From 5709f722c3de5f6103e29c8fb7b540152943d36d Mon Sep 17 00:00:00 2001 From: Aryann Dwivedi Date: Tue, 4 Jun 2024 17:58:47 +0530 Subject: [PATCH 1/2] chore: adding versioned directory(v0 and v1) with src --- v0/src/App.vue | 21 + .../assets/constants/Navbar/NAVBAR_DATA.json | 236 + v0/src/assets/constants/Navbar/USER_DATA.json | 71 + .../Panels/TimingDiagramPanel/buttons.json | 79 + .../Panels/VerilogEditorPanel/THEMES.json | 24 + v0/src/assets/img/ALU.png | Bin 0 -> 57481 bytes v0/src/assets/img/ALU.svg | 1 + v0/src/assets/img/Adder.svg | 1 + v0/src/assets/img/AndGate.svg | 1 + v0/src/assets/img/Arrow.svg | 1 + v0/src/assets/img/AsyncCounter.jpeg | Bin 0 -> 5872 bytes v0/src/assets/img/BitSelector.svg | 1 + v0/src/assets/img/Buffer.svg | 1 + v0/src/assets/img/Button.svg | 1 + v0/src/assets/img/Clock.svg | 1 + v0/src/assets/img/ConstantVal.svg | 1 + v0/src/assets/img/Control Sequencer.png | Bin 0 -> 271641 bytes v0/src/assets/img/ControlledInverter.svg | 1 + v0/src/assets/img/Counter.svg | 1 + v0/src/assets/img/Decoder.svg | 1 + v0/src/assets/img/Demultiplexer.svg | 1 + v0/src/assets/img/DflipFlop.svg | 1 + v0/src/assets/img/DigitalLed.svg | 1 + v0/src/assets/img/Dlatch.svg | 1 + v0/src/assets/img/EEPROM.svg | 1 + v0/src/assets/img/Flag.svg | 1 + v0/src/assets/img/FlipFlop.jpeg | Bin 0 -> 6224 bytes v0/src/assets/img/ForceGate.svg | 1 + v0/src/assets/img/Ground.svg | 1 + v0/src/assets/img/HexDisplay.svg | 1 + v0/src/assets/img/ImageAnnotation.svg | 1 + v0/src/assets/img/Input.svg | 1 + v0/src/assets/img/JKflipFlop.svg | 1 + v0/src/assets/img/Keyboard.jpeg | Bin 0 -> 12636 bytes v0/src/assets/img/Keyboard.svg | 1 + v0/src/assets/img/LSB.svg | 1 + v0/src/assets/img/MSB.svg | 1 + v0/src/assets/img/Main.png | Bin 0 -> 2061 bytes v0/src/assets/img/Multiplexer.svg | 1 + v0/src/assets/img/NandGate.svg | 1 + v0/src/assets/img/NorGate.svg | 1 + v0/src/assets/img/NotGate.svg | 1 + v0/src/assets/img/OrGate.svg | 1 + v0/src/assets/img/Output.svg | 1 + v0/src/assets/img/Power.svg | 1 + v0/src/assets/img/PriorityEncoder.svg | 1 + v0/src/assets/img/RAM.svg | 1 + v0/src/assets/img/RGBLed.svg | 1 + v0/src/assets/img/RGBLedMatrix.svg | 1 + v0/src/assets/img/Random.svg | 1 + v0/src/assets/img/Rectangle.svg | 1 + v0/src/assets/img/RippleCarry.jpeg | Bin 0 -> 17664 bytes v0/src/assets/img/Rom.svg | 1 + v0/src/assets/img/SAP.jpeg | Bin 0 -> 41613 bytes v0/src/assets/img/SRflipFlop.svg | 1 + v0/src/assets/img/SevenSegDisplay.svg | 1 + v0/src/assets/img/SixteenSegDisplay.svg | 1 + v0/src/assets/img/Splitter.svg | 1 + v0/src/assets/img/SquareRGBLed.svg | 1 + v0/src/assets/img/Stepper.svg | 1 + v0/src/assets/img/T-clock.png | Bin 0 -> 47639 bytes v0/src/assets/img/TB_Input.svg | 1 + v0/src/assets/img/TB_Output.svg | 1 + v0/src/assets/img/TTY.svg | 1 + v0/src/assets/img/Text.svg | 1 + v0/src/assets/img/TflipFlop.svg | 1 + v0/src/assets/img/TriState.svg | 1 + v0/src/assets/img/Tunnel.svg | 1 + v0/src/assets/img/TwoComplement.svg | 1 + v0/src/assets/img/VariableLed.svg | 1 + v0/src/assets/img/XnorGate.svg | 1 + v0/src/assets/img/XorGate.svg | 1 + v0/src/assets/img/assignment.png | Bin 0 -> 33699 bytes v0/src/assets/img/bus.png | Bin 0 -> 13856 bytes v0/src/assets/img/caret.jpg | Bin 0 -> 11217 bytes v0/src/assets/img/circuitverse2.svg | 1 + v0/src/assets/img/circuitverse_black.svg | 1 + v0/src/assets/img/circuitverse_logo.svg | 1 + v0/src/assets/img/cross.png | Bin 0 -> 194 bytes v0/src/assets/img/cvlogo.svg | 1 + v0/src/assets/img/default.png | Bin 0 -> 7548 bytes v0/src/assets/img/drag.mp4 | Bin 0 -> 43892 bytes v0/src/assets/img/edit_icon.png | Bin 0 -> 446 bytes v0/src/assets/img/embed.png | Bin 0 -> 27061 bytes v0/src/assets/img/facebook.png | Bin 0 -> 9902 bytes v0/src/assets/img/facebook_signin.png | Bin 0 -> 5050 bytes v0/src/assets/img/fullAdder.png | Bin 0 -> 47234 bytes v0/src/assets/img/google.png | Bin 0 -> 16985 bytes v0/src/assets/img/google_signin.png | Bin 0 -> 7018 bytes v0/src/assets/img/grading.png | Bin 0 -> 26275 bytes v0/src/assets/img/groups.png | Bin 0 -> 33081 bytes v0/src/assets/img/halfAdder.png | Bin 0 -> 26281 bytes v0/src/assets/img/help.png | Bin 0 -> 18810 bytes v0/src/assets/img/iDecoder.png | Bin 0 -> 68782 bytes v0/src/assets/img/iiitb.png | Bin 0 -> 48075 bytes v0/src/assets/img/implemented.png | Bin 0 -> 14155 bytes v0/src/assets/img/logix.png | Bin 0 -> 55139 bytes v0/src/assets/img/logixBanner.png | Bin 0 -> 25633 bytes v0/src/assets/img/logixBanner2.png | Bin 0 -> 24713 bytes v0/src/assets/img/logix_banner_new.png | Bin 0 -> 143965 bytes v0/src/assets/img/multiselectionDrag.mp4 | Bin 0 -> 79933 bytes v0/src/assets/img/properties.mp4 | Bin 0 -> 32920 bytes v0/src/assets/img/properties.png | Bin 0 -> 24904 bytes v0/src/assets/img/stats.png | Bin 0 -> 4824 bytes v0/src/assets/img/students.png | Bin 0 -> 62506 bytes v0/src/assets/img/super.png | Bin 0 -> 6565 bytes v0/src/assets/img/wire.mp4 | Bin 0 -> 20226 bytes v0/src/assets/themes/ColorBlind.svg | 101 + v0/src/assets/themes/DefaultTheme.svg | 101 + v0/src/assets/themes/GnW.svg | 101 + v0/src/assets/themes/HighContrast.svg | 101 + v0/src/assets/themes/LitebornSpring.svg | 101 + v0/src/assets/themes/NightSky.svg | 101 + v0/src/components/ContextMenu/ContextMenu.css | 0 v0/src/components/ContextMenu/ContextMenu.vue | 82 + v0/src/components/DialogBox/BooleanTable.vue | 23 + .../DialogBox/CombinationalAnalysis.vue | 708 ++ .../components/DialogBox/CustomShortcut.vue | 275 + v0/src/components/DialogBox/ExportProject.vue | 117 + v0/src/components/DialogBox/ExportVerilog.vue | 98 + v0/src/components/DialogBox/HexBinDec.vue | 253 + v0/src/components/DialogBox/ImportProject.vue | 250 + .../components/DialogBox/InsertSubcircuit.vue | 113 + v0/src/components/DialogBox/OpenOffline.vue | 99 + v0/src/components/DialogBox/SaveImage.vue | 157 + .../DialogBox/Themes/ApplyThemes.vue | 288 + v0/src/components/Dropdown/DropDown.css | 0 v0/src/components/Dropdown/DropDown.vue | 58 + v0/src/components/Extra.vue | 323 + v0/src/components/Logo/Logo.css | 0 v0/src/components/Logo/Logo.vue | 24 + v0/src/components/MessageBox/messageBox.vue | 82 + .../components/Navbar/Hamburger/Hamburger.css | 0 .../components/Navbar/Hamburger/Hamburger.vue | 18 + v0/src/components/Navbar/Navbar.css | 306 + v0/src/components/Navbar/Navbar.vue | 51 + .../NavbarLinks/NavbarLink/NavbarLink.css | 0 .../NavbarLinks/NavbarLink/NavbarLink.vue | 33 + .../Navbar/NavbarLinks/NavbarLinks.css | 0 .../Navbar/NavbarLinks/NavbarLinks.vue | 22 + .../Navbar/QuickButton/QuickButton.css | 0 .../Navbar/QuickButton/QuickButton.vue | 296 + v0/src/components/Navbar/User/User.css | 0 v0/src/components/Navbar/User/User.vue | 55 + .../Panels/ElementsPanel/ElementsPanel.vue | 240 + .../LayoutProperty/LayoutProperty.vue | 151 + .../ElementProperty/ElementProperty.vue | 121 + .../ModuleProperty/ModuleProperty.vue | 43 + .../ProjectProperty/ProjectProperty.vue | 241 + .../SubcircuitProperty/SubcircuitProperty.vue | 62 + .../PropertiesPanel/PropertiesPanel.vue | 75 + .../Panels/Shared/DropdownSelect.vue | 29 + .../components/Panels/Shared/HelpButton.vue | 21 + .../components/Panels/Shared/InputGroups.vue | 81 + .../components/Panels/Shared/PanelHeader.vue | 22 + .../TimingDiagramButtons.vue | 26 + .../TimingDiagramPanel/TimingDiagramPanel.vue | 107 + .../VerilogEditorPanel/VerilogEditorPanel.vue | 103 + v0/src/components/ReportIssue/ReportIssue.vue | 274 + .../ReportIssue/ReportIssueButton.vue | 24 + v0/src/components/TabsBar/TabsBar.vue | 368 + v0/src/components/helpers/Helper.vue | 28 + .../confirmComponent/ConfirmComponent.vue | 93 + .../helpers/createNewProject/TextEditor.vue | 445 + .../createNewProject/UpdateProjectDetail.vue | 264 + .../helpers/deleteCircuit/DeleteCircuit.vue | 151 + .../promptComponent/PromptComponent.vue | 151 + v0/src/env.d.ts | 8 + v0/src/globalVariables.ts | 27 + v0/src/locales/en.json | 162 + v0/src/locales/hi.json | 162 + v0/src/locales/i18n.ts | 16 + v0/src/main.ts | 29 + v0/src/pages/embed.vue | 317 + v0/src/pages/simulator.vue | 27 + v0/src/pages/simulatorHandler.vue | 96 + v0/src/plugins/vuetify.ts | 9 + v0/src/plugins/webfontloader.ts | 17 + v0/src/router/index.ts | 41 + v0/src/shims-vuetify.d.ts | 3 + .../Decoders-plexers-circuitdata.json | 1109 +++ .../spec/circuits/gates-circuitdata.json | 710 ++ v0/src/simulator/spec/data.spec.js | 121 + v0/src/simulator/spec/gates.spec.js | 57 + .../spec/testData/gates-testdata.json | 200 + v0/src/simulator/src/Verilog2CV.js | 264 + v0/src/simulator/src/VerilogClasses.js | 1507 ++++ v0/src/simulator/src/app.js | 213 + v0/src/simulator/src/arrayHelpers.js | 34 + v0/src/simulator/src/backgroundArea.js | 17 + v0/src/simulator/src/canvas2svg.js | 1433 +++ v0/src/simulator/src/canvasApi.js | 624 ++ v0/src/simulator/src/circuit.js | 483 + v0/src/simulator/src/circuitElement.js | 1018 +++ v0/src/simulator/src/combinationalAnalysis.js | 667 ++ v0/src/simulator/src/data.js | 62 + v0/src/simulator/src/data/backupCircuit.js | 83 + v0/src/simulator/src/data/load.js | 294 + v0/src/simulator/src/data/project.js | 175 + v0/src/simulator/src/data/redo.js | 47 + v0/src/simulator/src/data/save.js | 514 ++ v0/src/simulator/src/data/saveImage.js | 18 + v0/src/simulator/src/data/undo.js | 51 + .../src/doc/Circuit2Verilog documentation.md | 70 + .../CircuitVerse Timing Diagram Size Spec.svg | 3 + v0/src/simulator/src/drag.ts | 87 + v0/src/simulator/src/embed.js | 132 + v0/src/simulator/src/embedListeners.js | 259 + v0/src/simulator/src/engine.js | 559 ++ v0/src/simulator/src/eventQueue.js | 116 + v0/src/simulator/src/events.js | 338 + v0/src/simulator/src/file/Open.js | 96 + v0/src/simulator/src/file/SaveAs.js | 54 + .../src/hotkey_binder/defaultKeys.js | 29 + .../src/hotkey_binder/documentation.txt | 45 + .../simulator/src/hotkey_binder/keyBinder.js | 151 + .../src/hotkey_binder/model/actions.js | 205 + .../src/hotkey_binder/model/addShortcut.js | 102 + .../model/normalize/normalizer.plugin.js | 389 + .../hotkey_binder/model/shortcuts.plugin.js | 250 + .../src/hotkey_binder/model/utils.js | 67 + .../src/hotkey_binder/view/panel.ui.js | 60 + v0/src/simulator/src/i18n.js | 17 + v0/src/simulator/src/i18n/en.json | 8 + v0/src/simulator/src/i18n/hi.json | 8 + v0/src/simulator/src/img/ALU.png | Bin 0 -> 57481 bytes v0/src/simulator/src/img/ALU.svg | 1 + v0/src/simulator/src/img/Adder.svg | 1 + v0/src/simulator/src/img/AndGate.svg | 1 + v0/src/simulator/src/img/Arrow.svg | 1 + v0/src/simulator/src/img/AsyncCounter.jpeg | Bin 0 -> 5872 bytes v0/src/simulator/src/img/BitSelector.svg | 1 + v0/src/simulator/src/img/Buffer.svg | 1 + v0/src/simulator/src/img/Button.svg | 1 + v0/src/simulator/src/img/Clock.svg | 1 + v0/src/simulator/src/img/ConstantVal.svg | 1 + .../simulator/src/img/Control Sequencer.png | Bin 0 -> 271641 bytes .../simulator/src/img/ControlledInverter.svg | 1 + v0/src/simulator/src/img/Counter.svg | 1 + v0/src/simulator/src/img/Decoder.svg | 1 + v0/src/simulator/src/img/Demultiplexer.svg | 1 + v0/src/simulator/src/img/DflipFlop.svg | 1 + v0/src/simulator/src/img/DigitalLed.svg | 1 + v0/src/simulator/src/img/Dlatch.svg | 1 + v0/src/simulator/src/img/EEPROM.svg | 1 + v0/src/simulator/src/img/Flag.svg | 1 + v0/src/simulator/src/img/FlipFlop.jpeg | Bin 0 -> 6224 bytes v0/src/simulator/src/img/ForceGate.svg | 1 + v0/src/simulator/src/img/Ground.svg | 1 + v0/src/simulator/src/img/HexDisplay.svg | 1 + v0/src/simulator/src/img/ImageAnnotation.svg | 1 + v0/src/simulator/src/img/Input.svg | 1 + v0/src/simulator/src/img/JKflipFlop.svg | 1 + v0/src/simulator/src/img/Keyboard.jpeg | Bin 0 -> 12636 bytes v0/src/simulator/src/img/Keyboard.svg | 1 + v0/src/simulator/src/img/LSB.svg | 1 + v0/src/simulator/src/img/MSB.svg | 1 + v0/src/simulator/src/img/Main.png | Bin 0 -> 2061 bytes v0/src/simulator/src/img/Multiplexer.svg | 1 + v0/src/simulator/src/img/NandGate.svg | 1 + v0/src/simulator/src/img/NorGate.svg | 1 + v0/src/simulator/src/img/NotGate.svg | 1 + v0/src/simulator/src/img/OrGate.svg | 1 + v0/src/simulator/src/img/Output.svg | 1 + v0/src/simulator/src/img/Power.svg | 1 + v0/src/simulator/src/img/PriorityEncoder.svg | 1 + v0/src/simulator/src/img/RAM.svg | 1 + v0/src/simulator/src/img/RGBLed.svg | 1 + v0/src/simulator/src/img/RGBLedMatrix.svg | 1 + v0/src/simulator/src/img/Random.svg | 1 + v0/src/simulator/src/img/Rectangle.svg | 1 + v0/src/simulator/src/img/RippleCarry.jpeg | Bin 0 -> 17664 bytes v0/src/simulator/src/img/Rom.svg | 1 + v0/src/simulator/src/img/SAP.jpeg | Bin 0 -> 41613 bytes v0/src/simulator/src/img/SRflipFlop.svg | 1 + v0/src/simulator/src/img/SevenSegDisplay.svg | 1 + .../simulator/src/img/SixteenSegDisplay.svg | 1 + v0/src/simulator/src/img/Splitter.svg | 1 + v0/src/simulator/src/img/SquareRGBLed.svg | 1 + v0/src/simulator/src/img/Stepper.svg | 1 + v0/src/simulator/src/img/T-clock.png | Bin 0 -> 47639 bytes v0/src/simulator/src/img/TB_Input.svg | 1 + v0/src/simulator/src/img/TB_Output.svg | 1 + v0/src/simulator/src/img/TTY.svg | 1 + v0/src/simulator/src/img/Text.svg | 1 + v0/src/simulator/src/img/TflipFlop.svg | 1 + v0/src/simulator/src/img/TriState.svg | 1 + v0/src/simulator/src/img/Tunnel.svg | 1 + v0/src/simulator/src/img/TwoComplement.svg | 1 + v0/src/simulator/src/img/VariableLed.svg | 1 + v0/src/simulator/src/img/XnorGate.svg | 1 + v0/src/simulator/src/img/XorGate.svg | 1 + v0/src/simulator/src/img/assignment.png | Bin 0 -> 33699 bytes v0/src/simulator/src/img/bus.png | Bin 0 -> 13856 bytes v0/src/simulator/src/img/caret.jpg | Bin 0 -> 11217 bytes v0/src/simulator/src/img/circuitverse2.svg | 1 + .../simulator/src/img/circuitverse_black.svg | 1 + .../simulator/src/img/circuitverse_logo.svg | 1 + v0/src/simulator/src/img/cross.png | Bin 0 -> 194 bytes v0/src/simulator/src/img/cvlogo.svg | 1 + v0/src/simulator/src/img/default.png | Bin 0 -> 7548 bytes v0/src/simulator/src/img/drag.mp4 | Bin 0 -> 43892 bytes v0/src/simulator/src/img/edit_icon.png | Bin 0 -> 446 bytes v0/src/simulator/src/img/embed.png | Bin 0 -> 27061 bytes v0/src/simulator/src/img/facebook.png | Bin 0 -> 9902 bytes v0/src/simulator/src/img/facebook_signin.png | Bin 0 -> 5050 bytes v0/src/simulator/src/img/fullAdder.png | Bin 0 -> 47234 bytes v0/src/simulator/src/img/google.png | Bin 0 -> 16985 bytes v0/src/simulator/src/img/google_signin.png | Bin 0 -> 7018 bytes v0/src/simulator/src/img/grading.png | Bin 0 -> 26275 bytes v0/src/simulator/src/img/groups.png | Bin 0 -> 33081 bytes v0/src/simulator/src/img/halfAdder.png | Bin 0 -> 26281 bytes v0/src/simulator/src/img/help.png | Bin 0 -> 18810 bytes v0/src/simulator/src/img/iDecoder.png | Bin 0 -> 68782 bytes v0/src/simulator/src/img/iiitb.png | Bin 0 -> 48075 bytes v0/src/simulator/src/img/implemented.png | Bin 0 -> 14155 bytes v0/src/simulator/src/img/logix.png | Bin 0 -> 55139 bytes v0/src/simulator/src/img/logixBanner.png | Bin 0 -> 25633 bytes v0/src/simulator/src/img/logixBanner2.png | Bin 0 -> 24713 bytes v0/src/simulator/src/img/logix_banner_new.png | Bin 0 -> 143965 bytes .../simulator/src/img/multiselectionDrag.mp4 | Bin 0 -> 79933 bytes v0/src/simulator/src/img/properties.mp4 | Bin 0 -> 32920 bytes v0/src/simulator/src/img/properties.png | Bin 0 -> 24904 bytes v0/src/simulator/src/img/stats.png | Bin 0 -> 4824 bytes v0/src/simulator/src/img/students.png | Bin 0 -> 62506 bytes v0/src/simulator/src/img/super.png | Bin 0 -> 6565 bytes v0/src/simulator/src/img/wire.mp4 | Bin 0 -> 20226 bytes v0/src/simulator/src/layout/layoutBuffer.js | 88 + v0/src/simulator/src/layout/layoutNode.js | 124 + v0/src/simulator/src/layoutMode.js | 544 ++ v0/src/simulator/src/listeners.js | 761 ++ v0/src/simulator/src/metadata.json | 179 + v0/src/simulator/src/minimap.js | 193 + v0/src/simulator/src/moduleSetup.js | 135 + v0/src/simulator/src/modules.js | 60 + v0/src/simulator/src/modules/ALU.js | 200 + v0/src/simulator/src/modules/Adder.js | 107 + v0/src/simulator/src/modules/AndGate.js | 168 + v0/src/simulator/src/modules/Arrow.js | 83 + v0/src/simulator/src/modules/BitSelector.js | 173 + v0/src/simulator/src/modules/Buffer.js | 134 + v0/src/simulator/src/modules/Button.js | 184 + v0/src/simulator/src/modules/ConstantVal.js | 209 + .../src/modules/ControlledInverter.js | 122 + v0/src/simulator/src/modules/Counter.js | 194 + v0/src/simulator/src/modules/Decoder.js | 291 + v0/src/simulator/src/modules/Demultiplexer.js | 324 + v0/src/simulator/src/modules/DigitalLed.js | 188 + v0/src/simulator/src/modules/Flag.js | 234 + v0/src/simulator/src/modules/Ground.js | 129 + v0/src/simulator/src/modules/HexDisplay.js | 420 + .../simulator/src/modules/ImageAnnotation.js | 243 + v0/src/simulator/src/modules/Input.js | 210 + v0/src/simulator/src/modules/LSB.js | 144 + v0/src/simulator/src/modules/MSB.js | 141 + v0/src/simulator/src/modules/Multiplexer.js | 344 + v0/src/simulator/src/modules/NandGate.js | 169 + v0/src/simulator/src/modules/NorGate.js | 183 + v0/src/simulator/src/modules/NotGate.js | 113 + v0/src/simulator/src/modules/OrGate.js | 175 + v0/src/simulator/src/modules/Output.js | 219 + v0/src/simulator/src/modules/Power.js | 146 + .../simulator/src/modules/PriorityEncoder.js | 276 + v0/src/simulator/src/modules/RGBLed.js | 177 + v0/src/simulator/src/modules/RGBLedMatrix.js | 383 + v0/src/simulator/src/modules/Random.js | 172 + v0/src/simulator/src/modules/Rectangle.js | 159 + .../simulator/src/modules/SevenSegDisplay.js | 321 + .../src/modules/SixteenSegDisplay.js | 489 + v0/src/simulator/src/modules/Splitter.js | 359 + v0/src/simulator/src/modules/SquareRGBLed.js | 215 + v0/src/simulator/src/modules/Stepper.js | 102 + v0/src/simulator/src/modules/Text.js | 208 + v0/src/simulator/src/modules/TriState.js | 129 + v0/src/simulator/src/modules/Tunnel.js | 351 + v0/src/simulator/src/modules/TwoComplement.js | 102 + v0/src/simulator/src/modules/VariableLed.js | 205 + v0/src/simulator/src/modules/XnorGate.js | 199 + v0/src/simulator/src/modules/XorGate.js | 187 + .../simulator/src/modules/verilogDivider.js | 127 + .../src/modules/verilogMultiplier.js | 106 + v0/src/simulator/src/modules/verilogPower.js | 106 + .../simulator/src/modules/verilogShiftLeft.js | 108 + .../src/modules/verilogShiftRight.js | 108 + v0/src/simulator/src/node.js | 1021 +++ v0/src/simulator/src/plotArea.js | 521 ++ v0/src/simulator/src/quinMcCluskey.js | 227 + v0/src/simulator/src/restrictedElementDiv.js | 44 + v0/src/simulator/src/sequential.js | 25 + v0/src/simulator/src/sequential/Clock.js | 95 + v0/src/simulator/src/sequential/DflipFlop.js | 168 + v0/src/simulator/src/sequential/Dlatch.js | 119 + v0/src/simulator/src/sequential/EEPROM.js | 104 + v0/src/simulator/src/sequential/JKflipFlop.js | 166 + v0/src/simulator/src/sequential/Keyboard.js | 232 + v0/src/simulator/src/sequential/RAM.js | 374 + v0/src/simulator/src/sequential/Rom.js | 314 + v0/src/simulator/src/sequential/SRflipFlop.js | 131 + v0/src/simulator/src/sequential/TTY.js | 250 + v0/src/simulator/src/sequential/TflipFlop.js | 179 + v0/src/simulator/src/sequential/verilogRAM.js | 577 ++ v0/src/simulator/src/setup.js | 211 + v0/src/simulator/src/simulationArea.js | 99 + v0/src/simulator/src/subcircuit.js | 747 ++ v0/src/simulator/src/testCreator.js | 780 ++ v0/src/simulator/src/testbench.js | 1140 +++ v0/src/simulator/src/testbench/ForceGate.js | 92 + .../simulator/src/testbench/testbenchInput.js | 351 + .../src/testbench/testbenchOutput.js | 324 + .../src/themer/customThemeAbstraction.js | 44 + v0/src/simulator/src/themer/customThemer.js | 154 + v0/src/simulator/src/themer/themeCardSvg.js | 102 + v0/src/simulator/src/themer/themer.js | 223 + v0/src/simulator/src/themer/themes.js | 382 + v0/src/simulator/src/tutorials.js | 143 + v0/src/simulator/src/utils.js | 277 + v0/src/simulator/src/ux.js | 803 ++ v0/src/simulator/src/verilog.js | 580 ++ v0/src/simulator/src/verilogHelpers.js | 41 + v0/src/simulator/src/wire.js | 240 + v0/src/simulator/vendor/canvas2svg.js | 1469 +++ .../vendor/images/ui-icons_444444_256x240.png | Bin 0 -> 5005 bytes .../vendor/images/ui-icons_555555_256x240.png | Bin 0 -> 5004 bytes .../vendor/images/ui-icons_777620_256x240.png | Bin 0 -> 4498 bytes .../vendor/images/ui-icons_777777_256x240.png | Bin 0 -> 4990 bytes .../vendor/images/ui-icons_cc0000_256x240.png | Bin 0 -> 4498 bytes .../vendor/images/ui-icons_ffffff_256x240.png | Bin 0 -> 4948 bytes v0/src/simulator/vendor/jquery-ui.min.css | 1137 +++ v0/src/simulator/vendor/jquery-ui.min.js | 7887 +++++++++++++++++ v0/src/simulator/vendor/table2csv.js | 113 + v0/src/store/SimulatorStore/SimulatorStore.ts | 13 + v0/src/store/SimulatorStore/actions.ts | 16 + v0/src/store/SimulatorStore/getters.ts | 15 + v0/src/store/SimulatorStore/state.ts | 66 + v0/src/store/authStore.ts | 57 + v0/src/store/extractStore.ts | 40 + v0/src/store/projectStore.ts | 37 + v0/src/store/promptStore.ts | 113 + v0/src/styles/color_theme.scss | 551 ++ .../styles/css/0-helpers/_color-config.scss | 22 + v0/src/styles/css/0-helpers/_functions.scss | 0 v0/src/styles/css/0-helpers/_mixins.scss | 0 v0/src/styles/css/0-helpers/_variables.scss | 16 + v0/src/styles/css/2-basics/_buttons.scss | 0 v0/src/styles/css/2-basics/_close.scss | 0 v0/src/styles/css/2-basics/_global.scss | 0 v0/src/styles/css/2-basics/_links.scss | 0 v0/src/styles/css/2-basics/_toggle.scss | 0 v0/src/styles/css/2-basics/_typography.scss | 0 v0/src/styles/css/2-basics/base.scss | 11 + v0/src/styles/css/2-basics/reset.scss | 64 + .../css/3-sub-components/_navigation.scss | 0 .../css/3-sub-components/_searchbar.scss | 0 .../css/3-sub-components/_shortcut-menu.scss | 0 .../css/3-sub-components/_zoom-slider.scss | 0 .../css/4-components/_bool-logic-dialog.scss | 0 v0/src/styles/css/4-components/_canvas.scss | 0 .../css/4-components/_circuitelements.scss | 0 .../css/4-components/_context-menu.scss | 0 v0/src/styles/css/4-components/_dropdown.scss | 0 v0/src/styles/css/4-components/_header.scss | 0 .../css/4-components/_layout-dialog.scss | 0 v0/src/styles/css/4-components/_navbar.scss | 0 .../css/4-components/_new-circuit-dialog.scss | 0 .../styles/css/4-components/_properties.scss | 0 .../css/4-components/_save-img-dialog.scss | 0 .../css/4-components/_shortcut-dialog.scss | 0 v0/src/styles/css/4-components/_tabs-bar.scss | 0 v0/src/styles/css/5-layout/simulator.scss | 321 + v0/src/styles/css/UX.css | 969 ++ .../styles/css/assets/layout-panel/down.svg | 1 + .../styles/css/assets/layout-panel/left.svg | 1 + .../styles/css/assets/layout-panel/minus.svg | 1 + .../styles/css/assets/layout-panel/plus.svg | 1 + .../styles/css/assets/layout-panel/right.svg | 1 + v0/src/styles/css/assets/layout-panel/up.svg | 1 + v0/src/styles/css/assets/logo.svg | 1 + v0/src/styles/css/assets/shorcuts/delete.svg | 1 + .../styles/css/assets/shorcuts/download.svg | 1 + .../styles/css/assets/shorcuts/dragDots.svg | 86 + v0/src/styles/css/assets/shorcuts/fit.svg | 1 + v0/src/styles/css/assets/shorcuts/new.svg | 1 + v0/src/styles/css/assets/shorcuts/redo.svg | 1 + .../css/assets/shorcuts/save-online.svg | 1 + v0/src/styles/css/assets/shorcuts/save.svg | 1 + v0/src/styles/css/assets/shorcuts/undo.svg | 1 + .../assets/small-components/chevron-down.svg | 1 + .../css/assets/small-components/close.svg | 1 + v0/src/styles/css/custom_mailer.css | 6 + v0/src/styles/css/embed.css | 261 + v0/src/styles/css/error.css | 24 + v0/src/styles/css/main.stylesheet.css | 1956 ++++ .../css/plugin-stylesheets/checkBo.min.css | 386 + v0/src/styles/css/restrictedElements.css | 20 + v0/src/styles/css/shortcut.panel.css | 146 + v0/src/styles/css/testCreator.css | 141 + v0/src/styles/css/typeahead.min.css | 186 + v0/src/styles/simulator.scss | 39 + v0/src/styles/tutorials.scss | 52 + v1/src/App.vue | 21 + .../assets/constants/Navbar/NAVBAR_DATA.json | 236 + v1/src/assets/constants/Navbar/USER_DATA.json | 71 + .../Panels/TimingDiagramPanel/buttons.json | 79 + .../Panels/VerilogEditorPanel/THEMES.json | 24 + v1/src/assets/img/ALU.png | Bin 0 -> 57481 bytes v1/src/assets/img/ALU.svg | 1 + v1/src/assets/img/Adder.svg | 1 + v1/src/assets/img/AndGate.svg | 1 + v1/src/assets/img/Arrow.svg | 1 + v1/src/assets/img/AsyncCounter.jpeg | Bin 0 -> 5872 bytes v1/src/assets/img/BitSelector.svg | 1 + v1/src/assets/img/Buffer.svg | 1 + v1/src/assets/img/Button.svg | 1 + v1/src/assets/img/Clock.svg | 1 + v1/src/assets/img/ConstantVal.svg | 1 + v1/src/assets/img/Control Sequencer.png | Bin 0 -> 271641 bytes v1/src/assets/img/ControlledInverter.svg | 1 + v1/src/assets/img/Counter.svg | 1 + v1/src/assets/img/Decoder.svg | 1 + v1/src/assets/img/Demultiplexer.svg | 1 + v1/src/assets/img/DflipFlop.svg | 1 + v1/src/assets/img/DigitalLed.svg | 1 + v1/src/assets/img/Dlatch.svg | 1 + v1/src/assets/img/EEPROM.svg | 1 + v1/src/assets/img/Flag.svg | 1 + v1/src/assets/img/FlipFlop.jpeg | Bin 0 -> 6224 bytes v1/src/assets/img/ForceGate.svg | 1 + v1/src/assets/img/Ground.svg | 1 + v1/src/assets/img/HexDisplay.svg | 1 + v1/src/assets/img/ImageAnnotation.svg | 1 + v1/src/assets/img/Input.svg | 1 + v1/src/assets/img/JKflipFlop.svg | 1 + v1/src/assets/img/Keyboard.jpeg | Bin 0 -> 12636 bytes v1/src/assets/img/Keyboard.svg | 1 + v1/src/assets/img/LSB.svg | 1 + v1/src/assets/img/MSB.svg | 1 + v1/src/assets/img/Main.png | Bin 0 -> 2061 bytes v1/src/assets/img/Multiplexer.svg | 1 + v1/src/assets/img/NandGate.svg | 1 + v1/src/assets/img/NorGate.svg | 1 + v1/src/assets/img/NotGate.svg | 1 + v1/src/assets/img/OrGate.svg | 1 + v1/src/assets/img/Output.svg | 1 + v1/src/assets/img/Power.svg | 1 + v1/src/assets/img/PriorityEncoder.svg | 1 + v1/src/assets/img/RAM.svg | 1 + v1/src/assets/img/RGBLed.svg | 1 + v1/src/assets/img/RGBLedMatrix.svg | 1 + v1/src/assets/img/Random.svg | 1 + v1/src/assets/img/Rectangle.svg | 1 + v1/src/assets/img/RippleCarry.jpeg | Bin 0 -> 17664 bytes v1/src/assets/img/Rom.svg | 1 + v1/src/assets/img/SAP.jpeg | Bin 0 -> 41613 bytes v1/src/assets/img/SRflipFlop.svg | 1 + v1/src/assets/img/SevenSegDisplay.svg | 1 + v1/src/assets/img/SixteenSegDisplay.svg | 1 + v1/src/assets/img/Splitter.svg | 1 + v1/src/assets/img/SquareRGBLed.svg | 1 + v1/src/assets/img/Stepper.svg | 1 + v1/src/assets/img/T-clock.png | Bin 0 -> 47639 bytes v1/src/assets/img/TB_Input.svg | 1 + v1/src/assets/img/TB_Output.svg | 1 + v1/src/assets/img/TTY.svg | 1 + v1/src/assets/img/Text.svg | 1 + v1/src/assets/img/TflipFlop.svg | 1 + v1/src/assets/img/TriState.svg | 1 + v1/src/assets/img/Tunnel.svg | 1 + v1/src/assets/img/TwoComplement.svg | 1 + v1/src/assets/img/VariableLed.svg | 1 + v1/src/assets/img/XnorGate.svg | 1 + v1/src/assets/img/XorGate.svg | 1 + v1/src/assets/img/assignment.png | Bin 0 -> 33699 bytes v1/src/assets/img/bus.png | Bin 0 -> 13856 bytes v1/src/assets/img/caret.jpg | Bin 0 -> 11217 bytes v1/src/assets/img/circuitverse2.svg | 1 + v1/src/assets/img/circuitverse_black.svg | 1 + v1/src/assets/img/circuitverse_logo.svg | 1 + v1/src/assets/img/cross.png | Bin 0 -> 194 bytes v1/src/assets/img/cvlogo.svg | 1 + v1/src/assets/img/default.png | Bin 0 -> 7548 bytes v1/src/assets/img/drag.mp4 | Bin 0 -> 43892 bytes v1/src/assets/img/edit_icon.png | Bin 0 -> 446 bytes v1/src/assets/img/embed.png | Bin 0 -> 27061 bytes v1/src/assets/img/facebook.png | Bin 0 -> 9902 bytes v1/src/assets/img/facebook_signin.png | Bin 0 -> 5050 bytes v1/src/assets/img/fullAdder.png | Bin 0 -> 47234 bytes v1/src/assets/img/google.png | Bin 0 -> 16985 bytes v1/src/assets/img/google_signin.png | Bin 0 -> 7018 bytes v1/src/assets/img/grading.png | Bin 0 -> 26275 bytes v1/src/assets/img/groups.png | Bin 0 -> 33081 bytes v1/src/assets/img/halfAdder.png | Bin 0 -> 26281 bytes v1/src/assets/img/help.png | Bin 0 -> 18810 bytes v1/src/assets/img/iDecoder.png | Bin 0 -> 68782 bytes v1/src/assets/img/iiitb.png | Bin 0 -> 48075 bytes v1/src/assets/img/implemented.png | Bin 0 -> 14155 bytes v1/src/assets/img/logix.png | Bin 0 -> 55139 bytes v1/src/assets/img/logixBanner.png | Bin 0 -> 25633 bytes v1/src/assets/img/logixBanner2.png | Bin 0 -> 24713 bytes v1/src/assets/img/logix_banner_new.png | Bin 0 -> 143965 bytes v1/src/assets/img/multiselectionDrag.mp4 | Bin 0 -> 79933 bytes v1/src/assets/img/properties.mp4 | Bin 0 -> 32920 bytes v1/src/assets/img/properties.png | Bin 0 -> 24904 bytes v1/src/assets/img/stats.png | Bin 0 -> 4824 bytes v1/src/assets/img/students.png | Bin 0 -> 62506 bytes v1/src/assets/img/super.png | Bin 0 -> 6565 bytes v1/src/assets/img/wire.mp4 | Bin 0 -> 20226 bytes v1/src/assets/themes/ColorBlind.svg | 101 + v1/src/assets/themes/DefaultTheme.svg | 101 + v1/src/assets/themes/GnW.svg | 101 + v1/src/assets/themes/HighContrast.svg | 101 + v1/src/assets/themes/LitebornSpring.svg | 101 + v1/src/assets/themes/NightSky.svg | 101 + v1/src/components/ContextMenu/ContextMenu.css | 0 v1/src/components/ContextMenu/ContextMenu.vue | 82 + v1/src/components/DialogBox/BooleanTable.vue | 23 + .../DialogBox/CombinationalAnalysis.vue | 708 ++ .../components/DialogBox/CustomShortcut.vue | 275 + v1/src/components/DialogBox/ExportProject.vue | 117 + v1/src/components/DialogBox/ExportVerilog.vue | 98 + v1/src/components/DialogBox/HexBinDec.vue | 253 + v1/src/components/DialogBox/ImportProject.vue | 250 + .../components/DialogBox/InsertSubcircuit.vue | 113 + v1/src/components/DialogBox/OpenOffline.vue | 99 + v1/src/components/DialogBox/SaveImage.vue | 157 + .../DialogBox/Themes/ApplyThemes.vue | 288 + v1/src/components/Dropdown/DropDown.css | 0 v1/src/components/Dropdown/DropDown.vue | 58 + v1/src/components/Extra.vue | 323 + v1/src/components/Logo/Logo.css | 0 v1/src/components/Logo/Logo.vue | 24 + v1/src/components/MessageBox/messageBox.vue | 82 + .../components/Navbar/Hamburger/Hamburger.css | 0 .../components/Navbar/Hamburger/Hamburger.vue | 18 + v1/src/components/Navbar/Navbar.css | 306 + v1/src/components/Navbar/Navbar.vue | 51 + .../NavbarLinks/NavbarLink/NavbarLink.css | 0 .../NavbarLinks/NavbarLink/NavbarLink.vue | 33 + .../Navbar/NavbarLinks/NavbarLinks.css | 0 .../Navbar/NavbarLinks/NavbarLinks.vue | 22 + .../Navbar/QuickButton/QuickButton.css | 0 .../Navbar/QuickButton/QuickButton.vue | 296 + v1/src/components/Navbar/User/User.css | 0 v1/src/components/Navbar/User/User.vue | 55 + .../Panels/ElementsPanel/ElementsPanel.vue | 240 + .../LayoutProperty/LayoutProperty.vue | 151 + .../ElementProperty/ElementProperty.vue | 121 + .../ModuleProperty/ModuleProperty.vue | 43 + .../ProjectProperty/ProjectProperty.vue | 241 + .../SubcircuitProperty/SubcircuitProperty.vue | 62 + .../PropertiesPanel/PropertiesPanel.vue | 75 + .../Panels/Shared/DropdownSelect.vue | 29 + .../components/Panels/Shared/HelpButton.vue | 21 + .../components/Panels/Shared/InputGroups.vue | 81 + .../components/Panels/Shared/PanelHeader.vue | 22 + .../TimingDiagramButtons.vue | 26 + .../TimingDiagramPanel/TimingDiagramPanel.vue | 107 + .../VerilogEditorPanel/VerilogEditorPanel.vue | 103 + v1/src/components/ReportIssue/ReportIssue.vue | 274 + .../ReportIssue/ReportIssueButton.vue | 24 + v1/src/components/TabsBar/TabsBar.vue | 368 + v1/src/components/helpers/Helper.vue | 28 + .../confirmComponent/ConfirmComponent.vue | 93 + .../helpers/createNewProject/TextEditor.vue | 445 + .../createNewProject/UpdateProjectDetail.vue | 264 + .../helpers/deleteCircuit/DeleteCircuit.vue | 151 + .../promptComponent/PromptComponent.vue | 151 + v1/src/env.d.ts | 8 + v1/src/globalVariables.ts | 27 + v1/src/locales/en.json | 162 + v1/src/locales/hi.json | 162 + v1/src/locales/i18n.ts | 16 + v1/src/main.ts | 29 + v1/src/pages/embed.vue | 317 + v1/src/pages/simulator.vue | 27 + v1/src/pages/simulatorHandler.vue | 96 + v1/src/plugins/vuetify.ts | 9 + v1/src/plugins/webfontloader.ts | 17 + v1/src/router/index.ts | 41 + v1/src/shims-vuetify.d.ts | 3 + .../Decoders-plexers-circuitdata.json | 1109 +++ .../spec/circuits/gates-circuitdata.json | 710 ++ v1/src/simulator/spec/data.spec.js | 121 + v1/src/simulator/spec/gates.spec.js | 57 + .../spec/testData/gates-testdata.json | 200 + v1/src/simulator/src/Verilog2CV.js | 264 + v1/src/simulator/src/VerilogClasses.js | 1507 ++++ v1/src/simulator/src/app.js | 213 + v1/src/simulator/src/arrayHelpers.js | 34 + v1/src/simulator/src/backgroundArea.js | 17 + v1/src/simulator/src/canvas2svg.js | 1433 +++ v1/src/simulator/src/canvasApi.js | 624 ++ v1/src/simulator/src/circuit.js | 483 + v1/src/simulator/src/circuitElement.js | 1018 +++ v1/src/simulator/src/combinationalAnalysis.js | 667 ++ v1/src/simulator/src/data.js | 62 + v1/src/simulator/src/data/backupCircuit.js | 83 + v1/src/simulator/src/data/load.js | 294 + v1/src/simulator/src/data/project.js | 175 + v1/src/simulator/src/data/redo.js | 47 + v1/src/simulator/src/data/save.js | 514 ++ v1/src/simulator/src/data/saveImage.js | 18 + v1/src/simulator/src/data/undo.js | 51 + .../src/doc/Circuit2Verilog documentation.md | 70 + .../CircuitVerse Timing Diagram Size Spec.svg | 3 + v1/src/simulator/src/drag.ts | 87 + v1/src/simulator/src/embed.js | 132 + v1/src/simulator/src/embedListeners.js | 259 + v1/src/simulator/src/engine.js | 559 ++ v1/src/simulator/src/eventQueue.js | 116 + v1/src/simulator/src/events.js | 338 + v1/src/simulator/src/file/Open.js | 96 + v1/src/simulator/src/file/SaveAs.js | 54 + .../src/hotkey_binder/defaultKeys.js | 29 + .../src/hotkey_binder/documentation.txt | 45 + .../simulator/src/hotkey_binder/keyBinder.js | 151 + .../src/hotkey_binder/model/actions.js | 205 + .../src/hotkey_binder/model/addShortcut.js | 102 + .../model/normalize/normalizer.plugin.js | 389 + .../hotkey_binder/model/shortcuts.plugin.js | 250 + .../src/hotkey_binder/model/utils.js | 67 + .../src/hotkey_binder/view/panel.ui.js | 60 + v1/src/simulator/src/i18n.js | 17 + v1/src/simulator/src/i18n/en.json | 8 + v1/src/simulator/src/i18n/hi.json | 8 + v1/src/simulator/src/img/ALU.png | Bin 0 -> 57481 bytes v1/src/simulator/src/img/ALU.svg | 1 + v1/src/simulator/src/img/Adder.svg | 1 + v1/src/simulator/src/img/AndGate.svg | 1 + v1/src/simulator/src/img/Arrow.svg | 1 + v1/src/simulator/src/img/AsyncCounter.jpeg | Bin 0 -> 5872 bytes v1/src/simulator/src/img/BitSelector.svg | 1 + v1/src/simulator/src/img/Buffer.svg | 1 + v1/src/simulator/src/img/Button.svg | 1 + v1/src/simulator/src/img/Clock.svg | 1 + v1/src/simulator/src/img/ConstantVal.svg | 1 + .../simulator/src/img/Control Sequencer.png | Bin 0 -> 271641 bytes .../simulator/src/img/ControlledInverter.svg | 1 + v1/src/simulator/src/img/Counter.svg | 1 + v1/src/simulator/src/img/Decoder.svg | 1 + v1/src/simulator/src/img/Demultiplexer.svg | 1 + v1/src/simulator/src/img/DflipFlop.svg | 1 + v1/src/simulator/src/img/DigitalLed.svg | 1 + v1/src/simulator/src/img/Dlatch.svg | 1 + v1/src/simulator/src/img/EEPROM.svg | 1 + v1/src/simulator/src/img/Flag.svg | 1 + v1/src/simulator/src/img/FlipFlop.jpeg | Bin 0 -> 6224 bytes v1/src/simulator/src/img/ForceGate.svg | 1 + v1/src/simulator/src/img/Ground.svg | 1 + v1/src/simulator/src/img/HexDisplay.svg | 1 + v1/src/simulator/src/img/ImageAnnotation.svg | 1 + v1/src/simulator/src/img/Input.svg | 1 + v1/src/simulator/src/img/JKflipFlop.svg | 1 + v1/src/simulator/src/img/Keyboard.jpeg | Bin 0 -> 12636 bytes v1/src/simulator/src/img/Keyboard.svg | 1 + v1/src/simulator/src/img/LSB.svg | 1 + v1/src/simulator/src/img/MSB.svg | 1 + v1/src/simulator/src/img/Main.png | Bin 0 -> 2061 bytes v1/src/simulator/src/img/Multiplexer.svg | 1 + v1/src/simulator/src/img/NandGate.svg | 1 + v1/src/simulator/src/img/NorGate.svg | 1 + v1/src/simulator/src/img/NotGate.svg | 1 + v1/src/simulator/src/img/OrGate.svg | 1 + v1/src/simulator/src/img/Output.svg | 1 + v1/src/simulator/src/img/Power.svg | 1 + v1/src/simulator/src/img/PriorityEncoder.svg | 1 + v1/src/simulator/src/img/RAM.svg | 1 + v1/src/simulator/src/img/RGBLed.svg | 1 + v1/src/simulator/src/img/RGBLedMatrix.svg | 1 + v1/src/simulator/src/img/Random.svg | 1 + v1/src/simulator/src/img/Rectangle.svg | 1 + v1/src/simulator/src/img/RippleCarry.jpeg | Bin 0 -> 17664 bytes v1/src/simulator/src/img/Rom.svg | 1 + v1/src/simulator/src/img/SAP.jpeg | Bin 0 -> 41613 bytes v1/src/simulator/src/img/SRflipFlop.svg | 1 + v1/src/simulator/src/img/SevenSegDisplay.svg | 1 + .../simulator/src/img/SixteenSegDisplay.svg | 1 + v1/src/simulator/src/img/Splitter.svg | 1 + v1/src/simulator/src/img/SquareRGBLed.svg | 1 + v1/src/simulator/src/img/Stepper.svg | 1 + v1/src/simulator/src/img/T-clock.png | Bin 0 -> 47639 bytes v1/src/simulator/src/img/TB_Input.svg | 1 + v1/src/simulator/src/img/TB_Output.svg | 1 + v1/src/simulator/src/img/TTY.svg | 1 + v1/src/simulator/src/img/Text.svg | 1 + v1/src/simulator/src/img/TflipFlop.svg | 1 + v1/src/simulator/src/img/TriState.svg | 1 + v1/src/simulator/src/img/Tunnel.svg | 1 + v1/src/simulator/src/img/TwoComplement.svg | 1 + v1/src/simulator/src/img/VariableLed.svg | 1 + v1/src/simulator/src/img/XnorGate.svg | 1 + v1/src/simulator/src/img/XorGate.svg | 1 + v1/src/simulator/src/img/assignment.png | Bin 0 -> 33699 bytes v1/src/simulator/src/img/bus.png | Bin 0 -> 13856 bytes v1/src/simulator/src/img/caret.jpg | Bin 0 -> 11217 bytes v1/src/simulator/src/img/circuitverse2.svg | 1 + .../simulator/src/img/circuitverse_black.svg | 1 + .../simulator/src/img/circuitverse_logo.svg | 1 + v1/src/simulator/src/img/cross.png | Bin 0 -> 194 bytes v1/src/simulator/src/img/cvlogo.svg | 1 + v1/src/simulator/src/img/default.png | Bin 0 -> 7548 bytes v1/src/simulator/src/img/drag.mp4 | Bin 0 -> 43892 bytes v1/src/simulator/src/img/edit_icon.png | Bin 0 -> 446 bytes v1/src/simulator/src/img/embed.png | Bin 0 -> 27061 bytes v1/src/simulator/src/img/facebook.png | Bin 0 -> 9902 bytes v1/src/simulator/src/img/facebook_signin.png | Bin 0 -> 5050 bytes v1/src/simulator/src/img/fullAdder.png | Bin 0 -> 47234 bytes v1/src/simulator/src/img/google.png | Bin 0 -> 16985 bytes v1/src/simulator/src/img/google_signin.png | Bin 0 -> 7018 bytes v1/src/simulator/src/img/grading.png | Bin 0 -> 26275 bytes v1/src/simulator/src/img/groups.png | Bin 0 -> 33081 bytes v1/src/simulator/src/img/halfAdder.png | Bin 0 -> 26281 bytes v1/src/simulator/src/img/help.png | Bin 0 -> 18810 bytes v1/src/simulator/src/img/iDecoder.png | Bin 0 -> 68782 bytes v1/src/simulator/src/img/iiitb.png | Bin 0 -> 48075 bytes v1/src/simulator/src/img/implemented.png | Bin 0 -> 14155 bytes v1/src/simulator/src/img/logix.png | Bin 0 -> 55139 bytes v1/src/simulator/src/img/logixBanner.png | Bin 0 -> 25633 bytes v1/src/simulator/src/img/logixBanner2.png | Bin 0 -> 24713 bytes v1/src/simulator/src/img/logix_banner_new.png | Bin 0 -> 143965 bytes .../simulator/src/img/multiselectionDrag.mp4 | Bin 0 -> 79933 bytes v1/src/simulator/src/img/properties.mp4 | Bin 0 -> 32920 bytes v1/src/simulator/src/img/properties.png | Bin 0 -> 24904 bytes v1/src/simulator/src/img/stats.png | Bin 0 -> 4824 bytes v1/src/simulator/src/img/students.png | Bin 0 -> 62506 bytes v1/src/simulator/src/img/super.png | Bin 0 -> 6565 bytes v1/src/simulator/src/img/wire.mp4 | Bin 0 -> 20226 bytes v1/src/simulator/src/layout/layoutBuffer.js | 88 + v1/src/simulator/src/layout/layoutNode.js | 124 + v1/src/simulator/src/layoutMode.js | 544 ++ v1/src/simulator/src/listeners.js | 761 ++ v1/src/simulator/src/metadata.json | 179 + v1/src/simulator/src/minimap.js | 193 + v1/src/simulator/src/moduleSetup.js | 135 + v1/src/simulator/src/modules.js | 60 + v1/src/simulator/src/modules/ALU.js | 200 + v1/src/simulator/src/modules/Adder.js | 107 + v1/src/simulator/src/modules/AndGate.js | 168 + v1/src/simulator/src/modules/Arrow.js | 83 + v1/src/simulator/src/modules/BitSelector.js | 173 + v1/src/simulator/src/modules/Buffer.js | 134 + v1/src/simulator/src/modules/Button.js | 184 + v1/src/simulator/src/modules/ConstantVal.js | 209 + .../src/modules/ControlledInverter.js | 122 + v1/src/simulator/src/modules/Counter.js | 194 + v1/src/simulator/src/modules/Decoder.js | 291 + v1/src/simulator/src/modules/Demultiplexer.js | 324 + v1/src/simulator/src/modules/DigitalLed.js | 188 + v1/src/simulator/src/modules/Flag.js | 234 + v1/src/simulator/src/modules/Ground.js | 129 + v1/src/simulator/src/modules/HexDisplay.js | 420 + .../simulator/src/modules/ImageAnnotation.js | 243 + v1/src/simulator/src/modules/Input.js | 210 + v1/src/simulator/src/modules/LSB.js | 144 + v1/src/simulator/src/modules/MSB.js | 141 + v1/src/simulator/src/modules/Multiplexer.js | 344 + v1/src/simulator/src/modules/NandGate.js | 169 + v1/src/simulator/src/modules/NorGate.js | 183 + v1/src/simulator/src/modules/NotGate.js | 113 + v1/src/simulator/src/modules/OrGate.js | 175 + v1/src/simulator/src/modules/Output.js | 219 + v1/src/simulator/src/modules/Power.js | 146 + .../simulator/src/modules/PriorityEncoder.js | 276 + v1/src/simulator/src/modules/RGBLed.js | 177 + v1/src/simulator/src/modules/RGBLedMatrix.js | 383 + v1/src/simulator/src/modules/Random.js | 172 + v1/src/simulator/src/modules/Rectangle.js | 159 + .../simulator/src/modules/SevenSegDisplay.js | 321 + .../src/modules/SixteenSegDisplay.js | 489 + v1/src/simulator/src/modules/Splitter.js | 359 + v1/src/simulator/src/modules/SquareRGBLed.js | 215 + v1/src/simulator/src/modules/Stepper.js | 102 + v1/src/simulator/src/modules/Text.js | 208 + v1/src/simulator/src/modules/TriState.js | 129 + v1/src/simulator/src/modules/Tunnel.js | 351 + v1/src/simulator/src/modules/TwoComplement.js | 102 + v1/src/simulator/src/modules/VariableLed.js | 205 + v1/src/simulator/src/modules/XnorGate.js | 199 + v1/src/simulator/src/modules/XorGate.js | 187 + .../simulator/src/modules/verilogDivider.js | 127 + .../src/modules/verilogMultiplier.js | 106 + v1/src/simulator/src/modules/verilogPower.js | 106 + .../simulator/src/modules/verilogShiftLeft.js | 108 + .../src/modules/verilogShiftRight.js | 108 + v1/src/simulator/src/node.js | 1021 +++ v1/src/simulator/src/plotArea.js | 521 ++ v1/src/simulator/src/quinMcCluskey.js | 227 + v1/src/simulator/src/restrictedElementDiv.js | 44 + v1/src/simulator/src/sequential.js | 25 + v1/src/simulator/src/sequential/Clock.js | 95 + v1/src/simulator/src/sequential/DflipFlop.js | 168 + v1/src/simulator/src/sequential/Dlatch.js | 119 + v1/src/simulator/src/sequential/EEPROM.js | 104 + v1/src/simulator/src/sequential/JKflipFlop.js | 166 + v1/src/simulator/src/sequential/Keyboard.js | 232 + v1/src/simulator/src/sequential/RAM.js | 374 + v1/src/simulator/src/sequential/Rom.js | 314 + v1/src/simulator/src/sequential/SRflipFlop.js | 131 + v1/src/simulator/src/sequential/TTY.js | 250 + v1/src/simulator/src/sequential/TflipFlop.js | 179 + v1/src/simulator/src/sequential/verilogRAM.js | 577 ++ v1/src/simulator/src/setup.js | 211 + v1/src/simulator/src/simulationArea.js | 99 + v1/src/simulator/src/subcircuit.js | 747 ++ v1/src/simulator/src/testCreator.js | 780 ++ v1/src/simulator/src/testbench.js | 1140 +++ v1/src/simulator/src/testbench/ForceGate.js | 92 + .../simulator/src/testbench/testbenchInput.js | 351 + .../src/testbench/testbenchOutput.js | 324 + .../src/themer/customThemeAbstraction.js | 44 + v1/src/simulator/src/themer/customThemer.js | 154 + v1/src/simulator/src/themer/themeCardSvg.js | 102 + v1/src/simulator/src/themer/themer.js | 223 + v1/src/simulator/src/themer/themes.js | 382 + v1/src/simulator/src/tutorials.js | 143 + v1/src/simulator/src/utils.js | 277 + v1/src/simulator/src/ux.js | 803 ++ v1/src/simulator/src/verilog.js | 580 ++ v1/src/simulator/src/verilogHelpers.js | 41 + v1/src/simulator/src/wire.js | 240 + v1/src/simulator/vendor/canvas2svg.js | 1469 +++ .../vendor/images/ui-icons_444444_256x240.png | Bin 0 -> 5005 bytes .../vendor/images/ui-icons_555555_256x240.png | Bin 0 -> 5004 bytes .../vendor/images/ui-icons_777620_256x240.png | Bin 0 -> 4498 bytes .../vendor/images/ui-icons_777777_256x240.png | Bin 0 -> 4990 bytes .../vendor/images/ui-icons_cc0000_256x240.png | Bin 0 -> 4498 bytes .../vendor/images/ui-icons_ffffff_256x240.png | Bin 0 -> 4948 bytes v1/src/simulator/vendor/jquery-ui.min.css | 1137 +++ v1/src/simulator/vendor/jquery-ui.min.js | 7887 +++++++++++++++++ v1/src/simulator/vendor/table2csv.js | 113 + v1/src/store/SimulatorStore/SimulatorStore.ts | 13 + v1/src/store/SimulatorStore/actions.ts | 16 + v1/src/store/SimulatorStore/getters.ts | 15 + v1/src/store/SimulatorStore/state.ts | 66 + v1/src/store/authStore.ts | 57 + v1/src/store/extractStore.ts | 40 + v1/src/store/projectStore.ts | 37 + v1/src/store/promptStore.ts | 113 + v1/src/styles/color_theme.scss | 551 ++ .../styles/css/0-helpers/_color-config.scss | 22 + v1/src/styles/css/0-helpers/_functions.scss | 0 v1/src/styles/css/0-helpers/_mixins.scss | 0 v1/src/styles/css/0-helpers/_variables.scss | 16 + v1/src/styles/css/2-basics/_buttons.scss | 0 v1/src/styles/css/2-basics/_close.scss | 0 v1/src/styles/css/2-basics/_global.scss | 0 v1/src/styles/css/2-basics/_links.scss | 0 v1/src/styles/css/2-basics/_toggle.scss | 0 v1/src/styles/css/2-basics/_typography.scss | 0 v1/src/styles/css/2-basics/base.scss | 11 + v1/src/styles/css/2-basics/reset.scss | 64 + .../css/3-sub-components/_navigation.scss | 0 .../css/3-sub-components/_searchbar.scss | 0 .../css/3-sub-components/_shortcut-menu.scss | 0 .../css/3-sub-components/_zoom-slider.scss | 0 .../css/4-components/_bool-logic-dialog.scss | 0 v1/src/styles/css/4-components/_canvas.scss | 0 .../css/4-components/_circuitelements.scss | 0 .../css/4-components/_context-menu.scss | 0 v1/src/styles/css/4-components/_dropdown.scss | 0 v1/src/styles/css/4-components/_header.scss | 0 .../css/4-components/_layout-dialog.scss | 0 v1/src/styles/css/4-components/_navbar.scss | 0 .../css/4-components/_new-circuit-dialog.scss | 0 .../styles/css/4-components/_properties.scss | 0 .../css/4-components/_save-img-dialog.scss | 0 .../css/4-components/_shortcut-dialog.scss | 0 v1/src/styles/css/4-components/_tabs-bar.scss | 0 v1/src/styles/css/5-layout/simulator.scss | 321 + v1/src/styles/css/UX.css | 969 ++ .../styles/css/assets/layout-panel/down.svg | 1 + .../styles/css/assets/layout-panel/left.svg | 1 + .../styles/css/assets/layout-panel/minus.svg | 1 + .../styles/css/assets/layout-panel/plus.svg | 1 + .../styles/css/assets/layout-panel/right.svg | 1 + v1/src/styles/css/assets/layout-panel/up.svg | 1 + v1/src/styles/css/assets/logo.svg | 1 + v1/src/styles/css/assets/shorcuts/delete.svg | 1 + .../styles/css/assets/shorcuts/download.svg | 1 + .../styles/css/assets/shorcuts/dragDots.svg | 86 + v1/src/styles/css/assets/shorcuts/fit.svg | 1 + v1/src/styles/css/assets/shorcuts/new.svg | 1 + v1/src/styles/css/assets/shorcuts/redo.svg | 1 + .../css/assets/shorcuts/save-online.svg | 1 + v1/src/styles/css/assets/shorcuts/save.svg | 1 + v1/src/styles/css/assets/shorcuts/undo.svg | 1 + .../assets/small-components/chevron-down.svg | 1 + .../css/assets/small-components/close.svg | 1 + v1/src/styles/css/custom_mailer.css | 6 + v1/src/styles/css/embed.css | 261 + v1/src/styles/css/error.css | 24 + v1/src/styles/css/main.stylesheet.css | 1956 ++++ .../css/plugin-stylesheets/checkBo.min.css | 386 + v1/src/styles/css/restrictedElements.css | 20 + v1/src/styles/css/shortcut.panel.css | 146 + v1/src/styles/css/testCreator.css | 141 + v1/src/styles/css/typeahead.min.css | 186 + v1/src/styles/simulator.scss | 39 + v1/src/styles/tutorials.scss | 52 + 998 files changed, 122218 insertions(+) create mode 100644 v0/src/App.vue create mode 100644 v0/src/assets/constants/Navbar/NAVBAR_DATA.json create mode 100644 v0/src/assets/constants/Navbar/USER_DATA.json create mode 100644 v0/src/assets/constants/Panels/TimingDiagramPanel/buttons.json create mode 100644 v0/src/assets/constants/Panels/VerilogEditorPanel/THEMES.json create mode 100644 v0/src/assets/img/ALU.png create mode 100644 v0/src/assets/img/ALU.svg create mode 100644 v0/src/assets/img/Adder.svg create mode 100644 v0/src/assets/img/AndGate.svg create mode 100644 v0/src/assets/img/Arrow.svg create mode 100644 v0/src/assets/img/AsyncCounter.jpeg create mode 100644 v0/src/assets/img/BitSelector.svg create mode 100644 v0/src/assets/img/Buffer.svg create mode 100644 v0/src/assets/img/Button.svg create mode 100644 v0/src/assets/img/Clock.svg create mode 100644 v0/src/assets/img/ConstantVal.svg create mode 100644 v0/src/assets/img/Control Sequencer.png create mode 100644 v0/src/assets/img/ControlledInverter.svg create mode 100644 v0/src/assets/img/Counter.svg create mode 100644 v0/src/assets/img/Decoder.svg create mode 100644 v0/src/assets/img/Demultiplexer.svg create mode 100644 v0/src/assets/img/DflipFlop.svg create mode 100644 v0/src/assets/img/DigitalLed.svg create mode 100644 v0/src/assets/img/Dlatch.svg create mode 100644 v0/src/assets/img/EEPROM.svg create mode 100644 v0/src/assets/img/Flag.svg create mode 100644 v0/src/assets/img/FlipFlop.jpeg create mode 100644 v0/src/assets/img/ForceGate.svg create mode 100644 v0/src/assets/img/Ground.svg create mode 100644 v0/src/assets/img/HexDisplay.svg create mode 100644 v0/src/assets/img/ImageAnnotation.svg create mode 100644 v0/src/assets/img/Input.svg create mode 100644 v0/src/assets/img/JKflipFlop.svg create mode 100644 v0/src/assets/img/Keyboard.jpeg create mode 100644 v0/src/assets/img/Keyboard.svg create mode 100644 v0/src/assets/img/LSB.svg create mode 100644 v0/src/assets/img/MSB.svg create mode 100644 v0/src/assets/img/Main.png create mode 100644 v0/src/assets/img/Multiplexer.svg create mode 100644 v0/src/assets/img/NandGate.svg create mode 100644 v0/src/assets/img/NorGate.svg create mode 100644 v0/src/assets/img/NotGate.svg create mode 100644 v0/src/assets/img/OrGate.svg create mode 100644 v0/src/assets/img/Output.svg create mode 100644 v0/src/assets/img/Power.svg create mode 100644 v0/src/assets/img/PriorityEncoder.svg create mode 100644 v0/src/assets/img/RAM.svg create mode 100644 v0/src/assets/img/RGBLed.svg create mode 100644 v0/src/assets/img/RGBLedMatrix.svg create mode 100644 v0/src/assets/img/Random.svg create mode 100644 v0/src/assets/img/Rectangle.svg create mode 100644 v0/src/assets/img/RippleCarry.jpeg create mode 100644 v0/src/assets/img/Rom.svg create mode 100644 v0/src/assets/img/SAP.jpeg create mode 100644 v0/src/assets/img/SRflipFlop.svg create mode 100644 v0/src/assets/img/SevenSegDisplay.svg create mode 100644 v0/src/assets/img/SixteenSegDisplay.svg create mode 100644 v0/src/assets/img/Splitter.svg create mode 100644 v0/src/assets/img/SquareRGBLed.svg create mode 100644 v0/src/assets/img/Stepper.svg create mode 100644 v0/src/assets/img/T-clock.png create mode 100644 v0/src/assets/img/TB_Input.svg create mode 100644 v0/src/assets/img/TB_Output.svg create mode 100644 v0/src/assets/img/TTY.svg create mode 100644 v0/src/assets/img/Text.svg create mode 100644 v0/src/assets/img/TflipFlop.svg create mode 100644 v0/src/assets/img/TriState.svg create mode 100644 v0/src/assets/img/Tunnel.svg create mode 100644 v0/src/assets/img/TwoComplement.svg create mode 100644 v0/src/assets/img/VariableLed.svg create mode 100644 v0/src/assets/img/XnorGate.svg create mode 100644 v0/src/assets/img/XorGate.svg create mode 100644 v0/src/assets/img/assignment.png create mode 100644 v0/src/assets/img/bus.png create mode 100644 v0/src/assets/img/caret.jpg create mode 100644 v0/src/assets/img/circuitverse2.svg create mode 100644 v0/src/assets/img/circuitverse_black.svg create mode 100644 v0/src/assets/img/circuitverse_logo.svg create mode 100644 v0/src/assets/img/cross.png create mode 100644 v0/src/assets/img/cvlogo.svg create mode 100644 v0/src/assets/img/default.png create mode 100644 v0/src/assets/img/drag.mp4 create mode 100644 v0/src/assets/img/edit_icon.png create mode 100644 v0/src/assets/img/embed.png create mode 100644 v0/src/assets/img/facebook.png create mode 100644 v0/src/assets/img/facebook_signin.png create mode 100644 v0/src/assets/img/fullAdder.png create mode 100644 v0/src/assets/img/google.png create mode 100644 v0/src/assets/img/google_signin.png create mode 100644 v0/src/assets/img/grading.png create mode 100644 v0/src/assets/img/groups.png create mode 100644 v0/src/assets/img/halfAdder.png create mode 100644 v0/src/assets/img/help.png create mode 100644 v0/src/assets/img/iDecoder.png create mode 100644 v0/src/assets/img/iiitb.png create mode 100644 v0/src/assets/img/implemented.png create mode 100644 v0/src/assets/img/logix.png create mode 100644 v0/src/assets/img/logixBanner.png create mode 100644 v0/src/assets/img/logixBanner2.png create mode 100644 v0/src/assets/img/logix_banner_new.png create mode 100644 v0/src/assets/img/multiselectionDrag.mp4 create mode 100644 v0/src/assets/img/properties.mp4 create mode 100644 v0/src/assets/img/properties.png create mode 100644 v0/src/assets/img/stats.png create mode 100644 v0/src/assets/img/students.png create mode 100644 v0/src/assets/img/super.png create mode 100644 v0/src/assets/img/wire.mp4 create mode 100644 v0/src/assets/themes/ColorBlind.svg create mode 100644 v0/src/assets/themes/DefaultTheme.svg create mode 100644 v0/src/assets/themes/GnW.svg create mode 100644 v0/src/assets/themes/HighContrast.svg create mode 100644 v0/src/assets/themes/LitebornSpring.svg create mode 100644 v0/src/assets/themes/NightSky.svg create mode 100644 v0/src/components/ContextMenu/ContextMenu.css create mode 100644 v0/src/components/ContextMenu/ContextMenu.vue create mode 100644 v0/src/components/DialogBox/BooleanTable.vue create mode 100644 v0/src/components/DialogBox/CombinationalAnalysis.vue create mode 100644 v0/src/components/DialogBox/CustomShortcut.vue create mode 100644 v0/src/components/DialogBox/ExportProject.vue create mode 100644 v0/src/components/DialogBox/ExportVerilog.vue create mode 100644 v0/src/components/DialogBox/HexBinDec.vue create mode 100644 v0/src/components/DialogBox/ImportProject.vue create mode 100644 v0/src/components/DialogBox/InsertSubcircuit.vue create mode 100644 v0/src/components/DialogBox/OpenOffline.vue create mode 100644 v0/src/components/DialogBox/SaveImage.vue create mode 100644 v0/src/components/DialogBox/Themes/ApplyThemes.vue create mode 100644 v0/src/components/Dropdown/DropDown.css create mode 100644 v0/src/components/Dropdown/DropDown.vue create mode 100644 v0/src/components/Extra.vue create mode 100644 v0/src/components/Logo/Logo.css create mode 100644 v0/src/components/Logo/Logo.vue create mode 100644 v0/src/components/MessageBox/messageBox.vue create mode 100644 v0/src/components/Navbar/Hamburger/Hamburger.css create mode 100644 v0/src/components/Navbar/Hamburger/Hamburger.vue create mode 100644 v0/src/components/Navbar/Navbar.css create mode 100644 v0/src/components/Navbar/Navbar.vue create mode 100644 v0/src/components/Navbar/NavbarLinks/NavbarLink/NavbarLink.css create mode 100644 v0/src/components/Navbar/NavbarLinks/NavbarLink/NavbarLink.vue create mode 100644 v0/src/components/Navbar/NavbarLinks/NavbarLinks.css create mode 100644 v0/src/components/Navbar/NavbarLinks/NavbarLinks.vue create mode 100644 v0/src/components/Navbar/QuickButton/QuickButton.css create mode 100644 v0/src/components/Navbar/QuickButton/QuickButton.vue create mode 100644 v0/src/components/Navbar/User/User.css create mode 100644 v0/src/components/Navbar/User/User.vue create mode 100644 v0/src/components/Panels/ElementsPanel/ElementsPanel.vue create mode 100644 v0/src/components/Panels/PropertiesPanel/LayoutProperty/LayoutProperty.vue create mode 100644 v0/src/components/Panels/PropertiesPanel/ModuleProperty/ElementProperty/ElementProperty.vue create mode 100644 v0/src/components/Panels/PropertiesPanel/ModuleProperty/ModuleProperty.vue create mode 100644 v0/src/components/Panels/PropertiesPanel/ModuleProperty/ProjectProperty/ProjectProperty.vue create mode 100644 v0/src/components/Panels/PropertiesPanel/ModuleProperty/SubcircuitProperty/SubcircuitProperty.vue create mode 100644 v0/src/components/Panels/PropertiesPanel/PropertiesPanel.vue create mode 100644 v0/src/components/Panels/Shared/DropdownSelect.vue create mode 100644 v0/src/components/Panels/Shared/HelpButton.vue create mode 100644 v0/src/components/Panels/Shared/InputGroups.vue create mode 100644 v0/src/components/Panels/Shared/PanelHeader.vue create mode 100644 v0/src/components/Panels/TimingDiagramPanel/TimingDiagramButtons.vue create mode 100644 v0/src/components/Panels/TimingDiagramPanel/TimingDiagramPanel.vue create mode 100644 v0/src/components/Panels/VerilogEditorPanel/VerilogEditorPanel.vue create mode 100644 v0/src/components/ReportIssue/ReportIssue.vue create mode 100644 v0/src/components/ReportIssue/ReportIssueButton.vue create mode 100644 v0/src/components/TabsBar/TabsBar.vue create mode 100644 v0/src/components/helpers/Helper.vue create mode 100644 v0/src/components/helpers/confirmComponent/ConfirmComponent.vue create mode 100644 v0/src/components/helpers/createNewProject/TextEditor.vue create mode 100644 v0/src/components/helpers/createNewProject/UpdateProjectDetail.vue create mode 100644 v0/src/components/helpers/deleteCircuit/DeleteCircuit.vue create mode 100644 v0/src/components/helpers/promptComponent/PromptComponent.vue create mode 100644 v0/src/env.d.ts create mode 100644 v0/src/globalVariables.ts create mode 100644 v0/src/locales/en.json create mode 100644 v0/src/locales/hi.json create mode 100644 v0/src/locales/i18n.ts create mode 100644 v0/src/main.ts create mode 100644 v0/src/pages/embed.vue create mode 100644 v0/src/pages/simulator.vue create mode 100644 v0/src/pages/simulatorHandler.vue create mode 100644 v0/src/plugins/vuetify.ts create mode 100644 v0/src/plugins/webfontloader.ts create mode 100644 v0/src/router/index.ts create mode 100644 v0/src/shims-vuetify.d.ts create mode 100644 v0/src/simulator/spec/circuits/Decoders-plexers-circuitdata.json create mode 100644 v0/src/simulator/spec/circuits/gates-circuitdata.json create mode 100644 v0/src/simulator/spec/data.spec.js create mode 100644 v0/src/simulator/spec/gates.spec.js create mode 100644 v0/src/simulator/spec/testData/gates-testdata.json create mode 100644 v0/src/simulator/src/Verilog2CV.js create mode 100644 v0/src/simulator/src/VerilogClasses.js create mode 100644 v0/src/simulator/src/app.js create mode 100644 v0/src/simulator/src/arrayHelpers.js create mode 100644 v0/src/simulator/src/backgroundArea.js create mode 100644 v0/src/simulator/src/canvas2svg.js create mode 100644 v0/src/simulator/src/canvasApi.js create mode 100644 v0/src/simulator/src/circuit.js create mode 100644 v0/src/simulator/src/circuitElement.js create mode 100644 v0/src/simulator/src/combinationalAnalysis.js create mode 100644 v0/src/simulator/src/data.js create mode 100644 v0/src/simulator/src/data/backupCircuit.js create mode 100644 v0/src/simulator/src/data/load.js create mode 100644 v0/src/simulator/src/data/project.js create mode 100644 v0/src/simulator/src/data/redo.js create mode 100644 v0/src/simulator/src/data/save.js create mode 100644 v0/src/simulator/src/data/saveImage.js create mode 100644 v0/src/simulator/src/data/undo.js create mode 100644 v0/src/simulator/src/doc/Circuit2Verilog documentation.md create mode 100644 v0/src/simulator/src/doc/images/CircuitVerse Timing Diagram Size Spec.svg create mode 100644 v0/src/simulator/src/drag.ts create mode 100644 v0/src/simulator/src/embed.js create mode 100644 v0/src/simulator/src/embedListeners.js create mode 100644 v0/src/simulator/src/engine.js create mode 100644 v0/src/simulator/src/eventQueue.js create mode 100644 v0/src/simulator/src/events.js create mode 100644 v0/src/simulator/src/file/Open.js create mode 100644 v0/src/simulator/src/file/SaveAs.js create mode 100644 v0/src/simulator/src/hotkey_binder/defaultKeys.js create mode 100644 v0/src/simulator/src/hotkey_binder/documentation.txt create mode 100644 v0/src/simulator/src/hotkey_binder/keyBinder.js create mode 100644 v0/src/simulator/src/hotkey_binder/model/actions.js create mode 100644 v0/src/simulator/src/hotkey_binder/model/addShortcut.js create mode 100644 v0/src/simulator/src/hotkey_binder/model/normalize/normalizer.plugin.js create mode 100644 v0/src/simulator/src/hotkey_binder/model/shortcuts.plugin.js create mode 100644 v0/src/simulator/src/hotkey_binder/model/utils.js create mode 100644 v0/src/simulator/src/hotkey_binder/view/panel.ui.js create mode 100644 v0/src/simulator/src/i18n.js create mode 100644 v0/src/simulator/src/i18n/en.json create mode 100644 v0/src/simulator/src/i18n/hi.json create mode 100644 v0/src/simulator/src/img/ALU.png create mode 100644 v0/src/simulator/src/img/ALU.svg create mode 100644 v0/src/simulator/src/img/Adder.svg create mode 100644 v0/src/simulator/src/img/AndGate.svg create mode 100644 v0/src/simulator/src/img/Arrow.svg create mode 100644 v0/src/simulator/src/img/AsyncCounter.jpeg create mode 100644 v0/src/simulator/src/img/BitSelector.svg create mode 100644 v0/src/simulator/src/img/Buffer.svg create mode 100644 v0/src/simulator/src/img/Button.svg create mode 100644 v0/src/simulator/src/img/Clock.svg create mode 100644 v0/src/simulator/src/img/ConstantVal.svg create mode 100644 v0/src/simulator/src/img/Control Sequencer.png create mode 100644 v0/src/simulator/src/img/ControlledInverter.svg create mode 100644 v0/src/simulator/src/img/Counter.svg create mode 100644 v0/src/simulator/src/img/Decoder.svg create mode 100644 v0/src/simulator/src/img/Demultiplexer.svg create mode 100644 v0/src/simulator/src/img/DflipFlop.svg create mode 100644 v0/src/simulator/src/img/DigitalLed.svg create mode 100644 v0/src/simulator/src/img/Dlatch.svg create mode 100644 v0/src/simulator/src/img/EEPROM.svg create mode 100644 v0/src/simulator/src/img/Flag.svg create mode 100644 v0/src/simulator/src/img/FlipFlop.jpeg create mode 100644 v0/src/simulator/src/img/ForceGate.svg create mode 100644 v0/src/simulator/src/img/Ground.svg create mode 100644 v0/src/simulator/src/img/HexDisplay.svg create mode 100644 v0/src/simulator/src/img/ImageAnnotation.svg create mode 100644 v0/src/simulator/src/img/Input.svg create mode 100644 v0/src/simulator/src/img/JKflipFlop.svg create mode 100644 v0/src/simulator/src/img/Keyboard.jpeg create mode 100644 v0/src/simulator/src/img/Keyboard.svg create mode 100644 v0/src/simulator/src/img/LSB.svg create mode 100644 v0/src/simulator/src/img/MSB.svg create mode 100644 v0/src/simulator/src/img/Main.png create mode 100644 v0/src/simulator/src/img/Multiplexer.svg create mode 100644 v0/src/simulator/src/img/NandGate.svg create mode 100644 v0/src/simulator/src/img/NorGate.svg create mode 100644 v0/src/simulator/src/img/NotGate.svg create mode 100644 v0/src/simulator/src/img/OrGate.svg create mode 100644 v0/src/simulator/src/img/Output.svg create mode 100644 v0/src/simulator/src/img/Power.svg create mode 100644 v0/src/simulator/src/img/PriorityEncoder.svg create mode 100644 v0/src/simulator/src/img/RAM.svg create mode 100644 v0/src/simulator/src/img/RGBLed.svg create mode 100644 v0/src/simulator/src/img/RGBLedMatrix.svg create mode 100644 v0/src/simulator/src/img/Random.svg create mode 100644 v0/src/simulator/src/img/Rectangle.svg create mode 100644 v0/src/simulator/src/img/RippleCarry.jpeg create mode 100644 v0/src/simulator/src/img/Rom.svg create mode 100644 v0/src/simulator/src/img/SAP.jpeg create mode 100644 v0/src/simulator/src/img/SRflipFlop.svg create mode 100644 v0/src/simulator/src/img/SevenSegDisplay.svg create mode 100644 v0/src/simulator/src/img/SixteenSegDisplay.svg create mode 100644 v0/src/simulator/src/img/Splitter.svg create mode 100644 v0/src/simulator/src/img/SquareRGBLed.svg create mode 100644 v0/src/simulator/src/img/Stepper.svg create mode 100644 v0/src/simulator/src/img/T-clock.png create mode 100644 v0/src/simulator/src/img/TB_Input.svg create mode 100644 v0/src/simulator/src/img/TB_Output.svg create mode 100644 v0/src/simulator/src/img/TTY.svg create mode 100644 v0/src/simulator/src/img/Text.svg create mode 100644 v0/src/simulator/src/img/TflipFlop.svg create mode 100644 v0/src/simulator/src/img/TriState.svg create mode 100644 v0/src/simulator/src/img/Tunnel.svg create mode 100644 v0/src/simulator/src/img/TwoComplement.svg create mode 100644 v0/src/simulator/src/img/VariableLed.svg create mode 100644 v0/src/simulator/src/img/XnorGate.svg create mode 100644 v0/src/simulator/src/img/XorGate.svg create mode 100644 v0/src/simulator/src/img/assignment.png create mode 100644 v0/src/simulator/src/img/bus.png create mode 100644 v0/src/simulator/src/img/caret.jpg create mode 100644 v0/src/simulator/src/img/circuitverse2.svg create mode 100644 v0/src/simulator/src/img/circuitverse_black.svg create mode 100644 v0/src/simulator/src/img/circuitverse_logo.svg create mode 100644 v0/src/simulator/src/img/cross.png create mode 100644 v0/src/simulator/src/img/cvlogo.svg create mode 100644 v0/src/simulator/src/img/default.png create mode 100644 v0/src/simulator/src/img/drag.mp4 create mode 100644 v0/src/simulator/src/img/edit_icon.png create mode 100644 v0/src/simulator/src/img/embed.png create mode 100644 v0/src/simulator/src/img/facebook.png create mode 100644 v0/src/simulator/src/img/facebook_signin.png create mode 100644 v0/src/simulator/src/img/fullAdder.png create mode 100644 v0/src/simulator/src/img/google.png create mode 100644 v0/src/simulator/src/img/google_signin.png create mode 100644 v0/src/simulator/src/img/grading.png create mode 100644 v0/src/simulator/src/img/groups.png create mode 100644 v0/src/simulator/src/img/halfAdder.png create mode 100644 v0/src/simulator/src/img/help.png create mode 100644 v0/src/simulator/src/img/iDecoder.png create mode 100644 v0/src/simulator/src/img/iiitb.png create mode 100644 v0/src/simulator/src/img/implemented.png create mode 100644 v0/src/simulator/src/img/logix.png create mode 100644 v0/src/simulator/src/img/logixBanner.png create mode 100644 v0/src/simulator/src/img/logixBanner2.png create mode 100644 v0/src/simulator/src/img/logix_banner_new.png create mode 100644 v0/src/simulator/src/img/multiselectionDrag.mp4 create mode 100644 v0/src/simulator/src/img/properties.mp4 create mode 100644 v0/src/simulator/src/img/properties.png create mode 100644 v0/src/simulator/src/img/stats.png create mode 100644 v0/src/simulator/src/img/students.png create mode 100644 v0/src/simulator/src/img/super.png create mode 100644 v0/src/simulator/src/img/wire.mp4 create mode 100644 v0/src/simulator/src/layout/layoutBuffer.js create mode 100644 v0/src/simulator/src/layout/layoutNode.js create mode 100644 v0/src/simulator/src/layoutMode.js create mode 100644 v0/src/simulator/src/listeners.js create mode 100644 v0/src/simulator/src/metadata.json create mode 100644 v0/src/simulator/src/minimap.js create mode 100644 v0/src/simulator/src/moduleSetup.js create mode 100644 v0/src/simulator/src/modules.js create mode 100644 v0/src/simulator/src/modules/ALU.js create mode 100644 v0/src/simulator/src/modules/Adder.js create mode 100644 v0/src/simulator/src/modules/AndGate.js create mode 100644 v0/src/simulator/src/modules/Arrow.js create mode 100644 v0/src/simulator/src/modules/BitSelector.js create mode 100644 v0/src/simulator/src/modules/Buffer.js create mode 100644 v0/src/simulator/src/modules/Button.js create mode 100644 v0/src/simulator/src/modules/ConstantVal.js create mode 100644 v0/src/simulator/src/modules/ControlledInverter.js create mode 100644 v0/src/simulator/src/modules/Counter.js create mode 100644 v0/src/simulator/src/modules/Decoder.js create mode 100644 v0/src/simulator/src/modules/Demultiplexer.js create mode 100644 v0/src/simulator/src/modules/DigitalLed.js create mode 100644 v0/src/simulator/src/modules/Flag.js create mode 100644 v0/src/simulator/src/modules/Ground.js create mode 100644 v0/src/simulator/src/modules/HexDisplay.js create mode 100644 v0/src/simulator/src/modules/ImageAnnotation.js create mode 100644 v0/src/simulator/src/modules/Input.js create mode 100644 v0/src/simulator/src/modules/LSB.js create mode 100644 v0/src/simulator/src/modules/MSB.js create mode 100644 v0/src/simulator/src/modules/Multiplexer.js create mode 100644 v0/src/simulator/src/modules/NandGate.js create mode 100644 v0/src/simulator/src/modules/NorGate.js create mode 100644 v0/src/simulator/src/modules/NotGate.js create mode 100644 v0/src/simulator/src/modules/OrGate.js create mode 100644 v0/src/simulator/src/modules/Output.js create mode 100644 v0/src/simulator/src/modules/Power.js create mode 100644 v0/src/simulator/src/modules/PriorityEncoder.js create mode 100644 v0/src/simulator/src/modules/RGBLed.js create mode 100644 v0/src/simulator/src/modules/RGBLedMatrix.js create mode 100644 v0/src/simulator/src/modules/Random.js create mode 100644 v0/src/simulator/src/modules/Rectangle.js create mode 100644 v0/src/simulator/src/modules/SevenSegDisplay.js create mode 100644 v0/src/simulator/src/modules/SixteenSegDisplay.js create mode 100644 v0/src/simulator/src/modules/Splitter.js create mode 100644 v0/src/simulator/src/modules/SquareRGBLed.js create mode 100644 v0/src/simulator/src/modules/Stepper.js create mode 100644 v0/src/simulator/src/modules/Text.js create mode 100644 v0/src/simulator/src/modules/TriState.js create mode 100644 v0/src/simulator/src/modules/Tunnel.js create mode 100644 v0/src/simulator/src/modules/TwoComplement.js create mode 100644 v0/src/simulator/src/modules/VariableLed.js create mode 100644 v0/src/simulator/src/modules/XnorGate.js create mode 100644 v0/src/simulator/src/modules/XorGate.js create mode 100644 v0/src/simulator/src/modules/verilogDivider.js create mode 100644 v0/src/simulator/src/modules/verilogMultiplier.js create mode 100644 v0/src/simulator/src/modules/verilogPower.js create mode 100644 v0/src/simulator/src/modules/verilogShiftLeft.js create mode 100644 v0/src/simulator/src/modules/verilogShiftRight.js create mode 100644 v0/src/simulator/src/node.js create mode 100644 v0/src/simulator/src/plotArea.js create mode 100644 v0/src/simulator/src/quinMcCluskey.js create mode 100644 v0/src/simulator/src/restrictedElementDiv.js create mode 100644 v0/src/simulator/src/sequential.js create mode 100644 v0/src/simulator/src/sequential/Clock.js create mode 100644 v0/src/simulator/src/sequential/DflipFlop.js create mode 100644 v0/src/simulator/src/sequential/Dlatch.js create mode 100644 v0/src/simulator/src/sequential/EEPROM.js create mode 100644 v0/src/simulator/src/sequential/JKflipFlop.js create mode 100644 v0/src/simulator/src/sequential/Keyboard.js create mode 100644 v0/src/simulator/src/sequential/RAM.js create mode 100644 v0/src/simulator/src/sequential/Rom.js create mode 100644 v0/src/simulator/src/sequential/SRflipFlop.js create mode 100644 v0/src/simulator/src/sequential/TTY.js create mode 100644 v0/src/simulator/src/sequential/TflipFlop.js create mode 100644 v0/src/simulator/src/sequential/verilogRAM.js create mode 100644 v0/src/simulator/src/setup.js create mode 100644 v0/src/simulator/src/simulationArea.js create mode 100644 v0/src/simulator/src/subcircuit.js create mode 100644 v0/src/simulator/src/testCreator.js create mode 100644 v0/src/simulator/src/testbench.js create mode 100644 v0/src/simulator/src/testbench/ForceGate.js create mode 100644 v0/src/simulator/src/testbench/testbenchInput.js create mode 100644 v0/src/simulator/src/testbench/testbenchOutput.js create mode 100644 v0/src/simulator/src/themer/customThemeAbstraction.js create mode 100644 v0/src/simulator/src/themer/customThemer.js create mode 100644 v0/src/simulator/src/themer/themeCardSvg.js create mode 100644 v0/src/simulator/src/themer/themer.js create mode 100644 v0/src/simulator/src/themer/themes.js create mode 100644 v0/src/simulator/src/tutorials.js create mode 100644 v0/src/simulator/src/utils.js create mode 100644 v0/src/simulator/src/ux.js create mode 100644 v0/src/simulator/src/verilog.js create mode 100644 v0/src/simulator/src/verilogHelpers.js create mode 100644 v0/src/simulator/src/wire.js create mode 100644 v0/src/simulator/vendor/canvas2svg.js create mode 100644 v0/src/simulator/vendor/images/ui-icons_444444_256x240.png create mode 100644 v0/src/simulator/vendor/images/ui-icons_555555_256x240.png create mode 100644 v0/src/simulator/vendor/images/ui-icons_777620_256x240.png create mode 100644 v0/src/simulator/vendor/images/ui-icons_777777_256x240.png create mode 100644 v0/src/simulator/vendor/images/ui-icons_cc0000_256x240.png create mode 100644 v0/src/simulator/vendor/images/ui-icons_ffffff_256x240.png create mode 100644 v0/src/simulator/vendor/jquery-ui.min.css create mode 100644 v0/src/simulator/vendor/jquery-ui.min.js create mode 100644 v0/src/simulator/vendor/table2csv.js create mode 100644 v0/src/store/SimulatorStore/SimulatorStore.ts create mode 100644 v0/src/store/SimulatorStore/actions.ts create mode 100644 v0/src/store/SimulatorStore/getters.ts create mode 100644 v0/src/store/SimulatorStore/state.ts create mode 100644 v0/src/store/authStore.ts create mode 100644 v0/src/store/extractStore.ts create mode 100644 v0/src/store/projectStore.ts create mode 100644 v0/src/store/promptStore.ts create mode 100644 v0/src/styles/color_theme.scss create mode 100644 v0/src/styles/css/0-helpers/_color-config.scss create mode 100644 v0/src/styles/css/0-helpers/_functions.scss create mode 100644 v0/src/styles/css/0-helpers/_mixins.scss create mode 100644 v0/src/styles/css/0-helpers/_variables.scss create mode 100644 v0/src/styles/css/2-basics/_buttons.scss create mode 100644 v0/src/styles/css/2-basics/_close.scss create mode 100644 v0/src/styles/css/2-basics/_global.scss create mode 100644 v0/src/styles/css/2-basics/_links.scss create mode 100644 v0/src/styles/css/2-basics/_toggle.scss create mode 100644 v0/src/styles/css/2-basics/_typography.scss create mode 100644 v0/src/styles/css/2-basics/base.scss create mode 100644 v0/src/styles/css/2-basics/reset.scss create mode 100644 v0/src/styles/css/3-sub-components/_navigation.scss create mode 100644 v0/src/styles/css/3-sub-components/_searchbar.scss create mode 100644 v0/src/styles/css/3-sub-components/_shortcut-menu.scss create mode 100644 v0/src/styles/css/3-sub-components/_zoom-slider.scss create mode 100644 v0/src/styles/css/4-components/_bool-logic-dialog.scss create mode 100644 v0/src/styles/css/4-components/_canvas.scss create mode 100644 v0/src/styles/css/4-components/_circuitelements.scss create mode 100644 v0/src/styles/css/4-components/_context-menu.scss create mode 100644 v0/src/styles/css/4-components/_dropdown.scss create mode 100644 v0/src/styles/css/4-components/_header.scss create mode 100644 v0/src/styles/css/4-components/_layout-dialog.scss create mode 100644 v0/src/styles/css/4-components/_navbar.scss create mode 100644 v0/src/styles/css/4-components/_new-circuit-dialog.scss create mode 100644 v0/src/styles/css/4-components/_properties.scss create mode 100644 v0/src/styles/css/4-components/_save-img-dialog.scss create mode 100644 v0/src/styles/css/4-components/_shortcut-dialog.scss create mode 100644 v0/src/styles/css/4-components/_tabs-bar.scss create mode 100644 v0/src/styles/css/5-layout/simulator.scss create mode 100644 v0/src/styles/css/UX.css create mode 100644 v0/src/styles/css/assets/layout-panel/down.svg create mode 100644 v0/src/styles/css/assets/layout-panel/left.svg create mode 100644 v0/src/styles/css/assets/layout-panel/minus.svg create mode 100644 v0/src/styles/css/assets/layout-panel/plus.svg create mode 100644 v0/src/styles/css/assets/layout-panel/right.svg create mode 100644 v0/src/styles/css/assets/layout-panel/up.svg create mode 100644 v0/src/styles/css/assets/logo.svg create mode 100644 v0/src/styles/css/assets/shorcuts/delete.svg create mode 100644 v0/src/styles/css/assets/shorcuts/download.svg create mode 100644 v0/src/styles/css/assets/shorcuts/dragDots.svg create mode 100644 v0/src/styles/css/assets/shorcuts/fit.svg create mode 100644 v0/src/styles/css/assets/shorcuts/new.svg create mode 100644 v0/src/styles/css/assets/shorcuts/redo.svg create mode 100644 v0/src/styles/css/assets/shorcuts/save-online.svg create mode 100644 v0/src/styles/css/assets/shorcuts/save.svg create mode 100644 v0/src/styles/css/assets/shorcuts/undo.svg create mode 100644 v0/src/styles/css/assets/small-components/chevron-down.svg create mode 100644 v0/src/styles/css/assets/small-components/close.svg create mode 100644 v0/src/styles/css/custom_mailer.css create mode 100644 v0/src/styles/css/embed.css create mode 100644 v0/src/styles/css/error.css create mode 100644 v0/src/styles/css/main.stylesheet.css create mode 100644 v0/src/styles/css/plugin-stylesheets/checkBo.min.css create mode 100644 v0/src/styles/css/restrictedElements.css create mode 100644 v0/src/styles/css/shortcut.panel.css create mode 100644 v0/src/styles/css/testCreator.css create mode 100644 v0/src/styles/css/typeahead.min.css create mode 100644 v0/src/styles/simulator.scss create mode 100644 v0/src/styles/tutorials.scss create mode 100644 v1/src/App.vue create mode 100644 v1/src/assets/constants/Navbar/NAVBAR_DATA.json create mode 100644 v1/src/assets/constants/Navbar/USER_DATA.json create mode 100644 v1/src/assets/constants/Panels/TimingDiagramPanel/buttons.json create mode 100644 v1/src/assets/constants/Panels/VerilogEditorPanel/THEMES.json create mode 100644 v1/src/assets/img/ALU.png create mode 100644 v1/src/assets/img/ALU.svg create mode 100644 v1/src/assets/img/Adder.svg create mode 100644 v1/src/assets/img/AndGate.svg create mode 100644 v1/src/assets/img/Arrow.svg create mode 100644 v1/src/assets/img/AsyncCounter.jpeg create mode 100644 v1/src/assets/img/BitSelector.svg create mode 100644 v1/src/assets/img/Buffer.svg create mode 100644 v1/src/assets/img/Button.svg create mode 100644 v1/src/assets/img/Clock.svg create mode 100644 v1/src/assets/img/ConstantVal.svg create mode 100644 v1/src/assets/img/Control Sequencer.png create mode 100644 v1/src/assets/img/ControlledInverter.svg create mode 100644 v1/src/assets/img/Counter.svg create mode 100644 v1/src/assets/img/Decoder.svg create mode 100644 v1/src/assets/img/Demultiplexer.svg create mode 100644 v1/src/assets/img/DflipFlop.svg create mode 100644 v1/src/assets/img/DigitalLed.svg create mode 100644 v1/src/assets/img/Dlatch.svg create mode 100644 v1/src/assets/img/EEPROM.svg create mode 100644 v1/src/assets/img/Flag.svg create mode 100644 v1/src/assets/img/FlipFlop.jpeg create mode 100644 v1/src/assets/img/ForceGate.svg create mode 100644 v1/src/assets/img/Ground.svg create mode 100644 v1/src/assets/img/HexDisplay.svg create mode 100644 v1/src/assets/img/ImageAnnotation.svg create mode 100644 v1/src/assets/img/Input.svg create mode 100644 v1/src/assets/img/JKflipFlop.svg create mode 100644 v1/src/assets/img/Keyboard.jpeg create mode 100644 v1/src/assets/img/Keyboard.svg create mode 100644 v1/src/assets/img/LSB.svg create mode 100644 v1/src/assets/img/MSB.svg create mode 100644 v1/src/assets/img/Main.png create mode 100644 v1/src/assets/img/Multiplexer.svg create mode 100644 v1/src/assets/img/NandGate.svg create mode 100644 v1/src/assets/img/NorGate.svg create mode 100644 v1/src/assets/img/NotGate.svg create mode 100644 v1/src/assets/img/OrGate.svg create mode 100644 v1/src/assets/img/Output.svg create mode 100644 v1/src/assets/img/Power.svg create mode 100644 v1/src/assets/img/PriorityEncoder.svg create mode 100644 v1/src/assets/img/RAM.svg create mode 100644 v1/src/assets/img/RGBLed.svg create mode 100644 v1/src/assets/img/RGBLedMatrix.svg create mode 100644 v1/src/assets/img/Random.svg create mode 100644 v1/src/assets/img/Rectangle.svg create mode 100644 v1/src/assets/img/RippleCarry.jpeg create mode 100644 v1/src/assets/img/Rom.svg create mode 100644 v1/src/assets/img/SAP.jpeg create mode 100644 v1/src/assets/img/SRflipFlop.svg create mode 100644 v1/src/assets/img/SevenSegDisplay.svg create mode 100644 v1/src/assets/img/SixteenSegDisplay.svg create mode 100644 v1/src/assets/img/Splitter.svg create mode 100644 v1/src/assets/img/SquareRGBLed.svg create mode 100644 v1/src/assets/img/Stepper.svg create mode 100644 v1/src/assets/img/T-clock.png create mode 100644 v1/src/assets/img/TB_Input.svg create mode 100644 v1/src/assets/img/TB_Output.svg create mode 100644 v1/src/assets/img/TTY.svg create mode 100644 v1/src/assets/img/Text.svg create mode 100644 v1/src/assets/img/TflipFlop.svg create mode 100644 v1/src/assets/img/TriState.svg create mode 100644 v1/src/assets/img/Tunnel.svg create mode 100644 v1/src/assets/img/TwoComplement.svg create mode 100644 v1/src/assets/img/VariableLed.svg create mode 100644 v1/src/assets/img/XnorGate.svg create mode 100644 v1/src/assets/img/XorGate.svg create mode 100644 v1/src/assets/img/assignment.png create mode 100644 v1/src/assets/img/bus.png create mode 100644 v1/src/assets/img/caret.jpg create mode 100644 v1/src/assets/img/circuitverse2.svg create mode 100644 v1/src/assets/img/circuitverse_black.svg create mode 100644 v1/src/assets/img/circuitverse_logo.svg create mode 100644 v1/src/assets/img/cross.png create mode 100644 v1/src/assets/img/cvlogo.svg create mode 100644 v1/src/assets/img/default.png create mode 100644 v1/src/assets/img/drag.mp4 create mode 100644 v1/src/assets/img/edit_icon.png create mode 100644 v1/src/assets/img/embed.png create mode 100644 v1/src/assets/img/facebook.png create mode 100644 v1/src/assets/img/facebook_signin.png create mode 100644 v1/src/assets/img/fullAdder.png create mode 100644 v1/src/assets/img/google.png create mode 100644 v1/src/assets/img/google_signin.png create mode 100644 v1/src/assets/img/grading.png create mode 100644 v1/src/assets/img/groups.png create mode 100644 v1/src/assets/img/halfAdder.png create mode 100644 v1/src/assets/img/help.png create mode 100644 v1/src/assets/img/iDecoder.png create mode 100644 v1/src/assets/img/iiitb.png create mode 100644 v1/src/assets/img/implemented.png create mode 100644 v1/src/assets/img/logix.png create mode 100644 v1/src/assets/img/logixBanner.png create mode 100644 v1/src/assets/img/logixBanner2.png create mode 100644 v1/src/assets/img/logix_banner_new.png create mode 100644 v1/src/assets/img/multiselectionDrag.mp4 create mode 100644 v1/src/assets/img/properties.mp4 create mode 100644 v1/src/assets/img/properties.png create mode 100644 v1/src/assets/img/stats.png create mode 100644 v1/src/assets/img/students.png create mode 100644 v1/src/assets/img/super.png create mode 100644 v1/src/assets/img/wire.mp4 create mode 100644 v1/src/assets/themes/ColorBlind.svg create mode 100644 v1/src/assets/themes/DefaultTheme.svg create mode 100644 v1/src/assets/themes/GnW.svg create mode 100644 v1/src/assets/themes/HighContrast.svg create mode 100644 v1/src/assets/themes/LitebornSpring.svg create mode 100644 v1/src/assets/themes/NightSky.svg create mode 100644 v1/src/components/ContextMenu/ContextMenu.css create mode 100644 v1/src/components/ContextMenu/ContextMenu.vue create mode 100644 v1/src/components/DialogBox/BooleanTable.vue create mode 100644 v1/src/components/DialogBox/CombinationalAnalysis.vue create mode 100644 v1/src/components/DialogBox/CustomShortcut.vue create mode 100644 v1/src/components/DialogBox/ExportProject.vue create mode 100644 v1/src/components/DialogBox/ExportVerilog.vue create mode 100644 v1/src/components/DialogBox/HexBinDec.vue create mode 100644 v1/src/components/DialogBox/ImportProject.vue create mode 100644 v1/src/components/DialogBox/InsertSubcircuit.vue create mode 100644 v1/src/components/DialogBox/OpenOffline.vue create mode 100644 v1/src/components/DialogBox/SaveImage.vue create mode 100644 v1/src/components/DialogBox/Themes/ApplyThemes.vue create mode 100644 v1/src/components/Dropdown/DropDown.css create mode 100644 v1/src/components/Dropdown/DropDown.vue create mode 100644 v1/src/components/Extra.vue create mode 100644 v1/src/components/Logo/Logo.css create mode 100644 v1/src/components/Logo/Logo.vue create mode 100644 v1/src/components/MessageBox/messageBox.vue create mode 100644 v1/src/components/Navbar/Hamburger/Hamburger.css create mode 100644 v1/src/components/Navbar/Hamburger/Hamburger.vue create mode 100644 v1/src/components/Navbar/Navbar.css create mode 100644 v1/src/components/Navbar/Navbar.vue create mode 100644 v1/src/components/Navbar/NavbarLinks/NavbarLink/NavbarLink.css create mode 100644 v1/src/components/Navbar/NavbarLinks/NavbarLink/NavbarLink.vue create mode 100644 v1/src/components/Navbar/NavbarLinks/NavbarLinks.css create mode 100644 v1/src/components/Navbar/NavbarLinks/NavbarLinks.vue create mode 100644 v1/src/components/Navbar/QuickButton/QuickButton.css create mode 100644 v1/src/components/Navbar/QuickButton/QuickButton.vue create mode 100644 v1/src/components/Navbar/User/User.css create mode 100644 v1/src/components/Navbar/User/User.vue create mode 100644 v1/src/components/Panels/ElementsPanel/ElementsPanel.vue create mode 100644 v1/src/components/Panels/PropertiesPanel/LayoutProperty/LayoutProperty.vue create mode 100644 v1/src/components/Panels/PropertiesPanel/ModuleProperty/ElementProperty/ElementProperty.vue create mode 100644 v1/src/components/Panels/PropertiesPanel/ModuleProperty/ModuleProperty.vue create mode 100644 v1/src/components/Panels/PropertiesPanel/ModuleProperty/ProjectProperty/ProjectProperty.vue create mode 100644 v1/src/components/Panels/PropertiesPanel/ModuleProperty/SubcircuitProperty/SubcircuitProperty.vue create mode 100644 v1/src/components/Panels/PropertiesPanel/PropertiesPanel.vue create mode 100644 v1/src/components/Panels/Shared/DropdownSelect.vue create mode 100644 v1/src/components/Panels/Shared/HelpButton.vue create mode 100644 v1/src/components/Panels/Shared/InputGroups.vue create mode 100644 v1/src/components/Panels/Shared/PanelHeader.vue create mode 100644 v1/src/components/Panels/TimingDiagramPanel/TimingDiagramButtons.vue create mode 100644 v1/src/components/Panels/TimingDiagramPanel/TimingDiagramPanel.vue create mode 100644 v1/src/components/Panels/VerilogEditorPanel/VerilogEditorPanel.vue create mode 100644 v1/src/components/ReportIssue/ReportIssue.vue create mode 100644 v1/src/components/ReportIssue/ReportIssueButton.vue create mode 100644 v1/src/components/TabsBar/TabsBar.vue create mode 100644 v1/src/components/helpers/Helper.vue create mode 100644 v1/src/components/helpers/confirmComponent/ConfirmComponent.vue create mode 100644 v1/src/components/helpers/createNewProject/TextEditor.vue create mode 100644 v1/src/components/helpers/createNewProject/UpdateProjectDetail.vue create mode 100644 v1/src/components/helpers/deleteCircuit/DeleteCircuit.vue create mode 100644 v1/src/components/helpers/promptComponent/PromptComponent.vue create mode 100644 v1/src/env.d.ts create mode 100644 v1/src/globalVariables.ts create mode 100644 v1/src/locales/en.json create mode 100644 v1/src/locales/hi.json create mode 100644 v1/src/locales/i18n.ts create mode 100644 v1/src/main.ts create mode 100644 v1/src/pages/embed.vue create mode 100644 v1/src/pages/simulator.vue create mode 100644 v1/src/pages/simulatorHandler.vue create mode 100644 v1/src/plugins/vuetify.ts create mode 100644 v1/src/plugins/webfontloader.ts create mode 100644 v1/src/router/index.ts create mode 100644 v1/src/shims-vuetify.d.ts create mode 100644 v1/src/simulator/spec/circuits/Decoders-plexers-circuitdata.json create mode 100644 v1/src/simulator/spec/circuits/gates-circuitdata.json create mode 100644 v1/src/simulator/spec/data.spec.js create mode 100644 v1/src/simulator/spec/gates.spec.js create mode 100644 v1/src/simulator/spec/testData/gates-testdata.json create mode 100644 v1/src/simulator/src/Verilog2CV.js create mode 100644 v1/src/simulator/src/VerilogClasses.js create mode 100644 v1/src/simulator/src/app.js create mode 100644 v1/src/simulator/src/arrayHelpers.js create mode 100644 v1/src/simulator/src/backgroundArea.js create mode 100644 v1/src/simulator/src/canvas2svg.js create mode 100644 v1/src/simulator/src/canvasApi.js create mode 100644 v1/src/simulator/src/circuit.js create mode 100644 v1/src/simulator/src/circuitElement.js create mode 100644 v1/src/simulator/src/combinationalAnalysis.js create mode 100644 v1/src/simulator/src/data.js create mode 100644 v1/src/simulator/src/data/backupCircuit.js create mode 100644 v1/src/simulator/src/data/load.js create mode 100644 v1/src/simulator/src/data/project.js create mode 100644 v1/src/simulator/src/data/redo.js create mode 100644 v1/src/simulator/src/data/save.js create mode 100644 v1/src/simulator/src/data/saveImage.js create mode 100644 v1/src/simulator/src/data/undo.js create mode 100644 v1/src/simulator/src/doc/Circuit2Verilog documentation.md create mode 100644 v1/src/simulator/src/doc/images/CircuitVerse Timing Diagram Size Spec.svg create mode 100644 v1/src/simulator/src/drag.ts create mode 100644 v1/src/simulator/src/embed.js create mode 100644 v1/src/simulator/src/embedListeners.js create mode 100644 v1/src/simulator/src/engine.js create mode 100644 v1/src/simulator/src/eventQueue.js create mode 100644 v1/src/simulator/src/events.js create mode 100644 v1/src/simulator/src/file/Open.js create mode 100644 v1/src/simulator/src/file/SaveAs.js create mode 100644 v1/src/simulator/src/hotkey_binder/defaultKeys.js create mode 100644 v1/src/simulator/src/hotkey_binder/documentation.txt create mode 100644 v1/src/simulator/src/hotkey_binder/keyBinder.js create mode 100644 v1/src/simulator/src/hotkey_binder/model/actions.js create mode 100644 v1/src/simulator/src/hotkey_binder/model/addShortcut.js create mode 100644 v1/src/simulator/src/hotkey_binder/model/normalize/normalizer.plugin.js create mode 100644 v1/src/simulator/src/hotkey_binder/model/shortcuts.plugin.js create mode 100644 v1/src/simulator/src/hotkey_binder/model/utils.js create mode 100644 v1/src/simulator/src/hotkey_binder/view/panel.ui.js create mode 100644 v1/src/simulator/src/i18n.js create mode 100644 v1/src/simulator/src/i18n/en.json create mode 100644 v1/src/simulator/src/i18n/hi.json create mode 100644 v1/src/simulator/src/img/ALU.png create mode 100644 v1/src/simulator/src/img/ALU.svg create mode 100644 v1/src/simulator/src/img/Adder.svg create mode 100644 v1/src/simulator/src/img/AndGate.svg create mode 100644 v1/src/simulator/src/img/Arrow.svg create mode 100644 v1/src/simulator/src/img/AsyncCounter.jpeg create mode 100644 v1/src/simulator/src/img/BitSelector.svg create mode 100644 v1/src/simulator/src/img/Buffer.svg create mode 100644 v1/src/simulator/src/img/Button.svg create mode 100644 v1/src/simulator/src/img/Clock.svg create mode 100644 v1/src/simulator/src/img/ConstantVal.svg create mode 100644 v1/src/simulator/src/img/Control Sequencer.png create mode 100644 v1/src/simulator/src/img/ControlledInverter.svg create mode 100644 v1/src/simulator/src/img/Counter.svg create mode 100644 v1/src/simulator/src/img/Decoder.svg create mode 100644 v1/src/simulator/src/img/Demultiplexer.svg create mode 100644 v1/src/simulator/src/img/DflipFlop.svg create mode 100644 v1/src/simulator/src/img/DigitalLed.svg create mode 100644 v1/src/simulator/src/img/Dlatch.svg create mode 100644 v1/src/simulator/src/img/EEPROM.svg create mode 100644 v1/src/simulator/src/img/Flag.svg create mode 100644 v1/src/simulator/src/img/FlipFlop.jpeg create mode 100644 v1/src/simulator/src/img/ForceGate.svg create mode 100644 v1/src/simulator/src/img/Ground.svg create mode 100644 v1/src/simulator/src/img/HexDisplay.svg create mode 100644 v1/src/simulator/src/img/ImageAnnotation.svg create mode 100644 v1/src/simulator/src/img/Input.svg create mode 100644 v1/src/simulator/src/img/JKflipFlop.svg create mode 100644 v1/src/simulator/src/img/Keyboard.jpeg create mode 100644 v1/src/simulator/src/img/Keyboard.svg create mode 100644 v1/src/simulator/src/img/LSB.svg create mode 100644 v1/src/simulator/src/img/MSB.svg create mode 100644 v1/src/simulator/src/img/Main.png create mode 100644 v1/src/simulator/src/img/Multiplexer.svg create mode 100644 v1/src/simulator/src/img/NandGate.svg create mode 100644 v1/src/simulator/src/img/NorGate.svg create mode 100644 v1/src/simulator/src/img/NotGate.svg create mode 100644 v1/src/simulator/src/img/OrGate.svg create mode 100644 v1/src/simulator/src/img/Output.svg create mode 100644 v1/src/simulator/src/img/Power.svg create mode 100644 v1/src/simulator/src/img/PriorityEncoder.svg create mode 100644 v1/src/simulator/src/img/RAM.svg create mode 100644 v1/src/simulator/src/img/RGBLed.svg create mode 100644 v1/src/simulator/src/img/RGBLedMatrix.svg create mode 100644 v1/src/simulator/src/img/Random.svg create mode 100644 v1/src/simulator/src/img/Rectangle.svg create mode 100644 v1/src/simulator/src/img/RippleCarry.jpeg create mode 100644 v1/src/simulator/src/img/Rom.svg create mode 100644 v1/src/simulator/src/img/SAP.jpeg create mode 100644 v1/src/simulator/src/img/SRflipFlop.svg create mode 100644 v1/src/simulator/src/img/SevenSegDisplay.svg create mode 100644 v1/src/simulator/src/img/SixteenSegDisplay.svg create mode 100644 v1/src/simulator/src/img/Splitter.svg create mode 100644 v1/src/simulator/src/img/SquareRGBLed.svg create mode 100644 v1/src/simulator/src/img/Stepper.svg create mode 100644 v1/src/simulator/src/img/T-clock.png create mode 100644 v1/src/simulator/src/img/TB_Input.svg create mode 100644 v1/src/simulator/src/img/TB_Output.svg create mode 100644 v1/src/simulator/src/img/TTY.svg create mode 100644 v1/src/simulator/src/img/Text.svg create mode 100644 v1/src/simulator/src/img/TflipFlop.svg create mode 100644 v1/src/simulator/src/img/TriState.svg create mode 100644 v1/src/simulator/src/img/Tunnel.svg create mode 100644 v1/src/simulator/src/img/TwoComplement.svg create mode 100644 v1/src/simulator/src/img/VariableLed.svg create mode 100644 v1/src/simulator/src/img/XnorGate.svg create mode 100644 v1/src/simulator/src/img/XorGate.svg create mode 100644 v1/src/simulator/src/img/assignment.png create mode 100644 v1/src/simulator/src/img/bus.png create mode 100644 v1/src/simulator/src/img/caret.jpg create mode 100644 v1/src/simulator/src/img/circuitverse2.svg create mode 100644 v1/src/simulator/src/img/circuitverse_black.svg create mode 100644 v1/src/simulator/src/img/circuitverse_logo.svg create mode 100644 v1/src/simulator/src/img/cross.png create mode 100644 v1/src/simulator/src/img/cvlogo.svg create mode 100644 v1/src/simulator/src/img/default.png create mode 100644 v1/src/simulator/src/img/drag.mp4 create mode 100644 v1/src/simulator/src/img/edit_icon.png create mode 100644 v1/src/simulator/src/img/embed.png create mode 100644 v1/src/simulator/src/img/facebook.png create mode 100644 v1/src/simulator/src/img/facebook_signin.png create mode 100644 v1/src/simulator/src/img/fullAdder.png create mode 100644 v1/src/simulator/src/img/google.png create mode 100644 v1/src/simulator/src/img/google_signin.png create mode 100644 v1/src/simulator/src/img/grading.png create mode 100644 v1/src/simulator/src/img/groups.png create mode 100644 v1/src/simulator/src/img/halfAdder.png create mode 100644 v1/src/simulator/src/img/help.png create mode 100644 v1/src/simulator/src/img/iDecoder.png create mode 100644 v1/src/simulator/src/img/iiitb.png create mode 100644 v1/src/simulator/src/img/implemented.png create mode 100644 v1/src/simulator/src/img/logix.png create mode 100644 v1/src/simulator/src/img/logixBanner.png create mode 100644 v1/src/simulator/src/img/logixBanner2.png create mode 100644 v1/src/simulator/src/img/logix_banner_new.png create mode 100644 v1/src/simulator/src/img/multiselectionDrag.mp4 create mode 100644 v1/src/simulator/src/img/properties.mp4 create mode 100644 v1/src/simulator/src/img/properties.png create mode 100644 v1/src/simulator/src/img/stats.png create mode 100644 v1/src/simulator/src/img/students.png create mode 100644 v1/src/simulator/src/img/super.png create mode 100644 v1/src/simulator/src/img/wire.mp4 create mode 100644 v1/src/simulator/src/layout/layoutBuffer.js create mode 100644 v1/src/simulator/src/layout/layoutNode.js create mode 100644 v1/src/simulator/src/layoutMode.js create mode 100644 v1/src/simulator/src/listeners.js create mode 100644 v1/src/simulator/src/metadata.json create mode 100644 v1/src/simulator/src/minimap.js create mode 100644 v1/src/simulator/src/moduleSetup.js create mode 100644 v1/src/simulator/src/modules.js create mode 100644 v1/src/simulator/src/modules/ALU.js create mode 100644 v1/src/simulator/src/modules/Adder.js create mode 100644 v1/src/simulator/src/modules/AndGate.js create mode 100644 v1/src/simulator/src/modules/Arrow.js create mode 100644 v1/src/simulator/src/modules/BitSelector.js create mode 100644 v1/src/simulator/src/modules/Buffer.js create mode 100644 v1/src/simulator/src/modules/Button.js create mode 100644 v1/src/simulator/src/modules/ConstantVal.js create mode 100644 v1/src/simulator/src/modules/ControlledInverter.js create mode 100644 v1/src/simulator/src/modules/Counter.js create mode 100644 v1/src/simulator/src/modules/Decoder.js create mode 100644 v1/src/simulator/src/modules/Demultiplexer.js create mode 100644 v1/src/simulator/src/modules/DigitalLed.js create mode 100644 v1/src/simulator/src/modules/Flag.js create mode 100644 v1/src/simulator/src/modules/Ground.js create mode 100644 v1/src/simulator/src/modules/HexDisplay.js create mode 100644 v1/src/simulator/src/modules/ImageAnnotation.js create mode 100644 v1/src/simulator/src/modules/Input.js create mode 100644 v1/src/simulator/src/modules/LSB.js create mode 100644 v1/src/simulator/src/modules/MSB.js create mode 100644 v1/src/simulator/src/modules/Multiplexer.js create mode 100644 v1/src/simulator/src/modules/NandGate.js create mode 100644 v1/src/simulator/src/modules/NorGate.js create mode 100644 v1/src/simulator/src/modules/NotGate.js create mode 100644 v1/src/simulator/src/modules/OrGate.js create mode 100644 v1/src/simulator/src/modules/Output.js create mode 100644 v1/src/simulator/src/modules/Power.js create mode 100644 v1/src/simulator/src/modules/PriorityEncoder.js create mode 100644 v1/src/simulator/src/modules/RGBLed.js create mode 100644 v1/src/simulator/src/modules/RGBLedMatrix.js create mode 100644 v1/src/simulator/src/modules/Random.js create mode 100644 v1/src/simulator/src/modules/Rectangle.js create mode 100644 v1/src/simulator/src/modules/SevenSegDisplay.js create mode 100644 v1/src/simulator/src/modules/SixteenSegDisplay.js create mode 100644 v1/src/simulator/src/modules/Splitter.js create mode 100644 v1/src/simulator/src/modules/SquareRGBLed.js create mode 100644 v1/src/simulator/src/modules/Stepper.js create mode 100644 v1/src/simulator/src/modules/Text.js create mode 100644 v1/src/simulator/src/modules/TriState.js create mode 100644 v1/src/simulator/src/modules/Tunnel.js create mode 100644 v1/src/simulator/src/modules/TwoComplement.js create mode 100644 v1/src/simulator/src/modules/VariableLed.js create mode 100644 v1/src/simulator/src/modules/XnorGate.js create mode 100644 v1/src/simulator/src/modules/XorGate.js create mode 100644 v1/src/simulator/src/modules/verilogDivider.js create mode 100644 v1/src/simulator/src/modules/verilogMultiplier.js create mode 100644 v1/src/simulator/src/modules/verilogPower.js create mode 100644 v1/src/simulator/src/modules/verilogShiftLeft.js create mode 100644 v1/src/simulator/src/modules/verilogShiftRight.js create mode 100644 v1/src/simulator/src/node.js create mode 100644 v1/src/simulator/src/plotArea.js create mode 100644 v1/src/simulator/src/quinMcCluskey.js create mode 100644 v1/src/simulator/src/restrictedElementDiv.js create mode 100644 v1/src/simulator/src/sequential.js create mode 100644 v1/src/simulator/src/sequential/Clock.js create mode 100644 v1/src/simulator/src/sequential/DflipFlop.js create mode 100644 v1/src/simulator/src/sequential/Dlatch.js create mode 100644 v1/src/simulator/src/sequential/EEPROM.js create mode 100644 v1/src/simulator/src/sequential/JKflipFlop.js create mode 100644 v1/src/simulator/src/sequential/Keyboard.js create mode 100644 v1/src/simulator/src/sequential/RAM.js create mode 100644 v1/src/simulator/src/sequential/Rom.js create mode 100644 v1/src/simulator/src/sequential/SRflipFlop.js create mode 100644 v1/src/simulator/src/sequential/TTY.js create mode 100644 v1/src/simulator/src/sequential/TflipFlop.js create mode 100644 v1/src/simulator/src/sequential/verilogRAM.js create mode 100644 v1/src/simulator/src/setup.js create mode 100644 v1/src/simulator/src/simulationArea.js create mode 100644 v1/src/simulator/src/subcircuit.js create mode 100644 v1/src/simulator/src/testCreator.js create mode 100644 v1/src/simulator/src/testbench.js create mode 100644 v1/src/simulator/src/testbench/ForceGate.js create mode 100644 v1/src/simulator/src/testbench/testbenchInput.js create mode 100644 v1/src/simulator/src/testbench/testbenchOutput.js create mode 100644 v1/src/simulator/src/themer/customThemeAbstraction.js create mode 100644 v1/src/simulator/src/themer/customThemer.js create mode 100644 v1/src/simulator/src/themer/themeCardSvg.js create mode 100644 v1/src/simulator/src/themer/themer.js create mode 100644 v1/src/simulator/src/themer/themes.js create mode 100644 v1/src/simulator/src/tutorials.js create mode 100644 v1/src/simulator/src/utils.js create mode 100644 v1/src/simulator/src/ux.js create mode 100644 v1/src/simulator/src/verilog.js create mode 100644 v1/src/simulator/src/verilogHelpers.js create mode 100644 v1/src/simulator/src/wire.js create mode 100644 v1/src/simulator/vendor/canvas2svg.js create mode 100644 v1/src/simulator/vendor/images/ui-icons_444444_256x240.png create mode 100644 v1/src/simulator/vendor/images/ui-icons_555555_256x240.png create mode 100644 v1/src/simulator/vendor/images/ui-icons_777620_256x240.png create mode 100644 v1/src/simulator/vendor/images/ui-icons_777777_256x240.png create mode 100644 v1/src/simulator/vendor/images/ui-icons_cc0000_256x240.png create mode 100644 v1/src/simulator/vendor/images/ui-icons_ffffff_256x240.png create mode 100644 v1/src/simulator/vendor/jquery-ui.min.css create mode 100644 v1/src/simulator/vendor/jquery-ui.min.js create mode 100644 v1/src/simulator/vendor/table2csv.js create mode 100644 v1/src/store/SimulatorStore/SimulatorStore.ts create mode 100644 v1/src/store/SimulatorStore/actions.ts create mode 100644 v1/src/store/SimulatorStore/getters.ts create mode 100644 v1/src/store/SimulatorStore/state.ts create mode 100644 v1/src/store/authStore.ts create mode 100644 v1/src/store/extractStore.ts create mode 100644 v1/src/store/projectStore.ts create mode 100644 v1/src/store/promptStore.ts create mode 100644 v1/src/styles/color_theme.scss create mode 100644 v1/src/styles/css/0-helpers/_color-config.scss create mode 100644 v1/src/styles/css/0-helpers/_functions.scss create mode 100644 v1/src/styles/css/0-helpers/_mixins.scss create mode 100644 v1/src/styles/css/0-helpers/_variables.scss create mode 100644 v1/src/styles/css/2-basics/_buttons.scss create mode 100644 v1/src/styles/css/2-basics/_close.scss create mode 100644 v1/src/styles/css/2-basics/_global.scss create mode 100644 v1/src/styles/css/2-basics/_links.scss create mode 100644 v1/src/styles/css/2-basics/_toggle.scss create mode 100644 v1/src/styles/css/2-basics/_typography.scss create mode 100644 v1/src/styles/css/2-basics/base.scss create mode 100644 v1/src/styles/css/2-basics/reset.scss create mode 100644 v1/src/styles/css/3-sub-components/_navigation.scss create mode 100644 v1/src/styles/css/3-sub-components/_searchbar.scss create mode 100644 v1/src/styles/css/3-sub-components/_shortcut-menu.scss create mode 100644 v1/src/styles/css/3-sub-components/_zoom-slider.scss create mode 100644 v1/src/styles/css/4-components/_bool-logic-dialog.scss create mode 100644 v1/src/styles/css/4-components/_canvas.scss create mode 100644 v1/src/styles/css/4-components/_circuitelements.scss create mode 100644 v1/src/styles/css/4-components/_context-menu.scss create mode 100644 v1/src/styles/css/4-components/_dropdown.scss create mode 100644 v1/src/styles/css/4-components/_header.scss create mode 100644 v1/src/styles/css/4-components/_layout-dialog.scss create mode 100644 v1/src/styles/css/4-components/_navbar.scss create mode 100644 v1/src/styles/css/4-components/_new-circuit-dialog.scss create mode 100644 v1/src/styles/css/4-components/_properties.scss create mode 100644 v1/src/styles/css/4-components/_save-img-dialog.scss create mode 100644 v1/src/styles/css/4-components/_shortcut-dialog.scss create mode 100644 v1/src/styles/css/4-components/_tabs-bar.scss create mode 100644 v1/src/styles/css/5-layout/simulator.scss create mode 100644 v1/src/styles/css/UX.css create mode 100644 v1/src/styles/css/assets/layout-panel/down.svg create mode 100644 v1/src/styles/css/assets/layout-panel/left.svg create mode 100644 v1/src/styles/css/assets/layout-panel/minus.svg create mode 100644 v1/src/styles/css/assets/layout-panel/plus.svg create mode 100644 v1/src/styles/css/assets/layout-panel/right.svg create mode 100644 v1/src/styles/css/assets/layout-panel/up.svg create mode 100644 v1/src/styles/css/assets/logo.svg create mode 100644 v1/src/styles/css/assets/shorcuts/delete.svg create mode 100644 v1/src/styles/css/assets/shorcuts/download.svg create mode 100644 v1/src/styles/css/assets/shorcuts/dragDots.svg create mode 100644 v1/src/styles/css/assets/shorcuts/fit.svg create mode 100644 v1/src/styles/css/assets/shorcuts/new.svg create mode 100644 v1/src/styles/css/assets/shorcuts/redo.svg create mode 100644 v1/src/styles/css/assets/shorcuts/save-online.svg create mode 100644 v1/src/styles/css/assets/shorcuts/save.svg create mode 100644 v1/src/styles/css/assets/shorcuts/undo.svg create mode 100644 v1/src/styles/css/assets/small-components/chevron-down.svg create mode 100644 v1/src/styles/css/assets/small-components/close.svg create mode 100644 v1/src/styles/css/custom_mailer.css create mode 100644 v1/src/styles/css/embed.css create mode 100644 v1/src/styles/css/error.css create mode 100644 v1/src/styles/css/main.stylesheet.css create mode 100644 v1/src/styles/css/plugin-stylesheets/checkBo.min.css create mode 100644 v1/src/styles/css/restrictedElements.css create mode 100644 v1/src/styles/css/shortcut.panel.css create mode 100644 v1/src/styles/css/testCreator.css create mode 100644 v1/src/styles/css/typeahead.min.css create mode 100644 v1/src/styles/simulator.scss create mode 100644 v1/src/styles/tutorials.scss diff --git a/v0/src/App.vue b/v0/src/App.vue new file mode 100644 index 00000000..39422761 --- /dev/null +++ b/v0/src/App.vue @@ -0,0 +1,21 @@ + + + diff --git a/v0/src/assets/constants/Navbar/NAVBAR_DATA.json b/v0/src/assets/constants/Navbar/NAVBAR_DATA.json new file mode 100644 index 00000000..98d70a94 --- /dev/null +++ b/v0/src/assets/constants/Navbar/NAVBAR_DATA.json @@ -0,0 +1,236 @@ +[ + { + "id": "1", + "text": "project", + "spanClass": "caret", + "dropdownItems": [ + { + "id": "1", + "item": "new_project", + "itemid": "newProject", + "attributes": [] + }, + { + "id": "2", + "item": "save_online", + "itemid": "save", + "attributes": [] + }, + { + "id": "3", + "item": "save_offline", + "itemid": "saveOffline", + "attributes": [] + }, + { + "id": "4", + "item": "open_offline", + "itemid": "createOpenLocalPrompt", + "attributes": [] + }, + { + "id": "5", + "item": "export_as_file", + "itemid": "ExportProject", + "attributes": [] + }, + { + "id": "6", + "item": "import_project", + "itemid": "ImportProject", + "attributes": [] + }, + { + "id": "7", + "item": "clear_project", + "itemid": "clearProject", + "attributes": [] + }, + { + "id": "8", + "item": "recover_project", + "itemid": "recoverProject", + "attributes": [] + }, + { + "id": "9", + "item": "preview_circuit", + "itemid": "fullViewOption", + "attributes": [] + }, + { + "id": "10", + "item": "view_previous_ui", + "itemid": "", + "attributes": [ + { + "name": "onclick", + "value": "old_ui_redirect()" + } + ] + } + ] + }, + { + "id": "2", + "text": "circuit", + "spanClass": "caret", + "dropdownItems": [ + { + "id": "1", + "item": "new_circuit", + "itemid": "createNewCircuitScope", + "attributes": [] + }, + { + "id": "2", + "item": "new_verilog_module_html", + "itemid": "newVerilogModule", + "attributes": [] + }, + { + "id": "3", + "item": "insert_subcircuit", + "itemid": "createSubCircuitPrompt", + "attributes": [] + } + ] + }, + { + "id": "3", + "text": "tools", + "spanClass": "caret", + "dropdownItems": [ + { + "id": "1", + "item": "combinational_analysis_html", + "itemid": "createCombinationalAnalysisPrompt", + "attributes": [] + }, + { + "id": "2", + "item": "hex_bin_dec_converter_html", + "itemid": "bitconverter", + "attributes": [] + }, + { + "id": "3", + "item": "download_image", + "itemid": "createSaveAsImgPrompt", + "attributes": [] + }, + { + "id": "4", + "item": "themes", + "itemid": "colorThemes", + "attributes": [] + }, + { + "id": "5", + "item": "custom_shortcut", + "itemid": "customShortcut", + "attributes": [] + }, + { + "id": "6", + "item": "export_verilog", + "itemid": "generateVerilog", + "attributes": [] + } + ] + }, + { + "id": "4", + "text": "help", + "spanClass": "caret", + "dropdownItems": [ + { + "id": "1", + "item": "tutorial_guide", + "itemid": "showTourGuide", + "attributes": [] + }, + { + "id": "2", + "item": "user_manual", + "itemid": "", + "attributes": [ + { + "name": "href", + "value": "https://docs.circuitverse.org" + }, + { + "name": "target", + "value": "_blank" + }, + { + "name": "role", + "value": "button" + }, + { + "name": "aria-haspopup", + "value": "true" + }, + { + "name": "aria-expanded", + "value": "false" + } + ] + }, + { + "id": "3", + "item": "learn_digital_logic", + "itemid": "", + "attributes": [ + { + "name": "href", + "value": "https://learn.circuitverse.org" + }, + { + "name": "target", + "value": "_blank" + }, + { + "name": "role", + "value": "button" + }, + { + "name": "aria-haspopup", + "value": "true" + }, + { + "name": "aria-expanded", + "value": "false" + } + ] + }, + { + "id": "4", + "item": "discussion_forum", + "itemid": "", + "attributes": [ + { + "name": "href", + "value": "https://circuitverse.org/forum" + }, + { + "name": "target", + "value": "_blank" + }, + { + "name": "role", + "value": "button" + }, + { + "name": "aria-haspopup", + "value": "true" + }, + { + "name": "aria-expanded", + "value": "false" + } + ] + } + ] + } +] diff --git a/v0/src/assets/constants/Navbar/USER_DATA.json b/v0/src/assets/constants/Navbar/USER_DATA.json new file mode 100644 index 00000000..4d317d1e --- /dev/null +++ b/v0/src/assets/constants/Navbar/USER_DATA.json @@ -0,0 +1,71 @@ +[ + { + "id": "1", + "item": "dashboard", + "itemid": "", + "attributes": [ + { + "name": "href", + "value": "/users/${:id}" + }, + { + "name": "role", + "value": "button" + }, + { + "name": "aria-haspopup", + "value": "true" + }, + { + "name": "aria-expanded", + "value": "false" + } + ] + }, + { + "id": "2", + "item": "my_groups", + "itemid": "", + "attributes": [ + { + "name": "href", + "value": "/users/${:id}/groups" + }, + { + "name": "role", + "value": "button" + }, + { + "name": "aria-haspopup", + "value": "true" + }, + { + "name": "aria-expanded", + "value": "false" + } + ] + }, + { + "id": "3", + "item": "notifications", + "itemid": "", + "attributes": [ + { + "name": "href", + "value": "/users/${:id}/notifications" + }, + { + "name": "role", + "value": "button" + }, + { + "name": "aria-haspopup", + "value": "true" + }, + { + "name": "aria-expanded", + "value": "false" + } + ] + } +] diff --git a/v0/src/assets/constants/Panels/TimingDiagramPanel/buttons.json b/v0/src/assets/constants/Panels/TimingDiagramPanel/buttons.json new file mode 100644 index 00000000..357a00fa --- /dev/null +++ b/v0/src/assets/constants/Panels/TimingDiagramPanel/buttons.json @@ -0,0 +1,79 @@ +[ + { + "title": "Decrease Size", + "icon": "fa-chevron-left", + "class": "timing-diagram-smaller", + "type": "primary", + "click": "smaller" + }, + { + "title": "Increase Size", + "icon": "fa-chevron-right", + "class": "timing-diagram-larger", + "type": "primary", + "click": "larger" + }, + { + "title": "Decrease Height", + "icon": "fa-chevron-up", + "class": "timing-diagram-small-height", + "type": "primary", + "click": "smallHeight" + }, + { + "title": "Increase Height", + "icon": "fa-chevron-down", + "class": "timing-diagram-large-height", + "type": "primary", + "click": "largeHeight" + }, + { + "title": "Download As Image", + "icon": "fa-download", + "class": "timing-diagram-download", + "type": "primary", + "click": "download" + }, + { + "title": "Reset Timing Diagram", + "icon": "fa-undo", + "class": "timing-diagram-reset", + "type": "tertiary", + "click": "reset" + }, + { + "title": "Autocalibrate Cycle Units", + "icon": "fa-magic", + "class": "timing-diagram-calibrate", + "type": "tertiary", + "click": "calibrate" + }, + { + "title": "Zoom In", + "icon": "fa-search-plus", + "class": "timing-diagram-zoom-in", + "type": "primary", + "click": "zoomIn" + }, + { + "title": "Zoom Out", + "icon": "fa-search-minus", + "class": "timing-diagram-zoom-out", + "type": "primary", + "click": "zoomOut" + }, + { + "title": "Resume auto-scroll", + "icon": "fa-play", + "class": "timing-diagram-resume", + "type": "primary", + "click": "resume" + }, + { + "title": "Pause auto-scroll", + "icon": "fa-pause", + "class": "timing-diagram-pause", + "type": "primary", + "click": "pause" + } +] diff --git a/v0/src/assets/constants/Panels/VerilogEditorPanel/THEMES.json b/v0/src/assets/constants/Panels/VerilogEditorPanel/THEMES.json new file mode 100644 index 00000000..4319f822 --- /dev/null +++ b/v0/src/assets/constants/Panels/VerilogEditorPanel/THEMES.json @@ -0,0 +1,24 @@ +[ + { + "label": "Light Themes", + "options": [ + { "value": "default" }, + { "value": "solarized" }, + { "value": "elegant" }, + { "value": "neat" }, + { "value": "idea" }, + { "value": "neo" } + ] + }, + { + "label": "Dark Themes", + "options": [ + { "value": "blackboard" }, + { "value": "cobalt" }, + { "value": "night" }, + { "value": "the-matrix" }, + { "value": "midnight" }, + { "value": "monokai" } + ] + } +] diff --git a/v0/src/assets/img/ALU.png b/v0/src/assets/img/ALU.png new file mode 100644 index 0000000000000000000000000000000000000000..fa8094251a57c08ed6cdb85f8ad0b9a63a8a1236 GIT binary patch literal 57481 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

(DOe@ec`5}uQ@%Enyd(PG0tYsbGB-|l{)lZ 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 literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/ALU.svg b/v0/src/assets/img/ALU.svg new file mode 100644 index 00000000..0db7c17a --- /dev/null +++ b/v0/src/assets/img/ALU.svg @@ -0,0 +1 @@ +BACTRCarryAnsALU \ No newline at end of file diff --git a/v0/src/assets/img/Adder.svg b/v0/src/assets/img/Adder.svg new file mode 100644 index 00000000..9249cff0 --- /dev/null +++ b/v0/src/assets/img/Adder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/AndGate.svg b/v0/src/assets/img/AndGate.svg new file mode 100644 index 00000000..6273b83b --- /dev/null +++ b/v0/src/assets/img/AndGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/Arrow.svg b/v0/src/assets/img/Arrow.svg new file mode 100644 index 00000000..c25f20a1 --- /dev/null +++ b/v0/src/assets/img/Arrow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/AsyncCounter.jpeg b/v0/src/assets/img/AsyncCounter.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..88a40590e4f870e3024108f534cc902b5a7d03b6 GIT binary patch literal 5872 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 \ No newline at end of file diff --git a/v0/src/assets/img/Buffer.svg b/v0/src/assets/img/Buffer.svg new file mode 100644 index 00000000..bf867043 --- /dev/null +++ b/v0/src/assets/img/Buffer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/Button.svg b/v0/src/assets/img/Button.svg new file mode 100644 index 00000000..6c16a24e --- /dev/null +++ b/v0/src/assets/img/Button.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/Clock.svg b/v0/src/assets/img/Clock.svg new file mode 100644 index 00000000..653d29e0 --- /dev/null +++ b/v0/src/assets/img/Clock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/ConstantVal.svg b/v0/src/assets/img/ConstantVal.svg new file mode 100644 index 00000000..dcc41214 --- /dev/null +++ b/v0/src/assets/img/ConstantVal.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v0/src/assets/img/Control Sequencer.png b/v0/src/assets/img/Control Sequencer.png new file mode 100644 index 0000000000000000000000000000000000000000..2189f0a7554381e4dff78bc664855567d53cbc6a GIT binary patch literal 271641 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ξ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 z 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 C?GeWS literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/ControlledInverter.svg b/v0/src/assets/img/ControlledInverter.svg new file mode 100644 index 00000000..927dc8c8 --- /dev/null +++ b/v0/src/assets/img/ControlledInverter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/Counter.svg b/v0/src/assets/img/Counter.svg new file mode 100644 index 00000000..ee2aa77b --- /dev/null +++ b/v0/src/assets/img/Counter.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v0/src/assets/img/Decoder.svg b/v0/src/assets/img/Decoder.svg new file mode 100644 index 00000000..9a48c394 --- /dev/null +++ b/v0/src/assets/img/Decoder.svg @@ -0,0 +1 @@ +01 \ No newline at end of file diff --git a/v0/src/assets/img/Demultiplexer.svg b/v0/src/assets/img/Demultiplexer.svg new file mode 100644 index 00000000..61cad635 --- /dev/null +++ b/v0/src/assets/img/Demultiplexer.svg @@ -0,0 +1 @@ +01 \ No newline at end of file diff --git a/v0/src/assets/img/DflipFlop.svg b/v0/src/assets/img/DflipFlop.svg new file mode 100644 index 00000000..49f4ab5f --- /dev/null +++ b/v0/src/assets/img/DflipFlop.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v0/src/assets/img/DigitalLed.svg b/v0/src/assets/img/DigitalLed.svg new file mode 100644 index 00000000..a9259c2f --- /dev/null +++ b/v0/src/assets/img/DigitalLed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/Dlatch.svg b/v0/src/assets/img/Dlatch.svg new file mode 100644 index 00000000..8aef7671 --- /dev/null +++ b/v0/src/assets/img/Dlatch.svg @@ -0,0 +1 @@ +3 \ No newline at end of file diff --git a/v0/src/assets/img/EEPROM.svg b/v0/src/assets/img/EEPROM.svg new file mode 100644 index 00000000..504f61b0 --- /dev/null +++ b/v0/src/assets/img/EEPROM.svg @@ -0,0 +1 @@ +EPROMADIWDO \ No newline at end of file diff --git a/v0/src/assets/img/Flag.svg b/v0/src/assets/img/Flag.svg new file mode 100644 index 00000000..87ef27f4 --- /dev/null +++ b/v0/src/assets/img/Flag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/FlipFlop.jpeg b/v0/src/assets/img/FlipFlop.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..5c3d87cea34b60ff4158c2222ca06425f065213d GIT binary patch literal 6224 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 literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/ForceGate.svg b/v0/src/assets/img/ForceGate.svg new file mode 100644 index 00000000..28b50f3f --- /dev/null +++ b/v0/src/assets/img/ForceGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/Ground.svg b/v0/src/assets/img/Ground.svg new file mode 100644 index 00000000..70f453f6 --- /dev/null +++ b/v0/src/assets/img/Ground.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/HexDisplay.svg b/v0/src/assets/img/HexDisplay.svg new file mode 100644 index 00000000..10c89e13 --- /dev/null +++ b/v0/src/assets/img/HexDisplay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/ImageAnnotation.svg b/v0/src/assets/img/ImageAnnotation.svg new file mode 100644 index 00000000..8fbd9f75 --- /dev/null +++ b/v0/src/assets/img/ImageAnnotation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/Input.svg b/v0/src/assets/img/Input.svg new file mode 100644 index 00000000..42a626ff --- /dev/null +++ b/v0/src/assets/img/Input.svg @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/v0/src/assets/img/JKflipFlop.svg b/v0/src/assets/img/JKflipFlop.svg new file mode 100644 index 00000000..9e723197 --- /dev/null +++ b/v0/src/assets/img/JKflipFlop.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v0/src/assets/img/Keyboard.jpeg b/v0/src/assets/img/Keyboard.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..9922daff6949b554cde6f755ece5ce349e18761f GIT binary patch literal 12636 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 aQjzDO9w$(jdf- \ No newline at end of file diff --git a/v0/src/assets/img/LSB.svg b/v0/src/assets/img/LSB.svg new file mode 100644 index 00000000..31148b47 --- /dev/null +++ b/v0/src/assets/img/LSB.svg @@ -0,0 +1 @@ +LSBEN \ No newline at end of file diff --git a/v0/src/assets/img/MSB.svg b/v0/src/assets/img/MSB.svg new file mode 100644 index 00000000..21997b94 --- /dev/null +++ b/v0/src/assets/img/MSB.svg @@ -0,0 +1 @@ +MSBEN \ No newline at end of file diff --git a/v0/src/assets/img/Main.png b/v0/src/assets/img/Main.png new file mode 100644 index 0000000000000000000000000000000000000000..3bb25dac12eca21bc94afd0e87439830545b6b4a GIT binary patch literal 2061 zcmai!dpOgN9>>2f%l(kDQYlI5$0DReX}SE$vzSxT^lNRo-{w+8C7T^15<7k@N~}_& zWE%-Znqv?YFquI^Lqk%jw7a`|VPQcglW{nl!NEZj6B9>AM;#rV zrKKfHOUsFgiTU~YA3uKB+1a_fyR%rV+}vD0KR+KIpS88Mix)4#;c&6^i~e0)5c%?=C< zB#}r(MMa&Rovp2{XU=S-ZBd*$1*dG&O;bftca5QJ8Q2SN-@fhZ>nkiQ6p2JRIXTtU z)e?y$BqSs=GxN)rFP}euuBfQs^ZC=$(`II75fKr+y}gllgz!^6WPBO_ccx2dV= z`Sa&>b#-NBWjr3QxVShyJ>A~k{^re_&z?OK3WaTLZExPZiHnP))9FYgGA%7FDJh9e zCJzh@)YsS7)YQbp#56QCgoT9xI6$FLjE#*^sZ<7op^8_PE97FS7==Os2tZd?*UHLj zd**h)3jh)TnOrtJHw>r1(P(sbcJ{h_{qW(#c~A26^z?{CBI_GVJw=^4&g_}$K~Yg? z8hTJP2qi7;SCs{EqzA$=0l_EMsG1-85Y$lgX3tI{BT8 ztBX_Lr;56Y*4EcX#iQnV<_Yx)zU99BMgIA+^B+b&;2ZG<83qHh17}OlHcvFy4c8rg zeAJj|oWaT%5)FME`I0%~s{KdWG)YPzbf1Y-(@JUF%Oo;eEqlx(Yo z_`r+m_a1bMUF`#RSNE_(C3O(C&lT|fT2p_nrEQCeB^SY+T`A29fASbp7j%!;yt7u8 zq#&7=!%@bfevOWs5}DgdYAedN#revF&Sb5X~O)sl1RJcP*W8PgmFa$`~htT@o3{Ip3y+O(J{)%>)KMAc)>Rs=}0{& zAu4w9x zJ;N_ukTC_0+oYJ4iU){08ePu&%1fVOnTuW0!G??(nuBeuR6l<{UY>@q2NHHUB`7zV zz@kNRJ^X9`fC}r~kJc}_8GMM1t&QP_oG~&oMRUo@q1n6rUVd;Po7>4BS(ARxJDJ;j zQ04ynyTOUNowiNAr3b057e2e3M&znO9%M-VIJAdTiE!vcZAhMdIWjnfMX5w2n%{Tx z#?vyg6;=yn5O5$JLSj`S{LV8f?~nLyWyhax?gF zQ_x8rf8VIre#r(4j5#IJb|ozcjj8++q?9o~PlJ>ZwO zah<2B3p%$oFZH|J3^1Qm7hLpKu~ zhm}IS%AdxCpH&A3VEV2iIlOj$rCF_ZcU{GJx3ln z@KVF4f6KC-kjQsTgp>_mzC^D2daT2Eys-c4DF>8KQuWankwCP5#(s)*v;I&N9X7{Y z`1q~w*>3d7aI){U{0qG&O9Bcp!s*-2bT*aJf`I>HO>*^-sOZxX!i`T>y`xwEsi;smdn>VI2~-{Kbc8WmS_}i2JeK5!c6Fvfr0`sR~^>d`KncX{O>O8%=So~Ax~&ZV3{ zc(Y|S&a1`N1&E3EHSzKspptByF+no~xgtx#RpUD62AovKsb#EosR}Vum;FduzHNGV zI%d_7U8>BcuWb+a;Tl(k+2I_E%6g)KZD0t32GNOlLE+xQgrY5WO|I|U29AtJH{wBB zKX?DfSaiyf59$29YC01 \ No newline at end of file diff --git a/v0/src/assets/img/NandGate.svg b/v0/src/assets/img/NandGate.svg new file mode 100644 index 00000000..04cddce2 --- /dev/null +++ b/v0/src/assets/img/NandGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/NorGate.svg b/v0/src/assets/img/NorGate.svg new file mode 100644 index 00000000..55e9abc2 --- /dev/null +++ b/v0/src/assets/img/NorGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/NotGate.svg b/v0/src/assets/img/NotGate.svg new file mode 100644 index 00000000..a0d40ad4 --- /dev/null +++ b/v0/src/assets/img/NotGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/OrGate.svg b/v0/src/assets/img/OrGate.svg new file mode 100644 index 00000000..741ba9fe --- /dev/null +++ b/v0/src/assets/img/OrGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/Output.svg b/v0/src/assets/img/Output.svg new file mode 100644 index 00000000..7d4298f6 --- /dev/null +++ b/v0/src/assets/img/Output.svg @@ -0,0 +1 @@ +x \ No newline at end of file diff --git a/v0/src/assets/img/Power.svg b/v0/src/assets/img/Power.svg new file mode 100644 index 00000000..a4619920 --- /dev/null +++ b/v0/src/assets/img/Power.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/PriorityEncoder.svg b/v0/src/assets/img/PriorityEncoder.svg new file mode 100644 index 00000000..417325c6 --- /dev/null +++ b/v0/src/assets/img/PriorityEncoder.svg @@ -0,0 +1 @@ +010EN \ No newline at end of file diff --git a/v0/src/assets/img/RAM.svg b/v0/src/assets/img/RAM.svg new file mode 100644 index 00000000..92fd8293 --- /dev/null +++ b/v0/src/assets/img/RAM.svg @@ -0,0 +1 @@ +RAMADIWDO \ No newline at end of file diff --git a/v0/src/assets/img/RGBLed.svg b/v0/src/assets/img/RGBLed.svg new file mode 100644 index 00000000..299657c8 --- /dev/null +++ b/v0/src/assets/img/RGBLed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/RGBLedMatrix.svg b/v0/src/assets/img/RGBLedMatrix.svg new file mode 100644 index 00000000..cbb52e83 --- /dev/null +++ b/v0/src/assets/img/RGBLedMatrix.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/Random.svg b/v0/src/assets/img/Random.svg new file mode 100644 index 00000000..4da0fa99 --- /dev/null +++ b/v0/src/assets/img/Random.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v0/src/assets/img/Rectangle.svg b/v0/src/assets/img/Rectangle.svg new file mode 100644 index 00000000..f2ac9773 --- /dev/null +++ b/v0/src/assets/img/Rectangle.svg @@ -0,0 +1 @@ +Rectangle \ No newline at end of file diff --git a/v0/src/assets/img/RippleCarry.jpeg b/v0/src/assets/img/RippleCarry.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c1fbf61f06e9431bcebe1c2fe0af1c5cb53b6f52 GIT binary patch literal 17664 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 zNdaFxc$AYEzKVb~GKFuOXNpU;*W3*!w^G`(Qd&4(LW9oClADEn000000000000000000000000000000000004080c \ No newline at end of file diff --git a/v0/src/assets/img/SAP.jpeg b/v0/src/assets/img/SAP.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..79b76da052540ec1a57e295476003e558cc8f4af GIT binary patch literal 41613 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 UQA${o`xShw_t{w%TKs(JfBtH#PXGV_ literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/SRflipFlop.svg b/v0/src/assets/img/SRflipFlop.svg new file mode 100644 index 00000000..c41ff746 --- /dev/null +++ b/v0/src/assets/img/SRflipFlop.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v0/src/assets/img/SevenSegDisplay.svg b/v0/src/assets/img/SevenSegDisplay.svg new file mode 100644 index 00000000..bb3d2ae8 --- /dev/null +++ b/v0/src/assets/img/SevenSegDisplay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/SixteenSegDisplay.svg b/v0/src/assets/img/SixteenSegDisplay.svg new file mode 100644 index 00000000..ad05274b --- /dev/null +++ b/v0/src/assets/img/SixteenSegDisplay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/Splitter.svg b/v0/src/assets/img/Splitter.svg new file mode 100644 index 00000000..fa4a969d --- /dev/null +++ b/v0/src/assets/img/Splitter.svg @@ -0,0 +1 @@ +0:11:2 \ No newline at end of file diff --git a/v0/src/assets/img/SquareRGBLed.svg b/v0/src/assets/img/SquareRGBLed.svg new file mode 100644 index 00000000..7900e614 --- /dev/null +++ b/v0/src/assets/img/SquareRGBLed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/Stepper.svg b/v0/src/assets/img/Stepper.svg new file mode 100644 index 00000000..f18aa4fa --- /dev/null +++ b/v0/src/assets/img/Stepper.svg @@ -0,0 +1 @@ +5f \ No newline at end of file diff --git a/v0/src/assets/img/T-clock.png b/v0/src/assets/img/T-clock.png new file mode 100644 index 0000000000000000000000000000000000000000..66442d9e3ada92704aaf5c3e6bd5005242b240c2 GIT binary patch literal 47639 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%0Dv>aXGAiYQ4=zns+wkgne** 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 literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/TB_Input.svg b/v0/src/assets/img/TB_Input.svg new file mode 100644 index 00000000..c1c42ead --- /dev/null +++ b/v0/src/assets/img/TB_Input.svg @@ -0,0 +1 @@ +Test1 [INPUT] Case:0 \ No newline at end of file diff --git a/v0/src/assets/img/TB_Output.svg b/v0/src/assets/img/TB_Output.svg new file mode 100644 index 00000000..b62e1993 --- /dev/null +++ b/v0/src/assets/img/TB_Output.svg @@ -0,0 +1 @@ +Test1 [OUTPUT] Paired \ No newline at end of file diff --git a/v0/src/assets/img/TTY.svg b/v0/src/assets/img/TTY.svg new file mode 100644 index 00000000..208e42b9 --- /dev/null +++ b/v0/src/assets/img/TTY.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/Text.svg b/v0/src/assets/img/Text.svg new file mode 100644 index 00000000..db86087a --- /dev/null +++ b/v0/src/assets/img/Text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/TflipFlop.svg b/v0/src/assets/img/TflipFlop.svg new file mode 100644 index 00000000..50925f80 --- /dev/null +++ b/v0/src/assets/img/TflipFlop.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v0/src/assets/img/TriState.svg b/v0/src/assets/img/TriState.svg new file mode 100644 index 00000000..d251882c --- /dev/null +++ b/v0/src/assets/img/TriState.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/Tunnel.svg b/v0/src/assets/img/Tunnel.svg new file mode 100644 index 00000000..ff5b95bb --- /dev/null +++ b/v0/src/assets/img/Tunnel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/TwoComplement.svg b/v0/src/assets/img/TwoComplement.svg new file mode 100644 index 00000000..6baa7056 --- /dev/null +++ b/v0/src/assets/img/TwoComplement.svg @@ -0,0 +1 @@ +2' \ No newline at end of file diff --git a/v0/src/assets/img/VariableLed.svg b/v0/src/assets/img/VariableLed.svg new file mode 100644 index 00000000..e2829407 --- /dev/null +++ b/v0/src/assets/img/VariableLed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/XnorGate.svg b/v0/src/assets/img/XnorGate.svg new file mode 100644 index 00000000..4a8bae40 --- /dev/null +++ b/v0/src/assets/img/XnorGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/XorGate.svg b/v0/src/assets/img/XorGate.svg new file mode 100644 index 00000000..639b4c0b --- /dev/null +++ b/v0/src/assets/img/XorGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/assignment.png b/v0/src/assets/img/assignment.png new file mode 100644 index 0000000000000000000000000000000000000000..c27df5bc834f3a776bb4bb97f903d45c1d4650c7 GIT binary patch literal 33699 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 literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/caret.jpg b/v0/src/assets/img/caret.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a382f8daa86f7cb0127faaf81dc53abd0e760535 GIT binary patch literal 11217 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 literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/circuitverse2.svg b/v0/src/assets/img/circuitverse2.svg new file mode 100644 index 00000000..23dd6118 --- /dev/null +++ b/v0/src/assets/img/circuitverse2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/circuitverse_black.svg b/v0/src/assets/img/circuitverse_black.svg new file mode 100644 index 00000000..eba77c2a --- /dev/null +++ b/v0/src/assets/img/circuitverse_black.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/circuitverse_logo.svg b/v0/src/assets/img/circuitverse_logo.svg new file mode 100644 index 00000000..27202ecb --- /dev/null +++ b/v0/src/assets/img/circuitverse_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/cross.png b/v0/src/assets/img/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..bb7126e2a8083eee1f63ee7d714db1d45edec46a GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAIz3$+LnI_w4>kre88WaO&~9K< zh($ literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/cvlogo.svg b/v0/src/assets/img/cvlogo.svg new file mode 100644 index 00000000..ce4f7e59 --- /dev/null +++ b/v0/src/assets/img/cvlogo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/assets/img/default.png b/v0/src/assets/img/default.png new file mode 100644 index 0000000000000000000000000000000000000000..8e183a8a21dda36485b94de239e6e8a7911f982b GIT binary patch literal 7548 zcmeHMcT`hZw~wD=nGyRq3`KzvML+=|0uc}el_pJ5q{}EJAVi4tDvY2aMUWN(h=`~N zh;#@EMQU;>p(i1s-p~Vt4#K-Pes9)$Z>?{=zrMfTbFG+j_u2io_de%_=SBuv`+pJq z1%W{9*U`Ru6M@);Lm+mB?A-}bnuQYips$}CuIOJuAPS=QZQAaFo<;9#-_%DSd`}|~ z!G9qT>kuh;9D(qVLm(#aArKdn5D5N9_zGiH1Y*a6(G8Pp6SMP^oQ0`5?&$c`zzEnk zFxb^cZ|~{_I=U$Boh@xtN=H{)S1+}vzlYAG4~`6h6YObDKXa&w(pKM0scmQ`)iqSr ze5)kYmRD7m5l9uJT0(Ulv9`XZzUf;Nxslx3)z26NC#L5Y$!*jMVohyhOCzOiaFjj4 zSr`}^t!r#)2HJZWEY=8E*F*-VW{GtT4J`n31Y``35JXZTW=}R!T3Ms)j_y7JsjjS& zSpBWBhc-~t&`e_ulfE^U6G+|tjDg{?va0I-fx*GC@yR)EXD_X_vxiXgjXg8h($-O3 z-_*w(>gefjAh!b4?$SykwU<`kLSYP#P0cS3433OXbEY^8q}uw4*@e-Gsj0bzv8h?c z&}e0KU2|)DMO95RrLDcYZ){?^mD=6j-CIGb>0_`u`{>;?Mpf-MaB^mZJy}Vt85{w> zHMWdS&VW-h4b7C1iD?FFxPn++T2Tc~bEw^Yls0NdPv77edtzpeJvCcZTmP+@!W?CH z_0n3}JG*HEKxfY|I8on3Zf@-uVo%mJG&i;Y&&5D|%Zr1VS)e=js&`Z`#bjT9ELVZM7|M zMC5BhZgJMY@q&w%&WMvof9pT<+xb|H>YFov$i4aFk?yFCweRCoO%U`5nonAp$U=J4eOh>7Z`=|MM+_U{3X{%-tf-!n}(b9c#hIrB^AVxD=df`IX zC-zyV%gnQvjF08p+H~D@U45%bY#}ttV|NH!%-;@IMM+saEqgip*-(UXEda_UD$mt0#WfJFOBIFZ;EDC<<0ykvKhyn{SU1&E6tPtl_WqUReF

HVKS4XshDWUUmAKLiwZUQ~US& zqcZ=bS`vJ?g$YPe#|Sbz{*yO4&~?C6L?aDpvvg_82 zURT^f%kw{pHkomUN_rHWx?5@&l$xJsgV{9txLX}3_|Ursq9;|=!wFk(HR`hn&2b7H zk`spbOBro#<$4mx56l_e5sOkO$jZ7u^Vt#a`9bvCVFI%uKR6zUJsD5BMNe`*34|X% zv)66Yy3a8gr0Knf)9mrCVJHQtKL&kYUNtyZMb}0g`dX9!p*lc zS7Pg4cOqqhl1+(@uSm^cU5C74LBi6paLH`645!GlBPrf~?|DGW{Jl@@AdrhGR;?tl zr!}4(&B@%&IkX+VqT|5-P5`|d{-Cepc0ivixc$~Y2=B~rsa7%e?*!n_-&~5`Sv*3F zJ=)Xr3htHtWn5N&|E|BKVZtl>82eCDp1K|A1bfKFnt`mqwXB24ZLLv0Z3VeLq*99i zTNCSwN8t1D6zhxbzEvHY>bmP^f$Cr?123gS4A`6;iN0|IWAYv+6>lm5ir6qw6(_3l zTB&@CYJf5N0oKp+?akc!^jBRXscHS&8@)hkmcY0(E|Y`5q-6Y20yxCd5$@f(=er#j zk){6l(mR21LtN%U;mEC}-(-*Uep<2F%v4wONU(o%5G|AIiYc00(3-rJX+b*+Tn5pB zBg2`+?_7%48L`+u08t?Mefj2}S)p=4${v?Whd*m8Xk$G?R~l|mpSI{Zi9rkk`3b-bI zEw1rS>PZOoS(mx%;m$grh=JwP;yTd2Vd#p+sR4NjwzFT6CR7f70)(-r;x2A>6th^! z!t5T*MBA3?5>g`0(2NR4mbVA<*jB2!mTnLSdE}+yZ7B2LCiw2_q$;e=E3|a+;e`}r z<4Q|7yshL-KB{x41b+s$Z9kV#GL@XQ790p?ls{C-JUQxUr#*VNhAwu(=t8Bu#2&mP z%;-O-2rA%_5+2cS;vkbzkQ4orYkZxSD(s&hLz!Ys3`W|=-MGy-as~q9_yOkl;{^48 zFs(bhYm3aFAXJ11Sp&W$g&=K#Y>)u^f%N9LA$wBs;?auuv#^N=bN0lvSK{4zcaTt~ z%j0S+e6!O$aLyYxUL`z&8TZL&GG3hfTS^wRA6g@H4tS6bwj>?f4~vTeT8du{u}d?t zou?odTn;j+Hk)H!3WnGKn>lop?i2m#EP-EA!4w@4O4{DRisWT~+##K@z-u{g;`jYTNoDe`X(d6>7QuUrT^ z+MPpha~qng)3U_?qj6;PSz>|*PGrAB&g8PGLSO)=IhaX6Y8G@_(()V#Y3Enmm9b!X z6l-hz7<%`58aQ72xTF*Gl}l{B7O|(odpp#pgb1^%9!YKS>>(W1y>h9*%Tudx3q~hn z5G_-s7C%;0UUIzUU3o$0%nJ%a@C;xyhm5vNZ1XLI~KGi;} zcYhwzt|~~;NRG3}WKG?N8_Y-iqDAu`K#<>K$wKhPN6NsWRB_jx~=!T{YdTX#v4ZmCuREFBLIwqjHpW@0Yyb9Ez%7_7@Y4`;X?AR0a-VZ5kg;GY` zWG>Mko)lZ{!=5ivoDHK6Y*m!oCu6dR!OU#uacD-Yos1;+-jwEktWkd?*3Gl~lp^%UAk$mq{eTLbN{*CNZsQ}#^Om-aBBE(}7S zFss7V5`5hMRC|WPdVUQ$kP6MLAb0%{j$fKn!-z$wy0Xsx34m_RG*Xs15z0yCk6?ZBlBWJ|1 z#T_@u@Z?O_qpRQW=*?Mo+UylW8 zG(+gjy^l*_5=nK9$GcAq{QUNqbmezRY>BfVWZ%D0-G-@R#Sy0@nrbG=uMnZCbZMQ2 z$^^<{2>)t7b1l6Tt2MATDkQ{C(7hrY-$2}oUt9JNG*dH#&mPj3gAsoAN|W#a-W{3s!-UyNzAt!&dA0MY10akr#MZN?$GI z+hR`q`^bss$&Jx7tc_7MV`Zxo0zO_Uvq8xUGzSYvC*8ZiK26W`jtGO`Ry5HRxleD5 z`uygvPamtcgr4EfC~`$q!X5c{MU^_@3S zPlU;fXvf+*!50Je_FW{ErBYeA1cpl5u+BoTXc~bJzT9MyZ$nnGB;2d+1G&eoG!rMe z@KM!|M@9N@&2hY{Wwa&NeMuM|f-BfkB&^=31@8m{h-%Zy*fcm2wV0MG3n}!G;bxd$ zM(0K9Drgth(EAKRZt6M9nnJj=x+RZ@e^JaXV#0>Y&tX}fjx!t9c@UiVThf(n;yZNh z^kHnU=3qdaSOQ9CjCmB6n{c|GWJj!e-?32`1$l)^&k^X2y|=`K!B%uI2w*a%cpZ!i zw8ab>C)9t(JqJZ6tIs4NhWlg$HwdC3R0D6d5KcV5($l`0$cBjEVj_GrZMW4cm{Hyn@pUzIu{Is z)4nknd8a2i1*^05cx4lIxV3qYHRXPCb9=!|-z1RTPGkcyvjXs?T~u6s@dPgMoS`Jq^#>=M80bc0S5o#1~B z%GVxc@65sxx0`?v6<^q@S@h&AA-5-6hz_xM3s>ku#0}of zY0gbPs1){MC82X8$Cjhm?U|zDlLm*9%^s1@rh(U+REj*mFc~^LkVB!&Z5rshxK0a& z$+OawyyjjSLD3kH`;!f2R0%N#DMI`baqk}S68oCj-b2YgDM*T|ol2B#Xl_q(_T!a+ z0sH&Q@2iEK^i}VCjHncc&p3JHf$K+r7n`8&{e51~9HU)Y8=)dBE@xQtEJw=cw=vPa z7Jdb#@}!%3VV{BgqFy+YvjbBOr-}E5hVHF!#L}Sy7KO2P$%dg}6dqMNO`OxWoLSaK zlKrIxY86FRZH0KgrI87!phSyvuAXaaf^|v`TVH?~OHBy~V6%jBx}p|l)H%E-3IwDf zJ*s_h)cMBjbXU8(D}wwS36FwO%%1^otBwuPww76Xt}Cqx_M(3wwK#1h z8x~eBLG-o^XFk7VxU&VhtrC3*nNxHc-J!DJdk9ZouU*>2 zT+4`Onr7lkRUv%B#e^zdROy^o6Kk}{Q_7zJ^_tAUqvl0fm*!Y<|?8x-ho8tcu8SE83>3aSLqSjIh|}y>d7*+NPXq za}Lw^BcNWpS;@CvgfJN?5vdzI&ponM9QHa>m8yM%OXW_?e?w=0)!#|;S|3epBbRmyI<@+h#-VVaD2&rYE0A=g)UFbE0 z^AMg`)L9I$iUq9a2Mwg|?}ZBP&>dW6C&=Rh!=<5;4Mv`X0Q;YdU?dOklh8JA0sXg=`Vz{^ zKNmY80jNA)Le#$(|7H7M^1;m73XtS~E+EvQE`ccjV*!&z0jNR#bHVcwru=j9zj=HT zxU7s$!@ZoSbcW3NCz9Mo`!@Lkl-x|92H-4c8OZJJcm@R&r}WP_VE5s8;dJcI=Y5%~J=buy9|wHun_ttICu1-JDkm zpuk4!~a2VB2r@5X4;rIBhxN!%YpF8fE(9|M|`TXn1YrTkYi!}Nw9;x{Z9r&nXY)*eUUigD$8l7#Cy>_he=a5Y$ zj>Z(yG`$-XPNOZ&CrAT2gvKW!hZ;GPhUU?%2TooEzoPE?T+BCK9KAYqH02w=u=HNz zH6tOk!K4D`VI*Eu_HBHk!EL&7zK%=%pqV{^xHV0oGi_}Mt6c2jJ}$No(oh0n*L^N|ntOODN=xKUGTmK$l;f#Q#)Rw+ABU1gFs zn$uf0XB0-M!)cOA>3kn2$D{pg#7ZLsN&dI$!;D&a#w)9#{JGQHR?UvFvaQW0K&+$!-!;4`GbJ^zp+J>QAQ!h# z>d)JTWterJxpr`tVqoGlzsE$zLB|z$<5RwjTI#KK*CjvlGpL%@l?&AlxkL@nrcejJS5b|>Ja_8g}&dHxQIgh-E uRJHLYk`Hn1^92J2%T#NSMxOPh5QFS(@^IC literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/drag.mp4 b/v0/src/assets/img/drag.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b211439caec8d453b07c34376e6f4b8c212504d2 GIT binary patch literal 43892 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 literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/edit_icon.png b/v0/src/assets/img/edit_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..32f99fb15b2e2ade3dd74e7370f97c9659c3fe4c GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU0wmSG7d!(}Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4Z?C=OJ)|JO_CWfepiCq08;-sUysy~SUEnQY zzIj40q4~P}R`sh*Pu~e$zA?SNpz=^ShfDM|S&KUi42VR^8v`vqM-a zW@^fzt>@)-eL=gtB8NVUW@q9i4;B-JXpC>2OC7#SED=o%X8 z8XJTd8CaQ`TNxT^8yHv_7<}FR?+S{B-29Zxv`X9>TAsOO05vdpy85}Sb4q9e03pzz A@&Et; literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/embed.png b/v0/src/assets/img/embed.png new file mode 100644 index 0000000000000000000000000000000000000000..520cee0bca855e2fff6ec240b31bc182a28095e9 GIT binary patch literal 27061 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 BDwzNP literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/facebook_signin.png b/v0/src/assets/img/facebook_signin.png new file mode 100644 index 0000000000000000000000000000000000000000..e78185f0b4515999078505863203d212633ec7c1 GIT binary patch literal 5050 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 F@IN^8HJ<qi;4hrLdZ!j<%!~HJ4 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%0D$Jp-c7dz7cAH|o2zAp~sfQE*? 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 F{0A7tQg8qO literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/google.png b/v0/src/assets/img/google.png new file mode 100644 index 0000000000000000000000000000000000000000..2accb4e6e56d6f5bda516a6e81594602d7a77ce9 GIT binary patch literal 16985 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 T!G!MXh^3;asZjpLD&YSB7m+7j literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/grading.png b/v0/src/assets/img/grading.png new file mode 100644 index 0000000000000000000000000000000000000000..166ee57eb22c34019d2f4ab1561a99bbca71ce8a GIT binary patch literal 26275 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 VF*o>azzwT3E?&Ekea_tPe*o)2^NIif literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/halfAdder.png b/v0/src/assets/img/halfAdder.png new file mode 100644 index 0000000000000000000000000000000000000000..7c9f3f0c1b59a3854f0deda28e7351b5a23b720d GIT binary patch literal 26281 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 Bzrz3k literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/help.png b/v0/src/assets/img/help.png new file mode 100644 index 0000000000000000000000000000000000000000..5c72dbb733500993cd3b7ca00792d5e5cc5b221c GIT binary patch literal 18810 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 literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/iDecoder.png b/v0/src/assets/img/iDecoder.png new file mode 100644 index 0000000000000000000000000000000000000000..d55e9bfa1923ca43ad918f91deef2e7a4533ba8c GIT binary patch literal 68782 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 literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/implemented.png b/v0/src/assets/img/implemented.png new file mode 100644 index 0000000000000000000000000000000000000000..6766aaf6bd9803ccea6e7f6353f438950f924cd0 GIT binary patch literal 14155 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

Nlj6MuMWu!=Vh&=o4a;lR*bT+xR?q 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≈Lx)S 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 Pe@xxdyo0Vp*@gcP>R*Q? literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/logixBanner.png b/v0/src/assets/img/logixBanner.png new file mode 100644 index 0000000000000000000000000000000000000000..b9dad5d557ba7bae511bbf9ed94157ab37852361 GIT binary patch literal 25633 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 Q{>=wY*AV?o+xGtd0N(%-x&QzG literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/logixBanner2.png b/v0/src/assets/img/logixBanner2.png new file mode 100644 index 0000000000000000000000000000000000000000..9e7b044a64ba1e37cfe733310ea9209377f413dd GIT binary patch literal 24713 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 literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/logix_banner_new.png b/v0/src/assets/img/logix_banner_new.png new file mode 100644 index 0000000000000000000000000000000000000000..13d7fc635243f79d707d0043c859f32e74204b1a GIT binary patch literal 143965 zcmeFZ1yq#Z*DpR;Ac#mC3?VHb7J>{VphHSYw}2=}cMR}V8flOQ=@#iu>F)0C?wI+X z!T5fEzxQ2tz4zY#TKBHIUY5%E%z4h)XYbGc?0uf+?BgN%3XY3?8yfFyqW+9tvIuBp@R! zCx{9kB_GD~o9>cV5{djFFZ{DLC7tgY27PHK`4Gul!l|q^RB*kkx!+U!W#+vC+A*R+ z7TL8^w)Y{!7HK_-Yho+mVr+W5I|xbUgJ?4&+W@vM=K&n2;_*m3f=Tkpor;c&zYsNy z{~KC)f1LCk{P(raKg9PHit+0r-yd3Zvb^-W;o5J6R(*Q$Kl~o@Zvz@n*LvXbo_;Sa zElp3?A1N@n!)|DQG#3(Mw_cnm8p5+bsFg0CRe?CMye*F&?0ih8*x1;7{eibutuef) z!>yV3r>Yh9#nP$T-fa==M%LCG-W2Gz=aTZZ?pvR3HRLMAI2^yftvm2dRo~E%yck++ zu_AZQ@8|QD5mQ&6Kv8&mk+M244HO$s@!#XH-qeu$Zah`BCJS zZ#)#f$nVEjaDf{d3BW(Y{``dxxwyEh9lt1O#zQgA)%{>^1Z|TyQY|MNl@sIR(QHo* zhV$grZ00&+1s2+)N-fuv;#YQecWYaw>l81Fi;J_C?{?d5l!uhIH^TIXhljhJl?y(E zSzh|8q;0R;5sf$)voeeEqb0uux_xl#+yJhwuF($1OBr9KQ&mdL8G|i%=G#cstYg>T zPrKldcDuh}7uVOBjq^*9WpWq#MJ%+bN(}Jz8uw!{`Tk)VP9TyKNIa4H6W_;m+XGFB^jpngk9F()0_bDxx4l>^gr+d`;SiuTyqu3WwS(zc z!CmLdCu(qTj)GbFl$ST=QwQ>;T3&Mc>#x7&=jSuz)Ya9)dqKN%%}9RWv9-08W&x_M z!_ z&NT-=)@?tX@o_}%#Hb_o`VRA{1q1|Q9FaC-`~&GFkZVScF#E&J(v6BzvxRo?h^P65g;^@a+aC1Mp^tT6 zk=;llm~J3tQ3@iiRh*Y_*bY29IiN6{Z1krtG@7_S;Zxf*H)2#d*4-V@r>CcP+-BtP zn2ReCsB0n(sAjCx$`N%k(XnhZ>kqeF9W>cn?t3lajIcXcAA1(p-rf#iob=FxUWkjx z@+k>k(GxV#e@@=NC4^P}UT{XrF0P;o0jAqf=qw)WP9e2bykF(%9P8F`M)slVo14P7 znILOI-%baMOtj?qFWH~$uQ8nkHNngmCDRsaTyVDR#>$ZsDCEII700m>3!rPKEnr-< zp=yOS=6!0P1Z6lMT3o@zBy_Tzb?lj#;MMQX z$mma#O^@4gcVQbF8|&cO5tB>L&u9A*GPj;l-I6)3^ND z`n$UPJun^-|Var?70Zcw9xH;{``u16|x}_LU(?Ul~N3hGzLI(<5mCkg(Y*r{` zg_QYxEmhf?S>ZcnL0|2UyM2UxlRxlyRS!l- zfNSpCTzvSQ=3u&@prAxkWL-y9RW)&g*Jx|H&g4~?vhEEXVUyiPv^fF17-L)ER)XZ- z*uK_1qh7kLp;Dip8ctM{e;CTi=s(_Dkj*J%Em%L3cQ!$s0Sa6Lrq*<2kh$eAshPt+gij9O;#IO_>3=^1(_L)wf z&!4u}gqX7!Z)s*IWXEaan*vvOIlzpvvOe1zkkJAh2o*592xhbsI|eNE@^vI*cWIm4faz!JMZ8a8FF!r9+g~j;g5p?p4}vkyV@;=z{qa(=4yP|iw-tB?)#o3sWa$&YZ#&1$He{HvySSJwZ_31!8z8Eu`$)RyNw$_mjUl5;S`A7 zJzQUhy(AqLF_z6=YGe4W1d2fK%CUuX9rZecarbzMQ-t0nZK+B>!U)Eud}26Kv_Iuw@{Xs_+UAJl9_`dh=P@sd(i&9ytW3lF%UPb z6Wc2E(rs%FW-`m-HJcaP8l!ML-70l-#v#2=1BOVFLJQFRiy{n_f#;Sy{=g3}$N$<2zwyLOmpgi_I4LW1!MC`)eaD zT(+Jg2AX`6+asSn>`F5X?(XRc zTtBjvQC3-)uJZzBgP_A}Rc)t_GvGd5+3@i2S5ch7dQfiLC+Yc)C?ruHb(M9ukJu?2 z9ywQNpHhXrjWblIzyEX!&yfK+z&>tGtj9EZ<^o#m{Q&>MtSEiZ1N#=H|9n~twL*1wOU7z~GtMsy)iIh9Ad>iqgClf(FkfHZ zvSGa3ju7;E9)_+aL9e1|N3X8b2x2{Chy^2E^NR1JQ0QwfCw}&IvUAVV7)aBLRG>h zB?!91{vdODP#RxY$c`N_?Pen(A#qO^F!dY-w^8MprQFKq)Q>&^!Eu{~sMm?sMh~ND zYWzdRrO!G*)I1M}8q@FL0KjsouXA8;+ar%=xkW?nBld@MVK7)nGyG;hjkcjnCmx`nQuYw0QVa%^ z<+$BMZ}lkvQ05hC>FtC4UKt5R1(33yGeeP49(6Y3SI&)_y6ur5Z`6ZB z=!&3>mFjd0lhvP!!)Uz&f~u>lcg1;*7vnSfSsjmBp2Q)MNb89Vjrz~G{5=wEpBjxv z&T&!xjjDI>8ehlL84x`5;Z7$nVA4o`lcVi9kjpIJqEg4a3rMU@Z*8KI7ZHd~V9`Ks z2a3MkoSDgZQpJflHvb|+TmdY9KGV?MX(EH69390>kU@BZ^hiC~9wxo4yc!i1rT9FO z6rCO8kT5Hhm@frN@D$tbEnBSgpY0b`B6ix?OG`>XL{N!iZJKaY$+U+Bpb!{Ikt(MT zU5lyHT(?*o3u8feJ-%Jwx*aVlDK`e5R-fbZ47VO zGWjthPt*(rsu6qKdd9nVaDA-QYeoW1SC<|T*Li*k-F$6j*OIN(Abqh*yH?0o{dAgC z@p<;3J6u9;rRuMXsnPQ42)6XTk&y^fk*v%i&@#m|@Nj~ZRZR>S=6rEPm#TpA9dWWR z^b(y#kCJA2O^Z&MOooiW{Yu+`kGH5SB!;LRuc)KK*FC-_l$OFsI+>O781yv&7#=#& zyke56jzOI+xKTJ*w;lz*{Ey z)m*c$pO?JIw@gNgkF)#XEFcHtl?7V;$)_{~5pwr}MV{VX>CZfo`VhiQqbv zGYGrlbi3tX+-}1kPTthaWY2vDA^?8Aw)fn@z^qZ}DFtrmEOY8DOeu;a+x?A+7-BB4 zD%kQ+6(iPd3lG-cds$jQ$5}Vcl@^DEnQO<%$$7rsL1*esE5rHvCf#4W>sPWWqp`tC z1R1h&3RHFb#ex*Abiin>KL<*=)Y2eww%h?u_7W|~LtNU5ZE_s^+um1-?WBv|)OluP zPs_KqOzeMQQ6{LOAys_&)DSF_f^Ofud6VH=F{2#y!^?Wtc6d$KCMi&d4FPjHW@cuV z@DEeMzfBlwEtSr!TJoguZftt`%AHD9WHRp=V>%m%PaL6Qcn=`o)GNtFd(`aK@&}!A zcYP?%7U9_#Yf)C?9s#UpM&Cd(KL<_CQ&9ebLNC|O!=6~e&HDkeN9|S>GDye)zy{z4)Ui)5ovDV>Km0PYQt z=S*2@wV_sQItP}Yxwe2kL7dJ3iLHXN8CU~7kp+bHQ_~QDD_|qjqv*rrN^}D8({a%s zKv$;}rIuos9}xX`u(<;tlZ9~BSxJy_0U4^eH-t;boE7~*h&)86bT?rHA|D^%1c2Kr z!7{h%CY)awnbQOs?Ag?@G+4Qm zK!EespG|0jE@_g`fR53vogVr)2T-C5e!d(ii5QDUfdyC@HDEu~v>{z)mC*v0>;a=)C)SSUP@>LS=xqUV2#eUR`+p zkCM_Glq-6D#1@Dy+@&Ocg8^BudOrs2RDbQa>q9Ng*XvrN>hI{@{1$^p`n{*sg*EaA zhQma02;f3KE1;z+Ka5rN?-^A{aiD@uw92mCf}D`HV1IW6pT~d_K#T8=*%{#C|M3Pd z>EXUAoZV(gx~ixWSxmX|-O`YC^(->`xldXYM6Nj0gw%5>WZ{uz+jOP23(KBoOzW7A zsKpa0cQQblRWsx0`L#x4fcY(-C{Gxj+G?Hb?|=FBMZHXky|Ci+Bt$~xS(h{IMVq-y zgLfYo3fbhZMr^c^w$wEoC;)Vrqal*3TZOF4xqYZP8K&A%E3iu>Kk}tOg4KSw%Jr|Z z?Ico{#ThdS`EJ<~>co^?4stNC6Z(;-#{RXzN(DLgWW$Q@3oZ%cRXvq9$7=#c8%J+D z793HhKV~TIpM7}Wt`qWxv+~Uj?V0OEji8(wDgb0&TVvcqkR;S zqF?d^`j+vF7h}aZWV?C9sceXxAP#1VJU(iUfRPuejiRPE4~;{0PS+1%jyCkEnwxW- zA+cMt!R(5Wi<^l*R*nbq4c?13=jRyd5Zy%^o6m~o6WZhtqHngHdF%>zeDLM(J$j+* znZ+Jmw*B-`7M13eMIW-`f!H*!N((c66z_?EI8ZxIDXH9F3~?1VSf zP3iPM$VNlU{9m&UZWTgfp97)KG^L8i$*g72xIKre-qxtUj$Me(QZdnX^GY%GqR(fs z&or5*2!WHDNL+7R+OdW7sVshhMy4#Z3BIB|{w6{HBiYCj`;+Z2gvxrpVrpkU(hHLe zy(geC_r={5flOR3!WBikxQwz=>;qX^6M&B_b9Wvk@f^d}`olyl1hxm{Ov%U4HbY_@=Z6e_p}&r%T+7 z7PcF~W!uYW#hv#?rFmT4J+0~$Sih#56&2Mo!j1jIrSlZP0ih`|pCkD@d) zslX1f;cFY*t4&qee$y^=CM=Wnv)&Kz=29YeZ+ry`yr`xhQ2lp5*REf;w6L(Sv_wug z)}h={kC6``n+zPJ=J2>1EF-1N??)Zhhl@9PlO4HKkL&>=0Qa4bv5OvKHTwqZp>?ae zMZ~P#&d#dT3##SQxZHl6gxi#&HgkPwiU7X0xU}>>m5!WbeYE&7L^8sx+Ru1gASv15 ztoMu^F6yfr2#+#ZRxrsfs7>Cdot=RW`Y}gw zO>v?)Nle9-KaN~AIjMmI>HV^~9e#M@A&pq_Hi_?Tc|(1})#PkHjBUBnSvDF$t6A^A z*q4V{8V}~Z=H8@y%9#5jfJRS}I7=#o&))qeL6YU^_SWrB`~7X1a1`Q+wtLz3TMbl_ zla}Vpz@5N?mzqVA8-~v>k{brO{B1yH^@=iDtwTIJD~vmE%X$p1xxOZzD_+?B9zGk9 zrur`wlC%hdi@8b29%K51fuD!1t)3Sxmn|Yy?G`LVs}ZhIJFlZp9m4mm6DoriB)U;8 zTuvFU-P{8ncvo`o6e>{d?%k;%-+rNHv*z<1*T;p1M!j@OKRbS_HzS!}ucOW8e&E;z zo4K~V^Wb82$q8yXsCfy}YiHmMx{x+XUFuF!px+(-IKW>4_-_oqpnA+-ee}d@u-N+T z{$r~ALek2pHbcMx!)Umy`alMu7*4m-1O$acyYqs3-b6`Gjn)kB=?kE54=`5NV*c!) zYrd)yxxfAX$HFT@o4I^6pMtxLb#Wm@xpeo>3Kz9Hst=%%&NQn|uU3jC3cx$<95bKsA(A1>H>3!XvNOySr$+fR2#-6=PHIO4 zt~cJXnQcP|yJs6uMUd9Ns`coIxhY+$->ted5#w3*tWh8B;oo5ws=!MmRb?3p2x&if zrKB#bP$(k(Y;ySG8<$Sk1@Jh+QnR7v!G|W$n=C=Vr)mn>lfR_83~K`Wm!?8e(le zm^IJ%InVl?T=ytP`7il8w>Cz6DgzxsAYg`{Ax_Vw36i!BTN~Jk=&7?Pj$#bo@517> z&N^+fVn}m>g~3~)Hb*c&NoLYJ9Yz^8B-jfi{om9hObfrxm3$f0bx0}@#|`sm#{?h% zeS(e~GpH|BseFg!eAm*<-#(Ji-##+qsVp4l6$WxN)w? z)SqISJ3~ToEa3ruWM`dS2zj~zdt>no2F|S`!hcFPpAkj~!^$kolM4_@88GP}C$-y= z$&JPq;6tN6;U~H}@h@oHAA}Yke@dU3P+df=9P}-W(Qde|>coJzYQfI4@0e+*Zdt6P z+)mc`AueIDByP)Yf2ixFTj*uQwD+avr(Am=y#*NmHOI2@!!=wT;k~=QsRl9vf~QHo zt1EH8rbp)EvM|p@svK8>j9(E@9alegfXXK(faqokmj<)@yO)err6FSnfs8$mv0ZeNp_CfB0;_QNF~FWFeBbUQXSY(K@c46?gZAv5L&Zj(taC1?R!AX_ zi@HCWI?s4GjH`a<@Ku#j%%MSBh&?j0gLPHm<|Clui~IZ2h5GeJ9cJA-^h3Xh>D*|h z$^>*&#a7MbE@n8&<}}HbrnWb~13;t7V&{8IRYjHMl^fOeZRUd6S!t;(yrVtuLp0bdXC){`AF@spH8B|TnikVw|pTvn|jmB&T*@| zETrE&>nci)nKT_H+t-#hSgEesx_r;dWfiFAG#SynAn$wD{42Wf!Lgi*AE=1d0F4K! zo}7qIWFg}@9nuYry6-&llST8`;VJ)qWkwo>yt~RQk)7VCmgzu3DgQi3)b=D!9HJ|^ z&Pac=K9mYFUt`R2)oX7073unuDm66bMWnArL=>1RL5W+&<=3Ll44_+S+Ym2HkNhR?1$N}@dd%o%7cLHr#5JRdDQhPJEb)Ki`FRtBqw-KE|C{cZ=d`EI z+RodI@P~-G-Q^hOvxaVvth!R!%(0Omo4!H8qOkS>(U{{(yClQecp(1zB}VW}!SYho zODrd~2ag~~)@b5M6yPyKIOKyfWbrcf#Yxn(A_fw?JpX^F83)-dWD-@jPvyg|m*anUMO4T*nRPz?6b^3v#Ku%Sg`0azKd+l2M_fM5S+ z*gWcY@G4dG^H$62pdIMH^6?thF#f**;{THF{ND^*X9kZGZep!h?)h#R7e1Fw#d2D0 zEgNJlq6Uvzs$$Rx2J!y?z@^nN(v!LvlWZjC0$**`jq0UOpgDTjv=GsSORXQMN7IXx~HlKmT75Y)~MAQ+G zgAxuNjiDNEZlG=taDvw2*T3u^Z{mhB1y5N>s{LyhZ zg)v!!CH^EAc#H>dI9Zy|gS<>d2;S!WMK(ox`?D~Y76&WyN0Ybc+_w`dj2p@*SnCRt zvKnXni|lzV)b3(^FDG>*sT^M>+p89kyaKhPVmx*kKl#&WgFW;5&7RVon!Ah1b6^wgt5^)8n|yq0aAf#3s-P;_q$pKiTuDsC3b9R8WH&IW@dc<1NcSjMu^ia%Kq+`IStUcVtRs=KGx^3ikTYbSf| z+|VBy!Sj9o$Xv~dI5BA9_xOz;-af1!G^Sr}zatbzeN!N?YSggaSk39h%qkgJ_W@fZ zun|7<(fU2sBuCKI*7Ev;JKyIyd_Y#@wC=t!`j_3j)n_RYn-iIGt!pQB4pTL=SoPMZ z&2VWo6wbF9Rx3Ci2RhB!WCu??MQ7RX+HPd#Z>Q(?+d1;Y?0cQn%r)T)wvOxS=LQYr z?b{w5@GLm3H*y*yK_nOAx4Pt~z6zZD*@g305@@ac*Do{*qaOnN&)xIy!yNmT!yuVC zr=%R@T8)P@jW@Jz+_-jG$f-sWD-8oetMDwA2HWY$1%d}8SUNp(s&Ca^J&rTCHd2(4 zAD>nVS5k~iYi})8%58m}{@!5xt-M8X)DDjo&85-t1}@mbD2fBYQ|9DiH`kDhIfc1?)k<@R z8qcNYq;3aa%=#Q%Q&l!!{*i`;bWk2FG&|jyfjKT;OVm}{@oCjCG#(3C(fcxR z`kr$G8oN3`x`MNh|3^E5aEXRFR;$yal9RU5Qrps+m|e9+#G4hu?3zjMc6RK%?{CbOY&s$Qy_nD6s~ZvVG9s{6Ms#?DI=M(?1n7 z;%nsVav3JEeocOAx40*}OyekeF1EK-f4nhWF3wx%G`!Fz8mM*Rk4?ycDHvlX~L+d)j_!+GI zq^s0Um2BueTp*22&`}q~fb!+Z-$ZM$0Izb#n1Kh#Po_y~&$AgJ^Qiv~t7h!&-oy~tt5vMa92V=Zb!2pwqmm0=wb2$!a)BGh|HBRP zhhLkFNsNz2mn5B30wRjuyjgBb|MHsnESGMcEz8pR^xp|uG--bmeoW?Hb~x>Yu}b|* zkBoWLE>Yol>bN7f`KtjEvQJ3QG{(#3St2Z*w@F@NG=D&iTTLL)>x!S75wO9w&8ZB>v>*L!>Is%I;FbOM;e3PWFiCGg@AWxX;8TUG3w%dc{@F;QP%kM`a3trQTO zE*~1IuwhO%%l*ow#w5w_nealN=z^*;9j+|POCS^Whi#NS28*JfmglR;qkcTl@j2?u zadQnbR>RI=@Nt?F_Rg0Tpd55AUGIJ8d?|Havp}g{p%^$6;SqJlI$H7lwBr4nanmT^ zN1)@z`~kH)=rz~RhWxOAgH)UB>+QU-J;haIpn9~*C=g;EJ;iEv{l6RX4*MsTeyMLq z-YH;n{+N&Gk~=)Z(H+l;`Pr?ImX;P;QZPRNQ-(Dmq%NvwB#EBtmiI=v`-3c-d>|u3 zsuZ$1e5Sz{^Pf6PD9wUd?yHYTD^Ie62coTdF~p^)Qnv|Q)JCiF7XYA6AWM_>BTcZw z@|W0PPrJjWy@i>@a|v|E8k%ale4G%MerZ)=*gw9K47i@v=?S!$hV-Q#;QDNs z5oZn~Q4AUp)nN?7_}_hh?)ret3c~`N6V~%fdUJOkcKAF)tefBbO%5YhTj*4p)v)V8 zM9_m9(|KB6`h$EEurUz8re2LQ8*spbyHIW@?eS}o$p2&n30Q!rDWSZW7&p&PSM{D$ zCCweyO&tHOC)`)n$;WW(7t`iZ|A`CkJwAeEj%wlcA9_-Jc6 zW!aI@4J$SIhK`VV)RPCrtH1m!j~ZWCD5+4~w_JF-weIm$noi({w(am_e&B763OEv45DoJ#H->r zxWjD&(HgSZ*JgmCITiRpAZPpBN|S+v?NiS^P@Lls(}Mrg416$xF00tAl48!i8)var z<)jklb$SvXT^HWIMTrsWy04qpV)uH#V>~#1L40&;G4R_nxZH6`s9D)~l^n zbPKq~P&8|TSp%6f)Ukhj#38Rh)Y|JBk3$BY|6}@zRmS8zyE1fyyoLel^0!QQf1Bd0sIt-*T_+8ar`ur6&lj61s^84(XFSvj5k`1!c|Ze*INhFV3$DzKWw{gk6xUC4y-N;(!MK6Dr0Fh zB4B=7u|HhB#dV?6hs?L(l7-3vkPwv0;2Ljy-Y;e`!r6|voD7A3 zP66Ej7$jk=M?H*m+b*E26xOH+UeEtDa|=+yR|Dl3q&p{Qf}X(S_^p$k3L54{R=n22 zadbZy-@!*Gs?H@v%cbYp*U_h=`P?Cv75Z?Z?JLwowaOky0%ldUG-s};?5BP+ z)M)Ks^xwYZ8?cJO#n~3Uuw&5?753c?9nW^oXNd)wn|QTVO~KwIvExlWzY-1Gd4qQq zU~?XwC4s2ljJrU!Hm;BJ6S@bZjJoGvn`xnUdjrR#)L8+qSh2(B3uRZU^=LH@$IPz9mHqP#|Vm6DYZOF9(d zMD+1C!=$6 zC*p)W7@l$9V%^-F&Xc^#N>ECAE};FLHLOr{PCcf(adGVja^K(aiMhEs(WDu#PIggI z3UtZ2t*!0dJ5$r`xjEWj`aI(Nb<^NUCmtpyW|#ZW(9poZz^2XN_B*&kL2`03hfh2{ z_=Rz9-KWh1e@}?~-DCgM)YNyigM)*8eX@&KdDIrF^upWv?+gvsx3(TWh+}S9Gy*&5 zf8Q(r>)xddH#aw+KTsgX+|vC-RY^%nK|w)Pb!=!THEkJ`Fkn^?Y69ij*_EC-gKhsn zAY|pHcY8-iyyL75Ip>A7#=5#XN5qvZ5}{ zs%ZZFVK@)GO@ri6L!6Xi>9E1?1AK_ns?b@f{n2)j$qY7TdNvWLrukrCU|?t{m&lS% zIgA9ml&5$Nz&>ji7si2_1)SdR_+98C!PcYlD^K29USg8VX#D)Hvjfy20Yan%vEwV9 z=XRqHWE2F?9BS|Q+}vE_(6scm;e1i?RRI@nyZyxtm$s6Ul5SBey&E~8pcvGoOqAI? z?yUjkv5%-=7p^_$Y5_&7ED+pi=wG+7yl+0dn?4OTI0Nkafkk!@T%1T74q2y$K!*HX zaeYo#L3QPPgwe;F#3K${Ug|`)feE$e1xqO-QM`^kLBXu`BUIo{Jt2%7P`&V$_ui;U ziGN=X14J8sd#EcOp1TZ+Ms73%`9Z&sUcu*iv#lJiQb)469mh!dgKR1yL;eWNfuTta(Z$^Sr6P>r9{u6@|*4_BFHPnAk8PuW} zIqcl=4IBqs)PpcVr89VnhylmpxK=fR!%lk6L-L%9~dzGTmGSugB_w~_ zI^d73EjB=*8UY+J3vCof~E`}RfEOjS>+CfZmYs$xX+`E3J zMz;3EYH`^xTax#-1E3C`2NX~fGs&TM%~zhS84-Kf?RLR&9$rr53{sU;;p^z|7fMg*^>ZqsrBb~$aw5I)Vpz5%Qjmd zccjF~02*n)AsXfYb1oN9sB}QgQ7sBC-MB&xi{oCtuo+L-#V(4>v+{IZEb0D;u43P) zI5C`>10`4eQxq9r*ASN?Sl^GA+4Ox$AT$LP=O`mN0Y$?68Blzf{K~?ieCb$gwO7f*GqE5ASOtM0oS_?_zsMI2@8yam zcT)WjR(103vYmFA%K$)5ZmcJ$ENeYXh!9M>AlDC<6}|Hr+!x%9lbXXM|INCuEHRNb zD3J~`+}&TecXz30M)mG2sJ`vsMcL1DqJKTbNPC{hWn&Y)PGYg#fIJHu`hD9a=zD#mEiZ>=5Wf5-C)=}>$!W{ zo=c+_r|xW)Y^h6iyU(Ht>5$8ths*r_w4L>~<`ep9u~(=RKZ5G(;0~X`V>e3J^qRr0 zRGQ}Jis)V0?yjyW)ra=R(o3uEoNd;Yf}jddW>C7V&|C#OD234D{sUjW)J!3dRrhi6 zG0B|eq*qb5_2_v;l^h*N({UxHUBL5sG>bI)P+|<>pPP792qDAx&G_BDHa$B2sDVuY$)&yrG3_a?cbmt`2 zA%3DW54NDXv^{B|PJaOE(DiVsuvgHPi8PjUp3R`5^}dlp+?(S0f`o*-M9iJ)wsv-V z0ng0l6E3lCtCnrm-{CFB5oc*~Fb5c9;){PL>aZGJ(sSWnj5GESC@y+E<=Q}Q$NX?G zHeT||i@%7uJ!P&x_gw)+KJT}E9)T^@DJGV)X9p7<_ulb+c074kCaQ@GO7phuXF;tx z+YY>9RXC8YEeQMeQ2bwTay@%c)rXVSmvL7;c(^KI7tvKksmdD;pP{2^rvt|OH-AK+kg81aKXzW`7(1Rg*Q`5!+8R9+LC`uY}u;4ofF z7ed>PxOLY{PnM~VF=5mX8vHC%j++6r1^&=_%*MthE7ueJpydQS z^meA8tX3#={;hoc(R%5|cKoK-bM=tnm*r;7g{va&TJuN2;3Nh&Y{0RaZ?{)KJ=Cu` zUj-o!OdI^&6OvVHg9)XQCdoVMfO2&;-fzJJYIbcQB7mG(jF|I4VRnt9fxbQy_m&8{ z25v6HFzRH=jpDVU@5Ilq*KCTP8axODzBoL$9RW2C zvl9s=7>J=QrZVTXk-`OfMLT8{YtNb58M$A4wu*)3v!5Q&OM8-Uajccj`GDSKb zeMXjuxGC`xX6ifdIHZI^`kVDZ;NS9-ITrqvM`*(}fQ;yj0?@8R8AG}zW_6vYiGZ}i z^78Vwb@QYS9Kv-lYR2Qn6RKY9isz=mHwvD5=0w%*b9f&d z^zqSyYZ_#(-I$(7QoUxDwVz0%p&qQIa{Bv^DJEQ0zx3PE7?3)^Qnn<h+n^ z7=^{pr5=dQMhw&_gC#viE-*Y$9UzUBTYx?isA1@H3Lf0>B4N4x5zvjKPOi{ppH-{} z*6d@T(*0v7IEF*FzGa-8^A^nV167sD+3{ZEqq|lIfTJI$e%I?ulY9a4ZLXjPwL|{9 zs)vK&bzY?Ot8rAh)Jm=H_|!SrfL*Q{3gu9PxZ0FZ1I`ZlC|o@F1%w~d#EMG81Dqvk z()WSyxGv3Xf$b8V#%OPB^Z}GswRa7ut=k{^%yd@hraLd{s3RXxsWndDw+}Ab@GJP= zO=e!E6Vh`FJVDTn6Fncwsu86V3!TL9iA)>z|Jnp<2Du<1JY?FST=@AiH;iE7#f&ce zGtV?Aeb)l}_d!0eyD0q))R{`=QX`Q+TybT5=xI2>c^=aiwli>(Fh_OaxY= zMIagiY4|`|XnO^C&Qhb#;=-84lid1xG3#{u9BRHc#?viukjvXMaQX=TP)=rMTMPsQ z+3S4(!A4&N_`qo$$FqSFpzs&DlpM3ZwwC$9^8rW@F}NM?tCl1bd5nt;kBqE59(-;| zcXmf$)r6fI=5jDf8OR}-TuBiL3nG`Jw|#$HA)+vBo-F1 zcL#*Vl0C8veqCjz1J+}3dIbneKt<@kseelp*!HoBMXih@VdpP=WbUfc={==h8a`Tq z9BKi`<_Tw1;ls^W{7W)#r$GuWY0bpVuzJ+vH-w)gkkePZ%Aw}ryccCb1GMnd!~6hfevY0HJ;ytCf6U!sIPblS)w}oaujYT%#6S}2 z0z0h@xqI68zkE;sD$?B?mLionYG~i_jm^Q*d9@Lo&!Pr${PG09AECUCNN|jSegt%D z4IC%Y6NW8CtoBVS)oayVJmQ{ajq}x}1MpZ1t$#>L{za9Jb3Sdu(OOoW086g!(F%lJ ztvkMp)nMLx8S(k0Sr@V3gVn-e09>3-aQw$!&sZkBb~%MjzyIC$AYJjdphlRSqh~c@ zdkFv7=k(w$8~|oHL{3H~FeznJ|3kbH6H6&iE_KQE^4yR|vU`5eE}NFh(%_b^&Xhi> z;i{3#j1@gSJ%HuUSy;HJ3zVi zWh&UCL&z8c94OOv%t%VmopMo-j@T9V&b+Km*NH?lSMm3)09sLgM%znA4t?y2UAffS zaDdm@>ROYT`lS^{#1NaJ8Ln>sJF9Ra8N4C?A8vRH+~vT%2nj%~>5COsyQjZI;>(1h zeFrS5A~{VALDe@E`aq?r{50$p?wOefAnC6JVuBw%<%+$2<)b?Vg@qwF)nvR5ksVfF zopNByjxtw8p2n#9yb&eP72ZiYmoST{Z|yd z)A~DOeZZYI&T=)XKkhoRyc>Q!^it<%41s*@zi!NZ5pYd!xoW8;v5(#*Hd=iqnG+2lzb_0i@9J*+~h8=0LDO+#n*9QlJSulqhTiFYPd2zlJ#? z?Z50y7@tVQ>Ff2TNZr%gDaWIEH8hx`BYM+4m`R@QdKIVb?mNxLY+*&<1O${xg{)y; znyhyOlnOQ-;^yXOKSZvR(iFa@Zeenquk`Ise{ZUcMcs9TWv!8HhsT$Q8tUT;u+<5j zT0(@L|2AE!qgwi%rymr`;*!+&7kE`jiowDq==#+@aB_)GefXtbX4rHe+~xJ*xG$u@ zXhO|)+skmaHN{J~Z0-3vI7wjcP9hB)w^;|i%hmfm6P3T}ewzmuj42=#twYwl>h5c? zqXykV91$hQcKBE;iokOLXAkvrKrNp;{`}AbXQRW{tFo-DrGQ zjuxDihC}zrl~N+oTK9s1@Pt1V#5#-%q2XPrk|pw%~B~R=<8E5(t4l1c}bk{t-?7 zjRn%;4gJMjY7%1cQt=P&zUYHX0Lsxc#CKP34ZRLQKUCSl4ogd;mxyNmV0n6IvY~{= zH>Ff&W+rbKbZKdc@k8qMOUH=)d2Mh8#u+%DLBV>kGC(h;Z9%{~NinyqEtC-MWAIq47BTuUqb^*HYhx)GqqOu~%Ca;u=EhI@ zhDhpT{v?mvo(|Pnw$f7?6t;`8=#_82cAM*Fod0czN|7;@pu)2P$>Her2+vfM}a z?JM{Qysk&`AUFkSUJuRSJ6BZjyy&q%tOIrJzB2RGCAP%JmMIU!lzPA`{2xl>-m0ab~APq#zqxKNfH6~G{K=vVN&gs*?aDHiFlxN zzV8?~rVU;Q9zAx{_V{?Yk6bc52cOZ7No$Icb3)8K?t`dk9WBwM#UyyVSS|P^A&HSH z4Vd|cdXf2(wDyVBxJ|M#Q6Qaox6OX2KmAj|-f>2r89E&TKRDs;)V&Y0E!I;mqy&!y zNHp_A+wIhe7vsseZSycqx(}ws-!P|ZBMkM#GbQh_#)89&o(9FGGd#9k0H@2i0^dXj zynooM7aYnr)YaA1-3`u`O5j|i_T@rvI-rlX=I0jL4O{_>m!SLVslrv`4$BS{AmmA2 zU=G?GHS4g!^8nP{(1Z7C36q=Q(L>gX!)fqTPUa&WI&~25NwFU(oN#~<>JtXYU{eu3 zwp>-%lT2-`UuxPM)bf>GPhaM^6Tc+y$vi6|L=h}2oPSi7<;spPb-n)6ZE%2_kA-k{ zr+~b?yom3YQSkg=uUDKR_pa^gijY7hSok2%HXO4)I8KXhJByQ7-hBL4Y}Rik_O7Zt zSb*T3?Gh-vwn>VvNCqb>1VubEnXUzo3Bf5nNn*32tmO$TIP`FMh-~N7qS-aD`oU(T zusC#=kkm6Y+;>%5QU@>4SGtb5b!FbL0_sZHU!nj$b-+JrNYzPPd^ClSO$rnh%nq+X6S>rzDu`_wH z8yPp>TFeaM6^fCMyTnKL^4Z05Upd)gnz?ISDN|cS<;ibwmumt#iniDt*YXF5+FM3G zFm!&k6!*_fP^n20kH~YXxu2J&ciCYMwXI6j8v2l$aA)%e9x2ZRI4g=tI8Zj$dt=Tn zFB%*h@eagJ8?BqX+I8ml2IABCJz|)>ZNsbygH8zt=2V6LKknW!)y8cX;VBa@$>hd-1&f?qfLXMIBm6MQ8%Ku=O8|mm znITi|d)O{(Wp22=Qt+Q#2imwAH52ucfnV=d#@F3QEbE|l>r1g?%G*3nxwoB-yTBY} z*&`nQtmI+b59SCO%Q99y0J#)+)FC%{OqMnquG1V}P;NaTk76;+XnR>Vx-fZE#+lS` z9U^c1o14d*H5zWmzmx%-4BxB+S4AqJgy!My3mZqTMO+WLu)=OCW7{QhEJSkTq|_Zt z2lqQl54gKNvu&ENUf=i6Q-c)jAwyGjD!;H-d8mfseS`FWSxz zoNy>HjlMY4$;-loCBH9fO*bQZjPmwVZ)Xv}+ftwvid%pAV+CI-=o2J&{nBU8dBvB{ zzQ>4lKCExc!mX`Q7O~a$@VNJaDvJKk`BI6yGna@3qG-lL3iq%x2riH>*zAIx`#-BxiVDXrOo+WuU_z$T%piNC!qu?Qtf?=)g%H1*_*uYyV|{r0fRC+(c% zo;%+g)Uus3YrWd;YlJ zx1{D&&XVQEhM;}h`@KP*&9jHs=4`fa-%dpYTp1Wr!Q88X6eMI9!2|*gYn;rKpbd#G zVmSbk9nWsw*K`&Vgv81$B)Q+AzZ2{dBxc2m{I|ZBG6km=@q0sC!;i1Q1IX|}ImFRO*M#90$Skxc)&5@@ zV!s%Vgr-R+@mL({UgufyykYj@+ zvE`1i{QEUGDtS2F#7H^zr*Lmg%*BRCs~NGHB5$8uCT>j| zRevbSEZ!Lfb0QKf?D-Tz@19`(uZ24Y(A3*Vkd1&pihdyeLG*rbRHROStU5~>)*hiS zaT()Q6F|k=$~c<){>j|lgq{RR8kK0yfbIPn@)V9O=p~IhIATN^T+nj5A4^(pC@*J%~gI@$w#cCg0#OfVISZ2X!VJBslZ2 zdm{;~C4e{G$c3bnuouHW=Xd=Q?}ZDD-*!V$Umx5{PcB&1qc7F)yx7#yVLezuyCS*I z-e%hz1(8F7673fZY|oOF0}d7q>qC-sv_d={Outvw@CzK+(tbedHIgAZ;tmQbZ5#8S zJ}SJ{T60pe0@i*2prZEP-3sT)y_muBCO^P&eqtBk1E*76AjZc_|&!3v~S_RV2v|h+;mK zm6ZX08$Eetpg=MJlX^r(Mxqy3!bJ@Y6MdWi`Ob!;_0ZYS);tT-847q=OiD_ML+a5rQ;kKq4f zdch>fwt{uyBKI2D1X&u%uD1b1!EHnrL&R+(lPJe=?)q~)c-KB>`g;WP0ixxWJ~F2fQjXCgfvwU z<*9#}>htHC5Pc81MAC-GVsrbdLPZMCjAlO`ycVITL#!|?JrMC-dl?Ael#CVtVZ&2`9%j2Cuk(oh z8)@=xspF*=MO0SHHU4ANw94e?q}Rj%zY+Wi9th?lOV-uXBR>R%EZ|A!xOltG&jkrR zIk{GgM=Uy;mV7JoAg6!M?ri0h4;}01>2vVuo38-?wAX7dFI%Tal$|o zPIk<_DO6=`boTwX2FXInLTNktSOu%QRvX-7!%2Z_#e@yD!=rSgS)-K93q%e$bgxEX z=q~Id)tcBM{+PSFI|Lm4OH8rIeqE`it3XO7u8#nAp%4UiAtNaEEOcXBn@1ek!U~ra zLmi!68ds^x0bU!8x|N<;oEd%htrpfrvTbL3f4Z(<+x{QoxF{!0-7$I47SpxHnFo$o z2vTS%4rlEmyPEq<2z2VUiL%cwo;9(ndDEXLs8A=rPmX=O$;MmUVrnBBv|}!- zl5#=)`OK##x~+pX9bNtWezME0*VeP%p|^ncQR~4Mt|)jlNX+aD7LVU@Z-7(i_gS5YaJaOC(m7|3nr{* z>q}i`O7NAE%niizy4FLG0+)YM?@}rtw3F@D!B*TfGMeh-RM8U#{KE&clgTk^hAAEqp->;FB=Q#)fAj23vz;{qq9{`NFJ5K$XftxAfQ(>PYOab?E2$$^i8h& zPnr{z=*aUH+w@C4nN{v$Iw6gZBIqEAoOGQ5I4@iYrO*?|CV`}ssLT_w!U z)rc^YgPI7RF62@zSTDHS4DlSt!BI4!cVE6bVqR*3dCg8DO4e#?XtjxBwGouTpFeFn zn}r_z+=e&V1_xTLM~~%ghv%AA0sO>oG=Wn}&OA%yEuW6Qc=6(rvYOp|B=Z+Hz(Akh z9?Oh&i_Fax+Hjz}EIgZynST`yljLpE*JnZ9dL8p#`UH77p)El0veqeosvqK;%}ra@ z&Oj_v@xnDknO%d5fGG!zp1!_OXYOq;9P5T1pjXm*@!0vf0rD%Lwx02rvL43poLIA# zz&xNwXsvKotI`QI9hV8SKCX+ccg#RjZ->(r4BUlyNwRV zYL3Y?ppj3+;5(Ae zazoq+x<*ExD7j0PuPh%IWU|>Lm}d*f;1`n?gOU@kGD|Tx5e2187Fg-_4GORMg6(9x zX|G}AEujFY*8?KCU!%+>%0?Sv3B|LKIXUOu?m%_gz8d4)>2IpGy*5)6hX@D7vfAf} zJMC3hTf2W-SYP_y%t6?Q(mo$O!M4}2Ojns*&u{It4zezjOJ0x0PD;k9wc-0P#yz6h z8oi%hj()n`hGWg=Vz`t~zBAxib4Z31TkCnE1BMb))AO~ghVahVKW zuEUt`XE`K8ASngaJ{*#9^e}y?R;;viRVR7W`}dq$KA$oAfPTsQM3!q?3U`l{&M1^m zUhQ`dXD<+({_?W?1N@s*7bP1N^FFens=%eJ!VSYbP9*e2 zb4B0K&^>1ZT2bV&8((d`26kzW6$hw|E$6@mHAX%bpH5a@DzZ5R2N7P4{suSn@i{c}tTWXyT8aYm{wF!jLtXNkw9Wy@6v@oi!~kwTCeTX|J4l@e<5?@dkn_U^q5Mt6ZDRDeqm_cOW- zA#g?bQ2=9IAw_s4FD)h}hV6RBt)~OKFL}ks#{4HS*5$+ILJNh~Sx?a3;gXSaOlS_6-+pU8L+0uVA z1zck2T`@Q4tBSaTB3i0mNzsT$Hx&*i3gRRSDxF~YOMbfHNEUwvB{SntIl<#dW7;uy z&L2(@KUr;U1PESy-@C&K(Ep^UNc123#BmzgCj$yEusPvKqD8c?6OMKC$B#CM#}Ycv zfk(wG2gfltR7^tAM`C8?xedF9{woEG8OhQ2G@+jWK-Wr6C0tGZRxYeh`u8b@^ZlA4 zaN5J_g4!qf`YRs>-?!h9?Uf{`$=b;d)+9e6Lo_GRM?!?x<%Hy61_mirFg$<<?Qe)8v}-y-u)oa8u8PLdHZ`+D}^ z>x%cZ`$=6$#M6!&rbahQM10Sxy%#_`aqxgOZByr)2WA*U{)tE4O?S!@6t9bYecfDn z5o6YROw9|&hV#bE*(e{~Cx2wPW}w5=&L4KJMV3u^jc%fiYU%e@s+U*N4k0Hi(s5-& zlXqg(z!z6yqcaE|I@~7#P4hhGlQNhBuv}!23-0!oqs5b1H_S7T_VcM z%YmOzuSq?0(X~` z{4)N0H1*cj3?VB?ejpv~3?AV?vH6ix8R<!>qqO$)c8&Qh-=rC^eB4yEAV>^>mCl zGSHYcoTBO|c;MQ8w>)Gh2^y0C%N6>dd{)M(wp5-tgQQ zYw5tT27XgiosfiFDv@@Qu?->HBALP~ND;+Z;VTm>&bzJWkR32|G!BBj>Ovw+L-fIn z8|(GMbbu141<`H_RuL8ur>&Dh?j3Xm zu-xGWCb`pd(sVRz#+Dy3_=1lc5&mm(GzbQL_#tPhEBHr zq`I~C-ZrXT%OzBAKbbdye!A)dNVBU=t2uyMm7KJhbXZaKmr#ic1^--c<1QU+{isawe{)|~2IRP0vt|0QC){*~ll zrGrpZ(8#%i1wx?EFIb!W_*xXm*DcaPXrJw`-fq4aGIhG-Wr{t>)De;O<-V1&I=dqo z1sS}*)TqRbfkS5y13jK9ZV(3oBzGDXCBYscSkfz$XEN)4xeXtvA3M9O(A6<8SItu?=epEhwyG)k@np#|@gQ zwL$(bbdem7wMzFYc1u*A9jefF=i}o8$4&P7b%$vCv2tvl5y+83OtI>Y(ADX8gqR}_ zU!sp2+8HUaGOx^kifzhz^-GP|UuW}{i46=4Y*x9w9=;qZF#nMdoG9phe`U@sN8UX> zBjeo_qEzO5a+mc~Wz45P>E$`+zQ#bOhn=+9=n_*-DOhCqb*iL&UVV^s3k|{BBHL8G ze7nVsmu>i4Qa@%}9{%POV=c#pFUs$(KmZlAM`J*RY-iro(92moy8FnV`VDtawepP~ zFeIq`J88qhmXE@5n%Jp*e;+BjV)z>W~;k^`*gc7WcFyG1Z2C^InE&TT+-R_aP(Q=| z%?zw2aFZW=3wy{o6qj$~z6=`%hUqxdF3+yUSSe|u}z zeI_%TCgD@Q@5YS|s0eO;$|Ll|cfP-Nv0@gOhNuUNN=hV1-Ss(jAp-F~{s$vmqrJL3)J zW;zk!v!~!T>z1q&)Tj1|z89Jzc#8P&kRP2;JZDcH$lF2RbI$S9^%9g>+nc`32x^5J zmApZIy=;e>4Bg}7`Q!By=eoatiBCLxBTb?z{q~b4KAvNB_oUM^wN^cayjxjy-RmT3 zro>sjtU|10YZlnp*_)SKrTi!ImxhFg_dJ@kShGp7BiK?`LA31b*|T>O6*Dx;4>YqL zXa~wLg>ko2`MSC7nTRQgpY3$fkJJgxa_igU!M)#W&P5NJi6L1VhjYv~FuXdgVfO&o zfII2DN&KeKlLXaUbOfsp4Im9jzAYS{)G76cVw^+Yz#qD6MHv9i6Tlg-_c)55ON3BS zRFo#v`rdHth>D83b?erANBj^Jcbz|f9(+N59=HzD0zthZL#$vyPhP~~ZClQFk~J$t z8%RvC^{(}i!tKp;b{lqv1k>km2NuZ%0cpdcqc1Df_(?)QEZ?O66}6JIw0qKOgU7rJ zWFlnz&K%4C2EAzB42_62M>gPFJ{zz}2hiw~xwyDo-xDhn{P>8vb(XwI^mDjoTU}() z7~5FZAS)ux{~Xqh_x|I(IrG9#CK9G+vs#&%VRP zf@VQ1EXM0XU-R7Zqst6p*!)qE)2mA?ZTM+sRb!PK?!=T;8{SxkImc>h(p;7B=zBM3 zsUd@TP0nyhe{?7JWt(`Tg2k%#;H==+$R0or0mr(sO%$TvdV2BBd{&DF1aa6uB)!lh0f2qqfVq14&-kn)Ropve@Zo%ZZD~QDimx-6>@EOtik((+x z1=ji0o`$hmUkMypLLHsoxZF%c)CORE%C^P=KNz;Sq zt{39AGn3rHdGoy!)$JaG)t#6%;nt;%g>Fw;kAcuC^Bpm{F+y`v`DDp~lVKlcEVd)I zC(wJ>JGdG3{T^~*peTbN`VsU?8`a+GtC={5pKIfcCju@2+`_7LRLlph+SE%QUuB*lC9&UdB{@rop2*f0yRMjk8%Fu8EtVoD+1UI>-cC@A)CJw!AkwyOihZuice?sTZ2ijq=96^?Ydwsui!Cnm z!%gj<+tFb^yw<@HvAPwdCQn8sYaWtanHrLnH+dR(zklOGsG% zrn=ep>H!XdZ)EjTm^XvJ1aHHpW0Qt2el!cE6UD}uuhc_0$AIm8eRt!S& zTac}yjNf(oGQ3!G+6CPFwP>ar{_3Zos(x%$w{!JDoq^Exn=#j&71K2zKGaQ;RoDXs z*tPG(lpy^%LpDs?xJwjM-wdtEgZDnns=#GVt}8Wkn>7$>nHRV}H+eXSFyr4Y9^6P> zS@tUJzs6CJIigSD$z_n&IwG0sh)xQO@tpq6fA~nO=izU~FLnl##$9-7+*p{F*5Di- z6LW?7nj59Au5JbI1y#;m$T(u~-v#Ict>iCvaEEi=(>vwHo^SU3>Pa~2&(3_SuJ(9x zTAJT&Mjg7LCPnstkVslMZ@rx2e5KRvv3pND9<(1?m^x1Q9^c)v2*t9J@{F>-$&n2? zO0H2QV{-1vqBK=``J#8PE+WL)TCaT?eXH6;#xP?A)bIVD8uV(s3%q&vh^oRyw_a!W zp|T$VKk~BTXS(vPP!7)ldL2<8?>`u@qRz7SFrQ@eR4^&h5qK$iq%!FI*(Or5`wKky zD;|vgp`poP65^M9ZniXFzH_p6d2oo2cH$(;ohn}Ws#umU?|*V>KFQr~GHa;o*kI0Z z$k~f-(CqHG99)Ek5cA!Hd+IE@e6B+YPr32={&=nTel57kjzh+nh~w_Lo4}8zdB^i~ z&Pm7c;OF;1_b&s`%5ib@aQP8VFDHglx}dwa03boK2Zg$>Rt7<*w$BA$+=CO|=UbAmM0XVR0panGKEpY}T-FF3~T4Xj>M# zt)VpAq9$)NE&2YHN(-il6I<#yF&#K>uS^vj@+^+{Tnwf{i!FRah#~F zegOfesWn!)sfR7Yewu36FARQ)nT>Q8>HAA#h`Hb-Ohi%K!)X)y-%x|kg0rRa!f8VJ zs7by|Nm5ix+LafFlzqFvo9n2r?^}k3>$|O(sqgzyien;t zN4jwmA}O2_f=_<<^cVB9e$EJSPLu`tged#t3uGxeLOguT$6-?urMzV_kpev2HdKnX z^m2-J6(wO&d`oB#ocy{C45BIhuH6mElUJLN~sCZuQW~bL8R@>V#X?YNsj$p3ufF8O*!mC-fpPI6hFgy57CPl9KmhV$c1bgq6q-=OXtQO3!$Y6fALAbjr zLz2h2m(X~*Mp;xOc0(Mvk~}D2H?=MZfKkcSsfhf18_{$$ASdu|uzp2u5|o~v(J+z6JLIAFzyGJGu4sa_hgojuYXU#NjcxLQ6f@mS>^#4@Zfk}Xv4#$?^bDh^AGCSJ?ZGh zPj~LzVKc|{<@bBxLhGWhVOMqQq6!MS*2G5BbsNCs|4n@xdG}MeyCA7Zt>vCm${Lat z#-usyru}=d^ZS2$5WNvnn8i(|S>%{=Rsb)Mhwb7;D2W+cjl@l!!2>$Sa_vMJKx6pq zg9vIc;~ZSi6d|8*;*jC3qk;3YUe+~c&*gsE>%LUzE0sTD2;5N0$IZ<>1^l*k)UeK2 zG>$cv2^7rijns=ezTExnS<26Vgb1Vhs#8sszL`L$|8FwTgY+MAwYurI?C3EvYf&?N z!!*pU-_D9^NRcSs3e>%mn@-$u(F)Jx|rF z=?b@9DLZfy!;KISb9dF}m6mgjxn4mVSxeLu-g~ag@#zoP^7om6gO7-6I-;bs2d-+! zyZP%?&QGdl#hP#MM30I5;ZNqkJ%tvDH2r2ScH6aPlKVA``jLCJ%vKx&=>FWSiZWS_v~5sWe=_K%Ww_ZU#nLAO}QRKRtYqs#?c0t4LK&$Hf(DlMl2}5i_#t$X)$*x`urbv9c z5n@A#g%!qhjBz(JGAYEf^rAz>xzL|~9OXO&;V=)8wgnAvGn1sn^UOofn~l8ooG@Zp zJeXrP>P0QCs2Jcp50~D~^C00twt8si{G>cSxg8IdA^W+z)hrM_TCJ!%1%99a9uD^C z(59JN%F5$iAEFD}@c{vc2|K?$dSsv{L86qNmv=#8?Kl0(@wtO_f^v;DV zu^fiZ<|1JbAQSpv*qPfXVY#_7e7kqqnzng6qz;1VX}J6zK|seW!eXh@{Qg9lJA*(_ z!GPsu0(X3xWT*UhGjW?MM_q>|9o88zxCESK#OV=z>8yaR^9vp%R8#HA=Ig5x8_p1v zTB)wyF%O5WP92MQH?GEgJ~B^tO_{$4>c428mt+*XU-vuH3n_jXU$DJw0ly}x^;nYp zu{(N4t(GP;e7{(EltJ|1dK8!jo?Q@Gp#yWztMAPblqKLRhOjU6X^KRbF} zm%{S0snuM_oYlG8hKk0T#ZxY}OKH*~R+fVeKg9ZSH+rg=*VzaH@2}k%46b^wn*iG> zN|N+jM5wW=JAZE{WP1Q%sJ$dcQB3Kx&XPO$Ri5-bpSq6-OmdVo2I#CxUcKrZ;jr_i zV~k(Rwr5NpEg+^E?l`%0b;}k&^nse|>w9w3t_7^6$xjX+hEhO&9;DzE?g@0gxWRet zHdG=0YWyGvebLxY+43!m^YggFV$jHuySHeP9K7^d) zLc`vG-*N1P56wzVl%d0BvGmZ9o46J@B1^fU(WB^?V5L-9!OlC?uBb{h+Td@vT0 zpRL0MiHPu5V;9VX4`fc6?HEy=IGLjyu^dTfr2A6WT6?FY+;6s4?~~kxgolcTg@7OI zQ&G*8lp?q8LIzAwI6X7-q^PqHT0%q8?ed8iHTXS0WFmxLw0Pf`otrDJd*XIyreUDTj7kJ)wh9;i@|ozzbdF@cguBkOz6PFQ^X^8Sf^b8u6<;%NX}hKD$C-$prq*r$>d<6bdZ%A~yy z_|(O|I6r<1r7@!)AoLyZKAh^*WTMiA6UH-L7rw*<%LVCd&Uo7S(fc%ytYkR4Vtpf@ ze!+y_gNh%By#(ukucp0zqtFX%F<+^;Bqze|j5&OtX9-- z51fbaR{+1hS+UZZIaHMEh|s+`2yN+^pX6-7bwoY>Akq;_YZH?hsN>C`l(D2EW3(Is z-T3kKv@9l2C+20+tx>&vw&w<2c?yBf98@VwBPP<}yLR7KYe?l(zhM#PBY{bb^M{l- z&iZCmO>`LJHqmw!Ot4bun;0 zS7YJh*HF%vHZ?vzSFpCS+-qQNo>R1TVQs+!^YK7-+KcnIpcDg`5wIM0B@)eTVv=@c zkcEe(^!AFke!XT0fTNYOZ?m{-yt|{d_}T9l))NqH@~x~cqSOaJKT^rJe8cv(TiQ$H zQ2aWsWFr`ZDSN=1c!$$YtV1{+Y7XGMgo59vO^7*7tOBtwR@;x}QpwAP*4no*Nd3KH zI(nAM9A{kH2njaW7`Shdf#`o?sY?$)its$Juvh^TLifQ+AhsKWU|#`J&cSvM%?aFE z*${eiTy68OcjFM1L!2YvT+ZjCZ)TuBe*Bn2=Nt-suDyni#|%s$FLeF&LWSdBQ-dIB zi3s?VvCfdk;k=S(y^`93lMwE!-ZymLT?cL=K&4ugH7seXJmM)~a|57D9+Uvq9w60u zvz?*e^PmK{xPkGD&%i&Xg&b^Kqyvx*H@h6@&s}}3ergDQ<4NjnxdU z2`B3)YkUTa5LLcYqtoV6qAekny3XZPvCoj|U$bb!36FPdjxDwlLhmc9uA6XuBj5`w z34Vmw@2sF?wyNKt`1MesDYP7iQp=7)I|BH2vZ2B@5EBQp-PS_(Dh}%E8GUHXV$sa+ z2osuS=v9qocU_~C>b8H8=Z78FnBn5r&~LK>e51+-{~8;B7_h3xdBfKoTOgu*&9u=9Gj1c5f zfky9bZL8}mroHAuv-q~wryr;`{Pb3^2L!i^_v;dw$QSK-y$Z> z2GF1I%yWxWl@r?kAwdL&W!DYp*(KM>aki+P}>rFHIE zud$$^aQ&k!%Hzy4_4pC&7mI~m)kSi`#L*vTu&lmmc1Z<>DKZVll~jTkhw+lHIOde) z>0>m}sd{f}8rW@!dDLlDOG^KRYUt1|=tv5-{~?q_=I}y-|#Dk zulw%a`g(I{l?&3Xpyo*%6+Ciwq70nN2ZtwcR)UN%*J?eW_JsIgI(p$}IviP1rFN4~ zjds(ij{A~Oowgo-nu%yD1s z*`v%xR8}WcwGU26vP16ekNHW;h_+4OuA}V;#)8-9zEnE~|DqBXHGCeZl*|uQqJ4-I z4#6I8Q7P(*5u^IU6#2pDyo9GD+C5&+K>jBrS8^La;UDn@5|zQAD_rj^ksy2c3axVS z@p@tDlKCZnyA%iCpG0_CaI(jUfh-8n%S$0%po1Mk3X*H{j2(){iZ>@Y<|q;JYXNVC zF&+B28vHFC9U=hyC?5>Nhv9p7F>s%Y$q%a(@hUn*e;8?eh0`4WVGhjrv^mG!1PdHHtRTi z84dY8WXOGe%9*_P4%u;i>waBW)&2N_(N^UE%2+3W$z#6)X9RVf>%9#N{+!i~Z!!{N zPMyKMzdqAh{ANSHrs?guw+AP=)&+eB31zB7b_t50f{4RJ0cI;o^hWQl$?Br+bBJyn z<~;q9P)J-T?_F2{s#g;D36ua)9H>B_Mu84OR8FD?j*=ay03|QJ-Br<8$TL zs8pyk&Cy$<$}yVYb}Saj9fr0|W?1A0Rix}I15b)(iJFwO9%|Vxt_#1cWvYXpZ79>u z?IXl5a(D=0UXc8`jujH(oRRCB%htvDduySj$vRp}J%0!aYltsHU1<$nM>{-*s=S*^ z)1(i)hAeaIl}qNN@S!uRIa&XF#SDuOWbTa>!~fkYy3c_sP-4@o^K^aX>EK4iHxZRP zJ8!evI{D6gTV@aC_Q~0~86Qf72b4=4?AgO>N{Vux1^eckvAD-tQebFyi5}3mMU<)>Xdjmb1vrirD!- zw{!?)pF?|>@U62A(PEM^UCMYDOaZ`4zmds7M2sH!9>O?Vl>Ap))AhX zDdwW(B+W_Tr5@k3_i5R#XLuF}(E)}MW>^Uci62Ic{(kfXBHN&bGBBwf66Tr;=A`7n zmB85FtCMSPK05PV^|6WwTI93Sh=-GtQ%T%g!RCC1eAi=gL^f69`iLHrHp4bO!G^t_ z+y%50O|)zET-)h9s*Ib>yU7xPfr%Z6R9sc26A#;(oiYxa3$NHVGd&Z_MI)k=;qB@@ zZ?y;LX3=$ms*Z_@ipu%MX`7@!zp~RE#NyY~x;(nRR=t=nZ5ptMl>mW}kYK%%LElo( ztQ3ifK%^1lwZD^!;{%bpVHg%fQdwXw2Y${$bhDGHCILjElL}$UxsZlPnW%Zx zrT<)$Y+-3_&iJ3-o6q5TB}$Y4` z3^MQJR93$rzsJCtGGS$N?&Dw7Py}kgRsr!|{@N-Zt34C%an%A+TN8VrCgnf&V4Xo$ zc58k#`ktH~3Ag>>apDTX6yUmb9%0Alub%GfMsI)aRm(Y(BnAQG75m|{H}_#bzx@2t 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 literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/multiselectionDrag.mp4 b/v0/src/assets/img/multiselectionDrag.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..6a193d8e5bcafd7010b4b8b533a39045b5250144 GIT binary patch literal 79933 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�aW!}f{*=(ph63# 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 literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/stats.png b/v0/src/assets/img/stats.png new file mode 100644 index 0000000000000000000000000000000000000000..700bd7fb9ec3c2af3f506ef24bdbe41e165c7139 GIT binary patch literal 4824 zcmeHKc{J2t|DUl9V;M`vGT}>>?CWHiXhmiaBYd*X5HY@KwO7WH2rU|uBnl&ACO$1g zkqm13W`v5V5D`imiV%@!#`FE-_dDlz&htCZInRI3IrrT6``-8azL)#C_x-w`94}8- zS-3hJ0)fc7?b(foKtuot1bR_YR50T_HC-c^SoCt==j?jKUAt!ZKiB@C5B=wi|JU+= zci`XKflx18gy1HuoWOhfK=y3TdxnbmQ^Q#3LyN7?v{ZK$ZdE;Ri#C)xDV-+eQ zwtX2Px$=2~M(5J8X>m=y=#=ur&;BocgK!o7?>$An-{zEz1{TjRY-{?Zg?Eycng=Dg zk6XQtj(ttQjoy+md*`U`fIPsHuk3ggnp=G)EPG#Fh?}veX*1{YQ{73`Kt_Ocm^ z7b92fPdOhqu{y&3>(lOCTgS0yY00Uzw-05^W>T#m*~Poxui5!LC42|#B~1H)0Yj~~ z^j<@~?T1)0iGJzh$%>&88<$NF(=c1Ezb(vp?|L}Pl6Z0d>4U&spMZ05cVY;U<$8YC z8WV3uc?a*kaH5S8?Vo-Y?!tsX~%T0Tfb! zf`IN8DuVxOfl*Uvbk01oM#m$Yk)`|;{aO*_zrp|1fVmlK^G$W$79y4Uc3?n%-|&#O z8QPD2u6J)x%^kclT^rn7C2%N$1lQd|rGa(ZWO0*qPeOsvFF_y>Mga;0f|vwa>k$gH z*5m#EEr+WLZ2b$1$~W!=IG5XI<4)Bt%#q&i#r+w|cVy8=`J_s{`0#yv#VK>M!q87i z&4((fZ}|?nQ(iI}J&IGqjh;Cy_&)HE{sz&qF2mZT1pIxD%nZ#BMo>GLmj z1k~>XnKia)=8NU=uq>y#c#X(fr{&jn1gJ6Z?yRfkb6S7 z3oOmVR6?)WXaF=Z=Cu~yhy34sRYIXWsGmyD@T+ME730l`@E-WbL>L3_)PQa|fS=p9 z-7!R*c~FeGT-WKlsqfc|1C}AneYeq__gO9qph=rUXkh;Q`4g7G895|oBH>*I`c|F# z*AzO3*eB{2mx;bnr_O(3zFQDwB06{g$rj-a_ntiT48lzS-t`ETWonWbc?o-Hf#nm$vP^kmb9_+%!#9Th zr!xzmhn53IT04?+`i&ROGJHb`rs~y5MzEyGUV^OuwfR*zxI*?_%MRdg5HR!4T}dq8 z=CpBfWaadj%?`>yS9?Ikg0ZIvbq?%`5(^fkPJx`dUdduPlQ+b1 zk5`h#vI2%*R<3XY2Gq7E`y}MwF!!WlZS=?epGRWdyP$q{;Am`=*y=LDSIy^<3^2kr za-b{x=u+-%*?5+fP~_6nL>_lw>dFSaiCry*O>vtLQ0`IS*=w69>EV0jr$M>%-C{`F z85--+g(3uSo~>@}lfkQ&0q={b;* zrmW69Ka;o7uN9DBOt%))Medem{L&%VOER1rs)=zJgb9rJyrY_kUfTc$WzLVvDYW-5 zxey*o;zATHnQp3J(hF}k$x)AN%_T_{!aK5c0Ifeobfm#B# z;A4hP<~$rqWq@~EkQ&Uq5%w`8wRfAE8gsM`!VL!QqHT?UT~nf5BCy~59Gn*krM82W z^QiJPbeJqylBHJ`r7Xo9-AZ^UiyM8dLoVF1H;j4Y=(T-5`7o+DaOSxJTRq+*?9bNO zMW@KBMW=dk07-EB-OXA{`KLvQQe~XNG}>ACW4ZY%GJDleB!PXW4x7^KV&ADQHmHh)oeQ5J6QWrTy43fQ9P?J z?lMFg=r*x#`gW*{fx&zqTKyGT-E8{@^YQQ%?0l&Vn&&(Rk|W9?VB`3n@&5WLan73>YA9m>v9ZQgUzbVf9eu?KeADS&(Xm+M0G(kc4n-A3Q?vPZ6)zie5()to}e)BThM+@SyOiBWRCrx8&=xuzM4_f1S#GW_0dmfu+-lC|O#%KcRDYFfkrg z7;=0Ob}_}7jGbp>K*B8|60ow}9}c(OHl>h05<5*(yp8(R)_!a^q%|E*&xyx8c8{K* z|7^I-H7s8#ea`6Wjqs_V@3gUM*Q}se3V=8chE+0i?X|Q&$ntW#8kkl)XrsHG=3t!n zIc)U8jSUIfjh53l!;I2wFUxy$&T3OQCN7Iv2Ynh-ly)QTg&5K9;%&leWbu(^ttMqd#MnuoAlxLUA!`uL<1f zN)IdGBE6k4e)tEHyaWLbm0-`l~`)YR=m5dXLyg6`W?3 z&6HPEM;yk>$X=bJlD_|}SEH3mv7db=exb_3NglK55;ihMoR|OmngQOe)Tc=Vxlc^;7PEd{8{9a}|ompX#dC z*&S1-rCf*~OWjH<7`GVu7U4+K#el3D(`on zwlG6SdFs<{SG6Zavnc8T#2~}fWk_Ltcw2Vn*u8*iv1x4j(K3GI!{uvU!3wlIebt7C z^`)<*CbLUEMS5fTq92V$8t5;ox9ig0V-59YV$^rN}qh)RmB)}=)k z6z%*i!XRbJzA{P9vO_?4-P50bSf0f-WpA@+RMSJma1X2zzz^Qnr}S(pK6N>kpnOcm^Nw>1tq>SI1*yY@x5mWJ!?Si;}JR z`2C>|-h5V|Sb3)1>qLoD+uNN)i>{v+-_t{64%^q|zqf~Tv`22eW6f5Kpxf&s z-b9YI+eHk^#78{ECw9*=-W9e+TXemPmBBPbXg`Xoxbrp0`>?73-3?Qw_GhZ%r*=D&2PraZt}m3n-8IGjY%xne8uT;ycf-`;nFdf6Os)s0_MyC7CgZtAq*u(;;rop1W&z64L(xTtDSD literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/students.png b/v0/src/assets/img/students.png new file mode 100644 index 0000000000000000000000000000000000000000..0be22e0ed593b83fcc85ef1aac523eddde932a7d GIT binary patch literal 62506 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 Y#Yem*#``$##Pyz%D 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 SHu%2_0F*5uo9n)2ANyAU%@NrE literal 0 HcmV?d00001 diff --git a/v0/src/assets/img/wire.mp4 b/v0/src/assets/img/wire.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..8b246df9b9cdd8ad32a17d4c35843ee1611b683f GIT binary patch literal 20226 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 U|Bpu3KUTjmcVNlu3#@Jb7u2@p#Q*>R literal 0 HcmV?d00001 diff --git a/v0/src/assets/themes/ColorBlind.svg b/v0/src/assets/themes/ColorBlind.svg new file mode 100644 index 00000000..93bdf57a --- /dev/null +++ b/v0/src/assets/themes/ColorBlind.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v0/src/assets/themes/DefaultTheme.svg b/v0/src/assets/themes/DefaultTheme.svg new file mode 100644 index 00000000..f7979326 --- /dev/null +++ b/v0/src/assets/themes/DefaultTheme.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v0/src/assets/themes/GnW.svg b/v0/src/assets/themes/GnW.svg new file mode 100644 index 00000000..9d095029 --- /dev/null +++ b/v0/src/assets/themes/GnW.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v0/src/assets/themes/HighContrast.svg b/v0/src/assets/themes/HighContrast.svg new file mode 100644 index 00000000..d025b140 --- /dev/null +++ b/v0/src/assets/themes/HighContrast.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v0/src/assets/themes/LitebornSpring.svg b/v0/src/assets/themes/LitebornSpring.svg new file mode 100644 index 00000000..81b2bce4 --- /dev/null +++ b/v0/src/assets/themes/LitebornSpring.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v0/src/assets/themes/NightSky.svg b/v0/src/assets/themes/NightSky.svg new file mode 100644 index 00000000..718859b5 --- /dev/null +++ b/v0/src/assets/themes/NightSky.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v0/src/components/ContextMenu/ContextMenu.css b/v0/src/components/ContextMenu/ContextMenu.css new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/components/ContextMenu/ContextMenu.vue b/v0/src/components/ContextMenu/ContextMenu.vue new file mode 100644 index 00000000..d060d4f6 --- /dev/null +++ b/v0/src/components/ContextMenu/ContextMenu.vue @@ -0,0 +1,82 @@ + + + diff --git a/v0/src/components/DialogBox/BooleanTable.vue b/v0/src/components/DialogBox/BooleanTable.vue new file mode 100644 index 00000000..528a6cd5 --- /dev/null +++ b/v0/src/components/DialogBox/BooleanTable.vue @@ -0,0 +1,23 @@ + + + diff --git a/v0/src/components/DialogBox/CombinationalAnalysis.vue b/v0/src/components/DialogBox/CombinationalAnalysis.vue new file mode 100644 index 00000000..3b4092a8 --- /dev/null +++ b/v0/src/components/DialogBox/CombinationalAnalysis.vue @@ -0,0 +1,708 @@ + + + + + + + diff --git a/v0/src/components/DialogBox/CustomShortcut.vue b/v0/src/components/DialogBox/CustomShortcut.vue new file mode 100644 index 00000000..ae67a842 --- /dev/null +++ b/v0/src/components/DialogBox/CustomShortcut.vue @@ -0,0 +1,275 @@ + + + + + + + diff --git a/v0/src/components/DialogBox/ExportProject.vue b/v0/src/components/DialogBox/ExportProject.vue new file mode 100644 index 00000000..0da58f88 --- /dev/null +++ b/v0/src/components/DialogBox/ExportProject.vue @@ -0,0 +1,117 @@ + + + + + + + + + diff --git a/v0/src/components/DialogBox/ExportVerilog.vue b/v0/src/components/DialogBox/ExportVerilog.vue new file mode 100644 index 00000000..d826ad35 --- /dev/null +++ b/v0/src/components/DialogBox/ExportVerilog.vue @@ -0,0 +1,98 @@ + + + diff --git a/v0/src/components/DialogBox/HexBinDec.vue b/v0/src/components/DialogBox/HexBinDec.vue new file mode 100644 index 00000000..e65ebf73 --- /dev/null +++ b/v0/src/components/DialogBox/HexBinDec.vue @@ -0,0 +1,253 @@ + + + + + diff --git a/v0/src/components/DialogBox/ImportProject.vue b/v0/src/components/DialogBox/ImportProject.vue new file mode 100644 index 00000000..caa1df60 --- /dev/null +++ b/v0/src/components/DialogBox/ImportProject.vue @@ -0,0 +1,250 @@ + + + + + + + + + + + diff --git a/v0/src/components/DialogBox/InsertSubcircuit.vue b/v0/src/components/DialogBox/InsertSubcircuit.vue new file mode 100644 index 00000000..f2c1b1a6 --- /dev/null +++ b/v0/src/components/DialogBox/InsertSubcircuit.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/v0/src/components/DialogBox/OpenOffline.vue b/v0/src/components/DialogBox/OpenOffline.vue new file mode 100644 index 00000000..7bd3b94f --- /dev/null +++ b/v0/src/components/DialogBox/OpenOffline.vue @@ -0,0 +1,99 @@ + + + diff --git a/v0/src/components/DialogBox/SaveImage.vue b/v0/src/components/DialogBox/SaveImage.vue new file mode 100644 index 00000000..9cfaba08 --- /dev/null +++ b/v0/src/components/DialogBox/SaveImage.vue @@ -0,0 +1,157 @@ + + + diff --git a/v0/src/components/DialogBox/Themes/ApplyThemes.vue b/v0/src/components/DialogBox/Themes/ApplyThemes.vue new file mode 100644 index 00000000..7d564509 --- /dev/null +++ b/v0/src/components/DialogBox/Themes/ApplyThemes.vue @@ -0,0 +1,288 @@ + + + diff --git a/v0/src/components/Dropdown/DropDown.css b/v0/src/components/Dropdown/DropDown.css new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/components/Dropdown/DropDown.vue b/v0/src/components/Dropdown/DropDown.vue new file mode 100644 index 00000000..89dc2b20 --- /dev/null +++ b/v0/src/components/Dropdown/DropDown.vue @@ -0,0 +1,58 @@ + + + diff --git a/v0/src/components/Extra.vue b/v0/src/components/Extra.vue new file mode 100644 index 00000000..e61d1597 --- /dev/null +++ b/v0/src/components/Extra.vue @@ -0,0 +1,323 @@ + + + \ No newline at end of file diff --git a/v0/src/components/Logo/Logo.css b/v0/src/components/Logo/Logo.css new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/components/Logo/Logo.vue b/v0/src/components/Logo/Logo.vue new file mode 100644 index 00000000..56130b8c --- /dev/null +++ b/v0/src/components/Logo/Logo.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/v0/src/components/MessageBox/messageBox.vue b/v0/src/components/MessageBox/messageBox.vue new file mode 100644 index 00000000..f008946f --- /dev/null +++ b/v0/src/components/MessageBox/messageBox.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/v0/src/components/Navbar/Hamburger/Hamburger.css b/v0/src/components/Navbar/Hamburger/Hamburger.css new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/components/Navbar/Hamburger/Hamburger.vue b/v0/src/components/Navbar/Hamburger/Hamburger.vue new file mode 100644 index 00000000..8c362ef8 --- /dev/null +++ b/v0/src/components/Navbar/Hamburger/Hamburger.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/v0/src/components/Navbar/Navbar.css b/v0/src/components/Navbar/Navbar.css new file mode 100644 index 00000000..acdaef1a --- /dev/null +++ b/v0/src/components/Navbar/Navbar.css @@ -0,0 +1,306 @@ +@import url('/src/styles/color_theme.scss'); + +.navbar { + background-color: var(--white); + position: relative; + top: 0; + width: 100%; + z-index: 100; +} +.header { + background: var(--bg-navbar); +} + +.logo { + display: block; + max-width: 100%; + margin-bottom: 0px; +} +.logo { + background: url(/src/assets/logo.svg) center/cover; + height: 30px; + width: 105px; + display: inline-block; + margin-right: 36px; +} + +.navbar-nav > li > a { + padding: 7px 15px; +} + +.navbar-logo { + height: 70px; + padding-top: 5px; +} + +.navbar-search-icon-container { + height: 40px; + position: relative; + width: 40px; +} +.navbar-search-icon-container.search-icon { + cursor: pointer; +} + +.navbar-search-icon-oncollapse { + display: none; + margin-right: 0; + padding-right: 0; + padding-top: 5px; + text-align: right; +} + +.fa-search { + color: var(--navbar-dark-grey); + font-size: 20px; + margin-right: 12px; + vertical-align: middle; +} +.fa-search:hover { + color: var(--primary-green); + cursor: pointer; +} + +.fa-search.active { + color: var(--secondary-green); +} + +.fa-search:focus { + outline: none; +} + +.navbar-simulator-text { + border: 2px solid var(--primary-green); + color: var(--navbar-dark-grey); + font-weight: 500; + transition: all 0.3s ease-in; +} + +.navbar-simulator-text:hover { + background: var(--primary-green); + color: var(--white); +} + +.navbar-dropdown-toggle-hidden.dropdown-toggle::after { + display: none; +} + +.dropdown-toggle.navbar-user-dropdown { + cursor: pointer; +} +.dropdown-toggle.navbar-user-dropdown::after { + margin-left: 0; + padding-left: 0; + vertical-align: 0.5em; +} + +.dropdown-item:hover { + background-color: var(--primary-green); + color: var(--white); +} + +.navbar-text { + color: var(--navbar-dark-grey); + font-weight: 500; +} + +.navbar-text:hover { + color: var(--primary-green); +} + +.navbar-text.active { + color: var(--secondary-green); +} + +.navbar-text:focus { + outline: none; + text-decoration: underline; +} + +.navbar-search-active { + background-color: var(--card-green); + display: none; + margin-top: 0; + padding: 20px; + position: fixed; + top: 96px; + width: 100%; + z-index: 90; +} + +#navbar-dropdown-1, +#navbar-dropdown-2 :hover { + color: var(--primary-green); +} + +#navbar-dropdown-1, +#navbar-dropdown-2 [aria-expanded='true'] { + color: var(--secondary-green); +} + +#navbar-dropdown-1, +#navbar-dropdown-2 :focus { + outline: none; + text-decoration: underline; +} + +.navbar-username-truncate { + display: inline-block; + max-width: 70px; + overflow: hidden; + text-overflow: ellipsis; +} + +.affix { + box-shadow: 0 8px 6px -6px var(--shadow-grey); +} + +.navbar-search-bar-form { + display: flex; + margin-left: auto; + margin-right: auto; + width: 70%; +} + +.navbar-search-bar-input { + border: 1px solid var(--primary-green); + margin: 5px; + min-width: 150px; + padding: 5px; + width: 100%; +} + +.navbar-search-bar-select { + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; + background-color: var(--card-green); + background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23000000%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E'), + linear-gradient(to bottom, var(--white) 0%, var(--white) 100%); + background-position: right 0.3em top 50%, 0 0; + background-repeat: no-repeat, repeat; + background-size: 0.45em auto, 100%; + border: 1px solid var(--primary-green); + cursor: pointer; + font-size: 18px; + height: 40px; + margin-right: 6px; + margin-top: 5px; + max-width: 100px; + min-width: 100px; + padding-left: 5px; +} + +@media (max-width: 991px) { + .navbar-search-icon-oncollapse { + display: block; + } + + .navbar-search-icon-onexpand { + display: none; + } +} + +@media (max-width: 768px) { + .navbar-search-bar-form { + width: 90%; + } + + .navbar-search-bar-button { + padding-left: 10px; + padding-right: 10px; + } + + .navbar-search-bar-select { + width: 50px; + } +} + +@media (max-width: 400px) { + .navbar-search-bar-form { + width: 100%; + } + + .navbar-search-container { + padding-left: 0; + padding-right: 0; + } + + .navbar-search-active { + padding-left: 10px; + padding-right: 10px; + } + + .navbar-logo { + height: 60px; + padding-top: 10px; + } +} + +/* dropdown-menu styles */ + +.dropdown > ul { + border-radius: 5px; + text-align: center; + position: absolute; + left: 50%; + transform: translate(-50%, 13px); +} + +.draggable-panel-css { + border-radius: 5px; + z-index: 70; + transition: background 0.5s ease-out; + position: fixed; +} + +@supports (backdrop-filter: blur()) { + .dropdown > ul { + backdrop-filter: blur(5px); + } +} + +.mw-override { + min-width: 110px; +} + +.dropdown > ul::before { + background-color: transparent; + content: ''; + width: 10px; + display: inline-block; + height: 10px; + position: absolute; + transform: translate(-50%, -13px) rotate(-45deg); +} + +.dropdown > ul::after { + content: ''; + width: 11.5px; + display: inline-block; + height: 10px; + position: absolute; + transform: translate(-50%, -15.5px); + top: 14.5px; +} + +.dropdown-menu > li > a { + padding: 7px 0; + width: 90%; + margin: auto; + transition: all 0.2s ease-in-out; + text-align: left; + padding-left: 10px; +} + +.dropdown-menu > li > a:hover { + border-radius: 7px; + opacity: 1; +} + +@media (max-width: 991px) { + .navbar-nav .dropdown-menu { + position: absolute; + float: none; + } +} diff --git a/v0/src/components/Navbar/Navbar.vue b/v0/src/components/Navbar/Navbar.vue new file mode 100644 index 00000000..caeec961 --- /dev/null +++ b/v0/src/components/Navbar/Navbar.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/v0/src/components/Navbar/NavbarLinks/NavbarLink/NavbarLink.css b/v0/src/components/Navbar/NavbarLinks/NavbarLink/NavbarLink.css new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/components/Navbar/NavbarLinks/NavbarLink/NavbarLink.vue b/v0/src/components/Navbar/NavbarLinks/NavbarLink/NavbarLink.vue new file mode 100644 index 00000000..7f61cd7e --- /dev/null +++ b/v0/src/components/Navbar/NavbarLinks/NavbarLink/NavbarLink.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/v0/src/components/Navbar/NavbarLinks/NavbarLinks.css b/v0/src/components/Navbar/NavbarLinks/NavbarLinks.css new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/components/Navbar/NavbarLinks/NavbarLinks.vue b/v0/src/components/Navbar/NavbarLinks/NavbarLinks.vue new file mode 100644 index 00000000..3c01a4dc --- /dev/null +++ b/v0/src/components/Navbar/NavbarLinks/NavbarLinks.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/v0/src/components/Navbar/QuickButton/QuickButton.css b/v0/src/components/Navbar/QuickButton/QuickButton.css new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/components/Navbar/QuickButton/QuickButton.vue b/v0/src/components/Navbar/QuickButton/QuickButton.vue new file mode 100644 index 00000000..aad07b93 --- /dev/null +++ b/v0/src/components/Navbar/QuickButton/QuickButton.vue @@ -0,0 +1,296 @@ + + + + + diff --git a/v0/src/components/Navbar/User/User.css b/v0/src/components/Navbar/User/User.css new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/components/Navbar/User/User.vue b/v0/src/components/Navbar/User/User.vue new file mode 100644 index 00000000..839dae5e --- /dev/null +++ b/v0/src/components/Navbar/User/User.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/v0/src/components/Panels/ElementsPanel/ElementsPanel.vue b/v0/src/components/Panels/ElementsPanel/ElementsPanel.vue new file mode 100644 index 00000000..e5c52896 --- /dev/null +++ b/v0/src/components/Panels/ElementsPanel/ElementsPanel.vue @@ -0,0 +1,240 @@ + + + + + diff --git a/v0/src/components/Panels/PropertiesPanel/LayoutProperty/LayoutProperty.vue b/v0/src/components/Panels/PropertiesPanel/LayoutProperty/LayoutProperty.vue new file mode 100644 index 00000000..49c7689f --- /dev/null +++ b/v0/src/components/Panels/PropertiesPanel/LayoutProperty/LayoutProperty.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/v0/src/components/Panels/PropertiesPanel/ModuleProperty/ElementProperty/ElementProperty.vue b/v0/src/components/Panels/PropertiesPanel/ModuleProperty/ElementProperty/ElementProperty.vue new file mode 100644 index 00000000..fec2c571 --- /dev/null +++ b/v0/src/components/Panels/PropertiesPanel/ModuleProperty/ElementProperty/ElementProperty.vue @@ -0,0 +1,121 @@ + + + diff --git a/v0/src/components/Panels/PropertiesPanel/ModuleProperty/ModuleProperty.vue b/v0/src/components/Panels/PropertiesPanel/ModuleProperty/ModuleProperty.vue new file mode 100644 index 00000000..92d0c9aa --- /dev/null +++ b/v0/src/components/Panels/PropertiesPanel/ModuleProperty/ModuleProperty.vue @@ -0,0 +1,43 @@ + + + diff --git a/v0/src/components/Panels/PropertiesPanel/ModuleProperty/ProjectProperty/ProjectProperty.vue b/v0/src/components/Panels/PropertiesPanel/ModuleProperty/ProjectProperty/ProjectProperty.vue new file mode 100644 index 00000000..1fc88e1f --- /dev/null +++ b/v0/src/components/Panels/PropertiesPanel/ModuleProperty/ProjectProperty/ProjectProperty.vue @@ -0,0 +1,241 @@ + + + + + + + diff --git a/v0/src/components/Panels/PropertiesPanel/ModuleProperty/SubcircuitProperty/SubcircuitProperty.vue b/v0/src/components/Panels/PropertiesPanel/ModuleProperty/SubcircuitProperty/SubcircuitProperty.vue new file mode 100644 index 00000000..6ac03ece --- /dev/null +++ b/v0/src/components/Panels/PropertiesPanel/ModuleProperty/SubcircuitProperty/SubcircuitProperty.vue @@ -0,0 +1,62 @@ + + + diff --git a/v0/src/components/Panels/PropertiesPanel/PropertiesPanel.vue b/v0/src/components/Panels/PropertiesPanel/PropertiesPanel.vue new file mode 100644 index 00000000..368c5b79 --- /dev/null +++ b/v0/src/components/Panels/PropertiesPanel/PropertiesPanel.vue @@ -0,0 +1,75 @@ + + + diff --git a/v0/src/components/Panels/Shared/DropdownSelect.vue b/v0/src/components/Panels/Shared/DropdownSelect.vue new file mode 100644 index 00000000..f1983987 --- /dev/null +++ b/v0/src/components/Panels/Shared/DropdownSelect.vue @@ -0,0 +1,29 @@ + + + diff --git a/v0/src/components/Panels/Shared/HelpButton.vue b/v0/src/components/Panels/Shared/HelpButton.vue new file mode 100644 index 00000000..9956010b --- /dev/null +++ b/v0/src/components/Panels/Shared/HelpButton.vue @@ -0,0 +1,21 @@ + + + \ No newline at end of file diff --git a/v0/src/components/Panels/Shared/InputGroups.vue b/v0/src/components/Panels/Shared/InputGroups.vue new file mode 100644 index 00000000..628da797 --- /dev/null +++ b/v0/src/components/Panels/Shared/InputGroups.vue @@ -0,0 +1,81 @@ + + + diff --git a/v0/src/components/Panels/Shared/PanelHeader.vue b/v0/src/components/Panels/Shared/PanelHeader.vue new file mode 100644 index 00000000..212d5eab --- /dev/null +++ b/v0/src/components/Panels/Shared/PanelHeader.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/v0/src/components/Panels/TimingDiagramPanel/TimingDiagramButtons.vue b/v0/src/components/Panels/TimingDiagramPanel/TimingDiagramButtons.vue new file mode 100644 index 00000000..e5b16ad4 --- /dev/null +++ b/v0/src/components/Panels/TimingDiagramPanel/TimingDiagramButtons.vue @@ -0,0 +1,26 @@ + + + diff --git a/v0/src/components/Panels/TimingDiagramPanel/TimingDiagramPanel.vue b/v0/src/components/Panels/TimingDiagramPanel/TimingDiagramPanel.vue new file mode 100644 index 00000000..70cbc244 --- /dev/null +++ b/v0/src/components/Panels/TimingDiagramPanel/TimingDiagramPanel.vue @@ -0,0 +1,107 @@ + + + + + + + diff --git a/v0/src/components/Panels/VerilogEditorPanel/VerilogEditorPanel.vue b/v0/src/components/Panels/VerilogEditorPanel/VerilogEditorPanel.vue new file mode 100644 index 00000000..5a2011fa --- /dev/null +++ b/v0/src/components/Panels/VerilogEditorPanel/VerilogEditorPanel.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/v0/src/components/ReportIssue/ReportIssue.vue b/v0/src/components/ReportIssue/ReportIssue.vue new file mode 100644 index 00000000..14a9c288 --- /dev/null +++ b/v0/src/components/ReportIssue/ReportIssue.vue @@ -0,0 +1,274 @@ + + + + + diff --git a/v0/src/components/ReportIssue/ReportIssueButton.vue b/v0/src/components/ReportIssue/ReportIssueButton.vue new file mode 100644 index 00000000..128b6288 --- /dev/null +++ b/v0/src/components/ReportIssue/ReportIssueButton.vue @@ -0,0 +1,24 @@ + + + diff --git a/v0/src/components/TabsBar/TabsBar.vue b/v0/src/components/TabsBar/TabsBar.vue new file mode 100644 index 00000000..68c22aa4 --- /dev/null +++ b/v0/src/components/TabsBar/TabsBar.vue @@ -0,0 +1,368 @@ + + + + + + + diff --git a/v0/src/components/helpers/Helper.vue b/v0/src/components/helpers/Helper.vue new file mode 100644 index 00000000..14934a66 --- /dev/null +++ b/v0/src/components/helpers/Helper.vue @@ -0,0 +1,28 @@ + + + diff --git a/v0/src/components/helpers/confirmComponent/ConfirmComponent.vue b/v0/src/components/helpers/confirmComponent/ConfirmComponent.vue new file mode 100644 index 00000000..f10fe442 --- /dev/null +++ b/v0/src/components/helpers/confirmComponent/ConfirmComponent.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/v0/src/components/helpers/createNewProject/TextEditor.vue b/v0/src/components/helpers/createNewProject/TextEditor.vue new file mode 100644 index 00000000..62811a4c --- /dev/null +++ b/v0/src/components/helpers/createNewProject/TextEditor.vue @@ -0,0 +1,445 @@ + + + + + diff --git a/v0/src/components/helpers/createNewProject/UpdateProjectDetail.vue b/v0/src/components/helpers/createNewProject/UpdateProjectDetail.vue new file mode 100644 index 00000000..94327f0b --- /dev/null +++ b/v0/src/components/helpers/createNewProject/UpdateProjectDetail.vue @@ -0,0 +1,264 @@ + + + + + + + diff --git a/v0/src/components/helpers/deleteCircuit/DeleteCircuit.vue b/v0/src/components/helpers/deleteCircuit/DeleteCircuit.vue new file mode 100644 index 00000000..04b7d478 --- /dev/null +++ b/v0/src/components/helpers/deleteCircuit/DeleteCircuit.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/v0/src/components/helpers/promptComponent/PromptComponent.vue b/v0/src/components/helpers/promptComponent/PromptComponent.vue new file mode 100644 index 00000000..fcedab76 --- /dev/null +++ b/v0/src/components/helpers/promptComponent/PromptComponent.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/v0/src/env.d.ts b/v0/src/env.d.ts new file mode 100644 index 00000000..76a98121 --- /dev/null +++ b/v0/src/env.d.ts @@ -0,0 +1,8 @@ +/// + +declare module '*.vue' { + import type { DefineComponent } from 'vue' + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types + const component: DefineComponent<{}, {}, any> + export default component +} diff --git a/v0/src/globalVariables.ts b/v0/src/globalVariables.ts new file mode 100644 index 00000000..34a7a546 --- /dev/null +++ b/v0/src/globalVariables.ts @@ -0,0 +1,27 @@ +/*global ...*/ +/*eslint no-undef: "error"*/ + +declare const window: any + +import jQuery from 'jquery' +window.$ = window.jQuery = jQuery + +import Array from './simulator/src/arrayHelpers.js' +window.Array = Array +window.isUserLoggedIn = false +window.logixProjectId = undefined + +window.restrictedElements = [] +window.globalScope = undefined +window.lightMode = false // To be deprecated +window.projectId = undefined +window.id = undefined +window.loading = false // Flag - all assets are loaded + +window.embed = false + +window.width = undefined +window.height = undefined +window.DPR = window.devicePixelRatio || 1 // devicePixelRatio, 2 for retina displays, 1 for low resolution displays + +window.elementHierarchy = [] diff --git a/v0/src/locales/en.json b/v0/src/locales/en.json new file mode 100644 index 00000000..6681330a --- /dev/null +++ b/v0/src/locales/en.json @@ -0,0 +1,162 @@ +{ + "simulator": { + "save_online": "Save Online", + "save_offline": "Save Offline", + "preview_circuit": "Preview Circuit", + "export_verilog": "Export Verilog", + "insert_subcircuit": "Insert SubCircuit", + "undo": "Undo", + "report_issue": "Report an issue", + "restricted_elements_used": "Restricted elements used:", + "made_with_circuitverse": "Made With CircuitVerse", + "nav": { + "untitled_project": "Untitled", + "sign_out": "Sign Out", + "sign_in": "Sign In", + "user_dropdown": { + "dashboard": "Dashboard", + "my_groups": "My Groups", + "notifications": "Notifications" + }, + "project": { + "heading": "Project", + "project_page": "Project Page", + "new_project": "New Project", + "open_offline": "Open Offline", + "export_as_file": "Export as File", + "import_project": "Import Project", + "save_online": "Save Online", + "save_offline": "Save Offline", + "preview_circuit": "Preview Circuit", + "clear_project": "Clear Project", + "recover_project": "Recover Project", + "view_previous_ui": "View Previous UI" + }, + "circuit": { + "heading": "Circuit", + "new_circuit": "New Circuit +", + "insert_subcircuit": "Insert SubCircuit", + "new_verilog_module_html": "New Verilog\nModule" + }, + "tools": { + "heading": "Tools", + "combinational_analysis_html": "Combinational\nAnalysis", + "hex_bin_dec_converter_html": "Hex-Bin-Dec\nConverter", + "download_image": "Download Image", + "themes": "Themes", + "export_verilog": "Export Verilog", + "custom_shortcut": "Custom Shortcut" + }, + "help": { + "heading": "Help", + "tutorial_guide": "Tutorial Guide", + "user_manual": "User Manual", + "learn_digital_logic": "Learn Digital Logic", + "discussion_forum": "Discussion Forum" + } + }, + "panel_header": { + "circuit_elements": "Circuit Elements", + "layout_elements": "Layout Elements", + "timing_diagram": "Timing Diagram", + "verilog_module": "Verilog Module", + "properties": "Properties", + "layout": "Layout", + "keybinding_preference": "Keybinding Preference", + "render_image": "Render Image", + "select_theme": "Select Theme", + "boolean_logic_table": "BooleanLogicTable", + "open_project": "Open Project", + "bit_converter": "Dec-Bin-Hex-Converter" + }, + "panel_body": { + "circuit_elements": { + "search": "Search...", + "search_result": "No elements found...", + "expansion_panel_title": { + "Input": "Input", + "Output": "Output", + "Gates": "Gates", + "Decoders & Plexers": "Decoders & Plexers", + "Sequential Elements": "Sequential Elements", + "Annotation": "Annotation", + "Misc": "Misc" + } + }, + "timing_diagram": { + "one_cycle": "1 Cycle =", + "units": "Units" + }, + "verilog_module": { + "reset_code": "Reset Code", + "save_code": "Save Code", + "module_in_experiment_notice": "This is an experimental module. The code is not saved unless the \"Save Code\" button is clicked.", + "apply_themes": "Apply Themes", + "select_theme": "Select a theme:" + }, + "layout": { + "width": "Width", + "height": "Height", + "reset_all_nodes": "Reset all nodes:", + "title": "Title", + "title_enabled": "Title Enabled:", + "save": "Save", + "cancel": "Cancel" + }, + "render_image": { + "full_circuit_view": "Full Circuit View", + "current_view": "Current View", + "transparent_background": "Transparent Background", + "resolution": "Resolution:" + }, + "context_menu": { + "paste": "Paste", + "copy": "Copy", + "cut": "Cut", + "delete": "Delete", + "new_circuit": "New Circuit", + "center_focus": "Center Focus" + }, + "bit_converter": { + "decimal_value": "Decimal Value", + "binary_value": "Binary value", + "octal_value": "Octal value", + "hexadecimal_value": "Hexadecimal value" + }, + "custom_shortcut": { + "esc_cancel": "Press Desire Key Combination & press Enter", + "command": "Command", + "keymapping": "Keymapping", + "reset_to_default": "Reset to Default", + "save": "Save" + }, + "report_issue": { + "describe_issue": "Describe your issue:", + "email": "Email", + "optional": " [Optional]", + "report_btn": "Report", + "cancel_btn": "Cancel", + "close_btn": "Close" + } + }, + "tooltip": { + "delete_selected": "Delete Selected", + "download_as_image": "Download as Image", + "fit_to_screen": "Fit to Screen", + "redo": "Redo", + "decrease_size": "Decrease Size", + "increase_size": "Increase Size", + "decrease_height": "Decrease Height", + "increase_height": "Increase Height", + "reset_timing_diagram": "Reset Timing Diagram", + "autocalibrate_cycle_units": "Autocalibrate Cycle Units", + "zoom_in": "Zoom In", + "zoom_out": "Zoom Out", + "resume_timing_diagram": "Resume Timing Diagram", + "pause_timing_diagram": "Pause Timing Diagram", + "decrease_width": "Decrease Width", + "increase_width": "Increase Width", + "reset": "Reset" + } + } +} diff --git a/v0/src/locales/hi.json b/v0/src/locales/hi.json new file mode 100644 index 00000000..39086a16 --- /dev/null +++ b/v0/src/locales/hi.json @@ -0,0 +1,162 @@ +{ + "simulator": { + "save_online": "ऑनलाइन सेव करें", + "save_offline": "ऑफलाइन सेव करें", + "preview_circuit": "सर्किट प्रीव्यू करें", + "export_verilog": "वेरिलोग एक्सपोर्ट करें", + "insert_subcircuit": "सब-सर्किट इन्सर्ट करें", + "undo": "पूर्ववत् करें", + "report_issue": "मामले की रिपोर्ट करें", + "restricted_elements_used": "प्रतिबंधित एलिमेंट्स जिनका इस्तेमाल किया गया:", + "made_with_circuitverse": "सर्किटवर्स में बनाया गया", + "nav": { + "untitled_project": "शीर्षकहीन", + "sign_out": "साइन आउट", + "sign_in": "साइन इन करें", + "user_dropdown": { + "dashboard": "डैशबोर्ड", + "my_groups": "मेरे समूह", + "notifications": "सूचनाएं" + }, + "project": { + "heading": "परियोजना", + "project_page": "परियोजना का पेज", + "new_project": "नयी परियोजना", + "open_offline": "ऑफ़लाइन खोलें", + "save_online": "ऑनलाइन सहेजें", + "save_offline": "ऑफ़लाइन सहेजें", + "export_as_file": "फ़ाइल में निर्यात करें", + "import_project": "फ़ाइल से आयात करें", + "preview_circuit": "पूर्वावलोकन सर्किट", + "clear_project": "परियोजना क्लियर करें", + "recover_project": "परियोजना पुनर्प्राप्त करें", + "view_previous_ui": "पिछला UI देखें" + }, + "circuit": { + "heading": "सर्किट", + "new_circuit": "नया सर्किट +", + "insert_subcircuit": "सब-सर्किट डालें", + "new_verilog_module_html": "नया वेरिलोग\nमॉड्यूल" + }, + "tools": { + "heading": "उपकरण", + "combinational_analysis_html": "कॉम्बिनेशनल\nएनालिसिस", + "hex_bin_dec_converter_html": "Hex-Bin-Dec\nकनवर्टर", + "download_image": "छवि डाउनलोड करें", + "themes": "थीम", + "export_verilog": "निर्यात Verilog", + "custom_shortcut": "कस्टम शॉर्टकट" + }, + "help": { + "heading": "सहायता", + "tutorial_guide": "ट्यूटोरियल गाइड", + "user_manual": "उपयोगकर्ताओं के लिए मैन्युअल", + "learn_digital_logic": "डिजिटल लॉजिक सीखें", + "discussion_forum": "चर्चा के लिए मंच" + } + }, + "panel_header": { + "circuit_elements": "सर्किट के एलिमेंट्स", + "layout_elements": "लेआउट के एलिमेंट्स", + "timing_diagram": "टाइमिंग डायग्राम", + "verilog_module": "वेरिलोग मॉड्यूल", + "properties": "प्रॉपर्टीज", + "layout": "लेआउट", + "keybinding_preference": "कीबाइंडिंग परेफरेंस", + "render_image": "छवि प्रस्तुत करें", + "select_theme": "थीम चुनें", + "boolean_logic_table": "बूलियन लॉजिक टेबल", + "open_project": "परियोजना खोलें", + "bit_converter": "Dec-Bin-Hex-कनवर्टर" + }, + "panel_body": { + "circuit_elements": { + "search": "खोजें...", + "search_result": "कोई तत्व नहीं मिला...", + "expansion_panel_title": { + "Input": "इनपुट", + "Output": "उत्पादन", + "Gates": "गेट्स", + "Decoders & Plexers": "डिकोडर्स और प्लेक्सर्स", + "Sequential Elements": "अनुक्रमिक तत्व", + "Annotation": "टिप्पणी", + "Misc": "विविध" + } + }, + "timing_diagram": { + "one_cycle": "1 साइकिल =", + "units": "यूनिट्स" + }, + "verilog_module": { + "reset_code": "कोड रिसेट करें", + "save_code": "कोड सेव करें", + "module_in_experiment_notice": "यह एक प्रायोगिक मॉड्यूल है। कोड तब तक सेव नहीं होगा जब तक \"कोड सेव करें\" बटन क्लिक नहीं किया जाता।", + "apply_themes": "थीम लागू करें", + "select_theme": "थीम चुनें:" + }, + "layout": { + "width": "चौड़ाई", + "height": "ऊंचाई", + "reset_all_nodes": "सभी नोड्स रीसेट करें:", + "title": "शीर्षक", + "title_enabled": "शीर्षक इनेबल किया गया:", + "save": "सेव करें", + "cancel": "रद्द करें" + }, + "render_image": { + "full_circuit_view": "सर्किट का पूर्ण दृश्य देखें", + "current_view": "वर्तमान का दृश्य", + "transparent_background": "बैकग्राउंड ट्रांसपेरेंट करें", + "resolution": "रेजोलुएशन" + }, + "context_menu": { + "paste": "पेस्ट करें", + "copy": "कॉपी करें", + "cut": "कट करें", + "delete": "हटाएं", + "new_circuit": "नया सर्किट", + "center_focus": "सेंटर फोकस" + }, + "bit_converter": { + "decimal_value": "डेसीमल वैल्यू", + "binary_value": "बाइनरी वैल्यू", + "octal_value": "ऑक्टल वैल्यू", + "hexadecimal_value": "हेक्साडेसिमल वैल्यू" + }, + "custom_shortcut": { + "esc_cancel": "वांछित कुंजी संयोजन दबाएं और स्टोर करने के लिए enter दबाएं", + "command": "कमांड", + "keymapping": "कीमैपिंग", + "reset_to_default": "डिफ़ॉल्ट पर रीसेट करें", + "save": "सेव करें" + }, + "report_issue": { + "describe_issue": "अपनी समस्या का वर्णन करें:", + "email": "ईमेल", + "optional": " [वैकल्पिक]", + "report_btn": "रिपोर्ट करें", + "cancel_btn": "रद्द करें", + "close_btn": "बंद करें" + } + }, + "tooltip": { + "delete_selected": "चयनित हटाए", + "download_as_image": "छवि के रूप में डाउनलोड करें", + "fit_to_screen": "स्क्रीन में फिट", + "redo": "फिर से करें", + "decrease_size": "आकार घटाएं", + "increase_size": "आकार बढ़ाएँ", + "decrease_height": "ऊंचाई घटाएं", + "increase_height": "ऊँचाई बढ़ाएँ", + "reset_timing_diagram": "टाइमिंग डायग्राम रिसेट करें", + "autocalibrate_cycle_units": "साइक्ल यूनिट्स को ऑटोकैलिब्रेट करें", + "zoom_in": "ज़ूम इन", + "zoom_out": "ज़ूम आउट", + "resume_timing_diagram": "टाइमिंग डायग्राम को रिज्यूम करें", + "pause_timing_diagram": "टाइमिंग डायग्राम को पॉज करें", + "decrease_width": "चौड़ाई घटाएं", + "increase_width": "चौड़ाई बढ़ाएँ", + "reset": "रिसेट करें" + } + } +} diff --git a/v0/src/locales/i18n.ts b/v0/src/locales/i18n.ts new file mode 100644 index 00000000..d82d9d3f --- /dev/null +++ b/v0/src/locales/i18n.ts @@ -0,0 +1,16 @@ +import { createI18n } from 'vue-i18n' +import en from './en.json' +import hi from './hi.json' + +const i18n = createI18n({ + legacy: false, + locale: 'en', + globalInjection: true, + // messages + messages: { + en, + hi, + }, +}) + +export default i18n diff --git a/v0/src/main.ts b/v0/src/main.ts new file mode 100644 index 00000000..3f92ae32 --- /dev/null +++ b/v0/src/main.ts @@ -0,0 +1,29 @@ +import { useActions } from './store/SimulatorStore/actions' +import { createApp } from 'vue' +import App from './App.vue' +import vuetify from './plugins/vuetify' +import router from './router/index' +import { createPinia } from 'pinia' +import { loadFonts } from './plugins/webfontloader' +import i18n from './locales/i18n' + +import 'bootstrap' + +import './globalVariables' + +import './styles/css/main.stylesheet.css' +import '../node_modules/bootstrap/scss/bootstrap.scss' +import './styles/color_theme.scss' +import './styles/simulator.scss' +import './styles/tutorials.scss' +import '@fortawesome/fontawesome-free/css/all.css' + +loadFonts() + +const app = createApp(App) + +app.use(createPinia()) +app.use(vuetify) +app.use(router) +app.use(i18n) +app.mount('#app') diff --git a/v0/src/pages/embed.vue b/v0/src/pages/embed.vue new file mode 100644 index 00000000..18a68a24 --- /dev/null +++ b/v0/src/pages/embed.vue @@ -0,0 +1,317 @@ + + + + + diff --git a/v0/src/pages/simulator.vue b/v0/src/pages/simulator.vue new file mode 100644 index 00000000..98c3e17e --- /dev/null +++ b/v0/src/pages/simulator.vue @@ -0,0 +1,27 @@ + + + diff --git a/v0/src/pages/simulatorHandler.vue b/v0/src/pages/simulatorHandler.vue new file mode 100644 index 00000000..d9e935ed --- /dev/null +++ b/v0/src/pages/simulatorHandler.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/v0/src/plugins/vuetify.ts b/v0/src/plugins/vuetify.ts new file mode 100644 index 00000000..d58e9e51 --- /dev/null +++ b/v0/src/plugins/vuetify.ts @@ -0,0 +1,9 @@ +// Styles +import '@mdi/font/css/materialdesignicons.css' +import 'vuetify/styles' + +// Vuetify +import { createVuetify } from 'vuetify' + +export default createVuetify() +// https://vuetifyjs.com/en/introduction/why-vuetify/#feature-guides diff --git a/v0/src/plugins/webfontloader.ts b/v0/src/plugins/webfontloader.ts new file mode 100644 index 00000000..f3287331 --- /dev/null +++ b/v0/src/plugins/webfontloader.ts @@ -0,0 +1,17 @@ +/** + * plugins/webfontloader.js + * + * webfontloader documentation: https://github.com/typekit/webfontloader + */ + +export async function loadFonts() { + const webFontLoader = await import( + /* webpackChunkName: "webfontloader" */ 'webfontloader' + ) + + webFontLoader.load({ + google: { + families: ['Roboto:100,300,400,500,700,900&display=swap'], + }, + }) +} diff --git a/v0/src/router/index.ts b/v0/src/router/index.ts new file mode 100644 index 00000000..730aea09 --- /dev/null +++ b/v0/src/router/index.ts @@ -0,0 +1,41 @@ +import { createRouter, createWebHistory } from 'vue-router' +import simulatorHandler from '../pages/simulatorHandler.vue' +import Embed from '../pages/embed.vue' + +const routes = [ + { + path: '/', + redirect: '/simulatorvue', // @TODO: update later back to /simulator + }, + { + path: '/simulatorvue', // @TODO: update later back to /simulator + name: 'simulator', + component: simulatorHandler, + children: [ + { + path: 'edit/:projectId', + name: 'simulator-edit', + component: simulatorHandler, + props: true, + }, + ], + }, + { + path: '/simulatorvue/:projectId', + name: 'simulator-view', + component: Embed, + props: true, + }, + { + path: '/simulatorvue/embed/:projectId', + name: 'simulator-embed', + component: Embed, + props: true, + }, +] +const router = createRouter({ + history: createWebHistory(), + routes, +}) + +export default router diff --git a/v0/src/shims-vuetify.d.ts b/v0/src/shims-vuetify.d.ts new file mode 100644 index 00000000..e4a5d5c5 --- /dev/null +++ b/v0/src/shims-vuetify.d.ts @@ -0,0 +1,3 @@ +declare module 'vuetify' +declare module 'vuetify/lib/components' +declare module 'vuetify/lib/directives' diff --git a/v0/src/simulator/spec/circuits/Decoders-plexers-circuitdata.json b/v0/src/simulator/spec/circuits/Decoders-plexers-circuitdata.json new file mode 100644 index 00000000..bf601345 --- /dev/null +++ b/v0/src/simulator/spec/circuits/Decoders-plexers-circuitdata.json @@ -0,0 +1,1109 @@ +{ + "name": "Decoders and Plexers", + "timePeriod": 500, + "clockEnabled": true, + "projectId": "RVvp1Qq4hf3eVcfUO7sE", + "focussedCircuit": 11597572508, + "orderedTabs": ["11597572508"], + "scopes": [ + { + "layout": { + "width": 100, + "height": 280, + "title_x": 50, + "title_y": 13, + "titleEnabled": true + }, + "verilogMetadata": { + "isVerilogCircuit": false, + "isMainCircuit": false, + "code": "// Write Some Verilog Code Here!", + "subCircuitScopeIds": [] + }, + "allNodes": [ + { + "x": -10, + "y": -10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [14] + }, + { + "x": -10, + "y": 10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [5] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [6] + }, + { + "x": 0, + "y": 20, + "type": 0, + "bitWidth": 1, + "label": "Control Signal", + "connections": [24] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [14] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [1] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [2] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [15] + }, + { + "x": -10, + "y": -10, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [12] + }, + { + "x": -10, + "y": 10, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [13] + }, + { + "x": 0, + "y": 20, + "type": 0, + "bitWidth": 1, + "label": "Control Signal", + "connections": [11] + }, + { + "x": 80, + "y": 510, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [10, 25] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [8] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [9] + }, + { + "x": -30, + "y": 130, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [0, 4, 15] + }, + { + "x": -30, + "y": 340, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [7, 14] + }, + { + "x": -20, + "y": 0, + "type": 0, + "bitWidth": 2, + "label": "Input", + "connections": [20] + }, + { + "x": 20, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "Output", + "connections": [19] + }, + { + "x": 0, + "y": 20, + "type": 0, + "bitWidth": 1, + "label": "Bit Selector", + "connections": [26] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [17] + }, + { + "x": 20, + "y": 0, + "type": 1, + "bitWidth": 2, + "label": "", + "connections": [16] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [22] + }, + { + "x": -180, + "y": 160, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [21, 23] + }, + { + "x": -180, + "y": 220, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [22, 24, 25] + }, + { + "x": 90, + "y": 220, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [3, 23] + }, + { + "x": -180, + "y": 510, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [11, 23, 27] + }, + { + "x": 70, + "y": 700, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [18, 27] + }, + { + "x": -180, + "y": 700, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [25, 26] + }, + { + "x": -10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [33] + }, + { + "x": 20, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [32] + }, + { + "x": 20, + "y": 20, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [31] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [30] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [29] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [28] + }, + { + "x": -10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [39] + }, + { + "x": 20, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [37] + }, + { + "x": 20, + "y": 20, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [38] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [35] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [36] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [34] + }, + { + "x": -10, + "y": -10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [46] + }, + { + "x": -10, + "y": 10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [47] + }, + { + "x": 30, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [45] + }, + { + "x": 10, + "y": 30, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [44] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [43] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [42] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [40] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [41] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [53] + }, + { + "x": -10, + "y": -10, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [51] + }, + { + "x": -10, + "y": 10, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [52] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [49] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [50] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [48] + } + ], + "id": 11597572508, + "name": "Main", + "Input": [ + { + "x": -70, + "y": 130, + "objectType": "Input", + "label": "inp1", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 4 + }, + "values": { + "state": 1 + }, + "constructorParamaters": [ + "RIGHT", + 1, + { + "x": 0, + "y": 60, + "id": "cZW4OLLsTA1aBoRSmHxv" + } + ] + } + }, + { + "x": -70, + "y": 150, + "objectType": "Input", + "label": "inp2", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 5 + }, + "values": { + "state": 1 + }, + "constructorParamaters": [ + "RIGHT", + 1, + { + "x": 0, + "y": 20, + "id": "OhBFKFzir02JVzBVOV44" + } + ] + } + }, + { + "x": -30, + "y": 630, + "objectType": "Input", + "label": "", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 20 + }, + "values": { + "state": 3 + }, + "constructorParamaters": [ + "RIGHT", + 2, + { + "x": 0, + "y": 120, + "id": "Tci49l79hiLHSfxqSPhk" + } + ] + } + }, + { + "x": -360, + "y": 160, + "objectType": "Input", + "label": "s", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 21 + }, + "values": { + "state": 0 + }, + "constructorParamaters": [ + "RIGHT", + 1, + { + "x": 0, + "y": 40, + "id": "2jYcmNNFpmoq6jcELh8X" + } + ] + } + }, + { + "x": -10, + "y": 840, + "objectType": "Input", + "label": "", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 33 + }, + "values": { + "state": 0 + }, + "constructorParamaters": [ + "RIGHT", + 1, + { + "x": 0, + "y": 80, + "id": "wUbTZgbmrEStf17qxgOw" + } + ] + } + }, + { + "x": 0, + "y": 1030, + "objectType": "Input", + "label": "", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 39 + }, + "values": { + "state": 1 + }, + "constructorParamaters": [ + "RIGHT", + 1, + { + "x": 0, + "y": 100, + "id": "hiFGtGajuArxucFOfydA" + } + ] + } + }, + { + "x": -550, + "y": 310, + "objectType": "Input", + "label": "", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 46 + }, + "values": { + "state": 1 + }, + "constructorParamaters": [ + "RIGHT", + 1, + { + "x": 0, + "y": 140, + "id": "6br60gi40FN03qZRFG9W" + } + ] + } + }, + { + "x": -550, + "y": 330, + "objectType": "Input", + "label": "", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 47 + }, + "values": { + "state": 1 + }, + "constructorParamaters": [ + "RIGHT", + 1, + { + "x": 0, + "y": 160, + "id": "EcNRmJVcoyFZdMUmGwQw" + } + ] + } + }, + { + "x": -600, + "y": 680, + "objectType": "Input", + "label": "", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 53 + }, + "values": { + "state": 1 + }, + "constructorParamaters": [ + "RIGHT", + 1, + { + "x": 0, + "y": 180, + "id": "eAluIwGbrt2vmFD37xUb" + } + ] + } + } + ], + "Output": [ + { + "x": 250, + "y": 140, + "objectType": "Output", + "label": "out1", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 6 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 40, + "id": "PQtMRkU1V36zoiUZaKnC" + } + ] + } + }, + { + "x": 340, + "y": 330, + "objectType": "Output", + "label": "out3", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 12 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 20, + "id": "rl7YenrdGRoBr9BXA2Ee" + } + ] + } + }, + { + "x": 340, + "y": 350, + "objectType": "Output", + "label": "out4", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 13 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 60, + "id": "gPrg5glyUDxsQmGldTow" + } + ] + } + }, + { + "x": 260, + "y": 630, + "objectType": "Output", + "label": "", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 19 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 80, + "id": "qqnDrlsm0T8y1dyyiGlL" + } + ] + } + }, + { + "x": 270, + "y": 860, + "objectType": "Output", + "label": "", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 31 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 120, + "id": "2smYfkmptbhEZ2gFBMmf" + } + ] + } + }, + { + "x": 270, + "y": 840, + "objectType": "Output", + "label": "", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 32 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 100, + "id": "45NWNA9b3l54VZE5cFYS" + } + ] + } + }, + { + "x": 220, + "y": 1030, + "objectType": "Output", + "label": "", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 37 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 140, + "id": "COIaU2CIfnmcZ8h0Nxpq" + } + ] + } + }, + { + "x": 220, + "y": 1050, + "objectType": "Output", + "label": "", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 38 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 160, + "id": "bJ7CLsYt9Johbanua2d4" + } + ] + } + }, + { + "x": -460, + "y": 400, + "objectType": "Output", + "label": "", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 44 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 180, + "id": "Of7qPmfBvyW9mhiLkfpN" + } + ] + } + }, + { + "x": -290, + "y": 320, + "objectType": "Output", + "label": "", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 45 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 200, + "id": "LLwXovDSOe6rplHPIDhv" + } + ] + } + }, + { + "x": -310, + "y": 670, + "objectType": "Output", + "label": "", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 51 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 220, + "id": "Yo4Zo5P6gClWQJZWt5DF" + } + ] + } + }, + { + "x": -310, + "y": 690, + "objectType": "Output", + "label": "", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 52 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 240, + "id": "T86CxN5DtKbZtDaZXSMx" + } + ] + } + } + ], + "Multiplexer": [ + { + "x": 90, + "y": 140, + "objectType": "Multiplexer", + "label": "multiplexer", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "constructorParamaters": ["RIGHT", 1, 1], + "nodes": { + "inp": [0, 1], + "output1": 2, + "controlSignalInput": 3 + } + } + } + ], + "BitSelector": [ + { + "x": 70, + "y": 630, + "objectType": "BitSelector", + "label": "", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "nodes": { + "inp1": 16, + "output1": 17, + "bitSelectorInp": 18 + }, + "constructorParamaters": ["RIGHT", 2, 1] + } + } + ], + "Demultiplexer": [ + { + "x": 80, + "y": 340, + "objectType": "Demultiplexer", + "label": "demultiplexer", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 10, + "customData": { + "constructorParamaters": ["LEFT", 1, 1], + "nodes": { + "output1": [8, 9], + "input": 7, + "controlSignalInput": 10 + } + } + } + ], + "MSB": [ + { + "x": 70, + "y": 840, + "objectType": "MSB", + "label": "", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "nodes": { + "inp1": 28, + "output1": 29, + "enable": 30 + }, + "constructorParamaters": ["RIGHT", 1] + } + } + ], + "LSB": [ + { + "x": 70, + "y": 1030, + "objectType": "LSB", + "label": "", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "nodes": { + "inp1": 34, + "output1": 35, + "enable": 36 + }, + "constructorParamaters": ["RIGHT", 1] + } + } + ], + "PriorityEncoder": [ + { + "x": -480, + "y": 320, + "objectType": "PriorityEncoder", + "label": "", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "nodes": { + "inp1": [40, 41], + "output1": [42], + "enable": 43 + }, + "constructorParamaters": ["RIGHT", 1] + } + } + ], + "Decoder": [ + { + "x": -480, + "y": 680, + "objectType": "Decoder", + "label": "", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 10, + "customData": { + "constructorParamaters": ["LEFT", 1], + "nodes": { + "output1": [49, 50], + "input": 48 + } + } + } + ], + "restrictedCircuitElementsUsed": [], + "nodes": [11, 14, 15, 22, 23, 24, 25, 26, 27] + } + ] +} diff --git a/v0/src/simulator/spec/circuits/gates-circuitdata.json b/v0/src/simulator/spec/circuits/gates-circuitdata.json new file mode 100644 index 00000000..a5c96609 --- /dev/null +++ b/v0/src/simulator/spec/circuits/gates-circuitdata.json @@ -0,0 +1,710 @@ +{ + "name": "gates-circuitdata", + "timePeriod": 500, + "clockEnabled": true, + "projectId": "hCqg1Ns4JVckHsnyKQDi", + "focussedCircuit": 11597572508, + "orderedTabs": ["11597572508"], + "scopes": [ + { + "layout": { + "width": 100, + "height": 280, + "title_x": 50, + "title_y": 13, + "titleEnabled": true + }, + "verilogMetadata": { + "isVerilogCircuit": false, + "isMainCircuit": false, + "code": "// Write Some Verilog Code Here!", + "subCircuitScopeIds": [] + }, + "allNodes": [ + { + "x": -10, + "y": -10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [29] + }, + { + "x": -10, + "y": 10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [31] + }, + { + "x": 20, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [22] + }, + { + "x": -10, + "y": -10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [30] + }, + { + "x": -10, + "y": 10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [32] + }, + { + "x": 20, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [23] + }, + { + "x": -10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [35] + }, + { + "x": 20, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [25] + }, + { + "x": -20, + "y": -10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [38] + }, + { + "x": -20, + "y": 10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [40] + }, + { + "x": 20, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [27] + }, + { + "x": -10, + "y": -10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [33] + }, + { + "x": -10, + "y": 10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [34] + }, + { + "x": 30, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [24] + }, + { + "x": -10, + "y": -10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [37] + }, + { + "x": -10, + "y": 10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [39] + }, + { + "x": 30, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [28] + }, + { + "x": -20, + "y": -10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [36] + }, + { + "x": -20, + "y": 10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [41] + }, + { + "x": 30, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [26] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [29] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [31] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [2] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [5] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [13] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [7] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [19] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [10] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [16] + }, + { + "x": 260, + "y": -10, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [0, 20, 30] + }, + { + "x": 260, + "y": 130, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [29, 3, 33] + }, + { + "x": 210, + "y": 10, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [1, 21, 32] + }, + { + "x": 210, + "y": 150, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [31, 4, 34] + }, + { + "x": 260, + "y": 300, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [30, 11, 35] + }, + { + "x": 210, + "y": 320, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [32, 12, 41] + }, + { + "x": 260, + "y": 460, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [33, 6, 36] + }, + { + "x": 260, + "y": 600, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [35, 17, 38] + }, + { + "x": 260, + "y": 820, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [38, 14] + }, + { + "x": 260, + "y": 740, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [36, 37, 8] + }, + { + "x": 210, + "y": 840, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [15, 40] + }, + { + "x": 210, + "y": 760, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [39, 9, 41] + }, + { + "x": 210, + "y": 620, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [34, 40, 18] + } + ], + "id": 11597572508, + "name": "Main", + "Input": [ + { + "x": -30, + "y": -10, + "objectType": "Input", + "label": "inp1", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 20 + }, + "values": { + "state": 1 + }, + "constructorParamaters": [ + "RIGHT", + 1, + { + "x": 0, + "y": 20, + "id": "55mKFwVFnZeU6ucfO8am" + } + ] + } + }, + { + "x": -30, + "y": 10, + "objectType": "Input", + "label": "inp2", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 21 + }, + "values": { + "state": 1 + }, + "constructorParamaters": [ + "RIGHT", + 1, + { + "x": 0, + "y": 40, + "id": "2O2YfZk7yuqLrtiRb429" + } + ] + } + } + ], + "Output": [ + { + "x": 500, + "y": 0, + "objectType": "Output", + "label": "out1", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 22 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 20, + "id": "RarwxCcQgRygZftUFlMr" + } + ] + } + }, + { + "x": 510, + "y": 140, + "objectType": "Output", + "label": "out2", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 23 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 40, + "id": "N0agpzN04aqy9nLexP98" + } + ] + } + }, + { + "x": 520, + "y": 310, + "objectType": "Output", + "label": "out3", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 24 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 60, + "id": "2yO9fxrqrjPk1urH47Fc" + } + ] + } + }, + { + "x": 520, + "y": 460, + "objectType": "Output", + "label": "out4", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 25 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 80, + "id": "IN7sNsKhkByzBHRShVdu" + } + ] + } + }, + { + "x": 520, + "y": 610, + "objectType": "Output", + "label": "out5", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 26 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 100, + "id": "Dfr4VEfv27q3AOwkLqpx" + } + ] + } + }, + { + "x": 520, + "y": 750, + "objectType": "Output", + "label": "out6", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 27 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 120, + "id": "FGeZ7ip5nJo9MUlEyJ35" + } + ] + } + }, + { + "x": 530, + "y": 830, + "objectType": "Output", + "label": "out7", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 28 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 140, + "id": "oYVAxzNmrQgKjC7I3xOg" + } + ] + } + } + ], + "NotGate": [ + { + "x": 340, + "y": 460, + "objectType": "NotGate", + "label": "NOT GATE", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "constructorParamaters": ["RIGHT", 1], + "nodes": { + "output1": 7, + "inp1": 6 + } + } + } + ], + "OrGate": [ + { + "x": 330, + "y": 140, + "objectType": "OrGate", + "label": "OR GATE", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "constructorParamaters": ["RIGHT", 2, 1], + "nodes": { + "inp": [3, 4], + "output1": 5 + } + } + } + ], + "AndGate": [ + { + "x": 320, + "y": 0, + "objectType": "AndGate", + "label": "AND GATE", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "constructorParamaters": ["RIGHT", 2, 1], + "nodes": { + "inp": [0, 1], + "output1": 2 + } + } + } + ], + "NorGate": [ + { + "x": 330, + "y": 830, + "objectType": "NorGate", + "label": "NOR", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "constructorParamaters": ["RIGHT", 2, 1], + "nodes": { + "inp": [14, 15], + "output1": 16 + } + } + } + ], + "NandGate": [ + { + "x": 340, + "y": 310, + "objectType": "NandGate", + "label": "NAND GATE", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "constructorParamaters": ["RIGHT", 2, 1], + "nodes": { + "inp": [11, 12], + "output1": 13 + } + } + } + ], + "XorGate": [ + { + "x": 330, + "y": 750, + "objectType": "XorGate", + "label": "XOR", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "constructorParamaters": ["RIGHT", 2, 1], + "nodes": { + "inp": [8, 9], + "output1": 10 + } + } + } + ], + "XnorGate": [ + { + "x": 330, + "y": 610, + "objectType": "XnorGate", + "label": "XNOR GATE", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "constructorParamaters": ["RIGHT", 2, 1], + "nodes": { + "inp": [17, 18], + "output1": 19 + } + } + } + ], + "restrictedCircuitElementsUsed": [], + "nodes": [29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41] + } + ] +} diff --git a/v0/src/simulator/spec/data.spec.js b/v0/src/simulator/spec/data.spec.js new file mode 100644 index 00000000..f91a08c8 --- /dev/null +++ b/v0/src/simulator/spec/data.spec.js @@ -0,0 +1,121 @@ +/** + * @jest-environment jsdom + */ + +import CodeMirror from 'codemirror' +import { setup } from '../src/setup' +import load from '../src/data/load' +import gatesCircuitData from './circuits/gates-circuitdata.json' +import decoderCircuitData from './circuits/Decoders-plexers-circuitdata.json' +import { checkIfBackup, scheduleBackup } from '../src/data/backupCircuit' +import undo from '../src/data/undo' +import redo from '../src/data/redo' +import save from '../src/data/save' +import { + clearProject, + newProject, + recoverProject, + saveOffline, + openOffline, +} from '../src/data/project' +import createSaveAsImgPrompt from '../src/data/saveImage' + +jest.mock('codemirror') + +describe('data dir working', () => { + CodeMirror.fromTextArea.mockReturnValueOnce({ setValue: () => {} }) + window.confirm = jest.fn(() => true) + setup() + + test('load gates_circuitData without throwing error', () => { + expect(() => load(gatesCircuitData)).not.toThrow() + }) + + test('should load another circuit data decoder_circuitData', () => { + expect(() => load(decoderCircuitData)).not.toThrow() + }) + + test('schedule backup working', () => { + // toggle states of inputs a dn then run schedule backup + globalScope.Input.forEach((input) => { + input.state = input.state === 1 ? 0 : 1 + expect(() => scheduleBackup()).not.toThrow() + }) + }) + + test('check if backup performed', () => { + expect(() => checkIfBackup(globalScope)).toBeTruthy() + }) + + test('undo working', () => { + const beforeUndo = { + backups: globalScope.backups.length, + history: globalScope.history.length, + } + for (let i = 1; i < beforeUndo.backups; i++) { + undo() + const afterUndo = { + backups: globalScope.backups.length + i, + history: globalScope.history.length - i, + } + expect(afterUndo).toEqual(beforeUndo) + } + }) + + test('redo working', () => { + const beforeRedo = { + backups: globalScope.backups.length, + history: globalScope.history.length, + } + for (let i = 1; i < beforeRedo.history; i++) { + redo() + const afterRedo = { + backups: globalScope.backups.length - i, + history: globalScope.history.length + i, + } + expect(afterRedo).toEqual(beforeRedo) + } + }) + + test('save updated circuit_data', () => { + // save project + window.logixProjectId = decoderCircuitData.projectId + expect(() => save()).not.toThrow() + }) + + test('project working', () => { + // create new project + expect(() => newProject(true)).not.toThrow() + }) + + test('clear Project working', () => { + // clear project + expect(() => clearProject()).not.toThrow() + }) + + test('recover Project working', () => { + // recover project from localstorage + localStorage.setItem('recover', JSON.stringify(gatesCircuitData)) + expect(() => recoverProject()).not.toThrow() + }) + + test('SaveOffline working', () => { + // save offline gate project + expect(() => saveOffline()).not.toThrow() + }) + + test('OpenOffline working', () => { + // open dialog + openOffline() + // click on first input + $('#openProjectDialog input')[0].click() + // click on open button + $('#Open_offline_btn')[0].click() + // it should load the offline saved project + expect(globalScope.id).toBe(11597572508) + }) + + test('saveImage working', () => { + expect(() => createSaveAsImgPrompt()).not.toThrow() + }) +}) diff --git a/v0/src/simulator/spec/gates.spec.js b/v0/src/simulator/spec/gates.spec.js new file mode 100644 index 00000000..90c7b1bd --- /dev/null +++ b/v0/src/simulator/spec/gates.spec.js @@ -0,0 +1,57 @@ +/** + * @jest-environment jsdom + */ + +import CodeMirror from 'codemirror' +import { setup } from '../src/setup' + +import load from '../src/data/load' +import circuitData from './circuits/gates-circuitdata.json' +import testData from './testData/gates-testdata.json' +import { runAll } from '../src/testbench' + +jest.mock('codemirror') + +describe('Simulator Gates Testing', () => { + CodeMirror.fromTextArea.mockReturnValueOnce({ setValue: (text) => {} }) + setup() + + test('load circuitData', () => { + expect(() => load(circuitData)).not.toThrow() + }) + + test('AND gate testing', () => { + const result = runAll(testData.AndGate) + expect(result.summary.passed).toBe(4) + }) + + test('NAND gate testing', () => { + const result = runAll(testData.nandGate) + expect(result.summary.passed).toBe(4) + }) + + test('NOR gate testing', () => { + const result = runAll(testData.norGate) + expect(result.summary.passed).toBe(4) + }) + + test('NOT gate testing', () => { + const result = runAll(testData.notGate) + expect(result.summary.passed).toBe(2) + }) + + test('OR gate testing', () => { + const result = runAll(testData.OrGate) + expect(result.summary.passed).toBe(4) + }) + + test('XNOR gate testing', () => { + const result = runAll(testData.xnorGate) + expect(result.summary.passed).toBe(4) + }) + + test('XOR gate testing', () => { + const result = runAll(testData.xorGate) + expect(result.summary.passed).toBe(4) + }) +}) diff --git a/v0/src/simulator/spec/testData/gates-testdata.json b/v0/src/simulator/spec/testData/gates-testdata.json new file mode 100644 index 00000000..3152253b --- /dev/null +++ b/v0/src/simulator/spec/testData/gates-testdata.json @@ -0,0 +1,200 @@ +{ + "AndGate": { + "type": "comb", + "title": "AND Gate", + "groups": [ + { + "label": "Group 1", + "inputs": [ + { + "label": "inp1", + "bitWidth": 1, + "values": ["0", "0", "1", "1"] + }, + { + "label": "inp2", + "bitWidth": 1, + "values": ["0", "1", "0", "1"] + } + ], + "outputs": [ + { + "label": "out1", + "bitWidth": 1, + "values": ["0", "0", "0", "1"] + } + ], + "n": 4 + } + ] + }, + "OrGate": { + "type": "comb", + "title": "OR Gate", + "groups": [ + { + "label": "Group 1", + "inputs": [ + { + "label": "inp1", + "bitWidth": 1, + "values": ["0", "0", "1", "1"] + }, + { + "label": "inp2", + "bitWidth": 1, + "values": ["0", "1", "0", "1"] + } + ], + "outputs": [ + { + "label": "out2", + "bitWidth": 1, + "values": ["0", "1", "1", "1"] + } + ], + "n": 4 + } + ] + }, + "nandGate": { + "type": "comb", + "title": "NAND Gate", + "groups": [ + { + "label": "Group 1", + "inputs": [ + { + "label": "inp1", + "bitWidth": 1, + "values": ["0", "0", "1", "1"] + }, + { + "label": "inp2", + "bitWidth": 1, + "values": ["0", "1", "0", "1"] + } + ], + "outputs": [ + { + "label": "out3", + "bitWidth": 1, + "values": ["1", "1", "1", "0"] + } + ], + "n": 4 + } + ] + }, + "xorGate": { + "type": "comb", + "title": "XOR Gate", + "groups": [ + { + "label": "Group 1", + "inputs": [ + { + "label": "inp1", + "bitWidth": 1, + "values": ["0", "0", "1", "1"] + }, + { + "label": "inp2", + "bitWidth": 1, + "values": ["0", "1", "0", "1"] + } + ], + "outputs": [ + { + "label": "out6", + "bitWidth": 1, + "values": ["0", "1", "1", "0"] + } + ], + "n": 4 + } + ] + }, + "norGate": { + "type": "comb", + "title": "NOR Gate", + "groups": [ + { + "label": "Group 1", + "inputs": [ + { + "label": "inp1", + "bitWidth": 1, + "values": ["0", "0", "1", "1"] + }, + { + "label": "inp2", + "bitWidth": 1, + "values": ["0", "1", "0", "1"] + } + ], + "outputs": [ + { + "label": "out7", + "bitWidth": 1, + "values": ["1", "0", "0", "0"] + } + ], + "n": 4 + } + ] + }, + "notGate": { + "type": "comb", + "title": "NOT GAte", + "groups": [ + { + "label": "Group 1", + "inputs": [ + { + "label": "inp1", + "bitWidth": 1, + "values": ["0", "1"] + } + ], + "outputs": [ + { + "label": "out4", + "bitWidth": 1, + "values": ["1", "0"] + } + ], + "n": 2 + } + ] + }, + "xnorGate": { + "type": "comb", + "title": "XNOR GAte", + "groups": [ + { + "label": "Group 1", + "inputs": [ + { + "label": "inp1", + "bitWidth": 1, + "values": ["0", "0", "1", "1"] + }, + { + "label": "inp2", + "bitWidth": 1, + "values": ["0", "1", "0", "1"] + } + ], + "outputs": [ + { + "label": "out5", + "bitWidth": 1, + "values": ["1", "0", "0", "1"] + } + ], + "n": 4 + } + ] + } +} diff --git a/v0/src/simulator/src/Verilog2CV.js b/v0/src/simulator/src/Verilog2CV.js new file mode 100644 index 00000000..83e7641e --- /dev/null +++ b/v0/src/simulator/src/Verilog2CV.js @@ -0,0 +1,264 @@ +import { + createNewCircuitScope, + switchCircuit, + changeCircuitName, +} from './circuit' +import SubCircuit from './subcircuit' +import simulationArea from './simulationArea' +import CodeMirror from 'codemirror/lib/codemirror.js' +import 'codemirror/lib/codemirror.css' + +// Importing CodeMirror themes +import 'codemirror/theme/3024-day.css' +import 'codemirror/theme/solarized.css' +import 'codemirror/theme/elegant.css' +import 'codemirror/theme/neat.css' +import 'codemirror/theme/idea.css' +import 'codemirror/theme/neo.css' +import 'codemirror/theme/3024-night.css' +import 'codemirror/theme/blackboard.css' +import 'codemirror/theme/cobalt.css' +import 'codemirror/theme/the-matrix.css' +import 'codemirror/theme/night.css' +import 'codemirror/theme/monokai.css' +import 'codemirror/theme/midnight.css' + +import 'codemirror/addon/hint/show-hint.css' +import 'codemirror/mode/verilog/verilog.js' +import 'codemirror/addon/edit/closebrackets.js' +import 'codemirror/addon/hint/anyword-hint.js' +import 'codemirror/addon/hint/show-hint.js' +import 'codemirror/addon/display/autorefresh.js' +import { showError, showMessage } from './utils' +import { showProperties } from './ux' + +var editor +var verilogMode = false + +export async function createVerilogCircuit() { + const returned = await createNewCircuitScope( + undefined, + undefined, + true, + true + ) + if (returned) verilogModeSet(true) +} + +export function saveVerilogCode() { + var code = editor.getValue() + globalScope.verilogMetadata.code = code + generateVerilogCircuit(code) +} + +export function applyVerilogTheme(theme) { + localStorage.setItem('verilog-theme', theme) + editor.setOption('theme', theme) +} + +export function resetVerilogCode() { + editor.setValue(globalScope.verilogMetadata.code) +} + +export function hasVerilogCodeChanges() { + return editor.getValue() != globalScope.verilogMetadata.code +} + +export function verilogModeGet() { + return verilogMode +} + +export function verilogModeSet(mode) { + if (mode == verilogMode) return + verilogMode = mode + if (mode) { + document.getElementById('code-window').style.display = 'block' + document.querySelector('.elementPanel').style.display = 'none' + document.querySelector('.timing-diagram-panel').style.display = 'none' + document.querySelector('.quick-btn').style.display = 'none' + document.getElementById('verilogEditorPanel').style.display = 'block' + if (!embed) { + simulationArea.lastSelected = globalScope.root + showProperties(undefined) + showProperties(simulationArea.lastSelected) + } + resetVerilogCode() + } else { + document.getElementById('code-window').style.display = 'none' + document.querySelector('.elementPanel').style.display = '' + document.querySelector('.timing-diagram-panel').style.display = '' + document.querySelector('.quick-btn').style.display = '' + document.getElementById('verilogEditorPanel').style.display = 'none' + } +} + +import yosysTypeMap from './VerilogClasses' + +class verilogSubCircuit { + constructor(circuit) { + this.circuit = circuit + } + + getPort(portName) { + var numInputs = this.circuit.inputNodes.length + var numOutputs = this.circuit.outputNodes.length + + for (var i = 0; i < numInputs; i++) { + if (this.circuit.data.Input[i].label == portName) { + return this.circuit.inputNodes[i] + } + } + + for (var i = 0; i < numOutputs; i++) { + if (this.circuit.data.Output[i].label == portName) { + return this.circuit.outputNodes[i] + } + } + } +} + +export function YosysJSON2CV( + JSON, + parentScope = globalScope, + name = 'verilogCircuit', + subCircuitScope = {}, + root = false +) { + var parentID = parentScope.id + var subScope + if (root) { + subScope = parentScope + } else { + subScope = newCircuit(name, undefined, true, false) + } + var circuitDevices = {} + + for (var subCircuitName in JSON.subcircuits) { + var scope = YosysJSON2CV( + JSON.subcircuits[subCircuitName], + subScope, + subCircuitName, + subCircuitScope + ) + subCircuitScope[subCircuitName] = scope.id + } + + for (var device in JSON.devices) { + var deviceType = JSON.devices[device].type + if (deviceType == 'Subcircuit') { + var subCircuitName = JSON.devices[device].celltype + circuitDevices[device] = new verilogSubCircuit( + new SubCircuit( + 500, + 500, + undefined, + subCircuitScope[subCircuitName] + ) + ) + } else { + circuitDevices[device] = new yosysTypeMap[deviceType]( + JSON.devices[device] + ) + } + } + + for (var connection in JSON.connectors) { + var fromId = JSON.connectors[connection]['from']['id'] + var fromPort = JSON.connectors[connection]['from']['port'] + var toId = JSON.connectors[connection]['to']['id'] + var toPort = JSON.connectors[connection]['to']['port'] + + var fromObj = circuitDevices[fromId] + var toObj = circuitDevices[toId] + + var fromPortNode = fromObj.getPort(fromPort) + var toPortNode = toObj.getPort(toPort) + + fromPortNode.connect(toPortNode) + } + + if (!root) { + switchCircuit(parentID) + return subScope + } +} + +export default function generateVerilogCircuit( + verilogCode, + scope = globalScope +) { + var params = { code: verilogCode } + fetch('/api/v1/simulator/verilogcv', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(params), + }) + .then((response) => { + if (!response.ok) { + throw response + } + return response.json() + }) + .then((circuitData) => { + scope.initialize() + for (var id in scope.verilogMetadata.subCircuitScopeIds) + delete scopeList[id] + scope.verilogMetadata.subCircuitScopeIds = [] + scope.verilogMetadata.code = verilogCode + var subCircuitScope = {} + YosysJSON2CV( + circuitData, + globalScope, + 'verilogCircuit', + subCircuitScope, + true + ) + changeCircuitName(circuitData.name) + showMessage('Verilog Circuit Successfully Created') + document.getElementById('verilogOutput').innerHTML = '' + }) + .catch((error) => { + if (error.status == 500) { + showError('Could not connect to Yosys') + } else { + showError('There is some issue with the code') + error.json().then((errorMessage) => { + document.getElementById('verilogOutput').innerHTML = + errorMessage.message + }) + } + }) +} + +export function setupCodeMirrorEnvironment() { + var myTextarea = document.getElementById('codeTextArea') + + CodeMirror.commands.autocomplete = function (cm) { + cm.showHint({ hint: CodeMirror.hint.anyword }) + } + + editor = CodeMirror.fromTextArea(myTextarea, { + mode: 'verilog', + autoRefresh: true, + styleActiveLine: true, + lineNumbers: true, + autoCloseBrackets: true, + smartIndent: true, + indentWithTabs: true, + extraKeys: { 'Ctrl-Space': 'autocomplete' }, + }) + + if (!localStorage.getItem('verilog-theme')) { + localStorage.setItem('verilog-theme', 'default') + } else { + const prevtheme = localStorage.getItem('verilog-theme') + editor.setOption('theme', prevtheme) + } + + editor.setValue('// Write Some Verilog Code Here!') + setTimeout(function () { + editor.refresh() + }, 1) +} diff --git a/v0/src/simulator/src/VerilogClasses.js b/v0/src/simulator/src/VerilogClasses.js new file mode 100644 index 00000000..253748af --- /dev/null +++ b/v0/src/simulator/src/VerilogClasses.js @@ -0,0 +1,1507 @@ +import AndGate from './modules/AndGate' +import NandGate from './modules/NandGate' +import Multiplexer from './modules/Multiplexer' +import XorGate from './modules/XorGate' +import XnorGate from './modules/XnorGate' +import SevenSegDisplay from './modules/SevenSegDisplay' +import SixteenSegDisplay from './modules/SixteenSegDisplay' +import HexDisplay from './modules/HexDisplay' +import OrGate from './modules/OrGate' +import Stepper from './modules/Stepper' +import NotGate from './modules/NotGate' +import Text from './modules/Text' +import TriState from './modules/TriState' +import Buffer from './modules/Buffer' +import ControlledInverter from './modules/ControlledInverter' +import Adder from './modules/Adder' +import verilogMultiplier from './modules/verilogMultiplier' +import verilogDivider from './modules/verilogDivider' +import verilogPower from './modules/verilogPower' +import verilogShiftLeft from './modules/verilogShiftLeft' +import verilogShiftRight from './modules/verilogShiftRight' +import TwoComplement from './modules/TwoComplement' +import Splitter from './modules/Splitter' +import Ground from './modules/Ground' +import Power from './modules/Power' +import Input from './modules/Input' +import Output from './modules/Output' +import BitSelector from './modules/BitSelector' +import ConstantVal from './modules/ConstantVal' +import NorGate from './modules/NorGate' +import DigitalLed from './modules/DigitalLed' +import VariableLed from './modules/VariableLed' +import Button from './modules/Button' +import RGBLed from './modules/RGBLed' +import SquareRGBLed from './modules/SquareRGBLed' +import Demultiplexer from './modules/Demultiplexer' +import Decoder from './modules/Decoder' +import Flag from './modules/Flag' +import MSB from './modules/MSB' +import LSB from './modules/LSB' +import PriorityEncoder from './modules/PriorityEncoder' +import Tunnel from './modules/Tunnel' +import ALU from './modules/ALU' +import Rectangle from './modules/Rectangle' +import Arrow from './modules/Arrow' +import Counter from './modules/Counter' +import Random from './modules/Random' +import RGBLedMatrix from './modules/RGBLedMatrix' +import simulationArea from './simulationArea' +import TflipFlop from './sequential/TflipFlop' +import DflipFlop from './sequential/DflipFlop' +import Dlatch from './sequential/Dlatch' +import SRflipFlop from './sequential/SRflipFlop' +import JKflipFlop from './sequential/JKflipFlop' +import TTY from './sequential/TTY' +import Keyboard from './sequential/Keyboard' +import Clock from './sequential/Clock' +import RAM from './sequential/RAM' +import verilogRAM from './sequential/verilogRAM' +import EEPROM from './sequential/EEPROM' +import Rom from './sequential/Rom' +import TB_Input from './testbench/testbenchInput' +import TB_Output from './testbench/testbenchOutput' +import ForceGate from './testbench/ForceGate' +import { newCircuit, switchCircuit, changeCircuitName } from './circuit' +import SubCircuit from './subcircuit' + +function getBitWidth(bitsJSON) { + if (Number.isInteger(bitsJSON)) { + return bitsJSON + } else { + var ans = 1 + for (var i in bitsJSON) { + ans = Math.max(ans, bitsJSON[i]) + } + return ans + } +} + +class verilogUnaryGate { + constructor(deviceJSON) { + this.bitWidth = 1 + if (deviceJSON['bits']) { + this.bitWidth = getBitWidth(deviceJSON['bits']) + } + } + + getPort(portName) { + if (portName == 'in') { + return this.input + } + if (portName == 'out') { + return this.output + } + } +} + +class verilogInput extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + if (deviceJSON['net'] == 'clk' || deviceJSON['net'] == 'clock') { + this.element = new Clock(0, 0) + } else { + this.element = new Input(0, 0, undefined, undefined, this.bitWidth) + } + this.output = this.element.output1 + this.element.label = deviceJSON['net'] + } +} + +class verilogOutput extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new Output(0, 0, undefined, undefined, this.bitWidth) + this.input = this.element.inp1 + this.element.label = deviceJSON['net'] + } +} + +class verilogClock extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new Clock(0, 0) + this.output = this.element.output1 + } +} + +class verilogButton extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new Button(0, 0) + this.output = this.element.output1 + } +} + +class verilogLamp extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new DigitalLed(0, 0) + this.input = this.element.inp1 + } +} + +class verilogNotGate extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new NotGate(0, 0, undefined, undefined, this.bitWidth) + this.input = this.element.inp1 + this.output = this.element.output1 + } +} + +class verilogRepeaterGate extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new Buffer(0, 0, undefined, undefined, this.bitWidth) + this.input = this.element.inp1 + this.output = this.element.output1 + } +} + +class verilogConstantVal extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.bitWidth = deviceJSON['constant'].length + this.state = deviceJSON['constant'] + if (this.state[0] == 'x') { + this.state = undefined + } + this.element = new ConstantVal( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.state + ) + this.input = this.element.inp1 + this.output = this.element.output1 + } +} + +class verilogReduceAndGate extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.bitWidthSplit = [] + for (var i = 0; i < this.bitWidth; i++) { + this.bitWidthSplit.push(1) + } + + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.bitWidthSplit + ) + this.andGate = new AndGate(0, 0, undefined, undefined, this.bitWidth, 1) + + for (var i = 0; i < this.bitWidth; i++) { + this.splitter.outputs[i].connect(this.andGate.inp[i]) + } + + this.input = this.splitter.inp1 + this.output = this.andGate.output1 + } +} + +class verilogReduceNandGate extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.bitWidthSplit = [] + for (var i = 0; i < this.bitWidth; i++) { + this.bitWidthSplit.push(1) + } + + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.bitWidthSplit + ) + this.nandGate = new NandGate( + 0, + 0, + undefined, + undefined, + this.bitWidth, + 1 + ) + + for (var i = 0; i < this.bitWidth; i++) { + this.splitter.outputs[i].connect(this.nandGate.inp[i]) + } + + this.input = this.splitter.inp1 + this.output = this.nandGate.output1 + } +} + +class verilogReduceOrGate extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.bitWidthSplit = [] + for (var i = 0; i < this.bitWidth; i++) { + this.bitWidthSplit.push(1) + } + + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.bitWidthSplit + ) + this.orGate = new OrGate(0, 0, undefined, undefined, this.bitWidth, 1) + + for (var i = 0; i < this.bitWidth; i++) { + this.splitter.outputs[i].connect(this.orGate.inp[i]) + } + + this.input = this.splitter.inp1 + this.output = this.orGate.output1 + } +} + +class verilogReduceNorGate extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.bitWidthSplit = [] + for (var i = 0; i < this.bitWidth; i++) { + this.bitWidthSplit.push(1) + } + + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.bitWidthSplit + ) + this.norGate = new NorGate(0, 0, undefined, undefined, this.bitWidth, 1) + + for (var i = 0; i < this.bitWidth; i++) { + this.splitter.outputs[i].connect(this.norGate.inp[i]) + } + + this.input = this.splitter.inp1 + this.output = this.norGate.output1 + } +} + +class verilogReduceXorGate extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.bitWidthSplit = [] + for (var i = 0; i < this.bitWidth; i++) { + this.bitWidthSplit.push(1) + } + + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.bitWidthSplit + ) + this.xorGate = new XorGate(0, 0, undefined, undefined, this.bitWidth, 1) + + for (var i = 0; i < this.bitWidth; i++) { + this.splitter.outputs[i].connect(this.xorGate.inp[i]) + } + + this.input = this.splitter.inp1 + this.output = this.xorGate.output1 + } +} + +class verilogReduceXnorGate extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.bitWidthSplit = [] + for (var i = 0; i < this.bitWidth; i++) { + this.bitWidthSplit.push(1) + } + + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.bitWidthSplit + ) + this.xnorGate = new XnorGate( + 0, + 0, + undefined, + undefined, + this.bitWidth, + 1 + ) + + for (var i = 0; i < this.bitWidth; i++) { + this.splitter.outputs[i].connect(this.xnorGate.inp[i]) + } + + this.input = this.splitter.inp1 + this.output = this.xnorGate.output1 + } +} + +class verilogBusSlice extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.bitWidth = deviceJSON['slice']['total'] + + this.start = deviceJSON['slice']['first'] + this.count = deviceJSON['slice']['count'] + if (this.start == 0) { + if (this.count == this.bitWidth) { + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [this.bitWidth] + ) + } else { + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [this.count, this.bitWidth - this.count] + ) + } + + this.input = this.splitter.inp1 + this.output = this.splitter.outputs[0] + } else { + if (this.start + this.count == this.bitWidth) { + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [this.start, this.count] + ) + } else { + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [ + this.start, + this.count, + this.bitWidth - this.start - this.count, + ] + ) + } + this.input = this.splitter.inp1 + this.output = this.splitter.outputs[1] + } + } +} + +class verilogZeroExtend extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.inputBitWidth = deviceJSON['extend']['input'] + this.outputBitWidth = deviceJSON['extend']['output'] + + var extraBits = this.outputBitWidth - this.inputBitWidth + + var zeroState = '' + for (var i = 0; i < extraBits; i++) { + zeroState += '0' + } + + this.zeroConstant = new ConstantVal( + 0, + 0, + undefined, + undefined, + extraBits, + zeroState + ) + + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.outputBitWidth, + [this.inputBitWidth, extraBits] + ) + + this.zeroConstant.output1.connect(this.splitter.outputs[1]) + this.input = this.splitter.outputs[0] + this.output = this.splitter.inp1 + } +} + +class verilogNegationGate extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.inputBitWidth = deviceJSON['bits']['in'] + + this.notGate = new NotGate(400, 0, undefined, undefined, this.bitWidth) + this.adder = new Adder(300, 0, undefined, undefined, this.bitWidth) + + if (this.inputBitWidth != this.bitWidth) { + var extraBits = this.bitWidth - this.inputBitWidth + this.splitter = new Splitter( + 600, + 600, + undefined, + undefined, + this.bitWidth, + [this.inputBitWidth, extraBits] + ) + + var zeroState = '' + for (var i = 0; i < extraBits; i++) { + zeroState += '0' + } + + this.zeroConstant = new ConstantVal( + 550, + 550, + undefined, + undefined, + extraBits, + zeroState + ) + + this.zeroConstant.output1.connect(this.splitter.outputs[1]) + this.splitter.inp1.connect(this.notGate.inp1) + + this.input = this.splitter.outputs[0] + } else { + this.input = this.notGate.inp1 + } + + var oneVal = '' + for (var i = 0; i < this.bitWidth - 1; i++) { + oneVal += '0' + } + oneVal += '1' + + this.oneConstant = new ConstantVal( + 0, + 0, + undefined, + undefined, + this.bitWidth, + oneVal + ) + + this.notGate.output1.connect(this.adder.inpA) + this.oneConstant.output1.connect(this.adder.inpB) + + this.output = this.adder.sum + } +} + +class verilogBinaryGate { + constructor(deviceJSON) { + this.bitWidth = 1 + if (deviceJSON['bits']) { + this.bitWidth = getBitWidth(deviceJSON['bits']) + } + } + + getPort(portName) { + if (portName == 'in1') { + return this.input[0] + } else if (portName == 'in2') { + return this.input[1] + } else if (portName == 'out') { + return this.output + } + } +} + +class verilogAndGate extends verilogBinaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new AndGate( + 0, + 0, + undefined, + undefined, + undefined, + this.bitWidth + ) + this.input = [this.element.inp[0], this.element.inp[1]] + this.output = this.element.output1 + } +} + +class verilogNandGate extends verilogBinaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new NandGate( + 0, + 0, + undefined, + undefined, + undefined, + this.bitWidth + ) + this.input = [this.element.inp[0], this.element.inp[1]] + this.output = this.element.output1 + } +} + +class verilogOrGate extends verilogBinaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new OrGate( + 0, + 0, + undefined, + undefined, + undefined, + this.bitWidth + ) + this.input = [this.element.inp[0], this.element.inp[1]] + this.output = this.element.output1 + } +} + +class verilogNorGate extends verilogBinaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new NorGate( + 0, + 0, + undefined, + undefined, + undefined, + this.bitWidth + ) + this.input = [this.element.inp[0], this.element.inp[1]] + this.output = this.element.output1 + } +} + +class verilogXorGate extends verilogBinaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new XorGate( + 0, + 0, + undefined, + undefined, + undefined, + this.bitWidth + ) + this.input = [this.element.inp[0], this.element.inp[1]] + this.output = this.element.output1 + } +} + +class verilogXnorGate extends verilogBinaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new XnorGate( + 0, + 0, + undefined, + undefined, + undefined, + this.bitWidth + ) + this.input = [this.element.inp[0], this.element.inp[1]] + this.output = this.element.output1 + } +} + +class verilogMathGate extends verilogBinaryGate { + constructor(deviceJSON, includeOutBitWidth) { + super(deviceJSON) + + this.bitWidth = Math.max( + deviceJSON['bits']['in1'], + deviceJSON['bits']['in2'] + ) + + if (includeOutBitWidth) { + this.bitWidth = Math.max(deviceJSON['bits']['out'], this.bitWidth) + } + + if (!Number.isInteger(deviceJSON['bits'])) { + this.in1BitWidth = deviceJSON['bits']['in1'] + this.in2BitWidth = deviceJSON['bits']['in2'] + } + + this.input = [] + + var extraBits = this.bitWidth - this.in1BitWidth + + if (extraBits != 0) { + this.in1Splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [this.in1BitWidth, extraBits] + ) + + var zeroState = '' + for (var i = 0; i < extraBits; i++) { + zeroState += '0' + } + this.in1ZeroConstant = new ConstantVal( + 0, + 0, + undefined, + undefined, + extraBits, + zeroState + ) + this.in1ZeroConstant.output1.connect(this.in1Splitter.outputs[1]) + } else { + this.in1Splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [this.bitWidth] + ) + } + + var extraBits = this.bitWidth - this.in2BitWidth + if (extraBits != 0) { + this.in2Splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [this.in2BitWidth, extraBits] + ) + var zeroState = '' + for (var i = 0; i < extraBits; i++) { + zeroState += '0' + } + + this.in2ZeroConstant = new ConstantVal( + 0, + 0, + undefined, + undefined, + extraBits, + zeroState + ) + this.in2ZeroConstant.output1.connect(this.in2Splitter.outputs[1]) + } else { + this.in2Splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [this.bitWidth] + ) + } + + this.input = [this.in1Splitter.outputs[0], this.in2Splitter.outputs[0]] + } +} + +class verilogEqGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON, false) + + var bitWidthSplit = [] + + for (var i = 0; i < this.bitWidth; i++) { + bitWidthSplit.push(1) + } + + this.xnorGate = new XnorGate( + 0, + 0, + undefined, + undefined, + undefined, + this.bitWidth + ) + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + bitWidthSplit + ) + this.andGate = new AndGate(0, 0, undefined, undefined, this.bitWidth) + this.in1Splitter.inp1.connect(this.xnorGate.inp[0]) + this.in2Splitter.inp1.connect(this.xnorGate.inp[1]) + + this.xnorGate.output1.connect(this.splitter.inp1) + for (var i = 0; i < this.bitWidth; i++) { + this.splitter.outputs[i].connect(this.andGate.inp[i]) + } + + this.output = this.andGate.output1 + } +} + +class verilogNeGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON, false) + + var bitWidthSplit = [] + + for (var i = 0; i < this.bitWidth; i++) { + bitWidthSplit.push(1) + } + + this.xnorGate = new XnorGate( + 0, + 0, + undefined, + undefined, + undefined, + this.bitWidth + ) + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + bitWidthSplit + ) + this.nandGate = new NandGate(0, 0, undefined, undefined, this.bitWidth) + + this.in1Splitter.inp1.connect(this.xnorGate.inp[0]) + this.in2Splitter.inp1.connect(this.xnorGate.inp[1]) + + this.xnorGate.output1.connect(this.splitter.inp1) + for (var i = 0; i < this.bitWidth; i++) { + this.splitter.outputs[i].connect(this.nandGate.inp[i]) + } + + this.output = this.nandGate.output1 + } +} + +class verilogLtGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON, false) + this.constant7 = new ConstantVal(0, 0, undefined, undefined, 3, '111') + this.alu = new ALU(0, 0, undefined, undefined, this.bitWidth) + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [1] + ) + + this.in1Splitter.inp1.connect(this.alu.inp1) + this.in2Splitter.inp1.connect(this.alu.inp2) + + this.constant7.output1.connect(this.alu.controlSignalInput) + this.alu.output.connect(this.splitter.inp1) + + this.output = this.splitter.outputs[0] + } +} + +class verilogGtGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON, false) + this.constant7 = new ConstantVal(0, 0, undefined, undefined, 3, '111') + this.alu = new ALU(0, 0, undefined, undefined, this.bitWidth) + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [1] + ) + + this.in1Splitter.inp1.connect(this.alu.inp1) + this.in2Splitter.inp1.connect(this.alu.inp2) + + this.constant7.output1.connect(this.alu.controlSignalInput) + this.alu.output.connect(this.splitter.inp1) + + this.output = this.splitter.outputs[0] + } +} + +class verilogGeGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON, false) + this.constant7 = new ConstantVal(0, 0, undefined, undefined, 3, '111') + this.alu = new ALU(0, 0, undefined, undefined, this.bitWidth) + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [1] + ) + this.notGate = new NotGate(0, 0) + + this.in1Splitter.inp1.connect(this.alu.inp1) + this.in2Splitter.inp1.connect(this.alu.inp2) + + this.constant7.output1.connect(this.alu.controlSignalInput) + this.alu.output.connect(this.splitter.inp1) + this.splitter.outputs[0].connect(this.notGate.inp1) + + this.output = this.notGate.output1 + } +} + +class verilogLeGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON, false) + this.constant7 = new ConstantVal(0, 0, undefined, undefined, 3, '111') + this.alu = new ALU(0, 0, undefined, undefined, this.bitWidth) + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [1] + ) + this.notGate = new NotGate(0, 0) + + this.in1Splitter.inp1.connect(this.alu.inp1) + this.in2Splitter.inp1.connect(this.alu.inp2) + + this.constant7.output1.connect(this.alu.controlSignalInput) + this.alu.output.connect(this.splitter.inp1) + this.splitter.outputs[0].connect(this.notGate.inp1) + + this.output = this.notGate.output1 + } +} + +class verilogAdditionGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON, false) + + this.outBitWidth = deviceJSON['bits']['out'] + + this.adder = new Adder(0, 0, undefined, undefined, this.bitWidth) + + this.in1Splitter.inp1.connect(this.adder.inpA) + this.in2Splitter.inp1.connect(this.adder.inpB) + + if (this.outBitWidth == this.bitWidth) { + this.output = this.adder.sum + } else if (this.outBitWidth == this.bitWidth + 1) { + this.outputSplitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.outBitWidth, + [this.bitWidth, 1] + ) + this.adder.sum.connect(this.outputSplitter.outputs[0]) + this.adder.carryOut.connect(this.outputSplitter.outputs[1]) + this.output = this.outputSplitter.inp1 + } + } +} + +class verilogMultiplicationGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.outBitWidth = deviceJSON['bits']['out'] + + this.verilogMultiplier = new verilogMultiplier( + 300, + 300, + undefined, + undefined, + this.bitWidth, + this.outBitWidth + ) + + this.in1Splitter.inp1.connect(this.verilogMultiplier.inpA) + this.in2Splitter.inp1.connect(this.verilogMultiplier.inpB) + + this.output = this.verilogMultiplier.product + } +} + +class verilogDivisionGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.outBitWidth = deviceJSON['bits']['out'] + + this.verilogDivider = new verilogDivider( + 300, + 300, + undefined, + undefined, + this.bitWidth, + this.outBitWidth + ) + + this.in1Splitter.inp1.connect(this.verilogDivider.inpA) + this.in2Splitter.inp1.connect(this.verilogDivider.inpB) + + this.output = this.verilogDivider.quotient + } +} + +class verilogPowerGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.outBitWidth = deviceJSON['bits']['out'] + + this.verilogPower = new verilogPower( + 300, + 300, + undefined, + undefined, + this.bitWidth, + this.outBitWidth + ) + + this.in1Splitter.inp1.connect(this.verilogPower.inpA) + this.in2Splitter.inp1.connect(this.verilogPower.inpB) + + this.output = this.verilogPower.answer + } +} + +class verilogModuloGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.outBitWidth = deviceJSON['bits']['out'] + + this.verilogDivider = new verilogDivider( + 300, + 300, + undefined, + undefined, + this.bitWidth, + this.outBitWidth + ) + + this.in1Splitter.inp1.connect(this.verilogDivider.inpA) + this.in2Splitter.inp1.connect(this.verilogDivider.inpB) + + this.output = this.verilogDivider.remainder + } +} + +class verilogShiftLeftGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.outBitWidth = deviceJSON['bits']['out'] + + this.verilogShiftLeft = new verilogShiftLeft( + 300, + 300, + undefined, + undefined, + this.bitWidth, + this.outBitWidth + ) + + this.in1Splitter.inp1.connect(this.verilogShiftLeft.inp1) + this.in2Splitter.inp1.connect(this.verilogShiftLeft.shiftInp) + + this.output = this.verilogShiftLeft.output1 + } +} + +class verilogShiftRightGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.outBitWidth = deviceJSON['bits']['out'] + + this.verilogShiftRight = new verilogShiftRight( + 300, + 300, + undefined, + undefined, + this.bitWidth, + this.outBitWidth + ) + + this.in1Splitter.inp1.connect(this.verilogShiftRight.inp1) + this.in2Splitter.inp1.connect(this.verilogShiftRight.shiftInp) + + this.output = this.verilogShiftRight.output1 + } +} + +class verilogSubtractionGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON, true) + + this.alu = new ALU(0, 0, undefined, undefined, this.bitWidth) + + this.controlConstant = new ConstantVal( + 0, + 0, + undefined, + undefined, + 3, + '110' + ) + this.alu.controlSignalInput.connect(this.controlConstant.output1) + + this.in1Splitter.inp1.connect(this.alu.inp1) + this.in2Splitter.inp1.connect(this.alu.inp2) + + this.output = this.alu.output + } +} + +class verilogDff { + constructor(deviceJSON) { + this.bitWidth = 1 + if (deviceJSON['bits']) { + this.bitWidth = getBitWidth(deviceJSON['bits']) + } + + this.dff = new DflipFlop(0, 0, undefined, undefined, this.bitWidth) + this.clockInput = this.dff.clockInp + this.arstInput = this.dff.reset + this.enableInput = this.dff.en + + this.clockPolarity = true + this.arstPolarity = true + this.enablePolarity = true + + if (deviceJSON['polarity']['clock'] != undefined) { + this.clockPolarity = deviceJSON['polarity']['clock'] + } + if (this.clockPolarity == false) { + this.notGateClock = new NotGate(0, 0) + this.notGateClock.output1.connect(this.dff.clockInp) + this.clockInput = this.notGateClock.inp1 + } + + if (deviceJSON['polarity']['enable'] != undefined) { + this.enablePolarity = deviceJSON['polarity']['enable'] + } + if (this.enablePolarity == false) { + this.notGateEnable = new NotGate(0, 0) + this.notGateEnable.output1.connect(this.dff.en) + this.enableInput = this.notGateEnable.inp1 + } + + if (deviceJSON['polarity']['arst'] != undefined) { + this.arstPolarity = deviceJSON['polarity']['arst'] + } + if (this.arstPolarity == false) { + this.notGateArst = new NotGate(0, 0) + this.notGateArst.output1.connect(this.dff.reset) + this.arstInput = this.notGateArst.inp1 + } + if (deviceJSON['arst_value'] != undefined) { + this.arst_value_constant = new ConstantVal( + 0, + 0, + undefined, + undefined, + this.bitWidth, + deviceJSON['arst_value'] + ) + this.arst_value_constant.output1.connect(this.dff.preset) + } + + this.dInput = this.dff.dInp + this.qOutput = this.dff.qOutput + } + + getPort(portName) { + if (portName == 'clk') { + return this.clockInput + } else if (portName == 'in') { + return this.dInput + } else if (portName == 'arst') { + return this.arstInput + } else if (portName == 'en') { + return this.enableInput + } else if (portName == 'out') { + return this.qOutput + } + } +} + +class verilogMultiplexer { + constructor(deviceJSON) { + this.bitWidth = 1 + this.selectBitWidth = undefined + if (deviceJSON['bits']['in'] != undefined) { + this.bitWidth = deviceJSON['bits']['in'] + } + + if (deviceJSON['bits']['sel'] != undefined) { + this.selectBitWidth = deviceJSON['bits']['sel'] + } + + this.multiplexer = new Multiplexer( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.selectBitWidth + ) + + this.input = this.multiplexer.inp + this.selectInput = this.multiplexer.controlSignalInput + this.output = this.multiplexer.output1 + } + + getPort(portName) { + if (portName == 'sel') { + return this.selectInput + } else if (portName == 'out') { + return this.output + } else { + var len = portName.length + var index = parseInt(portName.substring(2, len)) + + return this.input[index] + } + } +} + +class verilogMultiplexer1Hot { + constructor(deviceJSON) { + this.bitWidth = 1 + this.selectBitWidth = undefined + if (deviceJSON['bits']['in'] != undefined) { + this.bitWidth = deviceJSON['bits']['in'] + } + + if (deviceJSON['bits']['sel'] != undefined) { + this.selectBitWidth = deviceJSON['bits']['sel'] + } + + this.multiplexer = new Multiplexer( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.selectBitWidth + ) + this.lsb = new LSB(0, 0, undefined, undefined, this.selectBitWidth) + this.adder = new Adder(0, 0, undefined, undefined, this.selectBitWidth) + + var zeroState = '' + for (var i = 0; i < this.selectBitWidth - 1; i++) { + zeroState += '0' + } + this.zeroPadEnable = new ConstantVal( + 0, + 0, + undefined, + undefined, + this.selectBitWidth - 1, + zeroState + ) + + this.enbaleSplitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.selectBitWidth, + [1, this.selectBitWidth - 1] + ) + + this.lsb.enable.connect(this.enbaleSplitter.outputs[0]) + this.zeroPadEnable.output1.connect(this.enbaleSplitter.outputs[1]) + + this.adder.inpA.connect(this.lsb.output1) + this.adder.inpB.connect(this.enbaleSplitter.inp1) + + this.adder.sum.connect(this.multiplexer.controlSignalInput) + this.input = this.multiplexer.inp + this.selectInput = this.lsb.inp1 + this.output = this.multiplexer.output1 + } + + getPort(portName) { + if (portName == 'sel') { + return this.selectInput + } else if (portName == 'out') { + return this.output + } else { + var len = portName.length + var index = parseInt(portName.substring(2, len)) + + return this.input[index] + } + } +} + +class verilogBusGroup { + constructor(deviceJSON) { + this.bitWidth = 0 + this.bitWidthSplit = deviceJSON['groups'] + + for (var i = 0; i < this.bitWidthSplit.length; i++) { + this.bitWidth += this.bitWidthSplit[i] + } + + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.bitWidthSplit + ) + + this.input = this.splitter.outputs + this.output = this.splitter.inp1 + } + + getPort(portName) { + if (portName == 'out') { + return this.output + } else { + var len = portName.length + var index = parseInt(portName.substring(2, len)) + + return this.input[index] + } + } +} + +class verilogBusUngroup { + constructor(deviceJSON) { + this.bitWidth = 0 + this.bitWidthSplit = deviceJSON['groups'] + + for (var i = 0; i < this.bitWidthSplit.length; i++) { + this.bitWidth += this.bitWidthSplit[i] + } + + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.bitWidthSplit + ) + + this.input = this.splitter.inp1 + this.output = this.splitter.outputs + } + + getPort(portName) { + if (portName == 'in') { + return this.input + } else { + var len = portName.length + var index = parseInt(portName.substring(3, len)) + + return this.output[index] + } + } +} + +class verilogMemory { + constructor(deviceJSON) { + this.memData = deviceJSON['memdata'] + this.dataBitWidth = deviceJSON['bits'] + this.addressBitWidth = deviceJSON['abits'] + this.words = deviceJSON['words'] + + this.numRead = deviceJSON['rdports'].length + this.numWrite = deviceJSON['wrports'].length + + this.verilogRAM = new verilogRAM( + 0, + 0, + undefined, + undefined, + this.dataBitWidth, + this.addressBitWidth, + this.memData, + this.words, + this.numRead, + this.numWrite, + deviceJSON['rdports'], + deviceJSON['wrports'] + ) + + this.writeAddressInput = this.verilogRAM.writeAddress + this.readAddressInput = this.verilogRAM.readAddress + this.writeDataInput = this.verilogRAM.writeDataIn + this.writeEnableInput = this.verilogRAM.writeEnable + this.readDataOutput = this.verilogRAM.dataOut + this.readDffOut = this.verilogRAM.readDff + + for (var i = 0; i < this.numWrite; i++) { + var writeEnInput = new Input( + 0, + 0, + undefined, + undefined, + 1, + undefined + ) + writeEnInput.label = 'en' + i.toString() + writeEnInput.output1.connect(this.verilogRAM.writeEnable[i]) + } + } + + getPort(portName) { + var len = portName.length + var isPortAddr = portName.slice(len - 4, len) == 'addr' + var isPortData = portName.slice(len - 4, len) == 'data' + var isPortClk = portName.slice(len - 3, len) == 'clk' + var isPortEn = portName.slice(len - 2, len) == 'en' + if (portName.startsWith('rd')) { + if (isPortAddr) { + var portNum = portName.slice(2, len - 4) + portNum = parseInt(portNum) + + return this.readAddressInput[portNum] + } + if (isPortData) { + var portNum = portName.slice(2, len - 4) + portNum = parseInt(portNum) + return this.verilogRAM.readDffQOutput[portNum] + } + if (isPortClk) { + var portNum = portName.slice(2, len - 3) + portNum = parseInt(portNum) + + return this.verilogRAM.readDffClock[portNum] + } + if (isPortEn) { + var portNum = portName.slice(2, len - 2) + portNum = parseInt(portNum) + + return this.verilogRAM.readDffEn[portNum] + } + } else { + if (isPortAddr) { + var portNum = portName.slice(2, len - 4) + portNum = parseInt(portNum) + return this.writeAddressInput[portNum] + } + if (isPortData) { + var portNum = portName.slice(2, len - 4) + portNum = parseInt(portNum) + return this.writeDataInput[portNum] + } + if (isPortClk) { + var portNum = portName.slice(2, len - 3) + portNum = parseInt(portNum) + + return this.verilogRAM.writeDffClock[portNum] + } + if (isPortEn) { + var portNum = portName.slice(2, len - 2) + portNum = parseInt(portNum) + + return this.verilogRAM.writeDffEn[portNum] + } + } + } +} + +let yosysTypeMap = {} + +yosysTypeMap['Not'] = verilogNotGate +yosysTypeMap['Repeater'] = verilogRepeaterGate +yosysTypeMap['And'] = verilogAndGate +yosysTypeMap['Nand'] = verilogNandGate +yosysTypeMap['Or'] = verilogOrGate +yosysTypeMap['Nor'] = verilogNorGate +yosysTypeMap['Xor'] = verilogXorGate +yosysTypeMap['Xnor'] = verilogXnorGate +yosysTypeMap['Constant'] = verilogConstantVal +yosysTypeMap['Input'] = verilogInput +yosysTypeMap['Output'] = verilogOutput +yosysTypeMap['AndReduce'] = verilogReduceAndGate +yosysTypeMap['NandReduce'] = verilogReduceNandGate +yosysTypeMap['OrReduce'] = verilogReduceOrGate +yosysTypeMap['NorReduce'] = verilogReduceNorGate +yosysTypeMap['XorReduce'] = verilogReduceXorGate +yosysTypeMap['XnorReduce'] = verilogReduceXnorGate + +yosysTypeMap['Eq'] = verilogEqGate +yosysTypeMap['Ne'] = verilogNeGate + +yosysTypeMap['Lt'] = verilogLtGate +yosysTypeMap['Le'] = verilogLeGate +yosysTypeMap['Ge'] = verilogGeGate +yosysTypeMap['Gt'] = verilogGtGate + +yosysTypeMap['ZeroExtend'] = verilogZeroExtend +yosysTypeMap['Negation'] = verilogNegationGate + +yosysTypeMap['Dff'] = verilogDff +yosysTypeMap['Mux'] = verilogMultiplexer +yosysTypeMap['Mux1Hot'] = verilogMultiplexer1Hot +yosysTypeMap['BusSlice'] = verilogBusSlice +yosysTypeMap['BusGroup'] = verilogBusGroup +yosysTypeMap['BusUngroup'] = verilogBusUngroup + +yosysTypeMap['Addition'] = verilogAdditionGate +yosysTypeMap['Subtraction'] = verilogSubtractionGate +yosysTypeMap['Multiplication'] = verilogMultiplicationGate +yosysTypeMap['Division'] = verilogDivisionGate +yosysTypeMap['Modulo'] = verilogModuloGate +yosysTypeMap['Power'] = verilogPowerGate +yosysTypeMap['ShiftLeft'] = verilogShiftLeftGate +yosysTypeMap['ShiftRight'] = verilogShiftRightGate + +yosysTypeMap['Clock'] = verilogClock +yosysTypeMap['Lamp'] = verilogLamp +yosysTypeMap['Button'] = verilogButton + +yosysTypeMap['Memory'] = verilogMemory + +export default yosysTypeMap diff --git a/v0/src/simulator/src/app.js b/v0/src/simulator/src/app.js new file mode 100644 index 00000000..00b64e60 --- /dev/null +++ b/v0/src/simulator/src/app.js @@ -0,0 +1,213 @@ +import { setup } from './setup' +import Array from './arrayHelpers' + +document.addEventListener('DOMContentLoaded', () => { + setup() + var js = { + devices: { + dev0: { + type: 'Input', + net: 'clk', + order: 0, + bits: 1, + }, + dev1: { + type: 'Input', + net: 'addr', + order: 1, + bits: 4, + }, + dev2: { + type: 'Output', + net: 'data', + order: 2, + bits: 5, + }, + dev3: { + type: 'Input', + net: 'addr2', + order: 3, + bits: 4, + }, + dev4: { + type: 'Output', + net: 'data2', + order: 4, + bits: 5, + }, + dev5: { + type: 'Input', + net: 'wraddr', + order: 5, + bits: 4, + }, + dev6: { + type: 'Input', + net: 'wrdata', + order: 6, + bits: 5, + }, + dev7: { + type: 'Input', + net: 'wraddr2', + order: 7, + bits: 4, + }, + dev8: { + type: 'Input', + net: 'wrdata2', + order: 8, + bits: 5, + }, + dev9: { + label: 'mem', + type: 'Memory', + bits: 5, + abits: 4, + words: 16, + offset: 0, + rdports: [ + {}, + { + clock_polarity: true, + }, + ], + wrports: [ + { + clock_polarity: true, + }, + { + clock_polarity: true, + }, + ], + memdata: [13, '00001', 3, '11111'], + }, + }, + connectors: [ + { + to: { + id: 'dev9', + port: 'rd1clk', + }, + from: { + id: 'dev0', + port: 'out', + }, + name: 'clk', + }, + { + to: { + id: 'dev9', + port: 'wr0clk', + }, + from: { + id: 'dev0', + port: 'out', + }, + name: 'clk', + }, + { + to: { + id: 'dev9', + port: 'wr1clk', + }, + from: { + id: 'dev0', + port: 'out', + }, + name: 'clk', + }, + { + to: { + id: 'dev9', + port: 'rd0addr', + }, + from: { + id: 'dev1', + port: 'out', + }, + name: 'addr', + }, + { + to: { + id: 'dev2', + port: 'in', + }, + from: { + id: 'dev9', + port: 'rd0data', + }, + name: 'data', + }, + { + to: { + id: 'dev9', + port: 'rd1addr', + }, + from: { + id: 'dev3', + port: 'out', + }, + name: 'addr2', + }, + { + to: { + id: 'dev4', + port: 'in', + }, + from: { + id: 'dev9', + port: 'rd1data', + }, + name: 'data2', + }, + { + to: { + id: 'dev9', + port: 'wr0addr', + }, + from: { + id: 'dev5', + port: 'out', + }, + name: 'wraddr', + }, + { + to: { + id: 'dev9', + port: 'wr0data', + }, + from: { + id: 'dev6', + port: 'out', + }, + name: 'wrdata', + }, + { + to: { + id: 'dev9', + port: 'wr1addr', + }, + from: { + id: 'dev7', + port: 'out', + }, + name: 'wraddr2', + }, + { + to: { + id: 'dev9', + port: 'wr1data', + }, + from: { + id: 'dev8', + port: 'out', + }, + name: 'wrdata2', + }, + ], + subcircuits: {}, + } +}) + +window.Array = Array diff --git a/v0/src/simulator/src/arrayHelpers.js b/v0/src/simulator/src/arrayHelpers.js new file mode 100644 index 00000000..8d10917e --- /dev/null +++ b/v0/src/simulator/src/arrayHelpers.js @@ -0,0 +1,34 @@ +/* eslint-disable func-names */ +/* eslint-disable no-global-assign */ +/* eslint-disable no-extend-native */ +export default Array = window.Array + +Object.defineProperty(Array.prototype, 'clean', { + value: function (deleteValue) { + for (var i = 0; i < this.length; i++) { + if (this[i] === deleteValue) { + this.splice(i, 1) + i-- + } + } + return this + }, + enumerable: false, +}) + +Object.defineProperty(Array.prototype, 'extend', { + value: function (otherArray) { + /* you should include a test to check whether other_array really is an array */ + otherArray.forEach(function (v) { + this.push(v) + }, this) + }, + enumerable: false, +}) + +Object.defineProperty(Array.prototype, 'contains', { + value: function (value) { + return this.indexOf(value) > -1 + }, + enumerable: false, +}) diff --git a/v0/src/simulator/src/backgroundArea.js b/v0/src/simulator/src/backgroundArea.js new file mode 100644 index 00000000..49da21aa --- /dev/null +++ b/v0/src/simulator/src/backgroundArea.js @@ -0,0 +1,17 @@ +import { dots } from './canvasApi' + +var backgroundArea +export default backgroundArea = { + canvas: document.getElementById('backgroundArea'), + setup() { + this.canvas = document.getElementById('backgroundArea') + this.canvas.width = width + this.canvas.height = height + this.context = this.canvas.getContext('2d') + dots(true, false) + }, + clear() { + if (!this.context) return + this.context.clearRect(0, 0, this.canvas.width, this.canvas.height) + }, +} diff --git a/v0/src/simulator/src/canvas2svg.js b/v0/src/simulator/src/canvas2svg.js new file mode 100644 index 00000000..d6f5dc64 --- /dev/null +++ b/v0/src/simulator/src/canvas2svg.js @@ -0,0 +1,1433 @@ +/*!! + * Canvas 2 Svg v1.0.19 + * A low level canvas to SVG converter. Uses a mock canvas context to build an SVG document. + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/mit-license.php + * + * Author: + * Kerry Liu + * + * Copyright (c) 2014 Gliffy Inc. + */ + +/** + * CircuitVerse - Edited + * Latest npm package is 1.0.16 but we need 1.0.19 + */ + +'use strict' + +var STYLES, ctx, CanvasGradient, CanvasPattern, namedEntities + +//helper function to format a string +function format(str, args) { + var keys = Object.keys(args), + i + for (i = 0; i < keys.length; i++) { + str = str.replace( + new RegExp('\\{' + keys[i] + '\\}', 'gi'), + args[keys[i]] + ) + } + return str +} + +//helper function that generates a random string +function randomString(holder) { + var chars, randomstring, i + if (!holder) { + throw new Error( + 'cannot create a random attribute name for an undefined object' + ) + } + chars = 'ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz' + randomstring = '' + do { + randomstring = '' + for (i = 0; i < 12; i++) { + randomstring += chars[Math.floor(Math.random() * chars.length)] + } + } while (holder[randomstring]) + return randomstring +} + +//helper function to map named to numbered entities +function createNamedToNumberedLookup(items, radix) { + var i, + entity, + lookup = {}, + base10, + base16 + items = items.split(',') + radix = radix || 10 + // Map from named to numbered entities. + for (i = 0; i < items.length; i += 2) { + entity = '&' + items[i + 1] + ';' + base10 = parseInt(items[i], radix) + lookup[entity] = '&#' + base10 + ';' + } + //FF and IE need to create a regex from hex values ie   == \xa0 + lookup['\\xa0'] = ' ' + return lookup +} + +//helper function to map canvas-textAlign to svg-textAnchor +function getTextAnchor(textAlign) { + //TODO: support rtl languages + var mapping = { + left: 'start', + right: 'end', + center: 'middle', + start: 'start', + end: 'end', + } + return mapping[textAlign] || mapping.start +} + +//helper function to map canvas-textBaseline to svg-dominantBaseline +function getDominantBaseline(textBaseline) { + //INFO: not supported in all browsers + var mapping = { + alphabetic: 'alphabetic', + hanging: 'hanging', + top: 'text-before-edge', + bottom: 'text-after-edge', + middle: 'central', + } + return mapping[textBaseline] || mapping.alphabetic +} + +// Unpack entities lookup where the numbers are in radix 32 to reduce the size +// entity mapping courtesy of tinymce +namedEntities = createNamedToNumberedLookup( + '50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,' + + '5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,' + + '5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,' + + '5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,' + + '68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,' + + '6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,' + + '6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,' + + '75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,' + + '7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,' + + '7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,' + + 'sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,' + + 'st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,' + + 't9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,' + + 'tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,' + + 'u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,' + + '81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,' + + '8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,' + + '8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,' + + '8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,' + + '8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,' + + 'nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,' + + 'rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,' + + 'Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,' + + '80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,' + + '811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro', + 32 +) + +//Some basic mappings for attributes and default values. +STYLES = { + strokeStyle: { + svgAttr: 'stroke', //corresponding svg attribute + canvas: '#000000', //canvas default + svg: 'none', //svg default + apply: 'stroke', //apply on stroke() or fill() + }, + fillStyle: { + svgAttr: 'fill', + canvas: '#000000', + svg: null, //svg default is black, but we need to special case this to handle canvas stroke without fill + apply: 'fill', + }, + lineCap: { + svgAttr: 'stroke-linecap', + canvas: 'butt', + svg: 'butt', + apply: 'stroke', + }, + lineJoin: { + svgAttr: 'stroke-linejoin', + canvas: 'miter', + svg: 'miter', + apply: 'stroke', + }, + miterLimit: { + svgAttr: 'stroke-miterlimit', + canvas: 10, + svg: 4, + apply: 'stroke', + }, + lineWidth: { + svgAttr: 'stroke-width', + canvas: 1, + svg: 1, + apply: 'stroke', + }, + globalAlpha: { + svgAttr: 'opacity', + canvas: 1, + svg: 1, + apply: 'fill stroke', + }, + font: { + //font converts to multiple svg attributes, there is custom logic for this + canvas: '10px sans-serif', + }, + shadowColor: { + canvas: '#000000', + }, + shadowOffsetX: { + canvas: 0, + }, + shadowOffsetY: { + canvas: 0, + }, + shadowBlur: { + canvas: 0, + }, + textAlign: { + canvas: 'start', + }, + textBaseline: { + canvas: 'alphabetic', + }, + lineDash: { + svgAttr: 'stroke-dasharray', + canvas: [], + svg: null, + apply: 'stroke', + }, +} + +/** + * + * @param gradientNode - reference to the gradient + * @constructor + */ +CanvasGradient = function (gradientNode, ctx) { + this.__root = gradientNode + this.__ctx = ctx +} + +/** + * Adds a color stop to the gradient root + */ +CanvasGradient.prototype.addColorStop = function (offset, color) { + var stop = this.__ctx.__createElement('stop'), + regex, + matches + stop.setAttribute('offset', offset) + if (color.indexOf('rgba') !== -1) { + //separate alpha value, since webkit can't handle it + regex = + /rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d?\.?\d*)\s*\)/gi + matches = regex.exec(color) + stop.setAttribute( + 'stop-color', + format('rgb({r},{g},{b})', { + r: matches[1], + g: matches[2], + b: matches[3], + }) + ) + stop.setAttribute('stop-opacity', matches[4]) + } else { + stop.setAttribute('stop-color', color) + } + this.__root.appendChild(stop) +} + +CanvasPattern = function (pattern, ctx) { + this.__root = pattern + this.__ctx = ctx +} + +/** + * The mock canvas context + * @param o - options include: + * ctx - existing Context2D to wrap around + * width - width of your canvas (defaults to 500) + * height - height of your canvas (defaults to 500) + * enableMirroring - enables canvas mirroring (get image data) (defaults to false) + * document - the document object (defaults to the current document) + */ +ctx = function (o) { + var defaultOptions = { width: 500, height: 500, enableMirroring: false }, + options + + //keep support for this way of calling C2S: new C2S(width,height) + if (arguments.length > 1) { + options = defaultOptions + options.width = arguments[0] + options.height = arguments[1] + } else if (!o) { + options = defaultOptions + } else { + options = o + } + + if (!(this instanceof ctx)) { + //did someone call this without new? + return new ctx(options) + } + + //setup options + this.width = options.width || defaultOptions.width + this.height = options.height || defaultOptions.height + this.enableMirroring = + options.enableMirroring !== undefined + ? options.enableMirroring + : defaultOptions.enableMirroring + + this.canvas = this ///point back to this instance! + this.__document = options.document || document + + // allow passing in an existing context to wrap around + // if a context is passed in, we know a canvas already exist + if (options.ctx) { + this.__ctx = options.ctx + } else { + this.__canvas = this.__document.createElement('canvas') + this.__ctx = this.__canvas.getContext('2d') + } + + this.__setDefaultStyles() + this.__stack = [this.__getStyleState()] + this.__groupStack = [] + + //the root svg element + this.__root = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + 'svg' + ) + this.__root.setAttribute('version', 1.1) + this.__root.setAttribute('xmlns', 'http://www.w3.org/2000/svg') + this.__root.setAttributeNS( + 'http://www.w3.org/2000/xmlns/', + 'xmlns:xlink', + 'http://www.w3.org/1999/xlink' + ) + this.__root.setAttribute('width', this.width) + this.__root.setAttribute('height', this.height) + + //make sure we don't generate the same ids in defs + this.__ids = {} + + //defs tag + this.__defs = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + 'defs' + ) + this.__root.appendChild(this.__defs) + + //also add a group child. the svg element can't use the transform attribute + this.__currentElement = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + 'g' + ) + this.__root.appendChild(this.__currentElement) +} + +/** + * Creates the specified svg element + * @private + */ +ctx.prototype.__createElement = function (elementName, properties, resetFill) { + if (typeof properties === 'undefined') { + properties = {} + } + + var element = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + elementName + ), + keys = Object.keys(properties), + i, + key + if (resetFill) { + //if fill or stroke is not specified, the svg element should not display. By default SVG's fill is black. + element.setAttribute('fill', 'none') + element.setAttribute('stroke', 'none') + } + for (i = 0; i < keys.length; i++) { + key = keys[i] + element.setAttribute(key, properties[key]) + } + return element +} + +/** + * Applies default canvas styles to the context + * @private + */ +ctx.prototype.__setDefaultStyles = function () { + //default 2d canvas context properties see:http://www.w3.org/TR/2dcontext/ + var keys = Object.keys(STYLES), + i, + key + for (i = 0; i < keys.length; i++) { + key = keys[i] + this[key] = STYLES[key].canvas + } +} + +/** + * Applies styles on restore + * @param styleState + * @private + */ +ctx.prototype.__applyStyleState = function (styleState) { + var keys = Object.keys(styleState), + i, + key + for (i = 0; i < keys.length; i++) { + key = keys[i] + this[key] = styleState[key] + } +} + +/** + * Gets the current style state + * @return {Object} + * @private + */ +ctx.prototype.__getStyleState = function () { + var i, + styleState = {}, + keys = Object.keys(STYLES), + key + for (i = 0; i < keys.length; i++) { + key = keys[i] + styleState[key] = this[key] + } + return styleState +} + +/** + * Apples the current styles to the current SVG element. On "ctx.fill" or "ctx.stroke" + * @param type + * @private + */ +ctx.prototype.__applyStyleToCurrentElement = function (type) { + var currentElement = this.__currentElement + var currentStyleGroup = this.__currentElementsToStyle + if (currentStyleGroup) { + currentElement.setAttribute(type, '') + currentElement = currentStyleGroup.element + currentStyleGroup.children.forEach(function (node) { + node.setAttribute(type, '') + }) + } + + var keys = Object.keys(STYLES), + i, + style, + value, + id, + regex, + matches + for (i = 0; i < keys.length; i++) { + style = STYLES[keys[i]] + value = this[keys[i]] + if (style.apply) { + //is this a gradient or pattern? + if (value instanceof CanvasPattern) { + //pattern + if (value.__ctx) { + //copy over defs + while (value.__ctx.__defs.childNodes.length) { + id = value.__ctx.__defs.childNodes[0].getAttribute('id') + this.__ids[id] = id + this.__defs.appendChild( + value.__ctx.__defs.childNodes[0] + ) + } + } + currentElement.setAttribute( + style.apply, + format('url(#{id})', { + id: value.__root.getAttribute('id'), + }) + ) + } else if (value instanceof CanvasGradient) { + //gradient + currentElement.setAttribute( + style.apply, + format('url(#{id})', { + id: value.__root.getAttribute('id'), + }) + ) + } else if ( + style.apply.indexOf(type) !== -1 && + style.svg !== value + ) { + if ( + (style.svgAttr === 'stroke' || style.svgAttr === 'fill') && + value.indexOf('rgba') !== -1 + ) { + //separate alpha value, since illustrator can't handle it + regex = + /rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d?\.?\d*)\s*\)/gi + matches = regex.exec(value) + currentElement.setAttribute( + style.svgAttr, + format('rgb({r},{g},{b})', { + r: matches[1], + g: matches[2], + b: matches[3], + }) + ) + //should take globalAlpha here + var opacity = matches[4] + var globalAlpha = this.globalAlpha + if (globalAlpha != null) { + opacity *= globalAlpha + } + currentElement.setAttribute( + style.svgAttr + '-opacity', + opacity + ) + } else { + var attr = style.svgAttr + if (keys[i] === 'globalAlpha') { + attr = type + '-' + style.svgAttr + if (currentElement.getAttribute(attr)) { + //fill-opacity or stroke-opacity has already been set by stroke or fill. + continue + } + } + //otherwise only update attribute if right type, and not svg default + currentElement.setAttribute(attr, value) + } + } + } + } +} + +/** + * Will return the closest group or svg node. May return the current element. + * @private + */ +ctx.prototype.__closestGroupOrSvg = function (node) { + node = node || this.__currentElement + if (node.nodeName === 'g' || node.nodeName === 'svg') { + return node + } else { + return this.__closestGroupOrSvg(node.parentNode) + } +} + +/** + * Returns the serialized value of the svg so far + * @param fixNamedEntities - Standalone SVG doesn't support named entities, which document.createTextNode encodes. + * If true, we attempt to find all named entities and encode it as a numeric entity. + * @return serialized svg + */ +ctx.prototype.getSerializedSvg = function (fixNamedEntities) { + var serialized = new XMLSerializer().serializeToString(this.__root), + keys, + i, + key, + value, + regexp, + xmlns + + //IE search for a duplicate xmnls because they didn't implement setAttributeNS correctly + xmlns = + /xmlns="http:\/\/www\.w3\.org\/2000\/svg".+xmlns="http:\/\/www\.w3\.org\/2000\/svg/gi + if (xmlns.test(serialized)) { + serialized = serialized.replace( + 'xmlns="http://www.w3.org/2000/svg', + 'xmlns:xlink="http://www.w3.org/1999/xlink' + ) + } + + if (fixNamedEntities) { + keys = Object.keys(namedEntities) + //loop over each named entity and replace with the proper equivalent. + for (i = 0; i < keys.length; i++) { + key = keys[i] + value = namedEntities[key] + regexp = new RegExp(key, 'gi') + if (regexp.test(serialized)) { + serialized = serialized.replace(regexp, value) + } + } + } + + return serialized +} + +/** + * Returns the root svg + * @return svg + */ +ctx.prototype.getSvg = function () { + return this.__root +} +/** + * Will generate a group tag. + */ +ctx.prototype.save = function () { + var group = this.__createElement('g') + var parent = this.__closestGroupOrSvg() + this.__groupStack.push(parent) + parent.appendChild(group) + this.__currentElement = group + this.__stack.push(this.__getStyleState()) +} +/** + * Sets current element to parent, or just root if already root + */ +ctx.prototype.restore = function () { + this.__currentElement = this.__groupStack.pop() + this.__currentElementsToStyle = null + //Clearing canvas will make the poped group invalid, currentElement is set to the root group node. + if (!this.__currentElement) { + this.__currentElement = this.__root.childNodes[1] + } + var state = this.__stack.pop() + this.__applyStyleState(state) +} + +/** + * Helper method to add transform + * @private + */ +ctx.prototype.__addTransform = function (t) { + //if the current element has siblings, add another group + var parent = this.__closestGroupOrSvg() + if (parent.childNodes.length > 0) { + if (this.__currentElement.nodeName === 'path') { + if (!this.__currentElementsToStyle) + this.__currentElementsToStyle = { + element: parent, + children: [], + } + this.__currentElementsToStyle.children.push(this.__currentElement) + this.__applyCurrentDefaultPath() + } + + var group = this.__createElement('g') + parent.appendChild(group) + this.__currentElement = group + } + + var transform = this.__currentElement.getAttribute('transform') + if (transform) { + transform += ' ' + } else { + transform = '' + } + transform += t + this.__currentElement.setAttribute('transform', transform) +} + +/** + * scales the current element + */ +ctx.prototype.scale = function (x, y) { + if (y === undefined) { + y = x + } + this.__addTransform(format('scale({x},{y})', { x: x, y: y })) +} + +/** + * rotates the current element + */ +ctx.prototype.rotate = function (angle) { + var degrees = (angle * 180) / Math.PI + this.__addTransform( + format('rotate({angle},{cx},{cy})', { angle: degrees, cx: 0, cy: 0 }) + ) +} + +/** + * translates the current element + */ +ctx.prototype.translate = function (x, y) { + this.__addTransform(format('translate({x},{y})', { x: x, y: y })) +} + +/** + * applies a transform to the current element + */ +ctx.prototype.transform = function (a, b, c, d, e, f) { + this.__addTransform( + format('matrix({a},{b},{c},{d},{e},{f})', { + a: a, + b: b, + c: c, + d: d, + e: e, + f: f, + }) + ) +} + +/** + * Create a new Path Element + */ +ctx.prototype.beginPath = function () { + var path, parent + + // Note that there is only one current default path, it is not part of the drawing state. + // See also: https://html.spec.whatwg.org/multipage/scripting.html#current-default-path + this.__currentDefaultPath = '' + this.__currentPosition = {} + + path = this.__createElement('path', {}, true) + parent = this.__closestGroupOrSvg() + parent.appendChild(path) + this.__currentElement = path +} + +/** + * Helper function to apply currentDefaultPath to current path element + * @private + */ +ctx.prototype.__applyCurrentDefaultPath = function () { + var currentElement = this.__currentElement + if (currentElement.nodeName === 'path') { + currentElement.setAttribute('d', this.__currentDefaultPath) + } else { + console.error( + 'Attempted to apply path command to node', + currentElement.nodeName + ) + } +} + +/** + * Helper function to add path command + * @private + */ +ctx.prototype.__addPathCommand = function (command) { + this.__currentDefaultPath += ' ' + this.__currentDefaultPath += command +} + +/** + * Adds the move command to the current path element, + * if the currentPathElement is not empty create a new path element + */ +ctx.prototype.moveTo = function (x, y) { + if (this.__currentElement.nodeName !== 'path') { + this.beginPath() + } + + // creates a new subpath with the given point + this.__currentPosition = { x: x, y: y } + this.__addPathCommand(format('M {x} {y}', { x: x, y: y })) +} + +/** + * Closes the current path + */ +ctx.prototype.closePath = function () { + if (this.__currentDefaultPath) { + this.__addPathCommand('Z') + } +} + +/** + * Adds a line to command + */ +ctx.prototype.lineTo = function (x, y) { + this.__currentPosition = { x: x, y: y } + if (this.__currentDefaultPath.indexOf('M') > -1) { + this.__addPathCommand(format('L {x} {y}', { x: x, y: y })) + } else { + this.__addPathCommand(format('M {x} {y}', { x: x, y: y })) + } +} + +/** + * Add a bezier command + */ +ctx.prototype.bezierCurveTo = function (cp1x, cp1y, cp2x, cp2y, x, y) { + this.__currentPosition = { x: x, y: y } + this.__addPathCommand( + format('C {cp1x} {cp1y} {cp2x} {cp2y} {x} {y}', { + cp1x: cp1x, + cp1y: cp1y, + cp2x: cp2x, + cp2y: cp2y, + x: x, + y: y, + }) + ) +} + +/** + * Adds a quadratic curve to command + */ +ctx.prototype.quadraticCurveTo = function (cpx, cpy, x, y) { + this.__currentPosition = { x: x, y: y } + this.__addPathCommand( + format('Q {cpx} {cpy} {x} {y}', { cpx: cpx, cpy: cpy, x: x, y: y }) + ) +} + +/** + * Return a new normalized vector of given vector + */ +var normalize = function (vector) { + var len = Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1]) + return [vector[0] / len, vector[1] / len] +} + +/** + * Adds the arcTo to the current path + * + * @see http://www.w3.org/TR/2015/WD-2dcontext-20150514/#dom-context-2d-arcto + */ +ctx.prototype.arcTo = function (x1, y1, x2, y2, radius) { + // Let the point (x0, y0) be the last point in the subpath. + var x0 = this.__currentPosition && this.__currentPosition.x + var y0 = this.__currentPosition && this.__currentPosition.y + + // First ensure there is a subpath for (x1, y1). + if (typeof x0 == 'undefined' || typeof y0 == 'undefined') { + return + } + + // Negative values for radius must cause the implementation to throw an IndexSizeError exception. + if (radius < 0) { + throw new Error( + 'IndexSizeError: The radius provided (' + radius + ') is negative.' + ) + } + + // If the point (x0, y0) is equal to the point (x1, y1), + // or if the point (x1, y1) is equal to the point (x2, y2), + // or if the radius radius is zero, + // then the method must add the point (x1, y1) to the subpath, + // and connect that point to the previous point (x0, y0) by a straight line. + if ((x0 === x1 && y0 === y1) || (x1 === x2 && y1 === y2) || radius === 0) { + this.lineTo(x1, y1) + return + } + + // Otherwise, if the points (x0, y0), (x1, y1), and (x2, y2) all lie on a single straight line, + // then the method must add the point (x1, y1) to the subpath, + // and connect that point to the previous point (x0, y0) by a straight line. + var unit_vec_p1_p0 = normalize([x0 - x1, y0 - y1]) + var unit_vec_p1_p2 = normalize([x2 - x1, y2 - y1]) + if ( + unit_vec_p1_p0[0] * unit_vec_p1_p2[1] === + unit_vec_p1_p0[1] * unit_vec_p1_p2[0] + ) { + this.lineTo(x1, y1) + return + } + + // Otherwise, let The Arc be the shortest arc given by circumference of the circle that has radius radius, + // and that has one point tangent to the half-infinite line that crosses the point (x0, y0) and ends at the point (x1, y1), + // and that has a different point tangent to the half-infinite line that ends at the point (x1, y1), and crosses the point (x2, y2). + // The points at which this circle touches these two lines are called the start and end tangent points respectively. + + // note that both vectors are unit vectors, so the length is 1 + var cos = + unit_vec_p1_p0[0] * unit_vec_p1_p2[0] + + unit_vec_p1_p0[1] * unit_vec_p1_p2[1] + var theta = Math.acos(Math.abs(cos)) + + // Calculate origin + var unit_vec_p1_origin = normalize([ + unit_vec_p1_p0[0] + unit_vec_p1_p2[0], + unit_vec_p1_p0[1] + unit_vec_p1_p2[1], + ]) + var len_p1_origin = radius / Math.sin(theta / 2) + var x = x1 + len_p1_origin * unit_vec_p1_origin[0] + var y = y1 + len_p1_origin * unit_vec_p1_origin[1] + + // Calculate start angle and end angle + // rotate 90deg clockwise (note that y axis points to its down) + var unit_vec_origin_start_tangent = [-unit_vec_p1_p0[1], unit_vec_p1_p0[0]] + // rotate 90deg counter clockwise (note that y axis points to its down) + var unit_vec_origin_end_tangent = [unit_vec_p1_p2[1], -unit_vec_p1_p2[0]] + var getAngle = function (vector) { + // get angle (clockwise) between vector and (1, 0) + var x = vector[0] + var y = vector[1] + if (y >= 0) { + // note that y axis points to its down + return Math.acos(x) + } else { + return -Math.acos(x) + } + } + var startAngle = getAngle(unit_vec_origin_start_tangent) + var endAngle = getAngle(unit_vec_origin_end_tangent) + + // Connect the point (x0, y0) to the start tangent point by a straight line + this.lineTo( + x + unit_vec_origin_start_tangent[0] * radius, + y + unit_vec_origin_start_tangent[1] * radius + ) + + // Connect the start tangent point to the end tangent point by arc + // and adding the end tangent point to the subpath. + this.arc(x, y, radius, startAngle, endAngle) +} + +/** + * Sets the stroke property on the current element + */ +ctx.prototype.stroke = function () { + if (this.__currentElement.nodeName === 'path') { + this.__currentElement.setAttribute('paint-order', 'fill stroke markers') + } + this.__applyCurrentDefaultPath() + this.__applyStyleToCurrentElement('stroke') +} + +/** + * Sets fill properties on the current element + */ +ctx.prototype.fill = function () { + if (this.__currentElement.nodeName === 'path') { + this.__currentElement.setAttribute('paint-order', 'stroke fill markers') + } + this.__applyCurrentDefaultPath() + this.__applyStyleToCurrentElement('fill') +} + +/** + * Adds a rectangle to the path. + */ +ctx.prototype.rect = function (x, y, width, height) { + if (this.__currentElement.nodeName !== 'path') { + this.beginPath() + } + this.moveTo(x, y) + this.lineTo(x + width, y) + this.lineTo(x + width, y + height) + this.lineTo(x, y + height) + this.lineTo(x, y) + this.closePath() +} + +/** + * adds a rectangle element + */ +ctx.prototype.fillRect = function (x, y, width, height) { + var rect, parent + rect = this.__createElement( + 'rect', + { + x: x, + y: y, + width: width, + height: height, + }, + true + ) + parent = this.__closestGroupOrSvg() + parent.appendChild(rect) + this.__currentElement = rect + this.__applyStyleToCurrentElement('fill') +} + +/** + * Draws a rectangle with no fill + * @param x + * @param y + * @param width + * @param height + */ +ctx.prototype.strokeRect = function (x, y, width, height) { + var rect, parent + rect = this.__createElement( + 'rect', + { + x: x, + y: y, + width: width, + height: height, + }, + true + ) + parent = this.__closestGroupOrSvg() + parent.appendChild(rect) + this.__currentElement = rect + this.__applyStyleToCurrentElement('stroke') +} + +/** + * Clear entire canvas: + * 1. save current transforms + * 2. remove all the childNodes of the root g element + */ +ctx.prototype.__clearCanvas = function () { + var current = this.__closestGroupOrSvg(), + transform = current.getAttribute('transform') + var rootGroup = this.__root.childNodes[1] + var childNodes = rootGroup.childNodes + for (var i = childNodes.length - 1; i >= 0; i--) { + if (childNodes[i]) { + rootGroup.removeChild(childNodes[i]) + } + } + this.__currentElement = rootGroup + //reset __groupStack as all the child group nodes are all removed. + this.__groupStack = [] + if (transform) { + this.__addTransform(transform) + } +} + +/** + * "Clears" a canvas by just drawing a white rectangle in the current group. + */ +ctx.prototype.clearRect = function (x, y, width, height) { + //clear entire canvas + if (x === 0 && y === 0 && width === this.width && height === this.height) { + this.__clearCanvas() + return + } + var rect, + parent = this.__closestGroupOrSvg() + rect = this.__createElement( + 'rect', + { + x: x, + y: y, + width: width, + height: height, + fill: '#FFFFFF', + }, + true + ) + parent.appendChild(rect) +} + +/** + * Adds a linear gradient to a defs tag. + * Returns a canvas gradient object that has a reference to it's parent def + */ +ctx.prototype.createLinearGradient = function (x1, y1, x2, y2) { + var grad = this.__createElement( + 'linearGradient', + { + id: randomString(this.__ids), + x1: x1 + 'px', + x2: x2 + 'px', + y1: y1 + 'px', + y2: y2 + 'px', + gradientUnits: 'userSpaceOnUse', + }, + false + ) + this.__defs.appendChild(grad) + return new CanvasGradient(grad, this) +} + +/** + * Adds a radial gradient to a defs tag. + * Returns a canvas gradient object that has a reference to it's parent def + */ +ctx.prototype.createRadialGradient = function (x0, y0, r0, x1, y1, r1) { + var grad = this.__createElement( + 'radialGradient', + { + id: randomString(this.__ids), + cx: x1 + 'px', + cy: y1 + 'px', + r: r1 + 'px', + fx: x0 + 'px', + fy: y0 + 'px', + gradientUnits: 'userSpaceOnUse', + }, + false + ) + this.__defs.appendChild(grad) + return new CanvasGradient(grad, this) +} + +/** + * Parses the font string and returns svg mapping + * @private + */ +ctx.prototype.__parseFont = function () { + var regex = + /^\s*(?=(?:(?:[-a-z]+\s*){0,2}(italic|oblique))?)(?=(?:(?:[-a-z]+\s*){0,2}(small-caps))?)(?=(?:(?:[-a-z]+\s*){0,2}(bold(?:er)?|lighter|[1-9]00))?)(?:(?:normal|\1|\2|\3)\s*){0,3}((?:xx?-)?(?:small|large)|medium|smaller|larger|[.\d]+(?:\%|in|[cem]m|ex|p[ctx]))(?:\s*\/\s*(normal|[.\d]+(?:\%|in|[cem]m|ex|p[ctx])))?\s*([-,\'\"\sa-z0-9]+?)\s*$/i + var fontPart = regex.exec(this.font) + var data = { + style: fontPart[1] || 'normal', + size: fontPart[4] || '10px', + family: fontPart[6] || 'sans-serif', + weight: fontPart[3] || 'normal', + decoration: fontPart[2] || 'normal', + href: null, + } + + //canvas doesn't support underline natively, but we can pass this attribute + if (this.__fontUnderline === 'underline') { + data.decoration = 'underline' + } + + //canvas also doesn't support linking, but we can pass this as well + if (this.__fontHref) { + data.href = this.__fontHref + } + + return data +} + +/** + * Helper to link text fragments + * @param font + * @param element + * @return {*} + * @private + */ +ctx.prototype.__wrapTextLink = function (font, element) { + if (font.href) { + var a = this.__createElement('a') + a.setAttributeNS( + 'http://www.w3.org/1999/xlink', + 'xlink:href', + font.href + ) + a.appendChild(element) + return a + } + return element +} + +/** + * Fills or strokes text + * @param text + * @param x + * @param y + * @param action - stroke or fill + * @private + */ +ctx.prototype.__applyText = function (text, x, y, action) { + var font = this.__parseFont(), + parent = this.__closestGroupOrSvg(), + textElement = this.__createElement( + 'text', + { + 'font-family': font.family, + 'font-size': font.size, + 'font-style': font.style, + 'font-weight': font.weight, + 'text-decoration': font.decoration, + x: x, + y: y, + 'text-anchor': getTextAnchor(this.textAlign), + 'dominant-baseline': getDominantBaseline(this.textBaseline), + }, + true + ) + + textElement.appendChild(this.__document.createTextNode(text)) + this.__currentElement = textElement + this.__applyStyleToCurrentElement(action) + parent.appendChild(this.__wrapTextLink(font, textElement)) +} + +/** + * Creates a text element + * @param text + * @param x + * @param y + */ +ctx.prototype.fillText = function (text, x, y) { + this.__applyText(text, x, y, 'fill') +} + +/** + * Strokes text + * @param text + * @param x + * @param y + */ +ctx.prototype.strokeText = function (text, x, y) { + this.__applyText(text, x, y, 'stroke') +} + +/** + * No need to implement this for svg. + * @param text + * @return {TextMetrics} + */ +ctx.prototype.measureText = function (text) { + this.__ctx.font = this.font + return this.__ctx.measureText(text) +} + +/** + * Arc command! + */ +ctx.prototype.arc = function ( + x, + y, + radius, + startAngle, + endAngle, + counterClockwise +) { + // in canvas no circle is drawn if no angle is provided. + if (startAngle === endAngle) { + return + } + startAngle = startAngle % (2 * Math.PI) + endAngle = endAngle % (2 * Math.PI) + if (startAngle === endAngle) { + //circle time! subtract some of the angle so svg is happy (svg elliptical arc can't draw a full circle) + endAngle = + (endAngle + 2 * Math.PI - 0.001 * (counterClockwise ? -1 : 1)) % + (2 * Math.PI) + } + var endX = x + radius * Math.cos(endAngle), + endY = y + radius * Math.sin(endAngle), + startX = x + radius * Math.cos(startAngle), + startY = y + radius * Math.sin(startAngle), + sweepFlag = counterClockwise ? 0 : 1, + largeArcFlag = 0, + diff = endAngle - startAngle + + // https://github.com/gliffy/canvas2svg/issues/4 + if (diff < 0) { + diff += 2 * Math.PI + } + + if (counterClockwise) { + largeArcFlag = diff > Math.PI ? 0 : 1 + } else { + largeArcFlag = diff > Math.PI ? 1 : 0 + } + + this.lineTo(startX, startY) + this.__addPathCommand( + format( + 'A {rx} {ry} {xAxisRotation} {largeArcFlag} {sweepFlag} {endX} {endY}', + { + rx: radius, + ry: radius, + xAxisRotation: 0, + largeArcFlag: largeArcFlag, + sweepFlag: sweepFlag, + endX: endX, + endY: endY, + } + ) + ) + + this.__currentPosition = { x: endX, y: endY } +} + +/** + * Generates a ClipPath from the clip command. + */ +ctx.prototype.clip = function () { + var group = this.__closestGroupOrSvg(), + clipPath = this.__createElement('clipPath'), + id = randomString(this.__ids), + newGroup = this.__createElement('g') + + this.__applyCurrentDefaultPath() + group.removeChild(this.__currentElement) + clipPath.setAttribute('id', id) + clipPath.appendChild(this.__currentElement) + + this.__defs.appendChild(clipPath) + + //set the clip path to this group + group.setAttribute('clip-path', format('url(#{id})', { id: id })) + + //clip paths can be scaled and transformed, we need to add another wrapper group to avoid later transformations + // to this path + group.appendChild(newGroup) + + this.__currentElement = newGroup +} + +/** + * Draws a canvas, image or mock context to this canvas. + * Note that all svg dom manipulation uses node.childNodes rather than node.children for IE support. + * http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage + */ +ctx.prototype.drawImage = function () { + //convert arguments to a real array + var args = Array.prototype.slice.call(arguments), + image = args[0], + dx, + dy, + dw, + dh, + sx = 0, + sy = 0, + sw, + sh, + parent, + svg, + defs, + group, + currentElement, + svgImage, + canvas, + context, + id + + if (args.length === 3) { + dx = args[1] + dy = args[2] + sw = image.width + sh = image.height + dw = sw + dh = sh + } else if (args.length === 5) { + dx = args[1] + dy = args[2] + dw = args[3] + dh = args[4] + sw = image.width + sh = image.height + } else if (args.length === 9) { + sx = args[1] + sy = args[2] + sw = args[3] + sh = args[4] + dx = args[5] + dy = args[6] + dw = args[7] + dh = args[8] + } else { + throw new Error( + 'Inavlid number of arguments passed to drawImage: ' + + arguments.length + ) + } + + parent = this.__closestGroupOrSvg() + currentElement = this.__currentElement + var translateDirective = 'translate(' + dx + ', ' + dy + ')' + if (image instanceof ctx) { + //canvas2svg mock canvas context. In the future we may want to clone nodes instead. + //also I'm currently ignoring dw, dh, sw, sh, sx, sy for a mock context. + svg = image.getSvg().cloneNode(true) + if (svg.childNodes && svg.childNodes.length > 1) { + defs = svg.childNodes[0] + while (defs.childNodes.length) { + id = defs.childNodes[0].getAttribute('id') + this.__ids[id] = id + this.__defs.appendChild(defs.childNodes[0]) + } + group = svg.childNodes[1] + if (group) { + //save original transform + var originTransform = group.getAttribute('transform') + var transformDirective + if (originTransform) { + transformDirective = + originTransform + ' ' + translateDirective + } else { + transformDirective = translateDirective + } + group.setAttribute('transform', transformDirective) + parent.appendChild(group) + } + } + } else if (image.nodeName === 'CANVAS' || image.nodeName === 'IMG') { + //canvas or image + svgImage = this.__createElement('image') + svgImage.setAttribute('width', dw) + svgImage.setAttribute('height', dh) + svgImage.setAttribute('preserveAspectRatio', 'none') + + if (sx || sy || sw !== image.width || sh !== image.height) { + //crop the image using a temporary canvas + canvas = this.__document.createElement('canvas') + canvas.width = dw + canvas.height = dh + context = canvas.getContext('2d') + context.drawImage(image, sx, sy, sw, sh, 0, 0, dw, dh) + image = canvas + } + svgImage.setAttribute('transform', translateDirective) + svgImage.setAttributeNS( + 'http://www.w3.org/1999/xlink', + 'xlink:href', + image.nodeName === 'CANVAS' + ? image.toDataURL() + : image.getAttribute('src') + ) + parent.appendChild(svgImage) + } +} + +/** + * Generates a pattern tag + */ +ctx.prototype.createPattern = function (image, repetition) { + var pattern = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + 'pattern' + ), + id = randomString(this.__ids), + img + pattern.setAttribute('id', id) + pattern.setAttribute('width', image.width) + pattern.setAttribute('height', image.height) + if (image.nodeName === 'CANVAS' || image.nodeName === 'IMG') { + img = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + 'image' + ) + img.setAttribute('width', image.width) + img.setAttribute('height', image.height) + img.setAttributeNS( + 'http://www.w3.org/1999/xlink', + 'xlink:href', + image.nodeName === 'CANVAS' + ? image.toDataURL() + : image.getAttribute('src') + ) + pattern.appendChild(img) + this.__defs.appendChild(pattern) + } else if (image instanceof ctx) { + pattern.appendChild(image.__root.childNodes[1]) + this.__defs.appendChild(pattern) + } + return new CanvasPattern(pattern, this) +} + +ctx.prototype.setLineDash = function (dashArray) { + if (dashArray && dashArray.length > 0) { + this.lineDash = dashArray.join(',') + } else { + this.lineDash = null + } +} + +/** + * Not yet implemented + */ +ctx.prototype.drawFocusRing = function () {} +ctx.prototype.createImageData = function () {} +ctx.prototype.getImageData = function () {} +ctx.prototype.putImageData = function () {} +ctx.prototype.globalCompositeOperation = function () {} +ctx.prototype.setTransform = function () {} + +//add options for alternative namespace +// if (typeof window === "object") { +// window.C2S = ctx; +// } + +// CommonJS/Browserify +// if (typeof module === "object" && typeof module.exports === "object") { +// module.exports = ctx; +// } + +export default ctx diff --git a/v0/src/simulator/src/canvasApi.js b/v0/src/simulator/src/canvasApi.js new file mode 100644 index 00000000..08ee65d3 --- /dev/null +++ b/v0/src/simulator/src/canvasApi.js @@ -0,0 +1,624 @@ +/* eslint-disable no-param-reassign */ +import backgroundArea from './backgroundArea' +import simulationArea from './simulationArea' +import miniMapArea, { removeMiniMap, updatelastMinimapShown } from './minimap' +import { colors } from './themer/themer' + +var unit = 10 + +export function findDimensions(scope = globalScope) { + var totalObjects = 0 + simulationArea.minWidth = undefined + simulationArea.maxWidth = undefined + simulationArea.minHeight = undefined + simulationArea.maxHeight = undefined + for (var i = 0; i < updateOrder.length; i++) { + if (updateOrder[i] !== 'wires') { + for (var j = 0; j < scope[updateOrder[i]].length; j++) { + totalObjects += 1 + var obj = scope[updateOrder[i]][j] + if (totalObjects === 1) { + simulationArea.minWidth = obj.absX() + simulationArea.minHeight = obj.absY() + simulationArea.maxWidth = obj.absX() + simulationArea.maxHeight = obj.absY() + } + if (obj.objectType !== 'Node') { + if (obj.y - obj.upDimensionY < simulationArea.minHeight) { + simulationArea.minHeight = obj.y - obj.upDimensionY + } + if (obj.y + obj.downDimensionY > simulationArea.maxHeight) { + simulationArea.maxHeight = obj.y + obj.downDimensionY + } + if (obj.x - obj.leftDimensionX < simulationArea.minWidth) { + simulationArea.minWidth = obj.x - obj.leftDimensionX + } + if (obj.x + obj.rightDimensionX > simulationArea.maxWidth) { + simulationArea.maxWidth = obj.x + obj.rightDimensionX + } + } else { + if (obj.absY() < simulationArea.minHeight) { + simulationArea.minHeight = obj.absY() + } + if (obj.absY() > simulationArea.maxHeight) { + simulationArea.maxHeight = obj.absY() + } + if (obj.absX() < simulationArea.minWidth) { + simulationArea.minWidth = obj.absX() + } + if (obj.absX() > simulationArea.maxWidth) { + simulationArea.maxWidth = obj.absX() + } + } + } + } + } + simulationArea.objectList = updateOrder +} + +// Function used to change the zoom level wrt to a point +// fn to change scale (zoom) - It also shifts origin so that the position +// of the object in focus doesn't change +export function changeScale(delta, xx, yy, method = 1) { + // method = 3/2 - Zoom wrt center of screen + // method = 1 - Zoom wrt position of mouse + // Otherwise zoom wrt to selected object + + if (method === 3) { + xx = (width / 2 - globalScope.ox) / globalScope.scale + yy = (height / 2 - globalScope.oy) / globalScope.scale + } else if ( + xx === undefined || + yy === undefined || + xx === 'zoomButton' || + yy === 'zoomButton' + ) { + if ( + simulationArea.lastSelected && + simulationArea.lastSelected.objectType !== 'Wire' + ) { + // selected object + xx = simulationArea.lastSelected.x + yy = simulationArea.lastSelected.y + } else { + // mouse location + // eslint-disable-next-line no-lonely-if + if (method === 1) { + xx = simulationArea.mouseX + yy = simulationArea.mouseY + } else if (method === 2) { + xx = (width / 2 - globalScope.ox) / globalScope.scale + yy = (height / 2 - globalScope.oy) / globalScope.scale + } + } + } + + var oldScale = globalScope.scale + globalScope.scale = Math.max( + 0.5, + Math.min(4 * DPR, globalScope.scale + delta) + ) + globalScope.scale = Math.round(globalScope.scale * 10) / 10 + globalScope.ox -= Math.round(xx * (globalScope.scale - oldScale)) // Shift accordingly, so that we zoom wrt to the selected point + globalScope.oy -= Math.round(yy * (globalScope.scale - oldScale)) + // dots(true,false); + + // MiniMap + if (!embed && !lightMode) { + findDimensions(globalScope) + miniMapArea.setup() + $('#miniMap').show() + updatelastMinimapShown() + $('#miniMap').show() + setTimeout(removeMiniMap, 2000) + } +} +// fn to draw Dots on screen +// the function is called only when the zoom level or size of screen changes. +// Otherwise for normal panning, the canvas itself is moved to give the illusion of movement + +export function dots( + dots = true, + transparentBackground = false, + force = false +) { + const scale = unit * globalScope.scale + const ox = globalScope.ox % scale // offset + const oy = globalScope.oy % scale // offset + + const backgroundCtx = backgroundArea.context + if (!backgroundCtx) return + + const canvasWidth = backgroundArea.canvas.width // max X distance + const canvasHeight = backgroundArea.canvas.height // max Y distance + + backgroundArea.canvas.style.left = `${(ox - scale) / DPR}px` // adjust left position of canvas + backgroundArea.canvas.style.top = `${(oy - scale) / DPR}px` // adjust top position of canvas + + if (globalScope.scale === simulationArea.prevScale && !force) return + + simulationArea.prevScale = globalScope.scale // set the previous scale to current scale + + backgroundCtx.beginPath() + backgroundArea.clear() + + if (!transparentBackground) { + backgroundCtx.fillStyle = colors['canvas_fill'] + backgroundCtx.fillRect(0, 0, canvasWidth, canvasHeight) + } + + if (dots) { + backgroundCtx.fillStyle = colors['dot_fill'] + for (let i = 0; i < canvasWidth; i += scale) { + for (let j = 0; j < canvasHeight; j += scale) { + backgroundCtx.beginPath() + backgroundCtx.arc(i, j, scale / 10, 0, Math.PI * 2) + backgroundCtx.fill() + } + } + } + + backgroundCtx.strokeStyle = colors['canvas_stroke'] + backgroundCtx.lineWidth = 1 + + if (!embed) { + const correction = 0.5 * (backgroundCtx.lineWidth % 2) + for (let i = 0; i < canvasWidth; i += scale) { + backgroundCtx.moveTo(Math.round(i + correction) - correction, 0) + backgroundCtx.lineTo( + Math.round(i + correction) - correction, + canvasHeight + ) + } + for (let j = 0; j < canvasHeight; j += scale) { + backgroundCtx.moveTo(0, Math.round(j + correction) - correction) + backgroundCtx.lineTo( + canvasWidth, + Math.round(j + correction) - correction + ) + } + backgroundCtx.stroke() + } + + // Old Code + // function drawPixel(x, y, r, g, b, a) { + // var index = (x + y * canvasWidth) * 4; + // canvasData.data[index + 0] = r; + // canvasData.data[index + 1] = g; + // canvasData.data[index + 2] = b; + // canvasData.data[index + 3] = a; + // } + // if (dots) { + // var canvasData = ctx.getImageData(0, 0, canvasWidth, canvasHeight); + // + // + // + // for (var i = 0 + ox; i < canvasWidth; i += scale) + // for (var j = 0 + oy; j < canvasHeight; j += scale) + // drawPixel(i, j, 0, 0, 0, 255); + // ctx.putImageData(canvasData, 0, 0); + // } +} + +// Helper canvas API starts here +// All canvas functions are wrt to a center point (xx,yy), +// direction is used to abstract rotation of everything by a certain angle +// Possible values for direction = "RIGHT" (default), "LEFT", "UP", "DOWN" + +export function bezierCurveTo(x1, y1, x2, y2, x3, y3, xx, yy, dir) { + ;[x1, y1] = rotate(x1, y1, dir) + ;[x2, y2] = rotate(x2, y2, dir) + ;[x3, y3] = rotate(x3, y3, dir) + var { ox } = globalScope + var { oy } = globalScope + x1 *= globalScope.scale + y1 *= globalScope.scale + x2 *= globalScope.scale + y2 *= globalScope.scale + x3 *= globalScope.scale + y3 *= globalScope.scale + xx *= globalScope.scale + yy *= globalScope.scale + var ctx = simulationArea.context + ctx.bezierCurveTo( + Math.round(xx + ox + x1), + Math.round(yy + oy + y1), + Math.round(xx + ox + x2), + Math.round(yy + oy + y2), + Math.round(xx + ox + x3), + Math.round(yy + oy + y3) + ) +} + +export function moveTo(ctx, x1, y1, xx, yy, dir, bypass = false) { + var correction = 0.5 * (ctx.lineWidth % 2) + let newX + let newY + ;[newX, newY] = rotate(x1, y1, dir) + newX *= globalScope.scale + newY *= globalScope.scale + xx *= globalScope.scale + yy *= globalScope.scale + if (bypass) { + ctx.moveTo(xx + globalScope.ox + newX, yy + globalScope.oy + newY) + } else { + ctx.moveTo( + Math.round(xx + globalScope.ox + newX - correction) + correction, + Math.round(yy + globalScope.oy + newY - correction) + correction + ) + } +} + +export function lineTo(ctx, x1, y1, xx, yy, dir) { + let newX + let newY + + var correction = 0.5 * (ctx.lineWidth % 2) + ;[newX, newY] = rotate(x1, y1, dir) + newX *= globalScope.scale + newY *= globalScope.scale + xx *= globalScope.scale + yy *= globalScope.scale + ctx.lineTo( + Math.round(xx + globalScope.ox + newX - correction) + correction, + Math.round(yy + globalScope.oy + newY - correction) + correction + ) +} + +export function arc(ctx, sx, sy, radius, start, stop, xx, yy, dir) { + // ox-x of origin, xx- x of element , sx - shift in x from element + let Sx + let Sy + let newStart + let newStop + let counterClock + var correction = 0.5 * (ctx.lineWidth % 2) + ;[Sx, Sy] = rotate(sx, sy, dir) + Sx *= globalScope.scale + Sy *= globalScope.scale + xx *= globalScope.scale + yy *= globalScope.scale + radius *= globalScope.scale + ;[newStart, newStop, counterClock] = rotateAngle(start, stop, dir) + ctx.arc( + Math.round(xx + globalScope.ox + Sx + correction) - correction, + Math.round(yy + globalScope.oy + Sy + correction) - correction, + Math.round(radius), + newStart, + newStop, + counterClock + ) +} + +export function arc2(ctx, sx, sy, radius, start, stop, xx, yy, dir) { + // ox-x of origin, xx- x of element , sx - shift in x from element + let Sx + let Sy + let newStart + let newStop + let counterClock + var correction = 0.5 * (ctx.lineWidth % 2) + ;[Sx, Sy] = rotate(sx, sy, dir) + Sx *= globalScope.scale + Sy *= globalScope.scale + xx *= globalScope.scale + yy *= globalScope.scale + radius *= globalScope.scale + ;[newStart, newStop, counterClock] = rotateAngle(start, stop, dir) + var pi = 0 + if (counterClock) { + pi = Math.PI + } + ctx.arc( + Math.round(xx + globalScope.ox + Sx + correction) - correction, + Math.round(yy + globalScope.oy + Sy + correction) - correction, + Math.round(radius), + newStart + pi, + newStop + pi + ) +} + +export function drawCircle2(ctx, sx, sy, radius, xx, yy, dir) { + // ox-x of origin, xx- x of element , sx - shift in x from element + let Sx + let Sy + ;[Sx, Sy] = rotate(sx, sy, dir) + Sx *= globalScope.scale + Sy *= globalScope.scale + xx *= globalScope.scale + yy *= globalScope.scale + radius *= globalScope.scale + ctx.arc( + Math.round(xx + globalScope.ox + Sx), + Math.round(yy + globalScope.oy + Sy), + Math.round(radius), + 0, + 2 * Math.PI + ) +} + +export function rect(ctx, x1, y1, x2, y2) { + var correction = 0.5 * (ctx.lineWidth % 2) + x1 *= globalScope.scale + y1 *= globalScope.scale + x2 *= globalScope.scale + y2 *= globalScope.scale + ctx.rect( + Math.round(globalScope.ox + x1 - correction) + correction, + Math.round(globalScope.oy + y1 - correction) + correction, + Math.round(x2), + Math.round(y2) + ) +} + +export function drawImage(ctx, img, x1, y1, w_canvas, h_canvas) { + x1 *= globalScope.scale + y1 *= globalScope.scale + x1 += globalScope.ox + y1 += globalScope.oy + + w_canvas *= globalScope.scale + h_canvas *= globalScope.scale + ctx.drawImage(img, x1, y1, w_canvas, h_canvas) +} + +export function rect2(ctx, x1, y1, x2, y2, xx, yy, dir = 'RIGHT') { + var correction = 0.5 * (ctx.lineWidth % 2) + ;[x1, y1] = rotate(x1, y1, dir) + ;[x2, y2] = rotate(x2, y2, dir) + x1 *= globalScope.scale + y1 *= globalScope.scale + x2 *= globalScope.scale + y2 *= globalScope.scale + xx *= globalScope.scale + yy *= globalScope.scale + ctx.rect( + Math.round(globalScope.ox + xx + x1 - correction) + correction, + Math.round(globalScope.oy + yy + y1 - correction) + correction, + Math.round(x2), + Math.round(y2) + ) +} + +export function rotate(x1, y1, dir) { + if (dir === 'LEFT') { + return [-x1, y1] + } + if (dir === 'DOWN') { + return [y1, x1] + } + if (dir === 'UP') { + return [y1, -x1] + } + return [x1, y1] +} + +export function correctWidth(w) { + return Math.max(1, Math.round(w * globalScope.scale)) +} + +function rotateAngle(start, stop, dir) { + if (dir === 'LEFT') { + return [start, stop, true] + } + if (dir === 'DOWN') { + return [start - Math.PI / 2, stop - Math.PI / 2, true] + } + if (dir === 'UP') { + return [start - Math.PI / 2, stop - Math.PI / 2, false] + } + return [start, stop, false] +} + +export function drawLine(ctx, x1, y1, x2, y2, color, width) { + x1 *= globalScope.scale + y1 *= globalScope.scale + x2 *= globalScope.scale + y2 *= globalScope.scale + ctx.beginPath() + ctx.strokeStyle = color + ctx.lineCap = 'round' + ctx.lineWidth = correctWidth(width) //* globalScope.scale; + var correction = 0.5 * (ctx.lineWidth % 2) + var hCorrection = 0 + var vCorrection = 0 + if (y1 === y2) vCorrection = correction + if (x1 === x2) hCorrection = correction + ctx.moveTo( + Math.round(x1 + globalScope.ox + hCorrection) - hCorrection, + Math.round(y1 + globalScope.oy + vCorrection) - vCorrection + ) + ctx.lineTo( + Math.round(x2 + globalScope.ox + hCorrection) - hCorrection, + Math.round(y2 + globalScope.oy + vCorrection) - vCorrection + ) + ctx.stroke() +} + +// Checks if string color is a valid color using a hack +export function validColor(color) { + var $div = $('

') + $div.css('border', `1px solid ${color}`) + return $div.css('border-color') !== '' +} + +// Helper function to color "RED" to RGBA +export function colorToRGBA(color) { + var cvs + var ctx + cvs = document.createElement('canvas') + cvs.height = 1 + cvs.width = 1 + ctx = cvs.getContext('2d') + ctx.fillStyle = color + ctx.fillRect(0, 0, 1, 1) + return ctx.getImageData(0, 0, 1, 1).data +} + +export function drawCircle(ctx, x1, y1, r, color) { + x1 *= globalScope.scale + y1 *= globalScope.scale + ctx.beginPath() + ctx.fillStyle = color + ctx.arc( + Math.round(x1 + globalScope.ox), + Math.round(y1 + globalScope.oy), + Math.round(r * globalScope.scale), + 0, + Math.PI * 2, + false + ) + ctx.closePath() + ctx.fill() +} + +// To show message like values, node name etc +export function canvasMessage(ctx, str, x1, y1, fontSize = 10) { + if (!str || !str.length) return + + ctx.font = `${Math.round(fontSize * globalScope.scale)}px Raleway` + ctx.textAlign = 'center' + var width = ctx.measureText(str).width / globalScope.scale + 8 + var height = 13 + ctx.strokeStyle = 'black' + ctx.lineWidth = correctWidth(1) + ctx.fillStyle = 'yellow' + ctx.save() + ctx.beginPath() + rect(ctx, x1 - width / 2, y1 - height / 2 - 3, width, height) + ctx.shadowColor = '#999' + ctx.shadowBlur = 10 + ctx.shadowOffsetX = 3 + ctx.shadowOffsetY = 3 + ctx.stroke() + ctx.fill() + ctx.restore() + x1 *= globalScope.scale + y1 *= globalScope.scale + ctx.beginPath() + ctx.fillStyle = 'black' + ctx.fillText( + str, + Math.round(x1 + globalScope.ox), + Math.round(y1 + globalScope.oy) + ) + ctx.fill() +} + +export function fillText(ctx, str, x1, y1, fontSize = 20) { + x1 *= globalScope.scale + y1 *= globalScope.scale + ctx.font = `${Math.round(fontSize * globalScope.scale)}px Raleway` + ctx.fillText( + str, + Math.round(x1 + globalScope.ox), + Math.round(y1 + globalScope.oy) + ) +} + +export function fillText2(ctx, str, x1, y1, xx, yy, dir) { + var angle = { + RIGHT: 0, + LEFT: 0, + DOWN: Math.PI / 2, + UP: -Math.PI / 2, + } + x1 *= globalScope.scale + y1 *= globalScope.scale + ;[x1, y1] = rotate(x1, y1, dir) + xx *= globalScope.scale + yy *= globalScope.scale + + ctx.font = `${Math.round(14 * globalScope.scale)}px Raleway` + ctx.save() + ctx.translate( + Math.round(xx + x1 + globalScope.ox), + Math.round(yy + y1 + globalScope.oy) + ) + ctx.rotate(angle[dir]) + ctx.textAlign = 'center' + ctx.fillText( + str, + 0, + Math.round(4 * globalScope.scale) * (1 - 0 * +(dir === 'DOWN')) + ) + ctx.restore() +} + +export function fillText4( + ctx, + str, + x1, + y1, + xx, + yy, + dir, + fontSize = 14, + textAlign = 'center' +) { + var angle = { + RIGHT: 0, + LEFT: 0, + DOWN: Math.PI / 2, + UP: -Math.PI / 2, + } + x1 *= globalScope.scale + y1 *= globalScope.scale + ;[x1, y1] = rotate(x1, y1, dir) + xx *= globalScope.scale + yy *= globalScope.scale + + ctx.font = `${Math.round(fontSize * globalScope.scale)}px Raleway` + // ctx.font = 20+"px Raleway"; + ctx.textAlign = textAlign + ctx.fillText( + str, + xx + x1 + globalScope.ox, + yy + + y1 + + globalScope.oy + + Math.round((fontSize / 3) * globalScope.scale) + ) +} + +export function fillText3( + ctx, + str, + x1, + y1, + xx = 0, + yy = 0, + fontSize = 14, + font = 'Raleway', + textAlign = 'center' +) { + x1 *= globalScope.scale + y1 *= globalScope.scale + xx *= globalScope.scale + yy *= globalScope.scale + + ctx.font = `${Math.round(fontSize * globalScope.scale)}px ${font}` + ctx.textAlign = textAlign + ctx.fillText( + str, + Math.round(xx + x1 + globalScope.ox), + Math.round(yy + y1 + globalScope.oy) + ) +} + +export const oppositeDirection = { + RIGHT: 'LEFT', + LEFT: 'RIGHT', + DOWN: 'UP', + UP: 'DOWN', +} +export const fixDirection = { + right: 'LEFT', + left: 'RIGHT', + down: 'UP', + up: 'DOWN', + LEFT: 'LEFT', + RIGHT: 'RIGHT', + UP: 'UP', + DOWN: 'DOWN', +} diff --git a/v0/src/simulator/src/circuit.js b/v0/src/simulator/src/circuit.js new file mode 100644 index 00000000..f86429e3 --- /dev/null +++ b/v0/src/simulator/src/circuit.js @@ -0,0 +1,483 @@ +/* eslint-disable import/no-cycle */ +/* eslint-disable no-bitwise */ +/* eslint-disable guard-for-in */ +/* eslint-disable no-restricted-syntax */ +/* eslint-disable no-restricted-globals */ +/* eslint-disable consistent-return */ +/* eslint-disable func-names */ +/* eslint-disable array-callback-return */ +/* eslint-disable no-use-before-define */ +/* eslint-disable no-param-reassign */ +/* eslint-disable no-alert */ +import CircuitElement from './circuitElement' +import plotArea from './plotArea' +import simulationArea, { changeClockTime } from './simulationArea' +import { + stripTags, + uniq, + showMessage, + showError, + truncateString, +} from './utils' +import { findDimensions, dots } from './canvasApi' +import { updateRestrictedElementsList } from './restrictedElementDiv' +import { scheduleBackup } from './data/backupCircuit' +import { showProperties } from './ux' +import { + scheduleUpdate, + updateSimulationSet, + updateCanvasSet, + updateSubcircuitSet, + forceResetNodesSet, + changeLightMode, +} from './engine' +import { toggleLayoutMode, layoutModeGet } from './layoutMode' +import { setProjectName, getProjectName } from './data/save' +import { changeClockEnable } from './sequential' +import { changeInputSize } from './modules' +import { verilogModeGet, verilogModeSet } from './Verilog2CV' +import { updateTestbenchUI } from './testbench' +import { SimulatorStore } from '#/store/SimulatorStore/SimulatorStore' +import { toRef, toRefs } from 'vue' +import { provideCircuitName } from '#/components/helpers/promptComponent/PromptComponent.vue' +import { deleteCurrentCircuit } from '#/components/helpers/deleteCircuit/DeleteCircuit.vue' + +export const circuitProperty = { + toggleLayoutMode, + setProjectName, + changeCircuitName, + // changeClockTime, + deleteCurrentCircuit, + changeClockEnable, + changeInputSize, + changeLightMode, +} + +export var scopeList = {} +export function resetScopeList() { + const simulatorStore = SimulatorStore() + const { circuit_list } = toRefs(simulatorStore) + scopeList = {} + circuit_list.value = [] +} +/** + * Function used to change the current focusedCircuit + * Disables layoutMode if enabled + * Changes UI tab etc + * Sets flags to make updates, resets most of the things + * @param {string} id - identifier for circuit + * @category circuit + */ +export function switchCircuit(id) { + // TODO: fix tomorrow + const simulatorStore = SimulatorStore() + const { circuit_list } = toRefs(simulatorStore) + const { activeCircuit } = toRefs(simulatorStore) + + if (layoutModeGet()) { + toggleLayoutMode() + } + if (!scopeList[id].verilogMetadata.isVerilogCircuit) { + verilogModeSet(false) + } + + // globalScope.fixLayout(); + scheduleBackup() + if (id === globalScope.id) return + // $(`.circuits`).removeClass('current') + circuit_list.value.forEach((circuit) => + circuit.focussed ? (circuit.focussed = false) : null + ) + simulationArea.lastSelected = undefined + simulationArea.multipleObjectSelections = [] + simulationArea.copyList = [] + globalScope = scopeList[id] + if (globalScope.verilogMetadata.isVerilogCircuit) { + verilogModeSet(true) + } + if (globalScope.isVisible()) { + // $(`#${id}`).addClass('current') + const index = circuit_list.value.findIndex( + (circuit) => circuit.id == id + ) // TODO: add strict equality after typescript + circuit_list.value[index].focussed = true + activeCircuit.value.id = globalScope.id + activeCircuit.value.name = globalScope.name + } + updateSimulationSet(true) + updateSubcircuitSet(true) + forceResetNodesSet(true) + dots(false) + simulationArea.lastSelected = globalScope.root + if (!embed) { + showProperties(simulationArea.lastSelected) + updateTestbenchUI() + plotArea.reset() + } + updateCanvasSet(true) + scheduleUpdate() + + // to update the restricted elements information + updateRestrictedElementsList() +} + +export function getDependenciesList(scopeId) { + let scope = scopeList[scopeId] + if (scope == undefined) scope = scopeList[globalScope.id] + + let dependencies = '' + for (id in scopeList) { + if (id != scope.id && scopeList[id].checkDependency(scope.id)) { + if (dependencies === '') { + dependencies = scopeList[id].name + } else { + dependencies += `, ${scopeList[id].name}` + } + } + } + return dependencies +} + +// /** +// * Deletes the current circuit +// * Ensures that at least one circuit is there +// * Ensures that no circuit depends on the current circuit +// * Switched to a random circuit +// * @category circuit +// */ +// export function deleteCurrentCircuit(scopeId = globalScope.id) { +// const simulatorStore = SimulatorStore() +// const { circuit_list } = toRefs(simulatorStore) +// let scope = scopeList[scopeId] +// if (scope == undefined) scope = scopeList[globalScope.id] + +// if (scope.verilogMetadata.isVerilogCircuit) { +// scope.initialize() +// for (var id in scope.verilogMetadata.subCircuitScopeIds) +// delete scopeList[id] +// } +// // $(`#${scope.id}`).remove() +// const index = circuit_list.value.findIndex( +// (circuit) => circuit.id === scope.id +// ) +// circuit_list.value.splice(index, 1) +// delete scopeList[scope.id] +// if (scope.id == globalScope.id) { +// switchCircuit(Object.keys(scopeList)[0]) +// } +// showMessage('Circuit was successfully closed') +// } +/** + * Wrapper function around newCircuit to be called from + button on UI + */ +export async function createNewCircuitScope( + name, + id = undefined, + isVerilog = false, + isVerilogMain = false +) { + name = name ?? (await provideCircuitName()) + if (name instanceof Error) return // if user cancels the prompt + if (name.trim() == '') { + name = 'Untitled-Circuit' + } + simulationArea.lastSelected = undefined + newCircuit(name, id, isVerilog, isVerilogMain) + if (!embed) { + showProperties(simulationArea.lastSelected) + updateTestbenchUI() + plotArea.reset() + } + return true +} + +/** + * Function to create new circuit + * Function creates button in tab, creates scope and switches to this circuit + * @param {string} name - name of the new circuit + * @param {string} id - identifier for circuit + * @category circuit + */ +export function newCircuit(name, id, isVerilog = false, isVerilogMain = false) { + const simulatorStore = SimulatorStore() + const { circuit_list } = toRefs(simulatorStore) + const { activeCircuit } = toRefs(simulatorStore) + if (layoutModeGet()) { + toggleLayoutMode() + } + if (verilogModeGet()) { + verilogModeSet(false) + } + name = name || 'Untitled-Circuit' + name = stripTags(name) + if (!name) return + const scope = new Scope(name) + if (id) scope.id = id + scopeList[scope.id] = scope + let currCircuit = { + id: scope.id, + name: scope.name, // fix for tab name issue - vue - to be reviewed @devartstar + } + + circuit_list.value.push(currCircuit) + if (isVerilog) { + scope.verilogMetadata.isVerilogCircuit = true + // TODO: remove later if not required after fixing verilog code loading from saved file + circuit_list.value.forEach((circuit) => (circuit.isVerilog = false)) + circuit_list.value[circuit_list.value.length - 1].isVerilog = true + scope.verilogMetadata.isMainCircuit = isVerilogMain + } + globalScope = scope + // $('.circuits').removeClass('current') + circuit_list.value.forEach((circuit) => (circuit.focussed = false)) + circuit_list.value[circuit_list.value.length - 1].focussed = true + activeCircuit.value.id = scope.id + activeCircuit.value.name = scope.name + + if (!isVerilog || isVerilogMain) { + if (embed) { + // added calss - embed-tab using vue logic + // var html = `
${truncateString( + // name, + // 18 + // )}
` + // $('#tabsBar').append(html) + // $('#tabsBar').addClass('embed-tabs') + } else { + // logic implemented in vue + } + + // Remove listeners + //$('.circuits').off('click') + $('.circuitName').off('click') + //$('.tabsCloseButton').off('click') + + // switch circuit function moved inside vue component + + if (!embed) { + $('.circuitName').on('click', () => { + simulationArea.lastSelected = globalScope.root + setTimeout(() => { + // here link with the properties panel + document.getElementById('circname').select() + }, 100) + }) + } + // moved inside vue - component + // $('.tabsCloseButton').on('click', function (e) { + // e.stopPropagation() + // deleteCurrentCircuit(this.id) + // }) + + if (!embed) { + showProperties(scope.root) + } + dots(false) + } + return scope +} + +/** + * Used to change name of a circuit + * @param {string} name - new name + * @param {string} id - id of the circuit + * @category circuit + */ +export function changeCircuitName(name, id = globalScope.id) { + const simulatorStore = SimulatorStore() + const { circuit_list } = toRefs(simulatorStore) + // const { activeCircuit } = toRefs(simulatorStore) + name = name || 'Untitled' + name = stripTags(name) + scopeList[id].name = name + const index = circuit_list.value.findIndex((circuit) => circuit.id === id) + circuit_list.value[index].name = name + // activeCircuit.value.name = name // add later if necessary at current stage not important handled by projectProperty on switching circuit +} + +/** + * Class representing a Scope + * @class + * @param {string} name - name of the circuit + * @param {number=} id - a random id for the circuit + * @category circuit + */ +export default class Scope { + constructor(name = 'localScope', id = undefined) { + this.restrictedCircuitElementsUsed = [] + this.id = id || Math.floor(Math.random() * 100000000000 + 1) + this.CircuitElement = [] + this.name = name + + // root object for referring to main canvas - intermediate node uses this + this.root = new CircuitElement(0, 0, this, 'RIGHT', 1) + this.backups = [] + // maintaining a state (history) for redo function + this.history = [] + this.timeStamp = new Date().getTime() + this.verilogMetadata = { + isVerilogCircuit: false, + isMainCircuit: false, + code: '// Write Some Verilog Code Here!', + subCircuitScopeIds: [], + } + + this.ox = 0 + this.oy = 0 + this.scale = DPR + this.stack = [] + + this.initialize() + + // Setting default layout + this.layout = { + // default position + width: 100, + height: 40, + title_x: 50, + title_y: 13, + titleEnabled: true, + } + } + + isVisible() { + if (!this.verilogMetadata.isVerilogCircuit) return true + return this.verilogMetadata.isMainCircuit + } + + initialize() { + this.tunnelList = {} + this.pending = [] + this.nodes = [] // intermediate nodes only + this.allNodes = [] + this.wires = [] + + // Creating arrays for other module elements + for (let i = 0; i < moduleList.length; i++) { + this[moduleList[i]] = [] + } + } + + /** + * Resets all nodes recursively + */ + reset() { + for (let i = 0; i < this.allNodes.length; i++) { + this.allNodes[i].reset() + } + for (let i = 0; i < this.Splitter.length; i++) { + this.Splitter[i].reset() + } + for (let i = 0; i < this.SubCircuit.length; i++) { + this.SubCircuit[i].reset() + } + } + + /** + * Adds all inputs to simulationQueue + */ + addInputs() { + for (let i = 0; i < inputList.length; i++) { + for (var j = 0; j < this[inputList[i]].length; j++) { + simulationArea.simulationQueue.add(this[inputList[i]][j], 0) + } + } + + for (let i = 0; i < this.SubCircuit.length; i++) { + this.SubCircuit[i].addInputs() + } + } + + /** + * Ticks clocks recursively -- needs to be deprecated and synchronize all clocks with a global clock + */ + clockTick() { + for (let i = 0; i < this.Clock.length; i++) { + this.Clock[i].toggleState() + } // tick clock! + for (let i = 0; i < this.SubCircuit.length; i++) { + this.SubCircuit[i].localScope.clockTick() + } // tick clock! + } + + /** + * Checks if this circuit contains directly or indirectly scope with id + * Recursive nature + */ + checkDependency(id) { + if (id === this.id) return true + for (let i = 0; i < this.SubCircuit.length; i++) { + if (this.SubCircuit[i].id === id) return true + } + + for (let i = 0; i < this.SubCircuit.length; i++) { + if (scopeList[this.SubCircuit[i].id].checkDependency(id)) + return true + } + + return false + } + + /** + * Get dependency list - list of all circuits, this circuit depends on + */ + getDependencies() { + var list = [] + for (let i = 0; i < this.SubCircuit.length; i++) { + list.push(this.SubCircuit[i].id) + list.extend(scopeList[this.SubCircuit[i].id].getDependencies()) + } + return uniq(list) + } + + /** + * helper function to reduce layout size + */ + fixLayout() { + var maxY = 20 + for (let i = 0; i < this.Input.length; i++) { + maxY = Math.max(this.Input[i].layoutProperties.y, maxY) + } + for (let i = 0; i < this.Output.length; i++) { + maxY = Math.max(this.Output[i].layoutProperties.y, maxY) + } + if (maxY !== this.layout.height) { + this.layout.height = maxY + 10 + } + } + + /** + * Function which centers the circuit to the correct zoom level + */ + centerFocus(zoomIn = true) { + if (layoutModeGet()) return + findDimensions(this) + + var ytoolbarOffset = embed ? 0 : 60 * DPR // Some part ofcanvas is hidden behind the toolbar + + var minX = simulationArea.minWidth || 0 + var minY = simulationArea.minHeight || 0 + var maxX = simulationArea.maxWidth || 0 + var maxY = simulationArea.maxHeight || 0 + + var reqWidth = maxX - minX + 75 * DPR + var reqHeight = maxY - minY + 75 * DPR + + this.scale = Math.min( + width / reqWidth, + (height - ytoolbarOffset) / reqHeight + ) + + if (!zoomIn) { + this.scale = Math.min(this.scale, DPR) + } + this.scale = Math.max(this.scale, DPR / 10) + + this.ox = -minX * this.scale + (width - (maxX - minX) * this.scale) / 2 + this.oy = + -minY * this.scale + + (height - ytoolbarOffset - (maxY - minY) * this.scale) / 2 + } +} diff --git a/v0/src/simulator/src/circuitElement.js b/v0/src/simulator/src/circuitElement.js new file mode 100644 index 00000000..cd368c4d --- /dev/null +++ b/v0/src/simulator/src/circuitElement.js @@ -0,0 +1,1018 @@ +/* eslint-disable no-multi-assign */ +/* eslint-disable no-bitwise */ +import { scheduleUpdate } from './engine' +import simulationArea from './simulationArea' +import { + fixDirection, + fillText, + correctWidth, + rect2, + oppositeDirection, +} from './canvasApi' +import { colors } from './themer/themer' +import { layoutModeGet, tempBuffer } from './layoutMode' +import { fillSubcircuitElements } from './ux' +import { generateNodeName } from './verilogHelpers' + +/** + * Base class for circuit elements. + * @param {number} x - x coordinate of the element + * @param {number} y - y coordinate of the element + * @param {Scope} scope - The circuit on which circuit element is being drawn + * @param {string} dir - The direction of circuit element + * @param {number} bitWidth - the number of bits per node. + * @category circuitElement + */ +export default class CircuitElement { + constructor(x, y, scope, dir, bitWidth) { + // Data member initializations + this.x = x + this.y = y + this.hover = false + if (this.x === undefined || this.y === undefined) { + this.x = simulationArea.mouseX + this.y = simulationArea.mouseY + this.newElement = true + this.hover = true + } + this.deleteNodesWhenDeleted = true // FOR NOW - TO CHECK LATER + this.nodeList = [] + this.clicked = false + + this.oldx = x + this.oldy = y + + // The following attributes help in setting the touch area bound. They are the distances from the center. + // Note they are all positive distances from center. They will automatically be rotated when direction is changed. + // To stop the rotation when direction is changed, check overrideDirectionRotation attribute. + this.leftDimensionX = 10 + this.rightDimensionX = 10 + this.upDimensionY = 10 + this.downDimensionY = 10 + + this.label = '' + this.scope = scope + this.baseSetup() + + this.bitWidth = bitWidth || parseInt(prompt('Enter bitWidth'), 10) || 1 + this.direction = dir + this.directionFixed = false + this.labelDirectionFixed = false + this.labelDirection = oppositeDirection[dir] + this.orientationFixed = true + this.fixedBitWidth = false + + scheduleUpdate() + + this.queueProperties = { + inQueue: false, + time: undefined, + index: undefined, + } + + if (this.canShowInSubcircuit) { + this.subcircuitMetadata = { + showInSubcircuit: false, // if canShowInSubcircuit == true, showInSubcircuit determines wheter the user has added the element in the subcircuit + showLabelInSubcircuit: true, // determines whether the label of the element is to be showin the subcircuit + labelDirection: this.labelDirection, // determines the direction of the label of the element in the subcircuit + // coordinates of the element in the subcircuit relative to the subcircuit + x: 0, + y: 0, + } + } + } + + /** + * Function to flip bits + * @param {number} val - the value of flipped bits + * @returns {number} - The number of flipped bits + */ + flipBits(val) { + return ((~val >>> 0) << (32 - this.bitWidth)) >>> (32 - this.bitWidth) + } + + /** + * Function to get absolute value of x coordinate of the element + * @param {number} x - value of x coordinate of the element + * @return {number} - absolute value of x + */ + absX() { + return this.x + } + + /** + * Function to get absolute value of y coordinate of the element + * @param {number} y - value of y coordinate of the element + * @return {number} - absolute value of y + */ + absY() { + return this.y + } + + /** + * adds the element to scopeList + */ + baseSetup() { + this.scope[this.objectType].push(this) + } + + /** + * Function to copy the circuit element obj to a new circuit element + * @param {CircuitElement} obj - element to be copied from + */ + copyFrom(obj) { + var properties = ['label', 'labelDirection'] + for (let i = 0; i < properties.length; i++) { + if (obj[properties[i]] !== undefined) { + this[properties[i]] = obj[properties[i]] + } + } + } + + /** Methods to be Implemented for derivedClass + * saveObject(); //To generate JSON-safe data that can be loaded + * customDraw(); //This is to draw the custom design of the circuit(Optional) + * resolve(); // To execute digital logic(Optional) + * override isResolvable(); // custom logic for checking if module is ready + * override newDirection(dir) //To implement custom direction logic(Optional) + * newOrientation(dir) //To implement custom orientation logic(Optional) + */ + + // Method definitions + + /** + * Function to update the scope when a new element is added. + * @param {Scope} scope - the circuit in which we add element + */ + updateScope(scope) { + this.scope = scope + for (let i = 0; i < this.nodeList.length; i++) { + this.nodeList[i].scope = scope + } + } + + /** + * To generate JSON-safe data that can be loaded + * @memberof CircuitElement + * @return {JSON} - the data to be saved + */ + saveObject() { + var data = { + x: this.x, + y: this.y, + objectType: this.objectType, + label: this.label, + direction: this.direction, + labelDirection: this.labelDirection, + propagationDelay: this.propagationDelay, + customData: this.customSave(), + } + + if (this.canShowInSubcircuit) + data.subcircuitMetadata = this.subcircuitMetadata + return data + } + + /** + * Always overriden + * @memberof CircuitElement + * @return {JSON} - the data to be saved + */ + // eslint-disable-next-line class-methods-use-this + customSave() { + return { + values: {}, + nodes: {}, + constructorParamaters: [], + } + } + + /** + * check hover over the element + * @return {boolean} + */ + checkHover() { + if (simulationArea.mouseDown) return + for (let i = 0; i < this.nodeList.length; i++) { + this.nodeList[i].checkHover() + } + if (!simulationArea.mouseDown) { + if (simulationArea.hover === this) { + this.hover = this.isHover() + if (!this.hover) simulationArea.hover = undefined + } else if (!simulationArea.hover) { + this.hover = this.isHover() + if (this.hover) simulationArea.hover = this + } else { + this.hover = false + } + } + } + + /** + * This sets the width and height of the element if its rectangular + * and the reference point is at the center of the object. + * width and height define the X and Y distance from the center. + * Effectively HALF the actual width and height. + * NOT OVERRIDABLE + * @param {number} w - width + * @param {number} h - height + */ + setDimensions(width, height) { + this.leftDimensionX = this.rightDimensionX = width + this.downDimensionY = this.upDimensionY = height + } + + /** + * @memberof CircuitElement + * @param {number} w -width + */ + setWidth(width) { + this.leftDimensionX = this.rightDimensionX = width + } + + /** + * @param {number} h -height + */ + setHeight(height) { + this.downDimensionY = this.upDimensionY = height + } + + /** + * Helper Function to drag element to a new position + */ + startDragging() { + if (!layoutModeGet()) { + this.oldx = this.x + this.oldy = this.y + } else { + this.oldx = this.subcircuitMetadata.x + this.oldy = this.subcircuitMetadata.y + } + } + + /** + * Helper Function to drag element to a new position + * @memberof CircuitElement + */ + drag() { + if (!layoutModeGet()) { + this.x = + this.oldx + simulationArea.mouseX - simulationArea.mouseDownX + this.y = + this.oldy + simulationArea.mouseY - simulationArea.mouseDownY + } else { + this.subcircuitMetadata.x = + this.oldx + simulationArea.mouseX - simulationArea.mouseDownX + this.subcircuitMetadata.y = + this.oldy + simulationArea.mouseY - simulationArea.mouseDownY + } + } + + /** + * The update method is used to change the parameters of the object on mouse click and hover. + * Return Value: true if state has changed else false + * NOT OVERRIDABLE + */ + update() { + if (layoutModeGet()) { + return this.layoutUpdate() + } + let update = false + + update |= this.newElement + if (this.newElement) { + if (this.centerElement) { + this.x = + Math.round( + (simulationArea.mouseX - + (this.rightDimensionX - this.leftDimensionX) / 2) / + 10 + ) * 10 + this.y = + Math.round( + (simulationArea.mouseY - + (this.downDimensionY - this.upDimensionY) / 2) / + 10 + ) * 10 + } else { + this.x = simulationArea.mouseX + this.y = simulationArea.mouseY + } + + if (simulationArea.mouseDown) { + this.newElement = false + simulationArea.lastSelected = this + } else return update + } + + for (let i = 0; i < this.nodeList.length; i++) { + update |= this.nodeList[i].update() + } + + if (!simulationArea.hover || simulationArea.hover === this) { + this.hover = this.isHover() + } + + if (!simulationArea.mouseDown) this.hover = false + + if ((this.clicked || !simulationArea.hover) && this.isHover()) { + this.hover = true + simulationArea.hover = this + } else if ( + !simulationArea.mouseDown && + this.hover && + this.isHover() === false + ) { + if (this.hover) simulationArea.hover = undefined + this.hover = false + } + + if (simulationArea.mouseDown && this.clicked) { + this.drag() + if ( + !simulationArea.shiftDown && + simulationArea.multipleObjectSelections.contains(this) + ) { + for ( + let i = 0; + i < simulationArea.multipleObjectSelections.length; + i++ + ) { + simulationArea.multipleObjectSelections[i].drag() + } + } + + update |= true + } else if (simulationArea.mouseDown && !simulationArea.selected) { + this.startDragging() + if ( + !simulationArea.shiftDown && + simulationArea.multipleObjectSelections.contains(this) + ) { + for ( + let i = 0; + i < simulationArea.multipleObjectSelections.length; + i++ + ) { + simulationArea.multipleObjectSelections[i].startDragging() + } + } + simulationArea.selected = this.clicked = this.hover + + update |= this.clicked + } else { + if (this.clicked) simulationArea.selected = false + this.clicked = false + this.wasClicked = false + // If this is SubCircuit, then call releaseClick to recursively release clicks on each subcircuit object + if (this.objectType == 'SubCircuit') this.releaseClick() + } + + if (simulationArea.mouseDown && !this.wasClicked) { + if (this.clicked) { + this.wasClicked = true + if (this.click) this.click() + if (simulationArea.shiftDown) { + simulationArea.lastSelected = undefined + if ( + simulationArea.multipleObjectSelections.contains(this) + ) { + simulationArea.multipleObjectSelections.clean(this) + } else { + simulationArea.multipleObjectSelections.push(this) + } + } else { + simulationArea.lastSelected = this + } + } + } + + return update + } + + /** + * Used to update the state of the elements inside the subcircuit in layout mode + * Return Value: true if the state has changed, false otherwise + **/ + + layoutUpdate() { + var update = false + update |= this.newElement + if (this.newElement) { + this.subcircuitMetadata.x = simulationArea.mouseX + this.subcircuitMetadata.y = simulationArea.mouseY + + if (simulationArea.mouseDown) { + this.newElement = false + simulationArea.lastSelected = this + } else return + } + + if (!simulationArea.hover || simulationArea.hover == this) + this.hover = this.isHover() + + if ((this.clicked || !simulationArea.hover) && this.isHover()) { + this.hover = true + simulationArea.hover = this + } else if ( + !simulationArea.mouseDown && + this.hover && + this.isHover() == false + ) { + if (this.hover) simulationArea.hover = undefined + this.hover = false + } + + if (simulationArea.mouseDown && this.clicked) { + this.drag() + update |= true + } else if (simulationArea.mouseDown && !simulationArea.selected) { + this.startDragging() + simulationArea.selected = this.clicked = this.hover + update |= this.clicked + } else { + if (this.clicked) simulationArea.selected = false + this.clicked = false + this.wasClicked = false + } + + if (simulationArea.mouseDown && !this.wasClicked) { + if (this.clicked) { + this.wasClicked = true + simulationArea.lastSelected = this + } + } + + if (!this.clicked && !this.newElement) { + let x = this.subcircuitMetadata.x + let y = this.subcircuitMetadata.y + let yy = tempBuffer.layout.height + let xx = tempBuffer.layout.width + + let rX = this.layoutProperties.rightDimensionX + let lX = this.layoutProperties.leftDimensionX + let uY = this.layoutProperties.upDimensionY + let dY = this.layoutProperties.downDimensionY + + if (lX <= x && x + rX <= xx && y >= uY && y + dY <= yy) return + + this.subcircuitMetadata.showInSubcircuit = false + fillSubcircuitElements() + } + + return update + } + + /** + * Helper Function to correct the direction of element + */ + fixDirection() { + this.direction = fixDirection[this.direction] || this.direction + this.labelDirection = + fixDirection[this.labelDirection] || this.labelDirection + } + + /** + * The isHover method is used to check if the mouse is hovering over the object. + * Return Value: true if mouse is hovering over object else false + * NOT OVERRIDABLE + */ + isHover() { + var mX = simulationArea.mouseXf - this.x + var mY = this.y - simulationArea.mouseYf + + var rX = this.rightDimensionX + var lX = this.leftDimensionX + var uY = this.upDimensionY + var dY = this.downDimensionY + + if (layoutModeGet()) { + var mX = simulationArea.mouseXf - this.subcircuitMetadata.x + var mY = this.subcircuitMetadata.y - simulationArea.mouseYf + + var rX = this.layoutProperties.rightDimensionX + var lX = this.layoutProperties.leftDimensionX + var uY = this.layoutProperties.upDimensionY + var dY = this.layoutProperties.downDimensionY + } + + if (!this.directionFixed && !this.overrideDirectionRotation) { + if (this.direction === 'LEFT') { + lX = this.rightDimensionX + rX = this.leftDimensionX + } else if (this.direction === 'DOWN') { + lX = this.downDimensionY + rX = this.upDimensionY + uY = this.leftDimensionX + dY = this.rightDimensionX + } else if (this.direction === 'UP') { + lX = this.downDimensionY + rX = this.upDimensionY + dY = this.leftDimensionX + uY = this.rightDimensionX + } + } + + return -lX <= mX && mX <= rX && -dY <= mY && mY <= uY + } + + isSubcircuitHover(xoffset = 0, yoffset = 0) { + var mX = simulationArea.mouseXf - this.subcircuitMetadata.x - xoffset + var mY = yoffset + this.subcircuitMetadata.y - simulationArea.mouseYf + + var rX = this.layoutProperties.rightDimensionX + var lX = this.layoutProperties.leftDimensionX + var uY = this.layoutProperties.upDimensionY + var dY = this.layoutProperties.downDimensionY + + return -lX <= mX && mX <= rX && -dY <= mY && mY <= uY + } + + /** + * Helper Function to set label of an element. + * @memberof CircuitElement + * @param {string} label - the label for element + */ + setLabel(label) { + this.label = label || '' + } + + /** + * Method that draws the outline of the module and calls draw function on module Nodes. + * NOT OVERRIDABLE + */ + draw() { + // + var ctx = simulationArea.context + this.checkHover() + + if ( + this.x * this.scope.scale + this.scope.ox < + -this.rightDimensionX * this.scope.scale - 0 || + this.x * this.scope.scale + this.scope.ox > + width + this.leftDimensionX * this.scope.scale + 0 || + this.y * this.scope.scale + this.scope.oy < + -this.downDimensionY * this.scope.scale - 0 || + this.y * this.scope.scale + this.scope.oy > + height + 0 + this.upDimensionY * this.scope.scale + ) + return + + // Draws rectangle and highlights + if (this.rectangleObject) { + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + rect2( + ctx, + -this.leftDimensionX, + -this.upDimensionY, + this.leftDimensionX + this.rightDimensionX, + this.upDimensionY + this.downDimensionY, + this.x, + this.y, + [this.direction, 'RIGHT'][+this.directionFixed] + ) + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + } + if (this.label !== '') { + var rX = this.rightDimensionX + var lX = this.leftDimensionX + var uY = this.upDimensionY + var dY = this.downDimensionY + if (!this.directionFixed) { + if (this.direction === 'LEFT') { + lX = this.rightDimensionX + rX = this.leftDimensionX + } else if (this.direction === 'DOWN') { + lX = this.downDimensionY + rX = this.upDimensionY + uY = this.leftDimensionX + dY = this.rightDimensionX + } else if (this.direction === 'UP') { + lX = this.downDimensionY + rX = this.upDimensionY + dY = this.leftDimensionX + uY = this.rightDimensionX + } + } + + if (this.labelDirection === 'LEFT') { + ctx.beginPath() + ctx.textAlign = 'right' + ctx.fillStyle = colors['text'] + fillText(ctx, this.label, this.x - lX - 10, this.y + 5, 14) + ctx.fill() + } else if (this.labelDirection === 'RIGHT') { + ctx.beginPath() + ctx.textAlign = 'left' + ctx.fillStyle = colors['text'] + fillText(ctx, this.label, this.x + rX + 10, this.y + 5, 14) + ctx.fill() + } else if (this.labelDirection === 'UP') { + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = colors['text'] + fillText(ctx, this.label, this.x, this.y + 5 - uY - 10, 14) + ctx.fill() + } else if (this.labelDirection === 'DOWN') { + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = colors['text'] + fillText(ctx, this.label, this.x, this.y + 5 + dY + 10, 14) + ctx.fill() + } + } + + // calls the custom circuit design + if (this.customDraw) { + this.customDraw() + } + + // draws nodes - Moved to renderCanvas + // for (let i = 0; i < this.nodeList.length; i++) + // this.nodeList[i].draw(); + } + + /** + Draws element in layout mode (inside the subcircuit) + @param {number} xOffset - x position of the subcircuit + @param {number} yOffset - y position of the subcircuit + + Called by subcirucit.js/customDraw() - for drawing as a part of another circuit + and layoutMode.js/renderLayout() - for drawing in layoutMode + **/ + drawLayoutMode(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + if (layoutModeGet()) { + this.checkHover() + } + if ( + this.subcircuitMetadata.x * this.scope.scale + this.scope.ox < + -this.layoutProperties.rightDimensionX * this.scope.scale || + this.subcircuitMetadata.x * this.scope.scale + this.scope.ox > + width + + this.layoutProperties.leftDimensionX * this.scope.scale || + this.subcircuitMetadata.y * this.scope.scale + this.scope.oy < + -this.layoutProperties.downDimensionY * this.scope.scale || + this.subcircuitMetadata.y * this.scope.scale + this.scope.oy > + height + this.layoutProperties.upDimensionY * this.scope.scale + ) + return + + if (this.subcircuitMetadata.showLabelInSubcircuit) { + var rX = this.layoutProperties.rightDimensionX + var lX = this.layoutProperties.leftDimensionX + var uY = this.layoutProperties.upDimensionY + var dY = this.layoutProperties.downDimensionY + + // this.subcircuitMetadata.labelDirection + if (this.subcircuitMetadata.labelDirection == 'LEFT') { + ctx.beginPath() + ctx.textAlign = 'right' + ctx.fillStyle = 'black' + fillText( + ctx, + this.label, + this.subcircuitMetadata.x + xOffset - lX - 10, + this.subcircuitMetadata.y + yOffset + 5, + 10 + ) + ctx.fill() + } else if (this.subcircuitMetadata.labelDirection == 'RIGHT') { + ctx.beginPath() + ctx.textAlign = 'left' + ctx.fillStyle = 'black' + fillText( + ctx, + this.label, + this.subcircuitMetadata.x + xOffset + rX + 10, + this.subcircuitMetadata.y + yOffset + 5, + 10 + ) + ctx.fill() + } else if (this.subcircuitMetadata.labelDirection == 'UP') { + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = 'black' + fillText( + ctx, + this.label, + this.subcircuitMetadata.x + xOffset, + this.subcircuitMetadata.y + yOffset + 5 - uY - 10, + 10 + ) + ctx.fill() + } else if (this.subcircuitMetadata.labelDirection == 'DOWN') { + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = 'black' + fillText( + ctx, + this.label, + this.subcircuitMetadata.x + xOffset, + this.subcircuitMetadata.y + yOffset + 5 + dY + 10, + 10 + ) + ctx.fill() + } + } + // calls the subcircuitDraw function in the element to draw it to canvas + this.subcircuitDraw(xOffset, yOffset) + } + + // method to delete object + // OVERRIDE WITH CAUTION + delete() { + simulationArea.lastSelected = undefined + this.scope[this.objectType].clean(this) // CHECK IF THIS IS VALID + if (this.deleteNodesWhenDeleted) { + this.deleteNodes() + } else { + for (let i = 0; i < this.nodeList.length; i++) { + if (this.nodeList[i].connections.length) { + this.nodeList[i].converToIntermediate() + } else { + this.nodeList[i].delete() + } + } + } + this.deleted = true + } + + /** + * method to delete object + * OVERRIDE WITH CAUTION + * @memberof CircuitElement + */ + cleanDelete() { + this.deleteNodesWhenDeleted = true + this.delete() + } + + /** + * Helper Function to delete the element and all the node attached to it. + */ + deleteNodes() { + for (let i = 0; i < this.nodeList.length; i++) { + this.nodeList[i].delete() + } + } + + /** + * method to change direction + * OVERRIDE WITH CAUTION + * @param {string} dir - new direction + */ + newDirection(dir) { + if (this.direction === dir) return + // Leave this for now + if (this.directionFixed && this.orientationFixed) return + if (this.directionFixed) { + this.newOrientation(dir) + return // Should it return ? + } + + // if (obj.direction === undefined) return; + this.direction = dir + for (let i = 0; i < this.nodeList.length; i++) { + this.nodeList[i].refresh() + } + } + + /** + * Helper Function to change label direction of the element. + * @memberof CircuitElement + * @param {string} dir - new direction + */ + newLabelDirection(dir) { + if (layoutModeGet()) this.subcircuitMetadata.labelDirection = dir + else this.labelDirection = dir + } + + /** + * Method to check if object can be resolved + * OVERRIDE if necessary + * @return {boolean} + */ + isResolvable() { + if (this.alwaysResolve) return true + for (let i = 0; i < this.nodeList.length; i++) { + if ( + this.nodeList[i].type === 0 && + this.nodeList[i].value === undefined + ) + return false + } + return true + } + + /** + * Method to change object Bitwidth + * OVERRIDE if necessary + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + if (this.fixedBitWidth) return + if (this.bitWidth === undefined) return + if (this.bitWidth < 1) return + this.bitWidth = bitWidth + for (let i = 0; i < this.nodeList.length; i++) { + this.nodeList[i].bitWidth = bitWidth + } + } + + /** + * Method to change object delay + * OVERRIDE if necessary + * @param {number} delay - new delay + */ + changePropagationDelay(delay) { + if (this.propagationDelayFixed) return + if (delay === undefined) return + if (delay === '') return + var tmpDelay = parseInt(delay, 10) + if (tmpDelay < 0) return + this.propagationDelay = tmpDelay + } + + /** + * Dummy resolve function + * OVERRIDE if necessary + */ + resolve() {} + + /** + * Helper Function to process verilog + */ + processVerilog() { + // Output count used to sanitize output + var output_total = 0 + for (var i = 0; i < this.nodeList.length; i++) { + if ( + this.nodeList[i].type == NODE_OUTPUT && + this.nodeList[i].connections.length > 0 + ) + output_total++ + } + + var output_count = 0 + for (var i = 0; i < this.nodeList.length; i++) { + if (this.nodeList[i].type == NODE_OUTPUT) { + if ( + this.objectType != 'Input' && + this.objectType != 'Clock' && + this.nodeList[i].connections.length > 0 + ) { + this.nodeList[i].verilogLabel = generateNodeName( + this.nodeList[i], + output_count, + output_total + ) + + if ( + !this.scope.verilogWireList[ + this.nodeList[i].bitWidth + ].contains(this.nodeList[i].verilogLabel) + ) + this.scope.verilogWireList[ + this.nodeList[i].bitWidth + ].push(this.nodeList[i].verilogLabel) + output_count++ + } + this.scope.stack.push(this.nodeList[i]) + } + } + } + + /** + * Helper Function to check if verilog resolvable + * @return {boolean} + */ + isVerilogResolvable() { + var backupValues = [] + for (let i = 0; i < this.nodeList.length; i++) { + backupValues.push(this.nodeList[i].value) + this.nodeList[i].value = undefined + } + + for (let i = 0; i < this.nodeList.length; i++) { + if (this.nodeList[i].verilogLabel) { + this.nodeList[i].value = 1 + } + } + + var res = this.isResolvable() + + for (let i = 0; i < this.nodeList.length; i++) { + this.nodeList[i].value = backupValues[i] + } + + return res + } + + /** + * Helper Function to remove proporgation. + */ + removePropagation() { + for (let i = 0; i < this.nodeList.length; i++) { + if (this.nodeList[i].type === NODE_OUTPUT) { + if (this.nodeList[i].value !== undefined) { + this.nodeList[i].value = undefined + simulationArea.simulationQueue.add(this.nodeList[i]) + } + } + } + } + + /** + * Helper Function to name the verilog. + * @return {string} + */ + verilogName() { + return this.verilogType || this.objectType + } + + verilogBaseType() { + return this.verilogName() + } + + verilogParametrizedType() { + var type = this.verilogBaseType() + // Suffix bitwidth for multi-bit inputs + // Example: DflipFlop #(2) DflipFlop_0 + if (this.bitWidth != undefined && this.bitWidth > 1) + type += ' #(' + this.bitWidth + ')' + return type + } + + /** + * Helper Function to generate verilog + * @return {JSON} + */ + generateVerilog() { + // Example: and and_1(_out, _out, _Q[0]); + var inputs = [] + var outputs = [] + + for (var i = 0; i < this.nodeList.length; i++) { + if (this.nodeList[i].type == NODE_INPUT) { + inputs.push(this.nodeList[i]) + } else { + if (this.nodeList[i].connections.length > 0) + outputs.push(this.nodeList[i]) + else outputs.push('') // Don't create a wire + } + } + + var list = outputs.concat(inputs) + var res = this.verilogParametrizedType() + var moduleParams = list.map((x) => x.verilogLabel).join(', ') + res += ` ${this.verilogLabel}(${moduleParams});` + return res + } + + /** + * Toggles the visibility of the labels of subcircuit elements. Called by event handlers in ux.js + **/ + toggleLabelInLayoutMode() { + this.subcircuitMetadata.showLabelInSubcircuit = + !this.subcircuitMetadata.showLabelInSubcircuit + } +} + +CircuitElement.prototype.alwaysResolve = false +CircuitElement.prototype.propagationDelay = 10 +CircuitElement.prototype.tooltip = undefined +CircuitElement.prototype.propagationDelayFixed = false +CircuitElement.prototype.rectangleObject = true +CircuitElement.prototype.objectType = 'CircuitElement' +CircuitElement.prototype.canShowInSubcircuit = false // determines whether the element is supported to be shown inside a subcircuit +CircuitElement.prototype.subcircuitMetadata = {} // stores the coordinates and stuff for the elements in the subcircuit +CircuitElement.prototype.layoutProperties = { + rightDimensionX: 5, + leftDimensionX: 5, + upDimensionY: 5, + downDimensionY: 5, +} +CircuitElement.prototype.subcircuitMutableProperties = { + label: { + name: 'label: ', + type: 'text', + func: 'setLabel', + }, + 'show label': { + name: 'show label ', + type: 'checkbox', + func: 'toggleLabelInLayoutMode', + }, +} diff --git a/v0/src/simulator/src/combinationalAnalysis.js b/v0/src/simulator/src/combinationalAnalysis.js new file mode 100644 index 00000000..e45cb1b8 --- /dev/null +++ b/v0/src/simulator/src/combinationalAnalysis.js @@ -0,0 +1,667 @@ +/* eslint-disable import/no-cycle */ +/* eslint-disable guard-for-in */ +/* eslint-disable no-restricted-syntax */ +import Node from './node' +import { scheduleBackup } from './data/backupCircuit' +import BooleanMinimize from './quinMcCluskey' +import Input from './modules/Input' +import ConstantVal from './modules/ConstantVal' +import Output from './modules/Output' +import AndGate from './modules/AndGate' +import OrGate from './modules/OrGate' +import NotGate from './modules/NotGate' +import { stripTags } from './utils' +import simulationArea from './simulationArea' +import { findDimensions } from './canvasApi' +import { SimulatorStore } from '#/store/SimulatorStore/SimulatorStore' + +// var inputSample = 5 +// var dataSample = [ +// ['01---', '11110', '01---', '00000'], +// ['01110', '1-1-1', '----0'], +// ['01---', '11110', '01110', '1-1-1', '0---0'], +// ['----1'], +// ] + +// var sampleInputListNames = ['A', 'B'] +// var sampleOutputListNames = ['X'] + +/** + * The prompt for combinational analysis + * @param {Scope=} - the circuit in which we want combinational analysis + * @category combinationalAnalysis + */ +export function createCombinationalAnalysisPrompt(scope = globalScope) { + scheduleBackup() + SimulatorStore().dialogBox.combinationalanalysis_dialog = true + /* + $('#combinationalAnalysis').empty() + $('#combinationalAnalysis').append( + "

Enter Input names separated by commas:

" + ) + $('#combinationalAnalysis').append( + "

Enter Output names separated by commas:

" + ) + $('#combinationalAnalysis').append("

OR

") + $('#combinationalAnalysis').append( + "

Enter Boolean Function:

" + ) + $('#combinationalAnalysis').append( + "" + ) + $('#combinationalAnalysis').dialog({ + resizable: false, + width: 'auto', + buttons: [ + { + style: 'padding: 5px', + text: 'Next', + click() { + var inputList = stripTags($('#inputNameList').val()).split( + ',' + ) + var outputList = stripTags( + $('#outputNameList').val() + ).split(',') + var booleanExpression = $('#booleanExpression').val() + inputList = inputList.map((x) => x.trim()) + inputList = inputList.filter((e) => e) + outputList = outputList.map((x) => x.trim()) + outputList = outputList.filter((e) => e) + booleanExpression = booleanExpression.replace(/ /g, '') + booleanExpression = booleanExpression.toUpperCase() + var booleanInputVariables = [] + for (var i = 0; i < booleanExpression.length; i++) { + if ( + booleanExpression[i] >= 'A' && + booleanExpression[i] <= 'Z' + ) { + if ( + booleanExpression.indexOf( + booleanExpression[i] + ) == i + ) { + booleanInputVariables.push(booleanExpression[i]) + } + } + } + booleanInputVariables.sort() + if ( + inputList.length > 0 && + outputList.length > 0 && + booleanInputVariables.length == 0 + ) { + $(this).dialog('close') + createBooleanPrompt(inputList, outputList, null, scope) + } else if ( + booleanInputVariables.length > 0 && + inputList.length == 0 && + outputList.length == 0 + ) { + $(this).dialog('close') + var output = solveBooleanFunction( + booleanInputVariables, + booleanExpression + ) + if (output != null) { + createBooleanPrompt( + booleanInputVariables, + booleanExpression, + output, + scope + ) + } + } else if ( + (inputList.length == 0 || outputList.length == 0) && + booleanInputVariables == 0 + ) { + alert( + 'Enter Input / Output Variable(s) OR Boolean Function!' + ) + } else { + alert( + 'Use Either Combinational Analysis Or Boolean Function To Generate Circuit!' + ) + } + }, + }, + ], + }) + + $('#combinationalAnalysis').checkBo() + */ +} +// /** +// * This funciton hashes the output array and makes required JSON using +// * a BooleanMinimize class defined in Quin_Mcluskey.js var s which will +// * be output table is also initialied here +// * @param {Array} inputListNames - labels of input nodes +// * @param {Array} outputListNames - labels of output nodes +// * @param {Scope=} scope - h circuit +// * @category combinationalAnalysis +// */ +/* + function createBooleanPrompt( + inputListNames, + outputListNames, + output, + scope = globalScope + ) { + var inputListNames = + inputListNames || prompt('Enter inputs separated by commas').split(',') + var outputListNames = + outputListNames || + prompt('Enter outputs separated by commas').split(',') + var outputListNamesInteger = [] + if (output == null) { + for (var i = 0; i < outputListNames.length; i++) { + outputListNamesInteger[i] = 7 * i + 13 + } // assigning an integer to the value, 7*i + 13 is random + } else { + outputListNamesInteger = [13] + } + var s = '' + s += '' + s += '' + if ($('#decimalColumnBox').is(':checked')) { + s += '' + } + for (var i = 0; i < inputListNames.length; i++) { + s += `` + } + if (output == null) { + for (var i = 0; i < outputListNames.length; i++) { + s += `` + } + } else { + s += `` + } + s += '' + + var matrix = [] + for (var i = 0; i < inputListNames.length; i++) { + matrix[i] = new Array(1 << inputListNames.length) + } + + for (var i = 0; i < inputListNames.length; i++) { + for (var j = 0; j < 1 << inputListNames.length; j++) { + matrix[i][j] = +((j & (1 << (inputListNames.length - i - 1))) != 0) + } + } + + for (var j = 0; j < 1 << inputListNames.length; j++) { + s += '' + if ($('#decimalColumnBox').is(':checked')) { + s += `` + } + for (var i = 0; i < inputListNames.length; i++) { + s += `` + } + for (var i = 0; i < outputListNamesInteger.length; i++) { + if (output == null) { + s += + `' + // using hash values as they'll be used in the generateBooleanTableData function + } + } + if (output != null) { + s += + `' + } + s += '' + } + s += '' + s += '
' + 'dec' + '${inputListNames[i]}${outputListNames[i]}${outputListNames}
${j}${matrix[i][j]}` + + 'x' + + '` + + `${output[j]}` + + '
' + $('#combinationalAnalysis').empty() + $('#combinationalAnalysis').append(s) + $('#combinationalAnalysis').dialog({ + resizable: false, + width: 'auto', + buttons: [ + { + style: 'padding: 6px', + text: 'Generate Circuit', + click() { + $(this).dialog('close') + var data = generateBooleanTableData(outputListNamesInteger) + // passing the hash values to avoid spaces being passed which is causing a problem + var minimizedCircuit = [] + let inputCount = inputListNames.length + for (const output in data) { + let oneCount = data[output][1].length // Number of ones + let zeroCount = data[output][0].length // Number of zeroes + if (oneCount == 0) { + // Hardcode to 0 as output + minimizedCircuit.push([ + '-'.repeat(inputCount) + '0', + ]) + } else if (zeroCount == 0) { + // Hardcode to 1 as output + minimizedCircuit.push([ + '-'.repeat(inputCount) + '1', + ]) + } else { + // Perform KMap like minimzation + const temp = new BooleanMinimize( + inputListNames.length, + data[output][1].map(Number), + data[output].x.map(Number) + ) + minimizedCircuit.push(temp.result) + } + } + if (output == null) { + drawCombinationalAnalysis( + minimizedCircuit, + inputListNames, + outputListNames, + scope + ) + } else { + drawCombinationalAnalysis( + minimizedCircuit, + inputListNames, + [`${outputListNames}`], + scope + ) + } + }, + }, + { + style: 'padding: 6px', + text: 'Print Truth Table', + click() { + var sTable = document.getElementById( + 'combinationalAnalysis' + ).innerHTML + var style = + '' + var win = window.open('', '', 'height=700,width=700') + var htmlBody = ` + \ + Boolean Logic Table\ + ${style}\ + \ + \ +
${sTable}
\ + + ` + win.document.write(htmlBody) + win.document.close() + win.print() + }, + }, + ], + }) + + $('.output').on('click', function () { + var v = $(this).html() + if (v == 0) v = $(this).html(1) + else if (v == 1) v = $(this).html('x') + else if (v == 'x') v = $(this).html(0) + }) + } +*/ + +// function generateBooleanTableData(outputListNames) { +// var data = {} +// for (var i = 0; i < outputListNames.length; i++) { +// data[outputListNames[i]] = { +// x: [], +// 1: [], +// 0: [], +// } +// var rows = $(`.${outputListNames[i]}`) +// for (let j = 0; j < rows.length; j++) { +// data[outputListNames[i]][rows[j].innerHTML].push(rows[j].id) +// } +// } +// return data +// } + +// function drawCombinationalAnalysis( +// combinationalData, +// inputList, +// outputListNames, +// scope = globalScope +// ) { +// findDimensions(scope) +// var inputCount = inputList.length +// var maxTerms = 0 +// for (var i = 0; i < combinationalData.length; i++) { +// maxTerms = Math.max(maxTerms, combinationalData[i].length) +// } + +// var startPosX = 200 +// var startPosY = 200 + +// var currentPosY = 300 + +// if (simulationArea.maxWidth && simulationArea.maxHeight) { +// if (simulationArea.maxHeight + currentPosY > simulationArea.maxWidth) { +// startPosX += simulationArea.maxWidth +// } else { +// startPosY += simulationArea.maxHeight +// currentPosY += simulationArea.maxHeight +// } +// } +// var andPosX = startPosX + inputCount * 40 + 40 + 40 +// var orPosX = andPosX + Math.floor(maxTerms / 2) * 10 + 80 +// var outputPosX = orPosX + 60 +// var inputObjects = [] + +// var logixNodes = [] + +// // Appending constant input to the end of inputObjects +// for (var i = 0; i <= inputCount; i++) { +// if (i < inputCount) { +// // Regular Input +// inputObjects.push( +// new Input(startPosX + i * 40, startPosY, scope, 'DOWN', 1) +// ) +// inputObjects[i].setLabel(inputList[i]) +// } else { +// // Constant Input +// inputObjects.push( +// new ConstantVal( +// startPosX + i * 40, +// startPosY, +// scope, +// 'DOWN', +// 1, +// '1' +// ) +// ) +// inputObjects[i].setLabel('_C_') +// } + +// inputObjects[i].newLabelDirection('UP') +// var v1 = new Node(startPosX + i * 40, startPosY + 20, 2, scope.root) +// inputObjects[i].output1.connect(v1) +// var v2 = new Node( +// startPosX + i * 40 + 20, +// startPosY + 20, +// 2, +// scope.root +// ) +// v1.connect(v2) +// var notG = new NotGate( +// startPosX + i * 40 + 20, +// startPosY + 40, +// scope, +// 'DOWN', +// 1 +// ) +// notG.inp1.connect(v2) +// logixNodes.push(v1) +// logixNodes.push(notG.output1) +// } + +// function countTerm(s) { +// var c = 0 +// for (var i = 0; i < s.length; i++) { +// if (s[i] !== '-') c++ +// } +// return c +// } + +// for (var i = 0; i < combinationalData.length; i++) { +// var andGateNodes = [] +// for (var j = 0; j < combinationalData[i].length; j++) { +// var c = countTerm(combinationalData[i][j]) +// if (c > 1) { +// var andGate = new AndGate( +// andPosX, +// currentPosY, +// scope, +// 'RIGHT', +// c, +// 1 +// ) +// andGateNodes.push(andGate.output1) +// var misses = 0 +// for (var k = 0; k < combinationalData[i][j].length; k++) { +// if (combinationalData[i][j][k] == '-') { +// misses++ +// continue +// } +// var index = 2 * k + (combinationalData[i][j][k] == 0) +// var v = new Node( +// logixNodes[index].absX(), +// andGate.inp[k - misses].absY(), +// 2, +// scope.root +// ) +// logixNodes[index].connect(v) +// logixNodes[index] = v +// v.connect(andGate.inp[k - misses]) +// } +// } else { +// for (var k = 0; k < combinationalData[i][j].length; k++) { +// if (combinationalData[i][j][k] == '-') continue +// var index = 2 * k + (combinationalData[i][j][k] == 0) +// var andGateSubstituteNode = new Node( +// andPosX, +// currentPosY, +// 2, +// scope.root +// ) +// var v = new Node( +// logixNodes[index].absX(), +// andGateSubstituteNode.absY(), +// 2, +// scope.root +// ) +// logixNodes[index].connect(v) +// logixNodes[index] = v +// v.connect(andGateSubstituteNode) +// andGateNodes.push(andGateSubstituteNode) +// } +// } +// currentPosY += c * 10 + 30 +// } + +// var andGateCount = andGateNodes.length +// var midWay = Math.floor(andGateCount / 2) +// var orGatePosY = +// (andGateNodes[midWay].absY() + +// andGateNodes[Math.floor((andGateCount - 1) / 2)].absY()) / +// 2 +// if (orGatePosY % 10 == 5) { +// orGatePosY += 5 +// } // To make or gate fall in grid +// if (andGateCount > 1) { +// var o = new OrGate( +// orPosX, +// orGatePosY, +// scope, +// 'RIGHT', +// andGateCount, +// 1 +// ) +// if (andGateCount % 2 == 1) +// andGateNodes[midWay].connect(o.inp[midWay]) +// for (var j = 0; j < midWay; j++) { +// var v = new Node( +// andPosX + 30 + (midWay - j) * 10, +// andGateNodes[j].absY(), +// 2, +// scope.root +// ) +// v.connect(andGateNodes[j]) +// var v2 = new Node( +// andPosX + 30 + (midWay - j) * 10, +// o.inp[j].absY(), +// 2, +// scope.root +// ) +// v2.connect(v) +// o.inp[j].connect(v2) + +// var v = new Node( +// andPosX + 30 + (midWay - j) * 10, +// andGateNodes[andGateCount - j - 1].absY(), +// 2, +// scope.root +// ) +// v.connect(andGateNodes[andGateCount - j - 1]) +// var v2 = new Node( +// andPosX + 30 + (midWay - j) * 10, +// o.inp[andGateCount - j - 1].absY(), +// 2, +// scope.root +// ) +// v2.connect(v) +// o.inp[andGateCount - j - 1].connect(v2) +// } +// var out = new Output(outputPosX, o.y, scope, 'LEFT', 1) +// out.inp1.connect(o.output1) +// } else { +// var out = new Output( +// outputPosX, +// andGateNodes[0].absY(), +// scope, +// 'LEFT', +// 1 +// ) +// out.inp1.connect(andGateNodes[0]) +// } +// out.setLabel(outputListNames[i]) +// out.newLabelDirection('RIGHT') +// } +// for (var i = 0; i < logixNodes.length; i++) { +// if (logixNodes[i].absY() != currentPosY) { +// var v = new Node(logixNodes[i].absX(), currentPosY, 2, scope.root) +// logixNodes[i].connect(v) +// } +// } +// globalScope.centerFocus() +// } + +// /** +// * This function solves passed boolean expression and returns +// * output array which contains solution of the truth table +// * of given boolean expression +// * @param {Array} inputListNames - labels for input nodes +// * @param {String} booleanExpression - boolean expression which is to be solved +// */ +// function solveBooleanFunction(inputListNames, booleanExpression) { +// let i +// let j +// let output = [] + +// if ( +// booleanExpression.match( +// /[^ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01+'() ]/g +// ) != null +// ) { +// alert('One of the characters is not allowed.') +// return +// } + +// if (inputListNames.length > 8) { +// alert('You can only have 8 variables at a time.') +// return +// } + +// var s = '' +// s += '' +// s += '' +// if ($('#decimalColumnBox').is(':checked')) { +// s += '' +// } +// for (i = 0; i < inputListNames.length; i++) { +// s += `` +// } +// s += `` +// s += '' +// var matrix = [] +// for (i = 0; i < inputListNames.length; i++) { +// matrix[i] = new Array(inputListNames.length) +// } + +// for (i = 0; i < inputListNames.length; i++) { +// for (j = 0; j < 1 << inputListNames.length; j++) { +// matrix[i][j] = +((j & (1 << (inputListNames.length - i - 1))) != 0) +// } +// } +// // generate equivalent expression by replacing input vars with possible combinations of o and 1 +// for (i = 0; i < 2 ** inputListNames.length; i++) { +// const data = [] +// for (j = 0; j < inputListNames.length; j++) { +// data[j] = +// Math.floor(i / Math.pow(2, inputListNames.length - j - 1)) % 2 +// } +// let equation = booleanExpression +// for (j = 0; j < inputListNames.length; j++) { +// equation = equation.replace( +// new RegExp(inputListNames[j], 'g'), +// data[j] +// ) +// } + +// output[i] = solve(equation) +// } + +// for (j = 0; j < 1 << inputListNames.length; j++) { +// s += '' +// if ($('#decimalColumnBox').is(':checked')) { +// s += `` +// } +// for (i = 0; i < inputListNames.length; i++) { +// s += `` +// } + +// s += `' +// s += '' +// } + +// s += '' +// s += '
' + 'dec' + '${inputListNames[i]}${booleanExpression}
${j}${matrix[i][j]}` + `${output[j]}` + '
' +// // generates solution for the truth table of booleanexpression +// function solve(equation) { +// while (equation.indexOf('(') != -1) { +// const start = equation.lastIndexOf('(') +// const end = equation.indexOf(')', start) +// if (start != -1) { +// equation = +// equation.substring(0, start) + +// solve(equation.substring(start + 1, end)) + +// equation.substring(end + 1) +// } +// } +// equation = equation.replace(/''/g, '') +// equation = equation.replace(/0'/g, '1') +// equation = equation.replace(/1'/g, '0') +// for (let i = 0; i < equation.length - 1; i++) { +// if ( +// (equation[i] == '0' || equation[i] == '1') && +// (equation[i + 1] == '0' || equation[i + 1] == '1') +// ) { +// equation = +// equation.substring(0, i + 1) + +// '*' + +// equation.substring(i + 1, equation.length) +// } +// } +// try { +// const safeEval = eval +// const answer = safeEval(equation) +// if (answer == 0) { +// return 0 +// } +// if (answer > 0) { +// return 1 +// } +// return '' +// } catch (e) { +// return '' +// } +// } + +// return output +// } diff --git a/v0/src/simulator/src/data.js b/v0/src/simulator/src/data.js new file mode 100644 index 00000000..4e573c21 --- /dev/null +++ b/v0/src/simulator/src/data.js @@ -0,0 +1,62 @@ +import { fullView } from './ux' +import { createSubCircuitPrompt } from './subcircuit' +import save from './data/save' +import load from './data/load' +import createSaveAsImgPrompt from './data/saveImage' +import { + clearProject, + newProject, + saveOffline, + openOffline, + recoverProject, +} from './data/project' +import { newCircuit, createNewCircuitScope } from './circuit' +import { createCombinationalAnalysisPrompt } from './combinationalAnalysis' +import { colorThemes } from './themer/themer' +import { showTourGuide } from './tutorials' +import { + createVerilogCircuit, + // saveVerilogCode, + // resetVerilogCode, + // applyVerilogTheme, +} from './Verilog2CV' +import { generateVerilog } from './verilog' +import { bitConverterDialog } from './utils' +import { keyBinder } from '#/components/DialogBox/CustomShortcut.vue' +import { ExportProject } from '#/components/DialogBox/ExportProject.vue' +import { ImportProject } from '#/components/DialogBox/ImportProject.vue' + +const logixFunction = {} +logixFunction.save = save +logixFunction.load = load +logixFunction.createSaveAsImgPrompt = createSaveAsImgPrompt +logixFunction.clearProject = clearProject +logixFunction.newProject = newProject +logixFunction.saveOffline = saveOffline +// logixFunction.newCircuit = newCircuit +logixFunction.createOpenLocalPrompt = openOffline +logixFunction.recoverProject = recoverProject +logixFunction.createSubCircuitPrompt = createSubCircuitPrompt +logixFunction.createCombinationalAnalysisPrompt = + createCombinationalAnalysisPrompt +logixFunction.fullViewOption = fullView +logixFunction.colorThemes = colorThemes +logixFunction.showTourGuide = showTourGuideHelper +logixFunction.newVerilogModule = createVerilogCircuit +// logixFunction.saveVerilogCode = saveVerilogCode +// logixFunction.resetVerilogCode = resetVerilogCode +logixFunction.generateVerilog = generateVerilog +// logixFunction.applyVerilogTheme = applyVerilogTheme +logixFunction.bitconverter = bitConverterDialog +logixFunction.createNewCircuitScope = createNewCircuitScope +logixFunction.customShortcut = keyBinder +logixFunction.ExportProject = ExportProject +logixFunction.ImportProject = ImportProject +export default logixFunction + +// Hack to restart tour guide +function showTourGuideHelper() { + setTimeout(() => { + showTourGuide() + }, 100) +} diff --git a/v0/src/simulator/src/data/backupCircuit.js b/v0/src/simulator/src/data/backupCircuit.js new file mode 100644 index 00000000..c17a93c3 --- /dev/null +++ b/v0/src/simulator/src/data/backupCircuit.js @@ -0,0 +1,83 @@ +import { projectSavedSet } from './project' +/* eslint-disable no-param-reassign */ +function extract(obj) { + return obj.saveObject() +} + +// Check if there is anything to backup - to be deprecated +/** + * Check if backup is available + * @param {Scope} scope + * @return {boolean} + * @category data + */ +export function checkIfBackup(scope) { + for (let i = 0; i < updateOrder.length; i++) { + if (scope[updateOrder[i]].length) return true + } + return false +} + +export function backUp(scope = globalScope) { + // Disconnection of subcircuits are needed because these are the connections between nodes + // in current scope and those in the subcircuit's scope + for (let i = 0; i < scope.SubCircuit.length; i++) { + scope.SubCircuit[i].removeConnections() + } + + var data = {} + + // Storing layout + data.layout = scope.layout + + // Storing Verilog Properties + data.verilogMetadata = scope.verilogMetadata + + // Storing all nodes + data.allNodes = scope.allNodes.map(extract) + + // Storing test attached to scope + data.testbenchData = scope.testbenchData + + // Storing other details + data.id = scope.id + data.name = scope.name + + // Storing details of all module objects + for (let i = 0; i < moduleList.length; i++) { + if (scope[moduleList[i]].length) { + data[moduleList[i]] = scope[moduleList[i]].map(extract) + } + } + + // Adding restricted circuit elements used in the save data + data.restrictedCircuitElementsUsed = scope.restrictedCircuitElementsUsed + + // Storing intermediate nodes (nodes in wires) + data.nodes = [] + for (let i = 0; i < scope.nodes.length; i++) { + data.nodes.push(scope.allNodes.indexOf(scope.nodes[i])) + } + + // Restoring the connections + for (let i = 0; i < scope.SubCircuit.length; i++) { + scope.SubCircuit[i].makeConnections() + } + + return data +} + +export function scheduleBackup(scope = globalScope) { + var backup = JSON.stringify(backUp(scope)) + if ( + scope.backups.length === 0 || + scope.backups[scope.backups.length - 1] !== backup + ) { + scope.backups.push(backup) + scope.history = [] + scope.timeStamp = new Date().getTime() + projectSavedSet(false) + } + + return backup +} diff --git a/v0/src/simulator/src/data/load.js b/v0/src/simulator/src/data/load.js new file mode 100644 index 00000000..f9d7b89b --- /dev/null +++ b/v0/src/simulator/src/data/load.js @@ -0,0 +1,294 @@ +import { resetScopeList, newCircuit, switchCircuit } from '../circuit' +import { setProjectName } from './save' +import { + scheduleUpdate, + update, + updateSimulationSet, + updateCanvasSet, + gridUpdateSet, +} from '../engine' +import { updateRestrictedElementsInScope } from '../restrictedElementDiv' +import simulationArea from '../simulationArea' + +import { loadSubCircuit } from '../subcircuit' +import { scheduleBackup } from './backupCircuit' +import { showProperties } from '../ux' +import { constructNodeConnections, loadNode, replace } from '../node' +import { generateId } from '../utils' +import modules from '../modules' +import { oppositeDirection } from '../canvasApi' +import plotArea from '../plotArea' +import { updateTestbenchUI, TestbenchData } from '../testbench' +import { SimulatorStore } from '#/store/SimulatorStore/SimulatorStore' +import { toRefs } from 'vue' +/** + * Backward compatibility - needs to be deprecated + * @param {CircuitElement} obj - the object to be rectified + * @category data + */ +function rectifyObjectType(obj) { + const rectify = { + FlipFlop: 'DflipFlop', + Ram: 'Rom', + } + return rectify[obj] || obj +} + +/** + * Function to load CircuitElements + * @param {JSON} data - JSOn data + * @param {Scope} scope - circuit in which we want to load modules + * @category data + */ +function loadModule(data, scope) { + // Create circuit element + var obj = new modules[rectifyObjectType(data.objectType)]( + data.x, + data.y, + scope, + ...(data.customData.constructorParamaters || []) + ) + // Sets directions + obj.label = data.label + obj.labelDirection = + data.labelDirection || oppositeDirection[fixDirection[obj.direction]] + + // Sets delay + obj.propagationDelay = data.propagationDelay || obj.propagationDelay + obj.fixDirection() + + // Restore other values + if (data.customData.values) { + for (var prop in data.customData.values) { + obj[prop] = data.customData.values[prop] + } + } + + // Replace new nodes with the correct old nodes (with connections) + if (data.customData.nodes) { + for (const node in data.customData.nodes) { + const n = data.customData.nodes[node] + if (n instanceof Array) { + for (let i = 0; i < n.length; i++) { + obj[node][i] = replace(obj[node][i], n[i]) + } + } else { + obj[node] = replace(obj[node], n) + } + } + } + if (data.subcircuitMetadata) + obj.subcircuitMetadata = data['subcircuitMetadata'] +} + +/** + * This function shouldn't ideally exist. But temporary fix + * for some issues while loading nodes. + * @category data + */ +function removeBugNodes(scope = globalScope) { + let x = scope.allNodes.length + for (let i = 0; i < x; i++) { + if ( + scope.allNodes[i].type !== 2 && + scope.allNodes[i].parent.objectType === 'CircuitElement' + ) { + scope.allNodes[i].delete() + } + if (scope.allNodes.length !== x) { + i = 0 + x = scope.allNodes.length + } + } +} + +/** + * Function to load a full circuit + * @param {Scope} scope + * @param {JSON} data + * @category data + */ +export function loadScope(scope, data) { + const ML = moduleList.slice() // Module List copy + scope.restrictedCircuitElementsUsed = data.restrictedCircuitElementsUsed + + // Load all nodes + data.allNodes.map((x) => loadNode(x, scope)) + + // Make all connections + for (let i = 0; i < data.allNodes.length; i++) { + constructNodeConnections(scope.allNodes[i], data.allNodes[i]) + } + // Load all modules + for (let i = 0; i < ML.length; i++) { + if (data[ML[i]]) { + if (ML[i] === 'SubCircuit') { + // Load subcircuits differently + for (let j = 0; j < data[ML[i]].length; j++) { + loadSubCircuit(data[ML[i]][j], scope) + } + } else { + // Load everything else similarly + for (let j = 0; j < data[ML[i]].length; j++) { + loadModule(data[ML[i]][j], scope) + } + } + } + } + // Update wires according + scope.wires.map((x) => { + x.updateData(scope) + }) + removeBugNodes(scope) // To be deprecated + + // If Verilog Circuit Metadata exists, then restore + if (data.verilogMetadata) { + scope.verilogMetadata = data.verilogMetadata + } + + // If Test exists, then restore + if (data.testbenchData) { + globalScope.testbenchData = new TestbenchData( + data.testbenchData.testData, + data.testbenchData.currentGroup, + data.testbenchData.currentCase + ) + } + + // If layout exists, then restore + if (data.layout) { + scope.layout = data.layout + } else { + // Else generate new layout according to how it would have been otherwise (backward compatibility) + scope.layout = {} + scope.layout.width = 100 + scope.layout.height = + Math.max(scope.Input.length, scope.Output.length) * 20 + 20 + scope.layout.title_x = 50 + scope.layout.title_y = 13 + for (let i = 0; i < scope.Input.length; i++) { + scope.Input[i].layoutProperties = { + x: 0, + y: + scope.layout.height / 2 - + scope.Input.length * 10 + + 20 * i + + 10, + id: generateId(), + } + } + for (let i = 0; i < scope.Output.length; i++) { + scope.Output[i].layoutProperties = { + x: scope.layout.width, + y: + scope.layout.height / 2 - + scope.Output.length * 10 + + 20 * i + + 10, + id: generateId(), + } + } + } + // Backward compatibility + if (scope.layout.titleEnabled === undefined) { + scope.layout.titleEnabled = true + } +} + +// Function to load project from data +/** + * loads a saved project + * @param {JSON} data - the json data of the + * @category data + * @exports load + */ +export default function load(data) { + // If project is new and no data is there, then just set project name + const simulatorStore = SimulatorStore() + const { circuit_list } = toRefs(simulatorStore) + + if (!data) { + setProjectName(__projectName) + return + } + + var { projectId } = data + setProjectName(data.name) + + globalScope = undefined + resetScopeList() // Remove default scope + // $('.circuits').remove() // Delete default scope + + // Load all according to the dependency order + for (let i = 0; i < data.scopes.length; i++) { + var isVerilogCircuit = false + var isMainCircuit = false + if (data.scopes[i].verilogMetadata) { + isVerilogCircuit = data.scopes[i].verilogMetadata.isVerilogCircuit + isMainCircuit = data.scopes[i].verilogMetadata.isMainCircuit + } + // Create new circuit + const scope = newCircuit( + data.scopes[i].name || 'Untitled', + data.scopes[i].id, + isVerilogCircuit, + isMainCircuit + ) + + // Load circuit data + loadScope(scope, data.scopes[i]) + + // Focus circuit + globalScope = scope + + // Center circuit + if (embed) { + globalScope.centerFocus(true) + } else { + globalScope.centerFocus(false) + } + + // update and backup circuit once + update(globalScope, true) + + // Updating restricted element list initially on loading + updateRestrictedElementsInScope() + + scheduleBackup() + } + + // Restore clock + simulationArea.changeClockTime(data.timePeriod || 500) + simulationArea.clockEnabled = + data.clockEnabled === undefined ? true : data.clockEnabled + + if (!embed) { + showProperties(simulationArea.lastSelected) + } + + // Reorder tabs according to the saved order + if (data.orderedTabs) { + // var unorderedTabs = $('.circuits').detach() + // var plusButton = $('#tabsBar').children().detach() + // for (const tab of data.orderedTabs) { + // $('#tabsBar').append(unorderedTabs.filter(`#${tab}`)) + // } + // $('#tabsBar').append(plusButton) + circuit_list.value.sort((a, b) => { + return data.orderedTabs.indexOf(String(a.id)) - data.orderedTabs.indexOf(String(b.id)); + }) + } + + // Switch to last focussedCircuit + if (data.focussedCircuit) switchCircuit(String(data.focussedCircuit)) + + // Update the testbench UI + updateTestbenchUI() + + updateSimulationSet(true) + updateCanvasSet(true) + gridUpdateSet(true) + // Reset Timing + if (!embed) plotArea.reset() + scheduleUpdate(1) +} diff --git a/v0/src/simulator/src/data/project.js b/v0/src/simulator/src/data/project.js new file mode 100644 index 00000000..5a88fdd5 --- /dev/null +++ b/v0/src/simulator/src/data/project.js @@ -0,0 +1,175 @@ +/* eslint-disable guard-for-in */ +/* eslint-disable no-bitwise */ +/* eslint-disable import/no-cycle */ +/* eslint-disable no-restricted-globals */ +/* eslint-disable no-alert */ +import { resetScopeList, scopeList, newCircuit } from '../circuit' +import { showMessage, showError, generateId } from '../utils' +import { checkIfBackup } from './backupCircuit' +import { generateSaveData, getProjectName, setProjectName } from './save' +import load from './load' +import { SimulatorStore } from '#/store/SimulatorStore/SimulatorStore' +import { confirmOption } from '#/components/helpers/confirmComponent/ConfirmComponent.vue' + +/** + * Helper function to recover unsaved data + * @category data + */ +export async function recoverProject() { + if (localStorage.getItem('recover')) { + var data = JSON.parse(localStorage.getItem('recover')) + if (await confirmOption(`Would you like to recover: ${data.name}`)) { + load(data) + } + localStorage.removeItem('recover') + } else { + showError('No recover project found') + } +} + +/** + * Prompt to restore from localStorage + * @category data + */ +export function openOffline() { + const simulatorStore = SimulatorStore() + simulatorStore.dialogBox.open_project_dialog = true + /* + $('#openProjectDialog').empty() + const projectList = JSON.parse(localStorage.getItem('projectList')) + let flag = true + for (id in projectList) { + flag = false + $('#openProjectDialog').append( + `` + ) + } + if (flag) + $('#openProjectDialog').append( + '

Looks like no circuit has been saved yet. Create a new one and save it!

' + ) + $('#openProjectDialog').dialog({ + resizable: false, + width: 'auto', + buttons: !flag + ? [ + { + id: 'Open_offline_btn', + text: 'Open Project', + click() { + if (!$('input[name=projectId]:checked').val()) return + load( + JSON.parse( + localStorage.getItem( + $('input[name=projectId]:checked').val() + ) + ) + ) + window.projectId = $( + 'input[name=projectId]:checked' + ).val() + $(this).dialog('close') + }, + }, + ] + : [], + }) + */ +} +/** + * Flag for project saved or not + * @type {boolean} + * @category data + */ +var projectSaved = true +export function projectSavedSet(param) { + projectSaved = param +} + +/** + * Helper function to store to localStorage -- needs to be deprecated/removed + * @category data + */ +export async function saveOffline() { + const data = await generateSaveData() + if (data instanceof Error) return + localStorage.setItem(projectId, data) + const temp = JSON.parse(localStorage.getItem('projectList')) || {} + temp[projectId] = getProjectName() + localStorage.setItem('projectList', JSON.stringify(temp)) + showMessage( + `We have saved your project: ${getProjectName()} in your browser's localStorage` + ) +} + +/** + * Checks if any circuit has unsaved data + * @category data + */ +function checkToSave() { + let saveFlag = false + // eslint-disable-next-line no-restricted-syntax + for (id in scopeList) { + saveFlag |= checkIfBackup(scopeList[id]) + } + return saveFlag +} + +/** + * Prompt user to save data if unsaved + * @category data + */ +window.onbeforeunload = async function () { + if (projectSaved || embed) return + + if (!checkToSave()) return + + alert( + 'You have unsaved changes on this page. Do you want to leave this page and discard your changes or stay on this page?' + ) + // await confirmSingleOption( + // 'You have unsaved changes on this page. Do you want to leave this page and discard your changes or stay on this page?' + // ) + const data = await generateSaveData('Untitled') + localStorage.setItem('recover', await data) + // eslint-disable-next-line consistent-return + return 'Are u sure u want to leave? Any unsaved changes may not be recoverable' +} + +/** + * Function to clear project + * @category data + */ +export async function clearProject() { + if (await confirmOption('Would you like to clear the project?')) { + globalScope = undefined + resetScopeList() + // $('.circuits').remove() + newCircuit('main') + showMessage('Your project is as good as new!') + } +} + +/** + Function used to start a new project while prompting confirmation from the user + * @param {boolean} verify - flag to verify a new project + * @category data + */ +export async function newProject(verify) { + if ( + verify || + projectSaved || + !checkToSave() || + (await confirmOption( + 'What you like to start a new project? Any unsaved changes will be lost.' + )) + ) { + clearProject() + localStorage.removeItem('recover') + window.location = '/simulator' + + setProjectName(undefined) + projectId = generateId() + showMessage('New Project has been created!') + } +} diff --git a/v0/src/simulator/src/data/redo.js b/v0/src/simulator/src/data/redo.js new file mode 100644 index 00000000..bc252a98 --- /dev/null +++ b/v0/src/simulator/src/data/redo.js @@ -0,0 +1,47 @@ +/* eslint-disable import/no-cycle */ +/** + * Function to restore copy from backup + * @param {Scope=} scope - The circuit on which redo is called + * @category data + */ +import { layoutModeGet } from '../layoutMode' +import Scope, { scopeList } from '../circuit' +import { loadScope } from './load' +import { updateRestrictedElementsInScope } from '../restrictedElementDiv' +import { forceResetNodesSet } from '../engine' +/** + * Function called to generate a prompt to save an image + * @param {Scope=} - the circuit in which we want to call redo + * @category data + * @exports redo + */ +export default function redo(scope = globalScope) { + if (layoutModeGet()) return + if (scope.history.length === 0) return + const backupOx = globalScope.ox + const backupOy = globalScope.oy + const backupScale = globalScope.scale + globalScope.ox = 0 + globalScope.oy = 0 + const tempScope = new Scope(scope.name) + loading = true + const redoData = scope.history.pop() + scope.backups.push(redoData) + loadScope(tempScope, JSON.parse(redoData)) + tempScope.backups = scope.backups + tempScope.history = scope.history + tempScope.id = scope.id + tempScope.name = scope.name + tempScope.testbenchData = scope.testbenchData + scopeList[scope.id] = tempScope + globalScope = tempScope + globalScope.ox = backupOx + globalScope.oy = backupOy + globalScope.scale = backupScale + loading = false + forceResetNodesSet(true) + + // Updated restricted elements + updateRestrictedElementsInScope() +} +// for html file diff --git a/v0/src/simulator/src/data/save.js b/v0/src/simulator/src/data/save.js new file mode 100644 index 00000000..3ffb7788 --- /dev/null +++ b/v0/src/simulator/src/data/save.js @@ -0,0 +1,514 @@ +import { scopeList } from '../circuit' +import { resetup } from '../setup' +import { update } from '../engine' +import { stripTags, showMessage } from '../utils' +import { backUp } from './backupCircuit' +import simulationArea from '../simulationArea' +import backgroundArea from '../backgroundArea' +import { findDimensions } from '../canvasApi' +import { projectSavedSet } from './project' +import { colors } from '../themer/themer' +import { layoutModeGet, toggleLayoutMode } from '../layoutMode' +import { verilogModeGet } from '../Verilog2CV' +import domtoimage from 'dom-to-image' +import '../../vendor/canvas2svg' +import { useProjectStore } from '#/store/projectStore' +import { provideProjectName } from '#/components/helpers/promptComponent/PromptComponent.vue' +import { UpdateProjectDetail } from '#/components/helpers/createNewProject/UpdateProjectDetail.vue' +import { confirmOption } from '#/components/helpers/confirmComponent/ConfirmComponent.vue' +import { getToken } from '#/pages/simulatorHandler.vue' + +// var projectName = undefined + +/** + * Function to set the name of project. + * @param {string} name - name for project + * @category data + */ +export function setProjectName(name) { + const projectStore = useProjectStore() + if (name == undefined) { + // $('#projectName').html('Untitled') + return + } + name = stripTags(name) + // projectName = name + // $('#projectName').html(name) + projectStore.setProjectName(name) +} + +/** + * Function to set the name of project. + * @param {string} name - name for project + * @category data + */ +export function getProjectName() { + const projectStore = useProjectStore() + if (projectStore.getProjectNameDefined) + return projectStore.getProjectName.trim() + else return undefined +} +/** + * Helper function to save canvas as image based on image type + * @param {string} name -name of the circuit + * @param {string} imgType - image type ex: png,jpg etc. + * @category data + */ +function downloadAsImg(name, imgType) { + const gh = simulationArea.canvas.toDataURL(`image/${imgType}`) + const anchor = document.createElement('a') + anchor.href = gh + anchor.download = `${name}.${imgType}` + anchor.click() +} + +/** + * Returns the order of tabs in the project + */ +export function getTabsOrder() { + var tabs = document.getElementById('tabsBar').firstChild.children + var order = [] + for (let i = 0; i < tabs.length; i++) { + order.push(tabs[i].id) + } + return order +} + +/** + * Generates JSON of the entire project + * @param {string} name - the name of project + * @return {JSON} + * @category data + */ +export async function generateSaveData(name, setName = true) { + let data = {} + + // Prompts for name, defaults to Untitled + name = getProjectName() || name || (await provideProjectName()) + if (name instanceof Error) { + return new Error('cancel') + // throw 'save has been canceled' + } else if (name == '') { + name = 'Untitled' + } + data.name = stripTags(name) + if (setName) setProjectName(data.name) + + // Save project details + data.timePeriod = simulationArea.timePeriod + data.clockEnabled = simulationArea.clockEnabled + data.projectId = projectId + data.focussedCircuit = globalScope.id + data.orderedTabs = getTabsOrder() + + // Project Circuits, each scope is one circuit + data.scopes = [] + const dependencyList = {} + const completed = {} + // Getting list of dependencies for each circuit + for (id in scopeList) { + dependencyList[id] = scopeList[id].getDependencies() + } + + // Helper function to save Scope + // Recursively saves inner subcircuits first, before saving parent circuits + function saveScope(id) { + if (completed[id]) return + + for (let i = 0; i < dependencyList[id].length; i++) { + // Save inner subcircuits + saveScope(dependencyList[id][i]) + } + + completed[id] = true + update(scopeList[id], true) // For any pending integrity checks on subcircuits + data.scopes.push(backUp(scopeList[id])) + } + + // Save all circuits + for (let id in scopeList) { + saveScope(id) + } + + // convert to text + data = JSON.stringify(data) + return data +} + +// Helper function to download text +function download(filename, text) { + var pom = document.createElement('a') + pom.setAttribute( + 'href', + 'data:text/plain;charset=utf-8,' + encodeURIComponent(text) + ) + pom.setAttribute('download', filename) + + if (document.createEvent) { + var event = document.createEvent('MouseEvents') + event.initEvent('click', true, true) + pom.dispatchEvent(event) + } else { + pom.click() + } +} + +/** + * Function to generate image for the circuit + * @param {string} imgType - ex: png,jpg etc. + * @param {string} view - view type ex: full + * @param {boolean} transparent - tranparent bg or not + * @param {number} resolution - resolution of the image + * @param {boolean=} down - will download if true + * @category data + */ +export function generateImage( + imgType, + view, + transparent, + resolution, + down = true +) { + // Backup all data + const backUpOx = globalScope.ox + const backUpOy = globalScope.oy + const backUpWidth = width + const backUpHeight = height + const backUpScale = globalScope.scale + const backUpContextBackground = backgroundArea.context + const backUpContextSimulation = simulationArea.context + + backgroundArea.context = simulationArea.context + + globalScope.ox *= 1 / backUpScale + globalScope.oy *= 1 / backUpScale + + // If SVG, create SVG context - using canvas2svg here + if (imgType === 'svg') { + simulationArea.context = new C2S(width, height) + resolution = 1 + } else if (imgType !== 'png') { + transparent = false + } + + globalScope.scale = resolution + + const scope = globalScope + + // Focus circuit + var flag = 1 + if (flag) { + if (view === 'full') { + findDimensions() + const minX = simulationArea.minWidth + const minY = simulationArea.minHeight + const maxX = simulationArea.maxWidth + const maxY = simulationArea.maxHeight + width = (maxX - minX + 100) * resolution + height = (maxY - minY + 100) * resolution + + globalScope.ox = (-minX + 50) * resolution + globalScope.oy = (-minY + 50) * resolution + } else { + globalScope.ox *= resolution + globalScope.oy *= resolution + width = (width * resolution) / backUpScale + height = (height * resolution) / backUpScale + } + } + + globalScope.ox = Math.round(globalScope.ox) + globalScope.oy = Math.round(globalScope.oy) + + simulationArea.canvas.width = width + simulationArea.canvas.height = height + backgroundArea.canvas.width = width + backgroundArea.canvas.height = height + + backgroundArea.context = simulationArea.context + + simulationArea.clear() + + // Background + if (!transparent) { + simulationArea.context.fillStyle = colors['canvas_fill'] + simulationArea.context.rect(0, 0, width, height) + simulationArea.context.fill() + } + + // Draw circuits, why is it updateOrder and not renderOrder? + for (let i = 0; i < renderOrder.length; i++) { + for (let j = 0; j < scope[renderOrder[i]].length; j++) { + scope[renderOrder[i]][j].draw() + } + } + + let returnData + // If circuit is to be downloaded, download, other wise return dataURL + if (down) { + if (imgType === 'svg') { + const mySerializedSVG = simulationArea.context.getSerializedSvg() // true here, if you need to convert named to numbered entities. + download(`${globalScope.name}.svg`, mySerializedSVG) + } else { + downloadAsImg(globalScope.name, imgType) + } + } else { + returnData = simulationArea.canvas.toDataURL(`image/${imgType}`) + } + + // Restore everything + width = backUpWidth + height = backUpHeight + simulationArea.canvas.width = width + simulationArea.canvas.height = height + backgroundArea.canvas.width = width + backgroundArea.canvas.height = height + globalScope.scale = backUpScale + backgroundArea.context = backUpContextBackground + simulationArea.context = backUpContextSimulation + globalScope.ox = backUpOx + globalScope.oy = backUpOy + + resetup() + + if (!down) return returnData +} + +async function crop(dataURL, w, h) { + //get empty second canvas + var myCanvas = document.createElement('CANVAS') + myCanvas.width = w + myCanvas.height = h + var myContext = myCanvas.getContext('2d') + var myImage + var img = new Image() + return new Promise(function (resolved, rejected) { + img.src = dataURL + img.onload = () => { + myContext.drawImage(img, 0, 0, w, h, 0, 0, w, h) + myContext.save() + + //create a new data URL + myImage = myCanvas.toDataURL('image/jpeg') + resolved(myImage) + } + }) +} + +/** + * Function that is used to save image for display in the website + * @return {JSON} + * @category data + */ +async function generateImageForOnline() { + // Verilog Mode -> Different logic + // Fix aspect ratio to 1.6 + // Ensure image is approximately 700 x 440 + var ratio = 1.6 + if (verilogModeGet()) { + var node = document.getElementsByClassName('CodeMirror')[0] + // var node = document.getElementsByClassName('CodeMirror')[0]; + var prevHeight = $(node).css('height') + var prevWidth = $(node).css('width') + var baseWidth = 500 + var baseHeight = Math.round(baseWidth / ratio) + $(node).css('height', baseHeight) + $(node).css('width', baseWidth) + + var data = await domtoimage.toJpeg(node) + $(node).css('width', prevWidth) + $(node).css('height', prevHeight) + data = await crop(data, baseWidth, baseHeight) + return data + } + + simulationArea.lastSelected = undefined // Unselect any selections + + // Fix aspect ratio to 1.6 + if (width > height * ratio) { + height = width / ratio + } else { + width = height * 1.6 + } + + // Center circuits + globalScope.centerFocus() + + // Ensure image is approximately 700 x 440 + const resolution = Math.min( + 700 / (simulationArea.maxWidth - simulationArea.minWidth), + 440 / (simulationArea.maxHeight - simulationArea.minHeight) + ) + + data = generateImage('jpeg', 'current', false, resolution, false) + + // Restores Focus + globalScope.centerFocus(false) + return data +} +/** + * Function called when you save acircuit online + * @category data + * @exports save + */ +export default async function save() { + if (layoutModeGet()) toggleLayoutMode() + + projectSavedSet(true) + + const data = await generateSaveData() + if (data instanceof Error) return + $('.loadingIcon').fadeIn() + + const projectName = getProjectName() + var imageData = await generateImageForOnline() + + const headers = { + 'Content-Type': 'application/json', + 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content'), + Authorization: `Token ${getToken('cvt')}`, + } + + if (!window.isUserLoggedIn) { + // user not signed in, save locally temporarily and force user to sign in + localStorage.setItem('recover_login', data) + // Asking user whether they want to login. + if ( + await confirmOption( + 'You have to login to save the project, you will be redirected to the login page.' + ) + ) + window.location.href = '/users/sign_in' + else $('.loadingIcon').fadeOut() + // eslint-disable-next-line camelcase + } else if ([0, undefined, null, '', '0'].includes(window.logixProjectId)) { + // Create new project - this part needs to be improved and optimised + // const form = $('
', { + // action: '/api/v1/simulator/create', + // method: 'post', + // }) + // form.append( + // $('', { + // type: 'hidden', + // name: 'authenticity_token', + // value: $('meta[name="csrf-token"]').attr('content'), + // }) + // ) + // form.append( + // $('', { + // type: 'text', + // name: 'data', + // value: data, + // }) + // ) + // form.append( + // $('', { + // type: 'text', + // name: 'image', + // value: imageData, + // }) + // ) + // form.append( + // $('', { + // type: 'text', + // name: 'name', + // value: projectName, + // }) + // ) + // $('body').append(form) + // form.submit() + + fetch('/api/v1/projects', { + method: 'POST', + headers, + body: JSON.stringify({ + data, + image: imageData, + name: projectName, + }), + }) + .then((response) => { + if (response.ok) { + showMessage( + `We have Created a new project: ${projectName} in our servers.` + ) + $('.loadingIcon').fadeOut() + localStorage.removeItem('recover') + const responseJson = response.json() + responseJson.then((data) => { + UpdateProjectDetail(data) + }) + } + }) + .catch((error) => { + console.error('Error:', error) + }) + } else { + // updates project - this part needs to be improved and optimised + // $.ajax({ + // url: '/api/v1/simulator/update', + // type: 'PATCH', + // contentType: 'application/json', + // beforeSend(xhr) { + // xhr.setRequestHeader( + // 'X-CSRF-Token', + // $('meta[name="csrf-token"]').attr('content') + // ) + // }, + // data: JSON.stringify({ + // data, + // id: logixProjectId, + // image: imageData, + // name: projectName, + // }), + // success(response) { + // showMessage( + // `We have saved your project: ${projectName} in our servers.` + // ) + // $('.loadingIcon').fadeOut() + // localStorage.removeItem('recover') + // }, + // failure(err) { + // showMessage( + // "There was an error, we couldn't save to our servers" + // ) + // $('.loadingIcon').fadeOut() + // }, + // }) + // function getCookie(name) { + // const value = `; ${document.cookie}`; + // const parts = value.split(`; ${name}=`); + // if (parts.length === 2) return parts.pop().split(';').shift(); + // } + + fetch('/api/v1/projects/update_circuit', { + method: 'PATCH', + headers, + body: JSON.stringify({ + data, + id: window.logixProjectId, + image: imageData, + name: projectName, + }), + }) + .then((response) => { + if (response.ok) { + showMessage( + `We have saved your project: ${projectName} in our servers.` + ) + localStorage.removeItem('recover') + } else { + showMessage( + "There was an error, we couldn't save to our servers" + ) + } + $('.loadingIcon').fadeOut() + }) + .catch((error) => { + console.error('Error:', error) + }) + } + + // Restore everything + resetup() +} diff --git a/v0/src/simulator/src/data/saveImage.js b/v0/src/simulator/src/data/saveImage.js new file mode 100644 index 00000000..8e2b813d --- /dev/null +++ b/v0/src/simulator/src/data/saveImage.js @@ -0,0 +1,18 @@ +/** + * Helper function to show prompt to save image + * Options - resolution, image type, view + * @param {Scope=} scope - useless though + * @category data + */ +import { SimulatorStore } from '#/store/SimulatorStore/SimulatorStore' + +/** + * Function called to generate a prompt to save an image + * @category data + * @param {Scope=} - circuit whose image we want + * @exports createSaveAsImgPrompt + */ +export default function createSaveAsImgPrompt(scope = globalScope) { + const simulatorStore = SimulatorStore() + simulatorStore.dialogBox.saveimage_dialog = true +} diff --git a/v0/src/simulator/src/data/undo.js b/v0/src/simulator/src/data/undo.js new file mode 100644 index 00000000..67f22005 --- /dev/null +++ b/v0/src/simulator/src/data/undo.js @@ -0,0 +1,51 @@ +/* eslint-disable import/no-cycle */ +/** + * Function to restore copy from backup + * @param {Scope=} scope - The circuit on which undo is called + * @category data + */ +import { layoutModeGet } from '../layoutMode' +import Scope, { scopeList } from '../circuit' +import { loadScope } from './load' +import { updateRestrictedElementsInScope } from '../restrictedElementDiv' +import { forceResetNodesSet } from '../engine' +/** + * Function called to generate a prompt to save an image + * @param {Scope=} - the circuit in which we want to call undo + * @category data + * @exports undo + */ +export default function undo(scope = globalScope) { + if (layoutModeGet()) return + if (scope.backups.length < 2) return + const backupOx = globalScope.ox + const backupOy = globalScope.oy + const backupScale = globalScope.scale + globalScope.ox = 0 + globalScope.oy = 0 + const tempScope = new Scope(scope.name) + loading = true + const undoData = scope.backups.pop() + scope.history.push(undoData) + scope.backups.length !== 0 && + loadScope( + tempScope, + JSON.parse(scope.backups[scope.backups.length - 1]) + ) + tempScope.backups = scope.backups + tempScope.history = scope.history + tempScope.id = scope.id + tempScope.name = scope.name + tempScope.testbenchData = scope.testbenchData + scopeList[scope.id] = tempScope + globalScope = tempScope + globalScope.ox = backupOx + globalScope.oy = backupOy + globalScope.scale = backupScale + loading = false + forceResetNodesSet(true) + + // Updated restricted elements + updateRestrictedElementsInScope() +} +// for html file diff --git a/v0/src/simulator/src/doc/Circuit2Verilog documentation.md b/v0/src/simulator/src/doc/Circuit2Verilog documentation.md new file mode 100644 index 00000000..42d6b89d --- /dev/null +++ b/v0/src/simulator/src/doc/Circuit2Verilog documentation.md @@ -0,0 +1,70 @@ +## Circuit2Verilog Module + +**Primary Contributors:** + +1. James H - J Yeh, Ph.D. +2. Satvik Ramaprasad + +## Introduction + +This is an experimental module that generates Verilog netlist (structural +Verilog) given the circuit. Currently, the module generates fully functional +Verilog code for basic circuits. For a complex circuit, additional (manual) work +may need to be done in order to make it work. We are continuously improving this +module to work with more and more complex circuits. + +# Algorithm + +The basic algorithm is fairly straightforward. We have the circuit graph in +memory. We just need to convert this graph into Verilog netlist. It is done by +performing a DFS on the circuit graph. The DFS involves the following steps + +1. Creating Verilog wires as and when required +2. Connecting Verilog wires in element instantiations + +## Some background information + +The different sub-circuits form a DAG (Directed Acyclic Graph) or dependency +graph. Each sub-circuit itself (called scope internally) is actually a (cyclic) +graph on its own. Therefore the Verilog generation is done in a 2 step DFS +approach. The first DFS is performed on the dependency graph. The second DFS is +done on an individual sub-circuit (scope). + +## Code/Algorithm workflow + +1. `exportVerilog()` - entry point +2. `exportVerilogScope()` - DFS(1) on Sub Circuits Dependency Graph + 1. Set Verilog Labels for all elements + 2. `generateHeader()` - Generates Module Header + 3. `generateOutputList()` - Output Output List + 4. `generateInputList()` - Generates Input List + 5. `processGraph()` - DFS(2) on individual subcircuit/scope + 1. DFS starts from inputs + 2. Calls `processVerilog()` on all circuit elements (graph nodes) - resolves label names and adds neighbors to DFS stack. + 3. Calls `generateVerilog()` on all circuit elements to get the final Verilog. + 6. Generate Wire initializations + +## Functions + +**Verilog Module Functions:** + +1. `verilog.exportVerilog()` - Entry point +1. `verilog.exportVerilogScope()` - Recursive DFS function on subcircuit graph +1. `verilog.processGraph()` - Iterative DFS function on subcircuit scope +1. `verilog.resetLabels()` - Resets labels in scope +1. `verilog.setLabels()` - Sets labels in scope +1. `verilog.generateHeader()` - Generates Verilog Module Header +1. `verilog.generateInputList()` - Generates Verilog Module Input List +1. `verilog.generateOutputList()` - Generates Verilog Module Output List +1. `sanitizeLabel()` - Sanitizes label for node/wire +1. `verilog.generateNodeName()` - Helper function to resolve node/wire name + +**CircuitElement Functions:** + +These functions can be overridden by derived classes. + +1. `CircuitElement.prototype.processVerilog()` - Graph algorithm to resolve Verilog wire labels +1. `CircuitElement.prototype.verilogName()` - Generate Verilog name +1. `CircuitElement.prototype.generateVerilog()` - Generate final Verilog code +1. `CircuitElement.prototype.verilogType` - Verilog type name +1. `CircuitElement.moduleVerilog` - Custom module Verilog for elements diff --git a/v0/src/simulator/src/doc/images/CircuitVerse Timing Diagram Size Spec.svg b/v0/src/simulator/src/doc/images/CircuitVerse Timing Diagram Size Spec.svg new file mode 100644 index 00000000..d92c7cda --- /dev/null +++ b/v0/src/simulator/src/doc/images/CircuitVerse Timing Diagram Size Spec.svg @@ -0,0 +1,3 @@ + + +
TimeLine
TimeLi...
timeLineHeight
time...
padding
padd...
padding
padd...
padding
padd...
padding
p...
flagLabelWidth
flagLabelWidth
plotHeight
plot...
plotHeight
plot...
cycleWidth
cycleW...
cycleWidth
cycleWidth
waveFormHeight
wave...
waveFormPadding
wave...
waveFormPadding
wave...
plotHeight
plot...
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/v0/src/simulator/src/drag.ts b/v0/src/simulator/src/drag.ts new file mode 100644 index 00000000..2e14abca --- /dev/null +++ b/v0/src/simulator/src/drag.ts @@ -0,0 +1,87 @@ +import interact from 'interactjs' + +interface Position { + x: number + y: number +} + +function updatePosition( + element: HTMLElement, + dx: number, + dy: number, + positions: WeakMap +): void { + if (!element) return // Check if the element is valid + + // If the element does not exist in the positions WeakMap, create it + if (!positions.has(element)) { + positions.set(element, { x: 0, y: 0 }) + } + + // Update the element's x and y position + const currentPosition = positions.get(element) + if (!currentPosition) return // Check if the currentPosition is valid + currentPosition.x += dx + currentPosition.y += dy + + // Apply the new position to the element using the CSS transform property + element.style.transform = `translate(${currentPosition.x}px, ${currentPosition.y}px)` +} + +function disableSelection(element: HTMLElement): void { + element.setAttribute('unselectable', 'on') + element.style.userSelect = 'none' + element.style.webkitUserSelect = 'none' + element.style.MozUserSelect = 'none' + element.style.msUserSelect = 'none' + element.style.OUserSelect = 'none' + element.onselectstart = () => false +} + +/** + * Make an element draggable within a specified container. + * @param {HTMLElement} targetEl - Element that triggers the drag event. + * @param {HTMLElement} DragEl - Element to be dragged. + */ +export function dragging(targetEl: HTMLElement, DragEl: HTMLElement): void { + // WeakMap to store the position of each dragged element + const positions = new WeakMap() + + // Initialize the interact.js library with the draggable element selector + interact(DragEl).draggable({ + // Specify the element that triggers the drag event + allowFrom: targetEl, + // Set up event listeners for the draggable element + listeners: { + // Update the element's position when the move event is triggered + move(event) { + updatePosition( + event.target as HTMLElement, + event.dx, + event.dy, + positions + ) + }, + }, + // Set up modifiers to apply constraints to the draggable element + modifiers: [ + interact.modifiers.restrictRect({ + // Restrict the draggable element within its parent container + restriction: 'body', + }), + ], + }) + + $(DragEl).on('mousedown', () => { + $(`.draggable-panel:not(${DragEl})`).css('z-index', '99') + $(DragEl).css('z-index', '99') + }) + + let panelElements = document.querySelectorAll( + '.elementPanel, .layoutElementPanel, #moduleProperty, #layoutDialog, #verilogEditorPanel, .timing-diagram-panel, .testbench-manual-panel, .quick-btn' + ) + + panelElements.forEach((element) => { + disableSelection(element as HTMLElement) + }) +} diff --git a/v0/src/simulator/src/embed.js b/v0/src/simulator/src/embed.js new file mode 100644 index 00000000..b17e82ba --- /dev/null +++ b/v0/src/simulator/src/embed.js @@ -0,0 +1,132 @@ +// /* eslint-disable import/no-cycle */ +// // Helper functions for when circuit is embedded +// import { scopeList, circuitProperty } from './circuit' +// import simulationArea from './simulationArea' +// import { +// scheduleUpdate, +// wireToBeCheckedSet, +// updateCanvasSet, +// gridUpdateSet, +// } from './engine' +// import { prevPropertyObjGet, prevPropertyObjSet } from './ux' +// import { ZoomIn, ZoomOut } from './listeners' + +// // circuitProperty.toggleFullScreen = toggleFullScreen; +// $(document).ready(() => { +// // Clock features +// $('#clockProperty').append( +// " " +// ) +// $('#clockProperty').append( +// `
Time:
` +// ) +// $('#clockProperty').append( +// `
Clock:
` +// ) + +// // Following codes need to be removed +// $('.objectPropertyAttributeEmbed').on( +// 'change keyup paste click', +// function () { +// scheduleUpdate() +// updateCanvasSet(true) +// wireToBeCheckedSet(1) +// if ( +// simulationArea.lastSelected && +// simulationArea.lastSelected[this.name] +// ) { +// prevPropertyObjSet( +// simulationArea.lastSelected[this.name](this.value) +// ) || prevPropertyObjGet() +// } else { +// circuitProperty[this.name](this.value) +// } +// } +// ) + +// // Following codes need to be removed +// $('.objectPropertyAttributeEmbedChecked').on( +// 'change keyup paste click', +// function () { +// scheduleUpdate() +// updateCanvasSet(true) +// wireToBeCheckedSet(1) +// if ( +// simulationArea.lastSelected && +// simulationArea.lastSelected[this.name] +// ) { +// prevPropertyObjSet( +// simulationArea.lastSelected[this.name](this.value) +// ) || prevPropertyObjGet() +// } else { +// circuitProperty[this.name](this.checked) +// } +// } +// ) + +// $('#zoom-in-embed').on('click', () => ZoomIn()) + +// $('#zoom-out-embed').on('click', () => ZoomOut()) +// }) + +// // Full screen toggle helper function +// function toggleFullScreen(value) { +// if (!getfullscreenelement()) { +// GoInFullscreen(document.documentElement) +// } else { +// GoOutFullscreen() +// } +// } +// // Center focus accordingly +// function exitHandler() { +// setTimeout(() => { +// Object.keys(scopeList).forEach((id) => { +// scopeList[id].centerFocus(true) +// }) +// gridUpdateSet(true) +// scheduleUpdate() +// }, 100) +// } + +// function GoInFullscreen(element) { +// if (element.requestFullscreen) { +// element.requestFullscreen() +// } else if (element.mozRequestFullScreen) { +// element.mozRequestFullScreen() +// } else if (element.webkitRequestFullscreen) { +// element.webkitRequestFullscreen() +// } else if (element.msRequestFullscreen) { +// element.msRequestFullscreen() +// } +// } + +// function GoOutFullscreen() { +// if (document.exitFullscreen) { +// document.exitFullscreen() +// } else if (document.mozCancelFullScreen) { +// document.mozCancelFullScreen() +// } else if (document.webkitExitFullscreen) { +// document.webkitExitFullscreen() +// } else if (document.msExitFullscreen) { +// document.msExitFullscreen() +// } +// } + +// function getfullscreenelement() { +// return ( +// document.fullscreenElement || +// document.webkitFullscreenElement || +// document.mozFullScreenElement || +// document.msFullscreenElement +// ) +// } + +// // Full screen Listeners +// if (document.addEventListener) { +// document.addEventListener('webkitfullscreenchange', exitHandler, false) +// document.addEventListener('mozfullscreenchange', exitHandler, false) +// document.addEventListener('fullscreenchange', exitHandler, false) +// document.addEventListener('MSFullscreenChange', exitHandler, false) +// } diff --git a/v0/src/simulator/src/embedListeners.js b/v0/src/simulator/src/embedListeners.js new file mode 100644 index 00000000..e7cb2d0a --- /dev/null +++ b/v0/src/simulator/src/embedListeners.js @@ -0,0 +1,259 @@ +/* eslint-disable import/no-cycle */ +// Listeners when circuit is embedded +// Refer listeners.js +import simulationArea from './simulationArea' +import { + scheduleUpdate, + update, + updateSelectionsAndPane, + wireToBeCheckedSet, + updatePositionSet, + updateSimulationSet, + updateCanvasSet, + gridUpdateSet, + errorDetectedSet, +} from './engine' +import { changeScale } from './canvasApi' +import { copy, paste } from './events' +import { ZoomIn, ZoomOut } from './listeners' + +var unit = 10 + +export default function startListeners() { + window.addEventListener('keyup', (e) => { + scheduleUpdate(1) + if (e.keyCode == 16) { + simulationArea.shiftDown = false + } + if (e.key == 'Meta' || e.key == 'Control') { + simulationArea.controlDown = false + } + }) + + document + .getElementById('simulationArea') + .addEventListener('mousedown', (e) => { + errorDetectedSet(false) + updateSimulationSet(true) + updatePositionSet(true) + updateCanvasSet(true) + + simulationArea.lastSelected = undefined + simulationArea.selected = false + simulationArea.hover = undefined + var rect = simulationArea.canvas.getBoundingClientRect() + simulationArea.mouseDownRawX = (e.clientX - rect.left) * DPR + simulationArea.mouseDownRawY = (e.clientY - rect.top) * DPR + simulationArea.mouseDownX = + Math.round( + (simulationArea.mouseDownRawX - globalScope.ox) / + globalScope.scale / + unit + ) * unit + simulationArea.mouseDownY = + Math.round( + (simulationArea.mouseDownRawY - globalScope.oy) / + globalScope.scale / + unit + ) * unit + simulationArea.mouseDown = true + simulationArea.oldx = globalScope.ox + simulationArea.oldy = globalScope.oy + + e.preventDefault() + scheduleUpdate(1) + }) + + document + .getElementById('simulationArea') + .addEventListener('mousemove', () => { + var ele = document.getElementById('elementName') + if (globalScope && simulationArea && simulationArea.objectList) { + var { objectList } = simulationArea + objectList = objectList.filter((val) => val !== 'wires') + + for (var i = 0; i < objectList.length; i++) { + for ( + var j = 0; + j < globalScope[objectList[i]].length; + j++ + ) { + if (globalScope[objectList[i]][j].isHover()) { + ele.style.display = 'block' + if (objectList[i] === 'SubCircuit') { + ele.innerHTML = `Subcircuit: ${globalScope.SubCircuit[j].data.name}` + } else { + ele.innerHTML = `CircuitElement: ${objectList[i]}` + } + return + } + } + } + } + + ele.style.display = 'none' + document.getElementById('elementName').innerHTML = '' + }) + + window.addEventListener('mousemove', (e) => { + var rect = simulationArea.canvas.getBoundingClientRect() + simulationArea.mouseRawX = (e.clientX - rect.left) * DPR + simulationArea.mouseRawY = (e.clientY - rect.top) * DPR + simulationArea.mouseXf = + (simulationArea.mouseRawX - globalScope.ox) / globalScope.scale + simulationArea.mouseYf = + (simulationArea.mouseRawY - globalScope.oy) / globalScope.scale + simulationArea.mouseX = Math.round(simulationArea.mouseXf / unit) * unit + simulationArea.mouseY = Math.round(simulationArea.mouseYf / unit) * unit + + updateCanvasSet(true) + if (simulationArea.lastSelected == globalScope.root) { + updateCanvasSet(true) + var fn + fn = function () { + updateSelectionsAndPane() + } + scheduleUpdate(0, 20, fn) + } else { + scheduleUpdate(0, 200) + } + }) + window.addEventListener('keydown', (e) => { + errorDetectedSet(false) + updateSimulationSet(true) + updatePositionSet(true) + + // zoom in (+) + if (e.key == 'Meta' || e.key == 'Control') { + simulationArea.controlDown = true + } + + if ( + simulationArea.controlDown && + (e.keyCode == 187 || e.KeyCode == 171) + ) { + e.preventDefault() + ZoomIn() + } + + // zoom out (-) + if ( + simulationArea.controlDown && + (e.keyCode == 189 || e.Keycode == 173) + ) { + e.preventDefault() + ZoomOut() + } + + if ( + simulationArea.mouseRawX < 0 || + simulationArea.mouseRawY < 0 || + simulationArea.mouseRawX > width || + simulationArea.mouseRawY > height + ) + return + + scheduleUpdate(1) + updateCanvasSet(true) + + if ( + simulationArea.lastSelected && + simulationArea.lastSelected.keyDown + ) { + if ( + e.key.toString().length == 1 || + e.key.toString() == 'Backspace' + ) { + simulationArea.lastSelected.keyDown(e.key.toString()) + return + } + } + if ( + simulationArea.lastSelected && + simulationArea.lastSelected.keyDown2 + ) { + if (e.key.toString().length == 1) { + simulationArea.lastSelected.keyDown2(e.key.toString()) + return + } + } + + // if (simulationArea.lastSelected && simulationArea.lastSelected.keyDown3) { + // if (e.key.toString() != "Backspace" && e.key.toString() != "Delete") { + // simulationArea.lastSelected.keyDown3(e.key.toString()); + // return; + // } + + // } + + if (e.key == 'T' || e.key == 't') { + simulationArea.changeClockTime(prompt('Enter Time:')) + } + }) + document + .getElementById('simulationArea') + .addEventListener('dblclick', (e) => { + scheduleUpdate(2) + if ( + simulationArea.lastSelected && + simulationArea.lastSelected.dblclick !== undefined + ) { + simulationArea.lastSelected.dblclick() + } + }) + + window.addEventListener('mouseup', (e) => { + simulationArea.mouseDown = false + errorDetectedSet(false) + updateSimulationSet(true) + updatePositionSet(true) + updateCanvasSet(true) + gridUpdateSet(true) + wireToBeCheckedSet(1) + + scheduleUpdate(1) + }) + window.addEventListener('mousedown', function (e) { + this.focus() + }) + + document + .getElementById('simulationArea') + .addEventListener('mousewheel', MouseScroll) + document + .getElementById('simulationArea') + .addEventListener('DOMMouseScroll', MouseScroll) + + function MouseScroll(event) { + updateCanvasSet(true) + + event.preventDefault() + var deltaY = event.wheelDelta ? event.wheelDelta : -event.detail + var scrolledUp = deltaY < 0 + var scrolledDown = deltaY > 0 + + if (event.ctrlKey) { + if (scrolledUp && globalScope.scale > 0.5 * DPR) { + changeScale(-0.1 * DPR) + } + if (scrolledDown && globalScope.scale < 4 * DPR) { + changeScale(0.1 * DPR) + } + } else { + if (scrolledUp && globalScope.scale < 4 * DPR) { + changeScale(0.1 * DPR) + } + if (scrolledDown && globalScope.scale > 0.5 * DPR) { + changeScale(-0.1 * DPR) + } + } + + updateCanvasSet(true) + gridUpdateSet(true) + update() // Schedule update not working, this is INEFFICENT + } +} + +var isIe = + navigator.userAgent.toLowerCase().indexOf('msie') != -1 || + navigator.userAgent.toLowerCase().indexOf('trident') != -1 diff --git a/v0/src/simulator/src/engine.js b/v0/src/simulator/src/engine.js new file mode 100644 index 00000000..2f74df6e --- /dev/null +++ b/v0/src/simulator/src/engine.js @@ -0,0 +1,559 @@ +/* eslint-disable import/no-cycle */ +/* eslint-disable no-use-before-define */ +/* eslint-disable no-continue */ +/* eslint-disable no-param-reassign */ +/* eslint-disable no-bitwise */ +import { layoutModeGet, layoutUpdate } from './layoutMode' +import plotArea from './plotArea' +import simulationArea from './simulationArea' +import { dots, canvasMessage, findDimensions, rect2 } from './canvasApi' +import { showProperties, prevPropertyObjGet } from './ux' +import { showError } from './utils' +import miniMapArea from './minimap' +import { resetup } from './setup' +import { verilogModeGet } from './Verilog2CV' + +/** + * Core of the simulation and rendering algorithm. + */ + +/** + * @type {number} engine + * @category engine + */ +var wireToBeChecked = 0 + +/** + * Used to set wireChecked boolean which updates wires in UI if true (or 1). 2 if some problem and it is handled. + * @param {number} param - value of wirechecked + * @category engine + */ +export function wireToBeCheckedSet(param) { + wireToBeChecked = param +} + +/** + * scheduleUpdate() will be called if true + * @type {boolean} + * @category engine + */ +var willBeUpdated = false + +/** + * used to set willBeUpdated variable + * @type {boolean} + * @category engine + * @category engine + */ +export function willBeUpdatedSet(param) { + willBeUpdated = param +} + +/** + * true if we have an element selected and + * is used when we are paning the grid. + * @type {boolean} + * @category engine + */ +var objectSelection = false + +/** + * used to set the value of object selection, + * @param {boolean} param + * @category engine + */ +export function objectSelectionSet(param) { + objectSelection = param +} + +/** + * Flag for updating position + * @type {boolean} + * @category engine + */ +var updatePosition = true + +/** + * used to set the value of updatePosition. + * @param {boolean} param + * @category engine + */ +export function updatePositionSet(param) { + updatePosition = param +} + +/** + * Flag for updating simulation + * @type {boolean} + * @category engine + */ +var updateSimulation = true + +/** + * used to set the value of updateSimulation. + * @param {boolean} param + * @category engine + */ +export function updateSimulationSet(param) { + updateSimulation = param +} +/** + * Flag for rendering + * @type {boolean} + * @category engine + */ +var updateCanvas = true + +/** + * used to set the value of updateCanvas. + * @param {boolean} param + * @category engine + */ +export function updateCanvasSet(param) { + updateCanvas = param +} + +/** + * Flag for updating grid + * @type {boolean} + * @category engine + */ +var gridUpdate = true + +/** + * used to set gridUpdate + * @param {boolean} param + * @category engine + */ +export function gridUpdateSet(param) { + gridUpdate = param +} + +/** + * used to get gridUpdate + * @return {boolean} + * @category engine + */ +export function gridUpdateGet() { + return gridUpdate +} +/** + * Flag for updating grid + * @type {boolean} + * @category engine + */ +var forceResetNodes = true + +/** + * used to set forceResetNodes + * @param {boolean} param + * @category engine + */ +export function forceResetNodesSet(param) { + forceResetNodes = param +} +/** + * Flag for updating grid + * @type {boolean} + * @category engine + */ +var errorDetected = false + +/** + * used to set errorDetected + * @param {boolean} param + * @category engine + */ +export function errorDetectedSet(param) { + errorDetected = param +} + +/** + * used to set errorDetected + * @returns {boolean} errorDetected + * @category engine + */ +export function errorDetectedGet() { + return errorDetected +} + +/** + * details of where and what canvas message has to be shown. + * @type {Object} + * @property {number} x - x cordinate of message + * @property {number} y - x cordinate of message + * @property {number} string - the message + * @category engine + */ +export var canvasMessageData = { + x: undefined, + y: undefined, + string: undefined, +} + +/** + * Flag for updating subCircuits + * @type {boolean} + * @category engine + */ +var updateSubcircuit = true + +/** + * used to set updateSubcircuit + * @param {boolean} param + * @category engine + */ +export function updateSubcircuitSet(param) { + if (updateSubcircuit != param) { + updateSubcircuit = param + return true + } + updateSubcircuit = param + return false +} + +/** + * turn light mode on + * @param {boolean} val -- new value for light mode + * @category engine + */ +export function changeLightMode(val) { + if (!val && lightMode) { + lightMode = false + DPR = window.devicePixelRatio || 1 + globalScope.scale *= DPR + } else if (val && !lightMode) { + lightMode = true + globalScope.scale /= DPR + DPR = 1 + $('#miniMap').fadeOut('fast') + } + resetup() +} + +/** + * Function to render Canvas according th renderupdate order + * @param {Scope} scope - The circuit whose canvas we want to render + * @category engine + */ +export function renderCanvas(scope) { + if (layoutModeGet() || verilogModeGet()) { + // Different Algorithm + return + } + var ctx = simulationArea.context + // Reset canvas + simulationArea.clear() + // Update Grid + if (gridUpdate) { + gridUpdateSet(false) + dots() + } + canvasMessageData = { + x: undefined, + y: undefined, + string: undefined, + } // Globally set in draw fn () + // Render objects + for (let i = 0; i < renderOrder.length; i++) { + for (var j = 0; j < scope[renderOrder[i]].length; j++) { + scope[renderOrder[i]][j].draw() + } + } + // Show any message + if (canvasMessageData.string !== undefined) { + canvasMessage( + ctx, + canvasMessageData.string, + canvasMessageData.x, + canvasMessageData.y + ) + } + // If multiple object selections are going on, show selected area + if (objectSelection) { + ctx.beginPath() + ctx.lineWidth = 2 + ctx.strokeStyle = 'black' + ctx.fillStyle = 'rgba(0,0,0,0.1)' + rect2( + ctx, + simulationArea.mouseDownX, + simulationArea.mouseDownY, + simulationArea.mouseX - simulationArea.mouseDownX, + simulationArea.mouseY - simulationArea.mouseDownY, + 0, + 0, + 'RIGHT' + ) + ctx.stroke() + ctx.fill() + } + if (simulationArea.hover !== undefined) { + simulationArea.canvas.style.cursor = 'pointer' + } else if (simulationArea.mouseDown) { + simulationArea.canvas.style.cursor = 'grabbing' + } else { + simulationArea.canvas.style.cursor = 'default' + } +} + +/** + * Function to move multiple objects and panes window + * deselected using dblclick right now (PR open for esc key) + * @param {Scope=} scope - the circuit in which we are selecting stuff + * @category engine + */ +export function updateSelectionsAndPane(scope = globalScope) { + if (!simulationArea.selected && simulationArea.mouseDown) { + simulationArea.selected = true + simulationArea.lastSelected = scope.root + simulationArea.hover = scope.root + // Selecting multiple objects + if (simulationArea.shiftDown) { + objectSelectionSet(true) + } else if (!embed) { + findDimensions(scope) + miniMapArea.setup() + $('#miniMap').show() + } + } else if ( + simulationArea.lastSelected === scope.root && + simulationArea.mouseDown + ) { + // pane canvas to give an idea of grid moving + if (!objectSelection) { + globalScope.ox = + simulationArea.mouseRawX - + simulationArea.mouseDownRawX + + simulationArea.oldx + globalScope.oy = + simulationArea.mouseRawY - + simulationArea.mouseDownRawY + + simulationArea.oldy + globalScope.ox = Math.round(globalScope.ox) + globalScope.oy = Math.round(globalScope.oy) + gridUpdateSet(true) + if (!embed && !lightMode) miniMapArea.setup() + } else { + // idea: kind of empty + } + } else if (simulationArea.lastSelected === scope.root) { + /* + Select multiple objects by adding them to the array + simulationArea.multipleObjectSelections when we select + using shift + mouse movement to select an area but + not shift + click + */ + simulationArea.lastSelected = undefined + simulationArea.selected = false + simulationArea.hover = undefined + if (objectSelection) { + objectSelectionSet(false) + var x1 = simulationArea.mouseDownX + var x2 = simulationArea.mouseX + var y1 = simulationArea.mouseDownY + var y2 = simulationArea.mouseY + // Sort those four points to make a selection pane + if (x1 > x2) { + const temp = x1 + x1 = x2 + x2 = temp + } + if (y1 > y2) { + const temp = y1 + y1 = y2 + y2 = temp + } + // Select the objects, push them into a list + for (let i = 0; i < updateOrder.length; i++) { + for (var j = 0; j < scope[updateOrder[i]].length; j++) { + var obj = scope[updateOrder[i]][j] + if (simulationArea.multipleObjectSelections.contains(obj)) + continue + var x + var y + if (obj.objectType === 'Node') { + x = obj.absX() + y = obj.absY() + } else if (obj.objectType !== 'Wire') { + x = obj.x + y = obj.y + } else { + continue + } + if (x > x1 && x < x2 && y > y1 && y < y2) { + simulationArea.multipleObjectSelections.push(obj) + } + } + } + } + } +} + +/** + * Main fn that resolves circuit using event driven simulation + * All inputs are added to a scope using scope.addinput() and + * the simulation starts to play. + * @param {Scope=} scope - the circuit we want to simulate + * @param {boolean} resetNodes - boolean to reset all nodes + * @category engine + */ +export function play(scope = globalScope, resetNodes = false) { + if (errorDetected) return // Don't simulate until error is fixed + if (loading === true) return // Don't simulate until loaded + + simulationArea.simulationQueue.reset() + plotArea.setExecutionTime() // Waveform thing + // Reset Nodes if required + if (resetNodes || forceResetNodes) { + scope.reset() + simulationArea.simulationQueue.reset() + forceResetNodesSet(false) + } + + // To store list of circuitselements that have shown contention but kept temporarily + // Mainly to resolve tristate bus issues + simulationArea.contentionPending = [] + // add inputs to the simulation queue + scope.addInputs() + // to check if we have infinite loop in circuit + let stepCount = 0 + let elem + while (!simulationArea.simulationQueue.isEmpty()) { + if (errorDetected) { + simulationArea.simulationQueue.reset() + return + } + elem = simulationArea.simulationQueue.pop() + elem.resolve() + stepCount++ + if (stepCount > 1000000) { + // Cyclic or infinite Circuit Detection + showError( + 'Simulation Stack limit exceeded: maybe due to cyclic paths or contention' + ) + errorDetectedSet(true) + forceResetNodesSet(true) + } + } + // Check for TriState Contentions + if (simulationArea.contentionPending.length) { + showError('Contention at TriState') + forceResetNodesSet(true) + errorDetectedSet(true) + } +} + +/** + * Function to check for any UI update, it is throttled by time + * @param {number=} count - this is used to force update + * @param {number=} time - the time throttling parameter + * @param {function} fn - function to run before updating UI + * @category engine + */ +export function scheduleUpdate(count = 0, time = 100, fn) { + if (lightMode) time *= 5 + var updateFn = layoutModeGet() ? layoutUpdate : update + if (count) { + // Force update + updateFn() + for (let i = 0; i < count; i++) { + setTimeout(updateFn, 10 + 50 * i) + } + } + if (willBeUpdated) return // Throttling + willBeUpdatedSet(true) + // Call a function before update .. + if (fn) { + setTimeout(() => { + fn() + updateFn() + }, time) + } else setTimeout(updateFn, time) +} + +/** + * fn that calls update on everything else. If any change + * is there, it resolves the circuit and draws it again. + * Also updates simulations, selection, minimap, resolves + * circuit and redraws canvas if required. + * @param {Scope=} scope - the circuit to be updated + * @param {boolean=} updateEverything - if true we update the wires, nodes and modules + * @category engine + */ +export function update(scope = globalScope, updateEverything = false) { + willBeUpdatedSet(false) + if (loading === true || layoutModeGet()) return + var updated = false + simulationArea.hover = undefined + // Update wires + if (wireToBeChecked || updateEverything) { + if (wireToBeChecked === 2) + wireToBeChecked = 0 // this required due to timing issues + else wireToBeChecked++ + // WHY IS THIS REQUIRED ???? we are checking inside wire ALSO + // Idea: we can just call length again instead of doing it during loop. + var prevLength = scope.wires.length + for (let i = 0; i < scope.wires.length; i++) { + scope.wires[i].checkConnections() + if (scope.wires.length !== prevLength) { + prevLength-- + i-- + } + } + scheduleUpdate() + } + // Update subcircuits + if (updateSubcircuit || updateEverything) { + for (let i = 0; i < scope.SubCircuit.length; i++) { + scope.SubCircuit[i].reset() + } + updateSubcircuitSet(false) + } + // Update UI position + if (updatePosition || updateEverything) { + for (let i = 0; i < updateOrder.length; i++) { + for (let j = 0; j < scope[updateOrder[i]].length; j++) { + updated |= scope[updateOrder[i]][j].update() + } + } + } + // Updates multiple objectselections and panes window + if (updatePosition || updateEverything) { + updateSelectionsAndPane(scope) + } + // Update MiniMap + if ( + !embed && + simulationArea.mouseDown && + simulationArea.lastSelected && + simulationArea.lastSelected !== globalScope.root + ) { + if (!lightMode) { + $('#miniMap').fadeOut('fast') + } + } + // Run simulation + if (updateSimulation) { + play() + } + // Show properties of selected element + if (!embed && prevPropertyObjGet() !== simulationArea.lastSelected) { + if ( + simulationArea.lastSelected && + simulationArea.lastSelected.objectType !== 'Wire' + ) { + // ideas: why show properties of project in Nodes but not wires? + showProperties(simulationArea.lastSelected) + } else { + // hideProperties(); + } + } + // Draw, render everything + if (updateCanvas) { + renderCanvas(scope) + } + updateSimulationSet(false) + updateCanvas = false + updatePositionSet(false) +} diff --git a/v0/src/simulator/src/eventQueue.js b/v0/src/simulator/src/eventQueue.js new file mode 100644 index 00000000..f40110e1 --- /dev/null +++ b/v0/src/simulator/src/eventQueue.js @@ -0,0 +1,116 @@ +/** + * Event Queue is simply a priority Queue, basic implementation O(n^2). + * @category eventQueue + */ +export default class EventQueue { + constructor(size) { + this.size = size + this.queue = new Array(size) + this.frontIndex = 0 + this.time = 0 + } + + /** + * @param {CircuitElement} obj - the elemnt to be added + * @param {number} delay - the delay in adding an object to queue + */ + add(obj, delay) { + if (obj.queueProperties.inQueue) { + obj.queueProperties.time = + this.time + (delay || obj.propagationDelay) + let i = obj.queueProperties.index + while ( + i > 0 && + obj.queueProperties.time > + this.queue[i - 1].queueProperties.time + ) { + this.swap(i, i - 1) + i-- + } + i = obj.queueProperties.index + while ( + i < this.frontIndex - 1 && + obj.queueProperties.time < + this.queue[i + 1].queueProperties.time + ) { + this.swap(i, i + 1) + i++ + } + return + } + + if (this.frontIndex == this.size) throw 'EventQueue size exceeded' + this.queue[this.frontIndex] = obj + // obj.queueProperties.time=obj.propagationDelay; + obj.queueProperties.time = this.time + (delay || obj.propagationDelay) + obj.queueProperties.index = this.frontIndex + this.frontIndex++ + obj.queueProperties.inQueue = true + let i = obj.queueProperties.index + while ( + i > 0 && + obj.queueProperties.time > this.queue[i - 1].queueProperties.time + ) { + this.swap(i, i - 1) + i-- + } + } + + /** + * To add without any delay. + * @param {CircuitElement} obj - the object to be added + */ + addImmediate(obj) { + this.queue[this.frontIndex] = obj + obj.queueProperties.time = this.time + obj.queueProperties.index = this.frontIndex + obj.queueProperties.inQueue = true + this.frontIndex++ + } + + /** + * Function to swap two objects in queue. + * @param {number} v1 + * @param {number} v2 + */ + swap(v1, v2) { + const obj1 = this.queue[v1] + obj1.queueProperties.index = v2 + + const obj2 = this.queue[v2] + obj2.queueProperties.index = v1 + + this.queue[v1] = obj2 + this.queue[v2] = obj1 + } + + /** + * function to pop element from queue. + */ + pop() { + if (this.isEmpty()) throw 'Queue Empty' + + this.frontIndex-- + const obj = this.queue[this.frontIndex] + this.time = obj.queueProperties.time + obj.queueProperties.inQueue = false + return obj + } + + /** + * function to reset queue. + */ + reset() { + for (let i = 0; i < this.frontIndex; i++) + this.queue[i].queueProperties.inQueue = false + this.time = 0 + this.frontIndex = 0 + } + + /** + * function to check if empty queue. + */ + isEmpty() { + return this.frontIndex == 0 + } +} diff --git a/v0/src/simulator/src/events.js b/v0/src/simulator/src/events.js new file mode 100644 index 00000000..c3c0edca --- /dev/null +++ b/v0/src/simulator/src/events.js @@ -0,0 +1,338 @@ +/* eslint-disable import/no-cycle */ +import Scope, { scopeList, switchCircuit, newCircuit } from './circuit' + +import { loadScope } from './data/load' +import { + scheduleUpdate, + updateSimulationSet, + updateSubcircuitSet, + forceResetNodesSet, +} from './engine' +import { backUp } from './data/backupCircuit' +import { getNextPosition } from './modules' +import { generateId } from './utils' +import simulationArea from './simulationArea' +import { TestbenchData } from './testbench' + +/** + * Helper function to paste + * @param {JSON} copyData - the data to be pasted + * @category events + */ +export function paste(copyData) { + if (copyData === undefined) return + var data = JSON.parse(copyData) + if (!data.logixClipBoardData) return + + var currentScopeId = globalScope.id + for (let i = 0; i < data.scopes.length; i++) { + if (scopeList[data.scopes[i].id] === undefined) { + var isVerilogCircuit = false + var isMainCircuit = false + if (data.scopes[i].verilogMetadata) { + isVerilogCircuit = + data.scopes[i].verilogMetadata.isVerilogCircuit + isMainCircuit = data.scopes[i].verilogMetadata.isMainCircuit + } + var scope = newCircuit( + data.scopes[i].name, + data.scopes[i].id, + isVerilogCircuit, + isMainCircuit + ) + loadScope(scope, data.scopes[i]) + scopeList[data.scopes[i].id] = scope + } + } + + switchCircuit(currentScopeId) + var tempScope = new Scope(globalScope.name, globalScope.id) + var oldOx = globalScope.ox + var oldOy = globalScope.oy + var oldScale = globalScope.scale + loadScope(tempScope, data) + + var prevLength = tempScope.allNodes.length + for (let i = 0; i < tempScope.allNodes.length; i++) { + tempScope.allNodes[i].checkDeleted() + if (tempScope.allNodes.length != prevLength) { + prevLength-- + i-- + } + } + + var approxX = 0 + var approxY = 0 + var count = 0 + + for (let i = 0; i < updateOrder.length; i++) { + for (let j = 0; j < tempScope[updateOrder[i]].length; j++) { + const obj = tempScope[updateOrder[i]][j] + obj.updateScope(globalScope) + if (obj.objectType != 'Wire') { + approxX += obj.x + approxY += obj.y + count++ + } + } + } + + for (let j = 0; j < tempScope.CircuitElement.length; j++) { + const obj = tempScope.CircuitElement[j] + obj.updateScope(globalScope) + } + + approxX /= count + approxY /= count + + approxX = Math.round(approxX / 10) * 10 + approxY = Math.round(approxY / 10) * 10 + + for (let i = 0; i < updateOrder.length; i++) { + for (let j = 0; j < tempScope[updateOrder[i]].length; j++) { + const obj = tempScope[updateOrder[i]][j] + if (obj.objectType !== 'Wire') { + obj.x += simulationArea.mouseX - approxX + obj.y += simulationArea.mouseY - approxY + } + } + } + + Object.keys(tempScope).forEach((l) => { + if ( + tempScope[l] instanceof Array && + l !== 'objects' && + l !== 'CircuitElement' + ) { + globalScope[l].extend(tempScope[l]) + } + }) + for (let i = 0; i < tempScope.Input.length; i++) { + tempScope.Input[i].layoutProperties.y = getNextPosition(0, globalScope) + tempScope.Input[i].layoutProperties.id = generateId() + } + for (let i = 0; i < tempScope.Output.length; i++) { + tempScope.Output[i].layoutProperties.x = globalScope.layout.width + tempScope.Output[i].layoutProperties.id = generateId() + tempScope.Output[i].layoutProperties.y = getNextPosition( + globalScope.layout.width, + globalScope + ) + } + var canvasUpdate = true + updateSimulationSet(true) + updateSubcircuitSet(true) + scheduleUpdate() + globalScope.ox = oldOx + globalScope.oy = oldOy + globalScope.scale = oldScale + + forceResetNodesSet(true) +} +/** + * Helper function for cut + * @param {JSON} copyList - The selected elements + * @category events + */ +export function cut(copyList) { + if (copyList.length === 0) return + var tempScope = new Scope(globalScope.name, globalScope.id) + var oldOx = globalScope.ox + var oldOy = globalScope.oy + var oldScale = globalScope.scale + d = backUp(globalScope) + loadScope(tempScope, d) + scopeList[tempScope.id] = tempScope + + for (let i = 0; i < copyList.length; i++) { + const obj = copyList[i] + if (obj.objectType === 'Node') obj.objectType = 'allNodes' + for (let j = 0; j < tempScope[obj.objectType].length; j++) { + if ( + tempScope[obj.objectType][j].x === obj.x && + tempScope[obj.objectType][j].y === obj.y && + (obj.objectType != 'Node' || obj.type === 2) + ) { + tempScope[obj.objectType][j].delete() + break + } + } + } + tempScope.backups = globalScope.backups + for (let i = 0; i < updateOrder.length; i++) { + let prevLength = globalScope[updateOrder[i]].length // LOL length of list will reduce automatically when deletion starts + for (let j = 0; j < globalScope[updateOrder[i]].length; j++) { + const obj = globalScope[updateOrder[i]][j] + if (obj.objectType != 'Wire') { + // }&&obj.objectType!='CircuitElement'){//}&&(obj.objectType!='Node'||obj.type==2)){ + if (!copyList.contains(globalScope[updateOrder[i]][j])) { + globalScope[updateOrder[i]][j].cleanDelete() + } + } + + if (globalScope[updateOrder[i]].length != prevLength) { + prevLength-- + j-- + } + } + } + + var prevLength = globalScope.wires.length + for (let i = 0; i < globalScope.wires.length; i++) { + globalScope.wires[i].checkConnections() + if (globalScope.wires.length != prevLength) { + prevLength-- + i-- + } + } + + updateSimulationSet(true) + + var data = backUp(globalScope) + data.logixClipBoardData = true + var dependencyList = globalScope.getDependencies() + data.dependencies = {} + Object.keys(dependencyList).forEach((dependency) => { + data.dependencies[dependency] = backUp(scopeList[dependency]) + }) + data.logixClipBoardData = true + data = JSON.stringify(data) + + simulationArea.multipleObjectSelections = [] // copyList.slice(); + simulationArea.copyList = [] // copyList.slice(); + var canvasUpdate = true + updateSimulationSet(true) + globalScope = tempScope + scheduleUpdate() + globalScope.ox = oldOx + globalScope.oy = oldOy + globalScope.scale = oldScale + forceResetNodesSet(true) + // eslint-disable-next-line consistent-return + return data +} +/** + * Helper function for copy + * @param {JSON} copyList - The data to copied + * @param {boolean} cutflag - flase if we want to copy + * @category events + */ +export function copy(copyList, cutflag = false) { + if (copyList.length === 0) return + var tempScope = new Scope(globalScope.name, globalScope.id) + var oldOx = globalScope.ox + var oldOy = globalScope.oy + var oldScale = globalScope.scale + var d = backUp(globalScope) + const oldTestbenchData = globalScope.testbenchData + + loadScope(tempScope, d) + scopeList[tempScope.id] = tempScope + + if (cutflag) { + for (let i = 0; i < copyList.length; i++) { + const obj = copyList[i] + if (obj.objectType === 'Node') obj.objectType = 'allNodes' + for (let j = 0; j < tempScope[obj.objectType].length; j++) { + if ( + tempScope[obj.objectType][j].x === obj.x && + tempScope[obj.objectType][j].y === obj.y && + (obj.objectType != 'Node' || obj.type === 2) + ) { + tempScope[obj.objectType][j].delete() + break + } + } + } + } + tempScope.backups = globalScope.backups + for (let i = 0; i < updateOrder.length; i++) { + let prevLength = globalScope[updateOrder[i]].length // LOL length of list will reduce automatically when deletion starts + for (let j = 0; j < globalScope[updateOrder[i]].length; j++) { + const obj = globalScope[updateOrder[i]][j] + if (obj.objectType != 'Wire') { + // }&&obj.objectType!='CircuitElement'){//}&&(obj.objectType!='Node'||obj.type==2)){ + if (!copyList.contains(globalScope[updateOrder[i]][j])) { + globalScope[updateOrder[i]][j].cleanDelete() + } + } + + if (globalScope[updateOrder[i]].length != prevLength) { + prevLength-- + j-- + } + } + } + + var prevLength = globalScope.wires.length + for (let i = 0; i < globalScope.wires.length; i++) { + globalScope.wires[i].checkConnections() + if (globalScope.wires.length != prevLength) { + prevLength-- + i-- + } + } + + updateSimulationSet(true) + + var data = backUp(globalScope) + data.scopes = [] + var dependencyList = {} + var requiredDependencies = globalScope.getDependencies() + var completed = {} + Object.keys(scopeList).forEach((id) => { + dependencyList[id] = scopeList[id].getDependencies() + }) + function saveScope(id) { + if (completed[id]) return + for (let i = 0; i < dependencyList[id].length; i++) { + saveScope(dependencyList[id][i]) + } + completed[id] = true + data.scopes.push(backUp(scopeList[id])) + } + for (let i = 0; i < requiredDependencies.length; i++) { + saveScope(requiredDependencies[i]) + } + data.logixClipBoardData = true + data.testbenchData = undefined // Don't copy testbench data + data = JSON.stringify(data) + simulationArea.multipleObjectSelections = [] // copyList.slice(); + simulationArea.copyList = [] // copyList.slice(); + var canvasUpdate = true + updateSimulationSet(true) + globalScope = tempScope + scheduleUpdate() + globalScope.ox = oldOx + globalScope.oy = oldOy + globalScope.scale = oldScale + // Restore testbench data + if (oldTestbenchData) { + globalScope.testbenchData = new TestbenchData( + oldTestbenchData.testData, + oldTestbenchData.currentGroup, + oldTestbenchData.currentCase + ) + } + + forceResetNodesSet(true) + // needs to be fixed + // eslint-disable-next-line consistent-return + return data +} + +/** + * Function selects all the elements from the scope + * @category events + */ +export function selectAll(scope = globalScope) { + moduleList.forEach((val, _, __) => { + if (scope.hasOwnProperty(val)) { + simulationArea.multipleObjectSelections.push(...scope[val]) + } + }) + + if (scope.nodes) { + simulationArea.multipleObjectSelections.push(...scope.nodes) + } +} diff --git a/v0/src/simulator/src/file/Open.js b/v0/src/simulator/src/file/Open.js new file mode 100644 index 00000000..c371be16 --- /dev/null +++ b/v0/src/simulator/src/file/Open.js @@ -0,0 +1,96 @@ +/* **************************************************************************************************** */ +/* Implemented in ImportProject.vue Kept for reference in case any bugs occur */ +/* TODO: Remove this file after testing */ +/* **************************************************************************************************** */ + +// import load from '../data/load' +// import { generateSaveData } from '../data/save' +// import { escapeHtml } from '../ux' + +// const scopeSchema = [ +// 'layout', +// 'verilogMetadata', +// 'allNodes', +// 'id', +// 'name', +// 'restrictedCircuitElementsUsed', +// 'nodes', +// ] +// const JSONSchema = [ +// 'name', +// 'timePeriod', +// 'clockEnabled', +// 'projectId', +// 'focussedCircuit', +// 'orderedTabs', +// 'scopes', +// ] + +// var circuitData = null +// const GetDialogData = () => +// '

Browse files or Drag & Drop files here
No file chosen!!
' + +// const ImportCircuitFiles = () => { +// $('#ImportCircuitFilesDialog').empty() +// $('#ImportCircuitFilesDialog').append(GetDialogData()) +// $('#ImportCircuitFilesDialog').dialog({ +// resizable: false, +// close() { +// if (circuitData) load(circuitData) +// }, +// buttons: [ +// { +// text: 'Close', +// click() { +// $(this).dialog('close') +// }, +// }, +// ], +// }) +// $('#ImportCircuitFilesDialog').focus() + +// function ValidateData(fileData) { +// try { +// const parsedFileDate = JSON.parse(fileData) +// if ( +// JSON.stringify(Object.keys(parsedFileDate)) !== +// JSON.stringify(JSONSchema) +// ) +// throw new Error('Invalid JSON data') +// parsedFileDate.scopes.forEach((scope) => { +// const keys = Object.keys(scope) // get scope keys +// scopeSchema.forEach((key) => { +// if (!keys.includes(key)) +// throw new Error('Invalid Scope data') +// }) +// }) +// load(parsedFileDate) +// return true +// } catch (error) { +// $('#message').text('Invalid file format') +// return false +// } +// } + +// function receivedText(e) { +// // backUp data +// const backUp = JSON.parse( +// generateSaveData(escapeHtml($('#projectName').text()).trim(), false) +// ) +// const valid = ValidateData(e.target.result) // validate data +// if (!valid) { +// // fallback +// load(backUp) +// } else { +// $('#ImportCircuitFilesDialog').dialog('close') +// } +// } +// $('#CircuitDataFile').on('change', (event) => { +// var File = event.target.files[0] +// var fr = new FileReader() +// fr.onload = receivedText +// fr.readAsText(File) +// }) +// } + +// export default ImportCircuitFiles diff --git a/v0/src/simulator/src/file/SaveAs.js b/v0/src/simulator/src/file/SaveAs.js new file mode 100644 index 00000000..d94696a7 --- /dev/null +++ b/v0/src/simulator/src/file/SaveAs.js @@ -0,0 +1,54 @@ +/* **************************************************************************************************** */ +/* Implemented in ExportProject.vue Kept for reference in case any bugs occur */ +/* TODO: Remove this file after testing */ +/* **************************************************************************************************** */ + +// import { download, generateSaveData } from '../data/save' +// import { escapeHtml } from '../ux' + +// const GetDialogData = () => { +// const fileName = `${$('#projectName').text().trim()}.cv` +// const Input = document.createElement('input') +// Input.type = 'text' +// Input.name = 'fileName' +// Input.setAttribute('placeholder', fileName) +// Input.id = 'filename' +// Input.defaultValue = fileName +// const Label = document.createElement('label') +// Label.setAttribute('for', 'filename') +// Label.textContent = 'File Name' +// const container = document.createElement('div') +// container.appendChild(Label) +// container.appendChild(Input) +// return container +// } + +// /** +// * To Export Circuit Files +// */ +// const ExportCircuitFiles = () => { +// $('#ExportCircuitFilesDialog').empty() +// $('#ExportCircuitFilesDialog').append(GetDialogData()) +// $('#ExportCircuitFilesDialog').dialog({ +// resizable: false, +// buttons: [ +// { +// text: 'Save', +// click() { +// var fileName = +// escapeHtml($('#filename').val()) || 'untitled' +// const circuitData = generateSaveData( +// fileName.split('.')[0], +// false +// ) +// fileName = `${fileName.split('.')[0]}.cv` +// download(fileName, circuitData) +// $(this).dialog('close') +// }, +// }, +// ], +// }) +// $('#ExportCircuitFilesDialog').focus() +// } + +// export default ExportCircuitFiles diff --git a/v0/src/simulator/src/hotkey_binder/defaultKeys.js b/v0/src/simulator/src/hotkey_binder/defaultKeys.js new file mode 100644 index 00000000..0529ce5f --- /dev/null +++ b/v0/src/simulator/src/hotkey_binder/defaultKeys.js @@ -0,0 +1,29 @@ +/**Add more elements here, along with a valid value for key + * Elements keys must have the same name as their ID + **/ + +export const defaultKeys = { + 'New Circuit': 'Shift + N', + 'Save Online': 'Ctrl + S', + 'Save Offline': 'Ctrl + Alt + S', + 'Download as Image': 'Ctrl + D', + 'Open Offline': 'Ctrl + O', + 'Insert Sub-circuit': 'Shift + C', + 'Combinational Analysis': 'Shift + A', + // "Start Plot": "Ctrl + P", + 'Direction Up': 'Up', + 'Direction Down': 'Down', + 'Direction Left': 'Left', + 'Direction Right': 'Right', + 'Insert Label': 'Ctrl + L', + 'Label Direction Up': 'Alt + Up', + 'Label Direction Down': 'Alt + Down', + 'Label Direction Left': 'Alt + Left', + 'Label Direction Right': 'Alt + Right', + 'Move Element Up': 'Shift + Up', + 'Move Element Down': 'Shift + Down', + 'Move Element Left': 'Shift + Left', + 'Move Element Right': 'Shift + Right', + 'Hotkey Preference': 'F8', + 'Open Documentation': 'F1', +} diff --git a/v0/src/simulator/src/hotkey_binder/documentation.txt b/v0/src/simulator/src/hotkey_binder/documentation.txt new file mode 100644 index 00000000..f4af3be9 --- /dev/null +++ b/v0/src/simulator/src/hotkey_binder/documentation.txt @@ -0,0 +1,45 @@ +The feature includes two libraries: +1. shortcuts.plugin.js: It consists of a few function(s) + a. Add + b. Remove + c. RemoveAll + +a. function Add takes 3 arguments: + shortcut_combination: eg "Ctrl + X" + callback: reference to a function, which will be invoked when the above combination is detected + opt: some optional parameters such as propagation, type of keyevent, etc + +b. function Remove: removes a particular shortcut provided in the param. +c. function RemoveAll: takes no param removes all shortcuts. + +supported format: + * Modifier + * Modifier + key + * Single key + +2. normalizer.plugin.js: is used in keyBinder.js (line 73), to detect the shortcut_combination in string format + which is then passed to the shortcuts plugin. + +MAIN FILEs: + keyBinder.js is the controller, it performs operation that are defined in other files (model, view) + It consist of the keydown listener which detects while user is customizing the keys from the preference panel, + * checks for restrictions + * warns override + * restricts non-overridable combinations + * Others + +USAGE: + TO ADD SHORCUTS: + #1 add the shortcut in the defaultKeys.json file + #2 Assign the callback in addShorcut.js: + * the callback should be a func reference,if function to be invoked is already defined in the codebase just set it as it is. (for some func reference may not work, refer next step) + + *for callback not present in the codebase, or is present but doesn't work as intended, defined the function that will invoke the required callback in action.js, note that callback must be func reference hence define it as a higher-order func if necessary in action.js + TO REMOVE SHORCUTS: + #1. Remove the option from defaultKeys.json + #2. Remove the case from addShortcut.js + RESTRICTION: + To add restriction to any combination, mention it in utils.js -> checkRestricted func, which contains an array that consists of restricted combination, push to the array. + +*The feature make uses of localstorage for persistence, only defaultkeys else userkeys will be present in localstorage not both. +On load IFFE func on keyBinder.js (line 111) will check for userKeys, if found it it will be set, else defaultkeys will be set. \ No newline at end of file diff --git a/v0/src/simulator/src/hotkey_binder/keyBinder.js b/v0/src/simulator/src/hotkey_binder/keyBinder.js new file mode 100644 index 00000000..f4653fb7 --- /dev/null +++ b/v0/src/simulator/src/hotkey_binder/keyBinder.js @@ -0,0 +1,151 @@ +// import { +// editPanel, +// heading, +// markUp, +// closeEdit, +// submit, +// updateHTML, +// override, +// } from './view/panel.ui' +// import { setDefault, checkUpdate, addKeys, warnOverride } from './model/actions' +// import { KeyCode } from './model/normalize/normalizer.plugin.js' +// import { checkRestricted } from './model/utils.js' +// import { SimulatorStore } from '#/store/SimulatorStore/SimulatorStore' + +//** keyBinder dialog */ +// export function keyBinder() { + // const simulatorStore = SimulatorStore() + // simulatorStore.dialogBox.customshortcut_dialog = true + // $('#customShortcutDialog').append(editPanel) + // $('#customShortcutDialog').append(heading) + // $('#customShortcutDialog').append(markUp) + // $('#customShortcut').on('click', () => { + // closeEdit() + // $('#customShortcutDialog').dialog({ + // resizable: false, + // buttons: [ + // { + // text: 'Reset to default', + // click: () => { + // if ( + // confirm( + // 'Remove all custom keys & set the default keys?' + // ) + // ) + // setDefault() + // }, + // id: 'resetDefault', + // }, + // { + // text: 'Save', + // click: () => { + // submit() + // $('#customShortcutDialog').dialog('close') + // }, + // id: 'submitBtn', + // }, + // ], + // }) + // $('#customShortcutDialog').css('display', 'flex') + // }) + + // //** targetPref is assigned to the target key option to be edited */ + // let targetPref = null + // $('#preference').on('click', (e) => { + // $('#pressedKeys').text('') + // $('#warning').text('') + // $('#edit').css('border', 'none') + // $('#edit').css('display', 'block') + // $($('#edit')).focus() + // ;[, targetPref] = e.target.closest('div').children + // }) + + // //*** Modifiers restriction enabled here */ + // //*** below fn works in the edit panel where user enters key combo, + // //*** responsible for checking duplicate entries, overriding entries, checking restricted keys, arranging keys in + // //*** proper order, validating key combos */ + + // $('#edit').keydown((e) => { + // e = e || window.event + // e.stopPropagation() + // e.preventDefault() + // var k = KeyCode + // let modifiers = ['CTRL', 'ALT', 'SHIFT', 'META'] + // $('#edit').css('animation', 'none') + // $('#warning').text('') + // if (e.keyCode === 27) closeEdit() + // if (e.keyCode === 13) { + // if ($('#pressedKeys').text() === '') { + // $('#warning').text('Please enter some key(s)') + // $('#edit').css('animation', 'shake .3s linear') + // return + // } + // if (!checkRestricted($('#pressedKeys').text())) { + // override($('#pressedKeys').text()) + // targetPref.innerText = $('#pressedKeys').text() + // $('#pressedKeys').text('') + // $('#edit').css('display', 'none') + // } else { + // $('#warning').text('Please enter different key(s).') + // $('#edit').css('animation', 'shake .3s linear') + // $('#pressedKeys').text('') + // } + // } + // const currentKey = + // k.hot_key(k.translate_event(e)).split('+').join(' + ') !== 'Enter' + // ? k.hot_key(k.translate_event(e)).split('+').join(' + ') + // : '' + // if ( + // $('#pressedKeys').text().split(' + ').length === 2 && + // !modifiers.includes(currentKey) && + // modifiers.includes($('#pressedKeys').text().split(' + ')[1]) + // ) { + // $('#pressedKeys').append(` + ${currentKey}`) + // } else if (modifiers.includes($('#pressedKeys').text())) { + // modifiers = modifiers.filter( + // (mod) => mod === $('#pressedKeys').text() + // ) + // if (!modifiers.includes(currentKey)) { + // $('#pressedKeys').append(` + ${currentKey}`) + // } + // } else { + // $('#pressedKeys').text('') + // $('#pressedKeys').text(currentKey) + // } + // if (!$('#pressedKeys').text()) { + // $('#pressedKeys').text(currentKey) + // } + // if ( + // ($('#pressedKeys').text().split(' + ').length === 2 && + // ['Ctrl', 'Meta'].includes( + // $('#pressedKeys').text().split(' + ')[1] + // )) || + // ($('#pressedKeys').text().split(' + ')[0] === 'Alt' && + // $('#pressedKeys').text().split(' + ')[1] === 'Shift') + // ) { + // $('#pressedKeys').text( + // $('#pressedKeys').text().split(' + ').reverse().join(' + ') + // ) + // } + // warnOverride($('#pressedKeys').text(), targetPref) + // if (checkRestricted($('#pressedKeys').text())) { + // $('#warning').text( + // 'The above combination is a system default shortcut & cannot be set.' + // ) + // } + // }) + + // //** if users closes hotkey dialog by making changes & not saving them, fn will fallback to previous state */ + + // $('div#customShortcutDialog').on('dialogclose', function (event) { + // if (localStorage.userKeys) { + // updateHTML('user') + // } else updateHTML('default') + // }) + + // // Set up shortcuts + // if (localStorage.userKeys) { + // checkUpdate() + // addKeys('user') + // } else setDefault() +// } diff --git a/v0/src/simulator/src/hotkey_binder/model/actions.js b/v0/src/simulator/src/hotkey_binder/model/actions.js new file mode 100644 index 00000000..102209ee --- /dev/null +++ b/v0/src/simulator/src/hotkey_binder/model/actions.js @@ -0,0 +1,205 @@ +import { defaultKeys } from '../defaultKeys' +import { addShortcut } from './addShortcut' +import { updateHTML } from '../view/panel.ui' +import simulationArea from '../../simulationArea' +import { + scheduleUpdate, + update, + updateSelectionsAndPane, + wireToBeCheckedSet, + updatePositionSet, + updateSimulationSet, + updateCanvasSet, + gridUpdateSet, + errorDetectedSet, +} from '../../engine' + +import { getOS } from './utils.js' +import { shortcut } from './shortcuts.plugin.js' +/** + * Function used to add or change keys user or default + * grabs the keycombo from localstorage & + * calls the addShortcut function in a loop to bind them + * @param {string} mode - user custom keys or default keys + */ +export const addKeys = (mode) => { + shortcut.removeAll() + if (mode === 'user') { + localStorage.removeItem('defaultKeys') + let userKeys = localStorage.get('userKeys') + for (let pref in userKeys) { + let key = userKeys[pref] + key = key.split(' ').join('') + addShortcut(key, pref) + } + updateHTML('user') + } else if (mode == 'default') { + if (localStorage.userKeys) localStorage.removeItem('userKeys') + let defaultKeys = localStorage.get('defaultKeys') + for (let pref in defaultKeys) { + let key = defaultKeys[pref] + key = key.split(' ').join('') + addShortcut(key, pref) + } + updateHTML('default') + } +} +/** + * Function used to check if new keys are added, adds missing keys if added + */ +export const checkUpdate = () => { + const userK = localStorage.get('userKeys') + if (Object.size(userK) !== Object.size(defaultKeys)) { + for (const [key, value] of Object.entries(defaultKeys)) { + if (!Object.keys(userK).includes(key)) { + userK[key] = value + } + } + localStorage.set('userKeys', userK) + } else { + return + } +} +/** + * Function used to set userKeys, grabs the keycombo from the panel UI + * sets it to the localStorage & cals addKeys + * removes the defaultkeys from localStorage + */ +export const setUserKeys = () => { + if (localStorage.defaultKeys) localStorage.removeItem('defaultKeys') + let userKeys = {} + let x = 0 + while ($('#preference').children()[x]) { + userKeys[ + $('#preference').children()[x].children[1].children[0].innerText + ] = $('#preference').children()[x].children[1].children[1].innerText + x++ + } + localStorage.set('userKeys', userKeys) + addKeys('user') +} +/** + * Function used to set defaultKeys, grabs the keycombo from the defaultkeys metadata + * sets it to the localStorage & cals addKeys + * removes the userkeys from localStorage if present + * also checks for OS type + */ +export const setDefault = () => { + if (localStorage.userKeys) localStorage.removeItem('userKeys') + if (getOS() === 'MacOS') { + const macDefaultKeys = {} + for (let [key, value] of Object.entries(defaultKeys)) { + if (value.split(' + ')[0] == 'Ctrl'); + macDefaultKeys[key] = + value.split(' + ')[0] == 'Ctrl' + ? value.replace('Ctrl', 'Meta') + : value + localStorage.set('defaultKeys', macDefaultKeys) + } + } else { + localStorage.set('defaultKeys', defaultKeys) //TODO add a confirmation alert + } + addKeys('default') +} +/** + * function to check if user entered keys are already assigned to other key + * gives a warning message if keys already assigned + * @param {string} combo the key combo + * @param {string} target the target option of the panel + */ +export const warnOverride = (combo, target, warning) => { + let x = 0 + while ($('#preference').children()[x]) { + if ( + $('#preference').children()[x].children[1].children[1].innerText === + combo && + $('#preference').children()[x].children[1].children[0].innerText !== + target.previousElementSibling.innerText + ) { + const assignee = + $('#preference').children()[x].children[1].children[0].innerText + // $('#warning').text( + // `This key(s) is already assigned to: ${assignee}, press Enter to override.` + // ) + warning.value = `This key(s) is already assigned to: ${assignee}, press Enter to override.` + $('#edit').css('border', '1.5px solid #dc5656') + return + } else { + $('#edit').css('border', 'none') + } + x++ + } +} + +export const elementDirection = (direct) => () => { + if (simulationArea.lastSelected) { + simulationArea.lastSelected.newDirection(direct.toUpperCase()) + $("select[name |= 'newDirection']").val(direct.toUpperCase()) + updateSystem() + } +} + +export const labelDirection = (direct) => () => { + if ( + simulationArea.lastSelected && + !simulationArea.lastSelected.labelDirectionFixed + ) { + simulationArea.lastSelected.labelDirection = direct.toUpperCase() + $("select[name |= 'newLabelDirection']").val(direct.toUpperCase()) + updateSystem() + } +} + +export const insertLabel = () => { + if (simulationArea.lastSelected) { + $("input[name |= 'setLabel']").focus() + $("input[name |= 'setLabel']").val().length + ? null + : $("input[name |= 'setLabel']").val('Untitled') + $("input[name |= 'setLabel']").select() + updateSystem() + } +} + +export const moveElement = (direct) => () => { + if (simulationArea.lastSelected) { + switch (direct) { + case 'up': + simulationArea.lastSelected.y -= 10 + break + case 'down': + simulationArea.lastSelected.y += 10 + break + case 'left': + simulationArea.lastSelected.x -= 10 + break + case 'right': + simulationArea.lastSelected.x += 10 + break + } + updateSystem() + } +} + +export const openHotkey = () => $('#customShortcut').trigger('click') + +export const createNewCircuitScopeCall = () => + $('#createNewCircuitScope').trigger('click') // TODO: remove later + +export const openDocumentation = () => { + if ( + simulationArea.lastSelected == undefined || + simulationArea.lastSelected.helplink == undefined + ) { + // didn't select any element or documentation not found + window.open('https://docs.circuitverse.org/', '_blank') + } else { + window.open(simulationArea.lastSelected.helplink, '_blank') + } +} + +function updateSystem() { + updateCanvasSet(true) + wireToBeCheckedSet(1) + scheduleUpdate(1) +} diff --git a/v0/src/simulator/src/hotkey_binder/model/addShortcut.js b/v0/src/simulator/src/hotkey_binder/model/addShortcut.js new file mode 100644 index 00000000..27834ab1 --- /dev/null +++ b/v0/src/simulator/src/hotkey_binder/model/addShortcut.js @@ -0,0 +1,102 @@ +// import { shortcut } from './Shortcuts.plugin'; +// import createSaveAsImgPrompt from '../../data/saveImage'; +//Assign the callback func for the keymap here +import { + createNewCircuitScopeCall, + elementDirection, + insertLabel, + labelDirection, + openHotkey, + moveElement, + openDocumentation, +} from './actions' +import save from '../../data/save' +import { saveOffline, openOffline } from '../../data/project' +import createSaveAsImgPrompt from '../../data/saveImage' +import { createSubCircuitPrompt } from '../../subcircuit' +import { createCombinationalAnalysisPrompt } from '../../combinationalAnalysis' +import { shortcut } from './shortcuts.plugin.js' + +export const addShortcut = (keys, action) => { + let callback + switch (action) { + case 'New Circuit': + callback = createNewCircuitScopeCall // TODO: directly call rather than using dom click + break + case 'Save Online': + callback = save + break + case 'Save Offline': + callback = saveOffline + break + case 'Download as Image': + callback = createSaveAsImgPrompt + break + case 'Open Offline': + callback = openOffline + break + case 'Insert Sub-circuit': + callback = createSubCircuitPrompt + break + case 'Combinational Analysis': + callback = createCombinationalAnalysisPrompt + break //bug + // case "Start Plot": + // callback = startPlot; + // break; + case 'Direction Up': + callback = elementDirection('up') + break + case 'Direction Down': + callback = elementDirection('down') + break + case 'Direction Left': + callback = elementDirection('left') + break + case 'Direction Right': + callback = elementDirection('right') + break + case 'Insert Label': + callback = insertLabel + break + case 'Label Direction Up': + callback = labelDirection('up') + break + case 'Label Direction Down': + callback = labelDirection('down') + break + case 'Label Direction Left': + callback = labelDirection('left') + break + case 'Label Direction Right': + callback = labelDirection('right') + break + case 'Move Element Up': + callback = moveElement('up') + break + case 'Move Element Down': + callback = moveElement('down') + break + case 'Move Element Left': + callback = moveElement('left') + break + case 'Move Element Right': + callback = moveElement('right') + break + case 'Hotkey Preference': + callback = openHotkey + break + case 'Open Documentation': + callback = openDocumentation + break + default: + callback = () => console.log('No shortcut found..') + break + } + shortcut.add(keys, callback, { + type: 'keydown', + propagate: false, + target: document, + disable_in_input: true, + }) +} diff --git a/v0/src/simulator/src/hotkey_binder/model/normalize/normalizer.plugin.js b/v0/src/simulator/src/hotkey_binder/model/normalize/normalizer.plugin.js new file mode 100644 index 00000000..cc9a7def --- /dev/null +++ b/v0/src/simulator/src/hotkey_binder/model/normalize/normalizer.plugin.js @@ -0,0 +1,389 @@ +/** + * This plugin has been modified to support metakeys + */ + +/* + * Library to normalize key codes across browsers. This works with keydown + * events; keypress events are not fired for all keys, and the codes are + * different for them. It returns an object with the following fields: + * { int code, bool shift, bool alt, bool ctrl }. The normalized keycodes + * obey the following rules: + * + * For alphabetic characters, the ASCII code of the uppercase version + * + * For codes that are identical across all browsers (this includes all + * modifiers, esc, delete, arrows, etc.), the common keycode + * + * For numeric keypad keys, the value returned by numkey(). + * (Usually 96 + the number) + * + * For symbols, the ASCII code of the character that appears when shift + * is not held down, EXCEPT for '" => 222 (conflicts with right-arrow/pagedown), + * .> => 190 (conflicts with Delete) and `~ => 126 (conflicts with Num0). + * + * Basic usage: + * document.onkeydown = function(e) { + * do_something_with(KeyCode.translateEvent(e) + * }; + * + * The naming conventions for functions use 'code' to represent an integer + * keycode, 'key' to represent a key description (specified above), and 'e' + * to represent an event object. + * + * There's also functionality to track and detect which keys are currently + * being held down: install 'key_up' and 'key_down' on their respective event + * handlers, and then check with 'is_down'. + * + * @fileoverview + * @author Jonathan Tang + * @version 0.9 + * @license BSD + */ + +/* +Copyright (c) 2008 Jonathan Tang +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +var modifiers = ['ctrl', 'alt', 'shift', 'meta'], + KEY_MAP = {}, + shifted_symbols = { + 58: 59, // : -> ; + 43: 61, // = -> + + 60: 44, // < -> , + 95: 45, // _ -> - + 62: 46, // > -> . + 63: 47, // ? -> / + 96: 192, // ` -> ~ + 124: 92, // | -> \ + 39: 222, // ' -> 222 + 34: 222, // " -> 222 + 33: 49, // ! -> 1 + 64: 50, // @ -> 2 + 35: 51, // # -> 3 + 36: 52, // $ -> 4 + 37: 53, // % -> 5 + 94: 54, // ^ -> 6 + 38: 55, // & -> 7 + 42: 56, // * -> 8 + 40: 57, // ( -> 9 + 41: 58, // ) -> 0 + 123: 91, // { -> [ + 125: 93, // } -> ] + } + +function isLower(ascii) { + return ascii >= 97 && ascii <= 122 +} +function capitalize(str) { + return str.substr(0, 1).toUpperCase() + str.substr(1).toLowerCase() +} + +var is_gecko = navigator.userAgent.indexOf('Gecko') != -1, + is_ie = navigator.userAgent.indexOf('MSIE') != -1, + is_windows = navigator.platform.indexOf('Win') != -1, + is_opera = window.opera && window.opera.version() < 9.5, + is_konqueror = navigator.vendor && navigator.vendor.indexOf('KDE') != -1, + is_icab = navigator.vendor && navigator.vendor.indexOf('iCab') != -1 + +var GECKO_IE_KEYMAP = { + 186: 59, // ;: in IE + 187: 61, // =+ in IE + 188: 44, // ,< + 109: 95, // -_ in Mozilla + 107: 61, // =+ in Mozilla + 189: 95, // -_ in IE + 190: 62, // .> + 191: 47, // /? + 192: 126, // `~ + 219: 91, // {[ + 220: 92, // \| + 221: 93, // }] +} + +var OPERA_KEYMAP = {} + +// Browser detection taken from quirksmode.org +if (is_opera && is_windows) { + KEY_MAP = OPERA_KEYMAP +} else if (is_opera || is_konqueror || is_icab) { + var unshift = [ + 33, 64, 35, 36, 37, 94, 38, 42, 40, 41, 58, 43, 60, 95, 62, 63, 124, 34, + ] + KEY_MAP = OPERA_KEYMAP + for (var i = 0; i < unshift.length; ++i) { + KEY_MAP[unshift[i]] = shifted_symbols[unshift[i]] + } +} else { + // IE and Gecko are close enough that we can use the same map for both, + // and the rest of the world (eg. Opera 9.50) seems to be standardizing + // on them + KEY_MAP = GECKO_IE_KEYMAP +} + +if (is_konqueror) { + KEY_MAP[0] = 45 + KEY_MAP[127] = 46 + KEY_MAP[45] = 95 +} + +var key_names = { + 32: 'SPACE', + 13: 'ENTER', + 9: 'TAB', + 8: 'BACKSPACE', + 16: 'SHIFT', + 17: 'CTRL', + 18: 'ALT', + 20: 'CAPS_LOCK', + 144: 'NUM_LOCK', + 145: 'SCROLL_LOCK', + 37: 'LEFT', + 38: 'UP', + 39: 'RIGHT', + 40: 'DOWN', + 33: 'PAGE_UP', + 34: 'PAGE_DOWN', + 36: 'HOME', + 35: 'END', + 45: 'INSERT', + 46: 'DELETE', + 27: 'ESCAPE', + 19: 'PAUSE', + 222: "'", + 91: 'META', +} +function fn_name(code) { + if (code >= 112 && code <= 123) return 'F' + (code - 111) + return false +} +function num_name(code) { + if (code >= 96 && code < 106) return 'Num' + (code - 96) + switch (code) { + case 106: + return 'Num*' + case 111: + return 'Num/' + case 110: + return 'Num.' + default: + return false + } +} + +var current_keys = { + codes: {}, + ctrl: false, + alt: false, + shift: false, + meta: false, +} + +function update_current_modifiers(key) { + current_keys.ctrl = key.ctrl + current_keys.alt = key.alt + current_keys.shift = key.shift + current_keys.meta = key.meta +} + +function same_modifiers(key1, key2) { + return ( + key1.ctrl === key2.ctrl && + key1.alt === key2.alt && + key1.shift === key2.shift && + key1.meta === key2.meta + ) +} + +if (typeof window.KeyCode != 'undefined') { + var _KeyCode = window.KeyCode +} + +export const KeyCode = { + no_conflict: function () { + window.KeyCode = _KeyCode + return KeyCode + }, + + /** Generates a function key code from a number between 1 and 12 */ + fkey: function (num) { + return 111 + num + }, + + /** + * Generates a numeric keypad code from a number between 0 and 9. + * Also works for (some) arithmetic operators. The mappings are: + * + * *: 106, /: 111, .: 110 + * + * + and - are not supported because the keycodes generated by Mozilla + * conflict with the non-keypad codes. The same applies to all the + * arithmetic keypad keys on Konqueror and early Opera. + */ + numkey: function (num) { + switch (num) { + case '*': + return 106 + case '/': + return 111 + case '.': + return 110 + default: + return 96 + num + } + }, + + /** + * Generates a key code from the ASCII code of (the first character of) a + * string. + */ + key: function (str) { + var c = str.charCodeAt(0) + if (isLower(c)) return c - 32 + return shifted_symbols[c] || c + }, + + /** Checks if two key objects are equal. */ + key_equals: function (key1, key2) { + return key1.code == key2.code && same_modifiers(key1, key2) + }, + + /** Translates a keycode to its normalized value. */ + translate_key_code: function (code) { + return KEY_MAP[code] || code + }, + + /** + * Translates a keyDown event to a normalized key event object. The + * object has the following fields: + * { int code; boolean shift, boolean alt, boolean ctrl } + */ + translate_event: function (e) { + e = e || window.event + var code = e.which || e.keyCode + return { + code: KeyCode.translate_key_code(code), + shift: e.shiftKey, + alt: e.altKey, + ctrl: e.ctrlKey, + meta: e.metaKey, + } + }, + + /** + * Keydown event listener to update internal state of which keys are + * currently pressed. + */ + + key_down: function (e) { + var key = KeyCode.translate_event(e) + current_keys.codes[key.code] = key.code + update_current_modifiers(key) + }, + + /** + * Keyup event listener to update internal state. + */ + key_up: function (e) { + var key = KeyCode.translate_event(e) + delete current_keys.codes[key.code] + update_current_modifiers(key) + }, + + /** + * Returns true if the key spec (as returned by translate_event) is + * currently held down. + */ + is_down: function (key) { + var code = key.code + if (code == KeyCode.CTRL) return current_keys.ctrl + if (code == KeyCode.ALT) return current_keys.alt + if (code == KeyCode.SHIFT) return current_keys.shift + + return ( + current_keys.codes[code] !== undefined && + same_modifiers(key, current_keys) + ) + }, + + /** + * Returns a string representation of a key event suitable for the + * shortcut.js or JQuery HotKeys plugins. Also makes a decent UI display. + */ + hot_key: function (key) { + var pieces = [] + for (var i = 0; i < modifiers.length; ++i) { + var modifier = modifiers[i] + if ( + key[modifier] && + modifier.toUpperCase() != key_names[key.code] + ) { + pieces.push(capitalize(modifier)) + } + } + + var c = key.code + var key_name = + key_names[c] || fn_name(c) || num_name(c) || String.fromCharCode(c) + pieces.push(capitalize(key_name)) + return pieces.join('+') + }, +} + +// Add key constants +for (var code in key_names) { + KeyCode[key_names[code]] = code +} + +// var fields = ['charCode', 'keyCode', 'which', 'type', 'timeStamp', +// 'altKey', 'ctrlKey', 'shiftKey', 'metaKey']; +// var types = ['keydown', 'keypress', 'keyup']; + +// function show_event(type) { +// return function(e) { +// var lines = []; +// for(var i = 0; i < fields.length; ++i) { +// lines.push('' + fields[i] + ': ' + e[fields[i]] + '
'); +// } +// document.getElementByI(type).innerHTML = lines.join('\n'); +// return false; +// } +// }; + +// function show_is_key_down(id, code, ctrl, alt, shift) { +// document.getElementById(id + '_down').innerHTML = KeyCode.is_down({ +// code: code, +// ctrl: ctrl, +// alt: alt, +// shift: shift +// }); +// }; + +// function update_key_downs() { +// show_is_key_down('x', KeyCode.key('x'), false, false, false); +// show_is_key_down('shift_x', KeyCode.key('x'), false, false, true); +// show_is_key_down('shift_c', KeyCode.key('c'), false, false, true); +// show_is_key_down('ctrl_a', KeyCode.key('a'), true, false, false); +// }; diff --git a/v0/src/simulator/src/hotkey_binder/model/shortcuts.plugin.js b/v0/src/simulator/src/hotkey_binder/model/shortcuts.plugin.js new file mode 100644 index 00000000..f80d37bd --- /dev/null +++ b/v0/src/simulator/src/hotkey_binder/model/shortcuts.plugin.js @@ -0,0 +1,250 @@ +/** + * http://www.openjs.com/scripts/events/keyboard_shortcuts/ + * Version : 2.01.B + * By Binny V A + * License : BSD + */ + +/** + * Restrictions: + * The shortcut key combination should be specified in this format ... Modifier[+Modifier..]+Key. + * Can have a single key without Modifier .. Key, not Key + Key + * These restrictions must be be hardcoded to not let users input invalid key combo + * There is no way to override Ctrl+N, Ctrl+T, or Ctrl+W in Google Chrome since version 4 of Chrome (shipped in 2010). + * + **/ + +//*! This plugin has been modified + +export const shortcut = { + all_shortcuts: {}, //All the shortcuts are stored in this array ex. download : keycombo; + add: function (shortcut_combination, callback, opt) { + //Provide a set of default options + var default_options = { + type: 'keydown', + propagate: false, + disable_in_input: true, + target: document, + keycode: false, + } + + if (!opt) opt = default_options + else { + for (var dfo in default_options) { + if (typeof opt[dfo] == 'undefined') + opt[dfo] = default_options[dfo] + } + } + + var ele = opt.target + if (typeof opt.target == 'string') + ele = document.getElementById(opt.target) + var ths = this + shortcut_combination = shortcut_combination.toLowerCase() + + //The function to be called at keypress + var func = function (e) { + e = e || window.event + if (opt['disable_in_input']) { + //Don't enable shortcut keys in Input, Textarea fields + var element + if (e.target) element = e.target + else if (e.srcElement) element = e.srcElement + if (element.nodeType == 3) element = element.parentNode + + if (element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') + return + } + + let code = '' + //Find Which key is pressed + if (e.keyCode) code = e.keyCode + else if (e.which) code = e.which + var character = String.fromCharCode(code).toLowerCase() + // e.preventDefault(); + + if (code == 188) character = ',' //If the user presses , when the type is onkeydown + if (code == 190) character = '.' //If the user presses , when the type is onkeydown + + var keys = shortcut_combination.split('+') + //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked + var kp = 0 + + //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken + var shift_nums = { + '`': '~', + 1: '!', + 2: '@', + 3: '#', + 4: '$', + 5: '%', + 6: '^', + 7: '&', + 8: '*', + 9: '(', + 0: ')', + '-': '_', + '=': '+', + ';': ':', + "'": '"', + ',': '<', + '.': '>', + '/': '?', + '\\': '|', + } + //Special Keys - and their codes + var special_keys = { + esc: 27, + escape: 27, + tab: 9, + space: 32, + return: 13, + enter: 13, + backspace: 8, + + scrolllock: 145, + scroll_lock: 145, + scroll: 145, + capslock: 20, + caps_lock: 20, + caps: 20, + numlock: 144, + num_lock: 144, + num: 144, + + pause: 19, + break: 19, + + insert: 45, + home: 36, + delete: 46, + end: 35, + + pageup: 33, + page_up: 33, + pu: 33, + + pagedown: 34, + page_down: 34, + pd: 34, + + left: 37, + up: 38, + right: 39, + down: 40, + + f1: 112, + f2: 113, + f3: 114, + f4: 115, + f5: 116, + f6: 117, + f7: 118, + f8: 119, + f9: 120, + f10: 121, + f11: 122, + f12: 123, + } + + var modifiers = { + shift: { wanted: false, pressed: false }, + ctrl: { wanted: false, pressed: false }, + alt: { wanted: false, pressed: false }, + meta: { wanted: false, pressed: false }, //Meta is Mac specific + } + + if (e.ctrlKey) modifiers.ctrl.pressed = true + if (e.shiftKey) modifiers.shift.pressed = true + if (e.altKey) modifiers.alt.pressed = true + if (e.metaKey) modifiers.meta.pressed = true + + let k + for (var i = 0; (k = keys[i]), i < keys.length; i++) { + //Modifiers + if (k == 'ctrl' || k == 'control') { + kp++ + modifiers.ctrl.wanted = true + } else if (k == 'shift') { + kp++ + modifiers.shift.wanted = true + } else if (k == 'alt') { + kp++ + modifiers.alt.wanted = true + } else if (k == 'meta') { + kp++ + modifiers.meta.wanted = true + } else if (k.length > 1) { + //If it is a special key + if (special_keys[k] == code) kp++ + } else if (opt['keycode']) { + if (opt['keycode'] == code) kp++ + } else { + //The special keys did not match + if (character == k) kp++ + else { + if (shift_nums[character] && e.shiftKey) { + //Stupid Shift key bug created by using lowercase + character = shift_nums[character] + if (character == k) kp++ + } + } + } + } + + if ( + kp == keys.length && + modifiers.ctrl.pressed == modifiers.ctrl.wanted && + modifiers.shift.pressed == modifiers.shift.wanted && + modifiers.alt.pressed == modifiers.alt.wanted && + modifiers.meta.pressed == modifiers.meta.wanted + ) { + callback(e) + + if (!opt['propagate']) { + //Stop the event + //e.cancelBubble is supported by IE - this will kill the bubbling process. + e.cancelBubble = true + e.returnValue = false + + //e.stopPropagation works in Firefox. + if (e.stopPropagation) { + e.stopPropagation() + e.preventDefault() + } + return false + } + } + } + this.all_shortcuts[shortcut_combination] = { + callback: func, + target: ele, + event: opt['type'], + } + //Attach the function with the event + if (ele.addEventListener) ele.addEventListener(opt['type'], func, false) + else if (ele.attachEvent) ele.attachEvent('on' + opt['type'], func) + else ele['on' + opt['type']] = func + }, + + //Remove the shortcut - just specify the shortcut and I will remove the binding + remove: function (shortcut_combination) { + shortcut_combination = shortcut_combination.toLowerCase() + var binding = this.all_shortcuts[shortcut_combination] + delete this.all_shortcuts[shortcut_combination] + if (!binding) return + var type = binding['event'] + var ele = binding['target'] + var callback = binding['callback'] + + if (ele.detachEvent) ele.detachEvent('on' + type, callback) + else if (ele.removeEventListener) + ele.removeEventListener(type, callback, false) + else ele['on' + type] = false + }, + removeAll: function () { + for (let x in this.all_shortcuts) { + this.remove(x) + } + }, +} diff --git a/v0/src/simulator/src/hotkey_binder/model/utils.js b/v0/src/simulator/src/hotkey_binder/model/utils.js new file mode 100644 index 00000000..8a2a8a8b --- /dev/null +++ b/v0/src/simulator/src/hotkey_binder/model/utils.js @@ -0,0 +1,67 @@ +Storage.prototype.set = function (key, obj) { + return this.setItem(key, JSON.stringify(obj)) +} + +Storage.prototype.get = function (key) { + return JSON.parse(this.getItem(key)) +} + +Object.size = function (obj) { + var size = 0, + key + for (key in obj) { + if (obj.hasOwnProperty(key)) size++ + } + return size +} + +export const getKey = (obj, val) => + Object.keys(obj).find((key) => obj[key] === val) + +export const getOS = () => { + let OSName = '' + if (navigator.appVersion.indexOf('Win') != -1) OSName = 'Windows' + if (navigator.appVersion.indexOf('Mac') != -1) OSName = 'MacOS' + if (navigator.appVersion.indexOf('X11') != -1) OSName = 'UNIX' + if (navigator.appVersion.indexOf('Linux') != -1) OSName = 'Linux' + return OSName +} + +export const checkRestricted = (key) => { + const restrictedKeys = [ + 'Ctrl + N', + 'Ctrl + W', + 'Ctrl + T', + 'Ctrl + C', + 'Ctrl + V', + 'Ctrl + Delete', + 'Ctrl + Backspace', + 'Ctrl + /', + 'Ctrl + \\', + 'Ctrl + ]', + "Ctrl + '", + 'Ctrl + `', + 'Ctrl + [', + 'Ctrl + ~', + 'Ctrl + Num1', + 'Ctrl + Num2', + 'Ctrl + Num3', + 'Ctrl + Num4', + 'Ctrl + Num5', + 'Ctrl + Num6', + 'Ctrl + Num*', + 'Ctrl + Num/', + 'Ctrl + Num.', + 'Ctrl + Num0', + ] + if (getOS == 'macOS') { + restrictedKeys.forEach((value, i) => { + if (value.split(' + ')[0] == 'Ctrl'); + restrictedKeys[i] = + value.split(' + ')[0] == 'Ctrl' + ? value.replace('Ctrl', 'Meta') + : value + }) + } + return restrictedKeys.includes(key) +} diff --git a/v0/src/simulator/src/hotkey_binder/view/panel.ui.js b/v0/src/simulator/src/hotkey_binder/view/panel.ui.js new file mode 100644 index 00000000..06222901 --- /dev/null +++ b/v0/src/simulator/src/hotkey_binder/view/panel.ui.js @@ -0,0 +1,60 @@ +import { setUserKeys } from '../model/actions' + +/** + * fn to update the htokey panel UI with the currently set configuration + * @param {string} mode user prefered if present, or default keys configuration + */ +export const updateHTML = (mode) => { + let x = 0 + if (mode == 'user') { + const userKeys = localStorage.get('userKeys') + while ($('#preference').children()[x]) { + $('#preference').children()[x].children[1].children[1].innerText = + userKeys[ + $('#preference').children()[ + x + ].children[1].children[0].innerText + ] + x++ + } + } else if (mode == 'default') { + while ($('#preference').children()[x]) { + const defaultKeys = localStorage.get('defaultKeys') + $('#preference').children()[x].children[1].children[1].innerText = + defaultKeys[ + $('#preference').children()[ + x + ].children[1].children[0].innerText + ] + x++ + } + } +} +/** + * fn to override key of duplicate entries + * old entry will be left blank & keys will be assigned to the new target + * @param {*} combo + */ +export const override = (combo) => { + let x = 0 + while ($('#preference').children()[x]) { + if ( + $('#preference').children()[x].children[1].children[1].innerText === + combo + ) + $('#preference').children()[x].children[1].children[1].innerText = + '' + x++ + } +} + +export const closeEdit = () => { + $('#pressedKeys').text('') + $('#edit').css('display', 'none') +} + +export const submit = () => { + $('#edit').css('display', 'none') + setUserKeys() + updateHTML('user') +} diff --git a/v0/src/simulator/src/i18n.js b/v0/src/simulator/src/i18n.js new file mode 100644 index 00000000..602f4c51 --- /dev/null +++ b/v0/src/simulator/src/i18n.js @@ -0,0 +1,17 @@ +import Banana from 'banana-i18n' + +const banana = new Banana() +banana.setLocale(window.locale) +const { locale } = banana +const finalFallback = 'en' +// object with default language preloaded +const messages = { + [finalFallback]: require(`./i18n/${finalFallback}.json`), +} +try { + messages[locale] = require(`./i18n/${locale}.json`) +} catch (err) { + // If Asynchronous loading for current locale failed, load default locale +} +banana.load(messages) +export default banana diff --git a/v0/src/simulator/src/i18n/en.json b/v0/src/simulator/src/i18n/en.json new file mode 100644 index 00000000..e9fe2e17 --- /dev/null +++ b/v0/src/simulator/src/i18n/en.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": ["Pavan"], + "last-updated": "2021-07-06", + "locale": "en", + "message-documentation": "qqq" + } +} diff --git a/v0/src/simulator/src/i18n/hi.json b/v0/src/simulator/src/i18n/hi.json new file mode 100644 index 00000000..96f4543e --- /dev/null +++ b/v0/src/simulator/src/i18n/hi.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": ["Pavan"], + "last-updated": "2021-07-06", + "locale": "hi", + "message-documentation": "qqq" + } +} diff --git a/v0/src/simulator/src/img/ALU.png b/v0/src/simulator/src/img/ALU.png new file mode 100644 index 0000000000000000000000000000000000000000..fa8094251a57c08ed6cdb85f8ad0b9a63a8a1236 GIT binary patch literal 57481 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

(DOe@ec`5}uQ@%Enyd(PG0tYsbGB-|l{)lZ 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 literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/ALU.svg b/v0/src/simulator/src/img/ALU.svg new file mode 100644 index 00000000..0db7c17a --- /dev/null +++ b/v0/src/simulator/src/img/ALU.svg @@ -0,0 +1 @@ +BACTRCarryAnsALU \ No newline at end of file diff --git a/v0/src/simulator/src/img/Adder.svg b/v0/src/simulator/src/img/Adder.svg new file mode 100644 index 00000000..9249cff0 --- /dev/null +++ b/v0/src/simulator/src/img/Adder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/AndGate.svg b/v0/src/simulator/src/img/AndGate.svg new file mode 100644 index 00000000..6273b83b --- /dev/null +++ b/v0/src/simulator/src/img/AndGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/Arrow.svg b/v0/src/simulator/src/img/Arrow.svg new file mode 100644 index 00000000..c25f20a1 --- /dev/null +++ b/v0/src/simulator/src/img/Arrow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/AsyncCounter.jpeg b/v0/src/simulator/src/img/AsyncCounter.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..88a40590e4f870e3024108f534cc902b5a7d03b6 GIT binary patch literal 5872 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 \ No newline at end of file diff --git a/v0/src/simulator/src/img/Buffer.svg b/v0/src/simulator/src/img/Buffer.svg new file mode 100644 index 00000000..bf867043 --- /dev/null +++ b/v0/src/simulator/src/img/Buffer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/Button.svg b/v0/src/simulator/src/img/Button.svg new file mode 100644 index 00000000..6c16a24e --- /dev/null +++ b/v0/src/simulator/src/img/Button.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/Clock.svg b/v0/src/simulator/src/img/Clock.svg new file mode 100644 index 00000000..653d29e0 --- /dev/null +++ b/v0/src/simulator/src/img/Clock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/ConstantVal.svg b/v0/src/simulator/src/img/ConstantVal.svg new file mode 100644 index 00000000..dcc41214 --- /dev/null +++ b/v0/src/simulator/src/img/ConstantVal.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v0/src/simulator/src/img/Control Sequencer.png b/v0/src/simulator/src/img/Control Sequencer.png new file mode 100644 index 0000000000000000000000000000000000000000..2189f0a7554381e4dff78bc664855567d53cbc6a GIT binary patch literal 271641 zcmd?RWn7f&*FTE7jSVswh%~YlQAvYx2!(AT;zos`9Z40l}Ds%yn}t;g4{UZAFAq@-)C=F5eHi~{YgQwb92HJpZ)b6JCvWbZh>q5 z%ZI83`(J*6uU}DQuKYi`&aWk?e&ZShoFo zH@PSNpIw+i`1LJhpGfXP3QPK5@BWW3B+G1aPb7OGIUfE$e<4|BlY2GU3&}D2KfaKx zRFHcj*$c_?@c()7q5h8_Nlq+Q7m4jf9SBvL6Lx2#*l{4?>j7?xdj*>n|D<}bW7mQE zVMlgzr8@n=F3*&d=zL6bkATi+v|FUq;XC(*La?W5cACHLWi@Rw)w679?Q2UGXQOcJ zV!*R~rTUj(I^oC&>Kk$zMkHgE{$IFThm2vN_>bTH|AV{F&@S%&7YmoaoFQk;t5y$< z1Dl1%U05_65lJFG{X`0l`@N=kn9mzQFJQl9{zH@S>mZLT>o^W%tj2 z{p;udbUpvUI@gx4yw0^RXMiF*mVa6K&)RdCZ_QPAZc0!f^Cz7Vibk#tzmryvt`sW@ z+pX)ruf4&EjwVGZ_I$`cvGPIU_BKn43(e`q@o{l#*;XTiP06mVuKRgaUR^mHtnOgbfrd@LS<}*!Q!=(WZ9aVJi%T^P@#=U2w(%0~q=ZDCJ$kU% zgDqG`P*5<1Ft~5+WgB>J9m!l6z}{|63*7%exc0wubYzB|w4&!ny^MQlgAAF3E4Pq6uNl8h$@g0ZB4fPhN{oHNFTwJJ+Zz505i!Tnn z&LQAwEVEkqHN7t1!D88o0aAEWYoi3AQVvh)2#_-sf7}^{b?}om+ox;2r zbeY-)SLCNe782&BhH1{A2T9H8V`F1^JDmg2mP18PnWCekVQubdH;;LZ{*&O47qnpZ zr5S5IHPl*zLLVScKM!1Ecd1X1sP$-Pq3ijO=Z8vwW^Cei^xe0&$I5e|-!%->=~+9e8cXxMdC5!l8$)|hp@$1J2+y7}x`zIkr+*<;@t379$#Q)njmHO~W zUG=7M4KFV*pRmb!W!{{ombAS3EK`+&&e?;(h7GZ5$~QDso+#gdnzQ`hCc3YHn*cd%H)?1mZgEurV_`9a3r^hBotud>&GH7XbSO<@drUX8Koc0+*!N**T5(vM^(frpV?f{Z58k-&=6q9&AqMGx|_ldm|CkGLFM2 z^%w3}-zk!kmKN^NbZ~2Jo6SJ%GlHzcsOPweCMn@AkBcPx?d};GCu_3i8B`gJrex9M zy_}szckkYH-bLw>UshHYof#j1r9(FB0D+}E`^Z9jP zphJITgnUd(P0h&@C(LF>yW8h`gh(V3)>q7SGV~6U4jyz?Z04IMR<*C_Fem519`Xj2 zh*gZwTeP{D^d4Z?0Re&3&TBk8JWVZ)5=%3c*M>>y?e5VGOiWZ0uV25ePS=lNsc&k^yjvL(60&=Y z>`5BvpF+4CCU>!4S{YWP+=41KFzzdHadDY$ziVOPV&gbl6Qq%|WjiV+V+IcL;=1gq zHe2?RLuHIQc$U+5b^0v2y1IV%>>^$KojDcd2GksZZE;sWi1}F4yQIwLB8n6ooehRf&X?At+|CWnMwvDs6#gWf9? zkM;HS&9n|XOi6q}`2o8P4Gj%6QWImA(1yggFgBRSLZMM^}x>?`a_=0tZB7`OF?T3kgVLQ&-%n}ZEu0*VF zX^FUZB~Tz4ucU|H=UO4i^3hg$=TY!DD$;rtX366}6)JUZ7r>3EC+(Sz6% z_fwXfS9?Oo&!b^vo#WH&j~ z>gWE9uA~X2JX(Psc6J*Y8v2c01u8kPIZR_QG71U`cC>YR6Oj>tpF?vQb@6Z{m}O>n zIvBOS-`C*ft!HdZQwr{UsA{1N;#p515}>kpfzAG96Rr)1IgPOAld$EG%5M$_a8ba& z@r#eTam>^;d-OAxem6lcRjCYXWHiL3K6BaX9q<|a^W$7KsOB77%O@t?WziNmT#?1Z z)D+%kIB&_JjGm2+h9T0%JJPKVG4rmxDjB;x?MMk6M`h)Y&@z^KC*C1%=ULrZ&~zun zr@ubPI0wgEL*C*C6E~rbJ*xTEi3PfBDpkz4u z#=DhMS%SRPWxx5>#@3d==m4_5)GM*n6lK>~%9qDn|Kl@Pyh^577@U}Q{ca{b&r3eJT_j{V%EOXwmAvDML+gcwf9$?>qTCw2dZ za_28xaGWNv<<9m;tIrV|BvD~Y%9lGmlr;#&CW#=FDKAAeseYqk^Ml$FRMaA%Q1i7Q10*W-X-TWU)#p3+^Qpe4 zJqbej`Kb#t98=zsx1!^oz1NJ+HLdefx9V_#WAc?0rKi}^{1|)C`0kpk-cw&07azg- zZ5^onyVqrpRiJ~}4<0;d>I#l!a7f6(Z_kue2?T%?zPDtWt1t8`5Qr#dVH4mjW*C^w9t5#Wu^Yt2E&`!`9>1|lKi(blx*TP? z08ag4k5FDFaNI1@-$5Ka(>@xB>5nuO{vszuL}rc-N95(@fp<&lox$ghJT(pt7@wFx zB5tD(5a@$hwz08Mv!AGgGk*+%*b5%4GTK4DzK?(NUW(uS{u@qE{4an1jZgnOU;lT% z%cB0b5BiNuu;qXI`|s%Uzy1AxNjD01{D!pGhFsPEM2C3^v?T>Y?}CKMd^E+Ce^6VQ zpZIRcf3$`6`Uhc-%UN-RrdK!W|ByC*Xh5n~%({2J_`FY81vedwS6pL)e0175t!~L^ zp2BlcW?srebB^9ij%nJ8$-P6oOYIBw4W-57X6?OA9RpjemWx{()^$t$UpXDa?JEu} zB;5wdM>rI7Wc_>A|LyM|a>>Tm+kf}_yE;7~qm~Tov7V=-8}SV!@~d--dkOC5LYwWd z*j&`cOV(W?3NTzsjmTjfY+q-)!Czm$#0iJt^??Iv9zKxk+b_h;!;=GE0(-0qFQ=ny z?m`Ei4g4A#h)bv19o5l;OHgcF`}|C}Dv7>fnXH!P6LXjsE-gvct}K!`mQR z@cJ1gpdOIISme3s{K~bwJ(X!cLWaS!w0rH(%THhXQU%w(W$`ZU9%|2H+uNE-*aHcx z>WziVp9u@}&NNpf3-I)@S_(laRz6du9yK7gwpRH6y2E@1ZD3-O&}1+f#p0a-r$b&k zA&{!$+Kv!*W}4un8#y;DYkjL*AeX@``Kfmd z@`+-`cphHfhtzQRKaqtz+x$o|8)qK7!BL-5NIJ%;#TO6lyos0Oxb6SVWN=lKmmm6* zxA;vEerjrJmN;s@Z6GCRCC|XIc6fMcac;P4?~UlXgc3OFtY*jiPHI;meu=>-BtZ(U zk``_ozjIDIY<*}_V#6wb5|7|C*^E_8Rf>K7{Q0xV9zSDos~-mzFO8alCl(6Xn)vwm zVnJ$TX?OWc9wg?SHO!Qs36~R9XtB^}SZZtj##U1N&7(wNL&0GK1xN`-`PgnVkx&^~ z*<#M=`LRkVB9n3U7kTlR_ZVugs*yt;#SU9J^U#?STd$%DD%Mx{Q`2$uZ&(D6AKzUK zL7(ly#m_?}t*t497sZ-OQo>inHx#HhY^g1c-~beUCMYbNk(Nf6UaNBoi64mh`I2R~ zW+VEp{i%9&^hKlgn>3YD2fQcYcZ(lXimku5WxFJCe%`L^mXQ%}D2uqAur+p`v(UV7 zs2PjpcJ_JNm&{<)g;L0k{Cj=%8>Bdekff}lvQu})Zn1-aKmNeW%j=uTw5N8Ub+~+V zp<~imK!BJI{wdc@-$lPf!6B19UtHIpvw;da_&Y)f8P1dI2N71MsJhR3SE+ld?F)AQgS>h9-LbMsZrG~)<`@JTC~A)WTvS#;SvI-JBp;b4)3OGW828AHA0~+_OTkxNi3le`7s#HfyE4&nk3Hfq_mXh5NhZ8i??M0() zccGXRqE0LbX&Sb4bY^P&u}-IT-k(8phfwY3bxwhFTTEOWt`1fDL;A&SIT|8X^YYE` zC9RC7XqB1pJ!D_~{S^)qc|%EE-NP5jiJN8O981P!Yg*F@FMR&~eloRNX%g+v?7sfq z4g47wAte+b!s!gcd2l?;vpt~94DYF#$h3a>&rAVQB%?;5plI?+(JbTIk-I;nqg?BZ zh}e>@-Ln#Ghnd&$3qP$g5ql<{hy^3S&f`;BH!#85jIGlX(Bi+r($CH8ElMApSLdyd z6?RVCRpglWzKe+sFEx6TEREi%60r(#Dt$>T;F9Njd;Sc`Fi|oQ#s!+;GO2igamLr5)gY~h>e(i|w`Ksxf#SvR!ZV~3Q8wF#XGfoi+EcH64 zC|x8k`UM0$^@TjB%QBZ@V+(ON_D6SomvAAtKm3OIW9=T~{Tl=;umXqaY)sT-H@toO zkXDUeDvDK0)xk`O7Z%r8X*b?#M`$u{y_JYt%*_vw=}RPNfr&*uHvn zW*&-3n%gF9#C%F!Qe0fN&QY$t4!P&261#5yZjUyA;LXH@KNM0S#XEE7M@yf{AM<*# zpQr$5r6Y3r%4fq(I;l#C=?f6E6~uk34wGi*iF_>JSDq1eKIAy$_^RX7^NiH*;TqZ2 z?)}#*t;WB9Nv;&n5}8g-ORHCWJow?>7Is5Dy<Oc2LM{_N{ z!Gl?3&te7WtmEQLFKBvmN>Y;C5n4$il&QM*+D+6cup74L+CM$t71;)RATMyqP1z&{HhP1!#K-LJ?_zf5vWIx#y5#(S4J5MO7t*te7Iq_SL z=$vBQvSmxKeSGe$-u9dE%IQWNi3!g>LawVd%aX*k#s=i=YfEujy6w9C>qu9zka3&; z>(`8|th`>A=LF%fbc9s?{LC1H?&VrFx%b_hvB-TZpEc4z+4dH2YXcVI=g|!HU-A@G z5~Y~Dxp{5(@Vu{%jhS1hcHBQe`PQefpyjxb3Z-RCVxcX=pq``C<~89{JMX&vgIe$g zp8TxAL#=u8cS8C>?YGP0T6;9Ir!{&|@UZ@Ow`?TgSGLv7o=nbK+=7q-7|gvwpymIr z?D33dr+>(SZEp&c!q@nr3QtPs8h~Hny#9NGf-)ax%)p{z-^9P&~}jQzTdEfv(#sBZ9Psgyc^ly zFTO<;6jSwEyzbLGP3=e^$8jCJE?!{h^4XmqZ2v$gupF}>dsw4+3L%BSXc=~3+gGv8 zgZs!BC?b}KeVQe=Ys(MTO=KBO;wL2(sUCf_$;t!J1skcj@-!zLoMByYv;`E|7k*DC zM2ebf=04XhZ$YOa%CJ+M+({RY;t~}S~^!cV_DGP@cnNLlNm|o;68mY{`5vdw=gj0*{ULm*Mus zg(7>VW{*_uBnHw0#~;HtyZ04<11Yza`{e-{S@dHki&4of3FM5M&L+G0y5cFL%&7|= zi$`klV@B79f|7oOxePPgae9{Pu-#akimIm4I68e(L1BNIzi1e@e zel_4U9FyuS;#^|FfQktHONpXbmTjppIqy@$*0~Zk$I)gXhq=KEm5Z4ZmC?%b4RMj> zLZhROS$0z$t^4Z5f8<0>-^UmmBgL|eTh$dc>}0snwPGf|LaYf%+T4M-thkKMC(kr{ z%6y~cV~I(3N+Gkhce_2D;!ys8CuvvsKYoxqHw5^lT6M00-yXs}8D}09Y~=$b@;IKS?*ZrlUijv_G3=}efk;@=g!t4eKX#PVl{2;h>0kJjaF^tV0T)W zo8nVWX#@*fhS|}9FF`d}u@MrZLkEf5UkmTeJ5XO;ZPs+h$HnwH>LqIb zrh(hO6fW&YUur;l63+j6F8bk(NAijd4E3)EcZ*;`$EyPAd>Zk|M$Png2is4^FVYBR z5*ByT32j4mXm#Pi)+Ku(x;MRl%jVi)2y@iSugp9ERc(12;h07{%xN9ie>Vk!ljz8o zPM7w*Qe?BWi@3qAuTp>ojdNxeYB3=|N_ci|u1f^`BBTHhMP|t)6&6Vnt3+Lv}?A6wwD}WM$ zcG;`lMXINDPTz%nd?*q;XZ!w=m~e-*@^qCHjZ1J;bo5eh45U85 z-AqeKiBV4H6=N_f^AnOq?<`8)V0~77k@)P<%b%X#S3fxAR2@HX0qR-PqosTxoD60y zR$Wgu>Aw;4935?F*o)08#r9Wn`jxAJzt_RsplaC)PM*?n(u;e8A5tFb61L^h8K^va z+JtcflR_BM>)&#nX0iP&X^V{ipO{_Iv9Z*5UZ7Yu4IJX%M8twH%YN*9)dhMTE^N6Qt$+8CB?-3A+wp(}2~87P$*Ee&|eia*|JHQj-yGRAX&4zU+Qjj!t!F##(z zl+`~l;M!Z$-X7Gi)q9vi&iCC5BFBuL`hGF1FNxQSHJ+bnD!VDGdeiFh6`*WH_SQu7 zaQ4ZUH*K~cR`QM^K5XuOTwI*pK`QS1VRnrG;Y%gF5&hL5HNLmdr;mb9PL3GeVZZW< zAc?#mI1Hs#U2Uy%@Z@kiTk#DjkkR+|N5_jpbyPG6(V4S#b#oTd2!u$SI+@MecrohNFK;#?b`imvm%2e=Qg#R@dhag6dZ2n7lkk zut^=v2nWt43Wtj?PIvLw=DSc;&S@?}DIjp}D3k(@#i)*cbLW&Ew(Fk!#EWRNrR{)Y zYn1()$0toGH7qPFg6XBbxfupsy1llAVuR`X4FCRc`p=h3adErjOA55 zzhUDig$d8PcI{k`kQYyz)Q#sS60&l>e{^*Z5?5>K4WP@HaQVT<9>d&H`FVV}i8Er~ zl=aaCQ3biPF=1gGvJIho@j}%PY%9fQP7dtb*YK;+X!#(Yq~8#S$%f*qi94hL zug2jpHo5@r#8yEu@>sm;s9J+8FI{UR76`-=Qr?GiZ{t66W?kAVX6kfbI0x2FJS*^ip^L0$$BF6oN;TktwIK zlmmNj`ZpNDqYQN0?8m=cFikOPx+~q$z@%&9Ou5mQUQzuI`_=7sn;|uF(-bhvf|r`H zV0p1s?=1$7CH)kSmuEgZO!$9)%<<{=Nd+;Bx&(CIbg-*OkT~mw@gI&7{^#jZ!;T)` zzt1eNIQIaqgu};qbJ=TwXuxm4it`NG?(FRs-2$l@efQ$;oh>w}5n!x@H`T`XfySlZ4d$5($_(w4+i zj#k4oGn096qP;2x8LxKw$5_{<>?}it`8nDGZ*IjC43#I@CLLdCU=JGTo?%vpwG*)e z4e>N0MWHNdk($?!f;iYXk69ZuYaVobUhQ<^*QLFQh~Qkni0w=ToJ!(s;sRuN51XO6 zg_v>0ES5WW?z~}=_3ewHN6%cxRI70ti*$WP&hhp|A27Ps+>IG;UQV8U&1!z_;h4&9 z#PPn`o4Gk3>lHvFh29BJ%@H<7mCqCBU$aU(nP9Gp8^~>}nXLFui$MWsr`RY_TH(b) zda1HU$Iolf?YWYC=+E3g=-S;%IzLM%eLrOM&k5F#&yU+H@7&aAchGYy1FVRHv6VQN!>5{II*{4j)+TKjpQoOC z$Z%MsJ!fkC+c*D1?Lmn{-9GB52d4xDmeGK5bU!g1RPFRNVVjdqfL=t}Vk+{a^ z2QLI#_xO_7MgUrMHBdA&AOD6Y-Z*mJ;h@Z(;79H%V5a1Vm|y(tubNsn?UJCdjo}E% zWbv--1q`~{S>c#^B6iFXy#!8Mzk`Zpu0+=kzSh)~(aEzJ63&iHX7p3|&mLn*s-+rd zdFTqNCxY(}oSCTTRb~G>q}Eh<*brn|$yWKG4*o3EqK+lp`gos`?Y_}W3D3=pc8pwr z-xWeK;j_0F5qoe$U2yr>b}Dq;k3S11vicY);pO&OsE;%7UZk3yo1GQ^lk{S{n%$em z7sIjf#yPd5gj~C#vvH1Z9S#w<7ri)^La3JDqN~+8%Pr$|m^=D_{KDAG;}f41i}HtD zU_r05{9r*J=_6Qhb;Rf>lf1<2(?Y%vwehscH7KTkmQw}G|5-6-;C&5y)}#EyY;oX0 zg8d*|;8so>^sM47DV~>+5!$Cbn$snV)+of~W+np?*m+{_`M37BxZ@?!+zZJX+qNd^ z1yv4|9?@o?&U{$ijP)}|UjNke4GXU6fscz0L!KL0};63o3g3^{YPKK0X!M zA`iCqFJJy40MINPPH*h9qM{;MN%UX^k0qV*=t9f$UX8*@=GN;*XzrX-n@L+jl!`^P zuJ4MToMDz`Ie+ZFmjIH8)y!t;S!|*=tVC_Jc`LiL^Cuh$7xYC9j#gU}P?zb#jI(YC^bnuyu(1@_U*p*C86-pZ67_1Z0l@Rv`(V7BO zj%ef)W2>v0IMGJskaa+Q@WaTK!k#>A4Ye;R;m-li8|-!o^BU3ZPrGmKxDx8nm8M@vRoR-O4N{Lvw7b#GZ6GHUUK?YNuhimlXTRsR~MJK>kf(YCZ4KV3NgLO?t1UxV%=Y^uUwyyszn08s1@9-txirCVBf7_cKi?1hb?WG$bj- zKHL{aqf5lxyZb20M0{B84=&A?dRyf_QbK)Oy>QVo`NM8_P7Zx%2xO5@i>W0ewaefc z#KP3$&@l;vjy2&j?4`fy6;o*yj$$aC*?~6lj_CX zhQnz$+r%$={!OVjFRYNqD1S{|U82YRr0RkyXis&KsoS!ZZ62NV{yZ#HeJF9q_fHlt z9eBf@rV`H6t}|ps$oR51(YKAbk{veF9OZQx)eMrRYt{( z>N4VJvW^+xTc^K2_4QO=tm?+gGP|E^Nu7whoWEUn>S9_yTQ5SJyEvSCW>?w0wk=`K zgla9*!R6&hi|2IIc(oXZwjSK6yC6LvE#gzHb^Hs8>C*a&Rz!pu0KPlr6cj9>PW##z zzfbOO@TO@L(~R5IY)LQd%GyUgl}{+xt51Ht6CY$HCV!y8Z?3jq_Rdv@I|Q$sUR%xG z_%`&7OLGTEtR?abT`Exay&n&dNC9jAZh|ub%IivRS<+(dl{u!Ebf+*3-w2c)pgYh1 zYj*zw#0cV3nUyYQm6Vl>ub~l)xR{t2K_Abds;UauPn04QuT@}87JRW>X_K~HrA(Sz zaZBw(8YkO_%J15NNA5F3Q+At?&bM!C~%SN?MwG}m& zk5^;a<}2ao5QFK*K{;hoE}ej4IZeAQdy=S+teJ&{g}t=k@!pyXQHi(`zu`Q^n1erD zICHClhCK)q0lj(G4SHA{iM#p2JMx%5Q?rGt{>7lzg$Nj~+e_i$9uKnTG;MN|0sYOiD zP27Av;wp8C1YX+G{|jnG5{KGwmVLnct{uPH*;*$%aS6>LH~x!&MvM8-hF4pA^j_uXgd;_zx3pe8v>fJ4yTi(P&Id zHKtl}cs})KS;`>};yP2bVu5}E^UWq%gOGB()erVkF=s_t0Y zlP@HRvBO3c_BGs-P*doi3LEWGISJZ>M9fLh?va+7TKFRDDF8lZ`7zJCM0+2LfH69k z0y?z?+=sm{92qm3tPVKu+dm{EzjJ=}>9}0EYCM@_m_~UF^v@t_t(gWfq4Oq*`3@S* z<#5~T$1UzAIGUv7w9p0+OG|Oj4fpjiOy6KYlnpkcy)&7XKonIkHS=tXzsp& z(3=YaHHfQ0l5G!EoMTMaYf+b&*5_7K&mDe`k1zG_e<&jqs*p-^%JjUHK+GFB_+A=A z%1UDPi-%lN0yO!cE=q)|*Ra({2iv(=SD^?Nd+7fpVz1ef$&MsyUidUx7w;fok*lH0 z$izh0S}8WA@^~cvJ|I$ys$(#TootNSy2l-lvL~bn=S4?zp&~OgMQ&%#^!S-)s+6Zl zU$wXD?@v|G7R)o!dmlO8(~zF#$YuV5%fX~jIijr^QX~vwz;Pr4>2Y(GVuf&Dj?9_f zf)nAU?y9yfNCgXv1!kxnzp_z-R+8U8YOl+>aO<9(i;mA_#3OxJDR0G9_yKPP70u*3 z3OO&r!^5jjYKNr|plwOrB~QpoqPakbgh^loskWsb%{u>WIs(9(P_ zmERqkrG=@y@i0D@+f}dU71XRb=)N>GOaa{38i~-Jp@%XK<}fZn)>j*j1g)iks$i+( z45NEdgMNl^q9d?f!xU*b@j;?RgVto8k==Mvg-Y)(bj56?qA%KASs?CULokx{p^V0E z%~Ua}4!wje2osVqX8E!#2VUayKM3GUYV7WSq$A+e3p$`ZrFJTBY2n$eWRxC2Ql^!wScs7iV}2 zjp&amCk|=v7Rz>fmwHS%HIrb$CP?Q?CACiLCB>3AvVDB;;q zW^W+v3AELZuNY$=e-e7GTirnb=)&{1K5R6oy_1+|FjlPcj>9Jl+sJy0Ij>>YjspceHii=Tq2x z=lyC{*hgMt9WO3LFLXH}9PW1Lp%rjF7n*^|c!g(k$PgrQl;i!tDDIbki1jFCdq3YN zC99vR)9JPdhqttJ>7#B!HB(r+>x!tIfIJd4!!aB8Pj-SwRrU3w2lf%jBnkoU3;1Zm zBOhba+g?Xu7Zw&0GoTn{QgTW_pm0;4rnA`<=>B~qu(aw{NX_=iIx3wcy)a+sb(on` zcfgHlm&QJnvAJCxvYnMA)*fB=_VG#iDC|~9yLld#q4dGnxQ?G+(ba##s;GF?RaIMo z;a$&g&@lM08z9GV3Oj=~76DfD)*t+Yr$TL@2S{Ue*(URzvP+2xipg4G?v-PZknzcz z=a5q-z1XXLb-r^d?^TZBq`;D?OrlyNDCY2VA&X4>sT_-bo>;oxI!w&NeSijnGtOE1 zuuNdvU(3vN8mQxVxbek*;Fqylfmhjd>&!qLZhQp72^ac?ve zJC>nhP-s=}y-89aBvEO&((xSQ`paAJYSz1lx`@5`YBOQ_FEEefGMosiw++@ex6~z2 zf;%ie`spB4(%!LMd-phut$%x{PxUt4 z5j0++uod_T2|;$ca#X?UZ5N_5^&m^x!MdrD%Y7qhSI7e-$yuy(5ZDQ1LrTa0w$M1_ zSyh{Vs4ZO<0GC5B^8#QcHg0*vGOoNQgb`R*+H#P>*5!Ba`G;Bx?Pfi++lk!4y8NF0 z@o20L{@!nj{nb1a!{?Bdz*@d%D0cHTV%tr{YaH<&(0AC#5ERR2?OdE`Ru{p7wNk-1P7Wpt>~ z>0Sd4!y^V4g;f0A_C?=RW{c8D7w$Y2P|;Y>Twv`vw%}ND@e*#-9RLhw6R;G&G3- zcyALd1QopjZM$Z_iCCQx=nGzeoS|Z(#yR@R!cg#=P0!1dxLO14OizM1W&kVQbp+7yr*A@Rt__Zx#__7ACf}@+(R^Ze z#;nOfIuNK75$pN=`*%#XmFbc2xHuyKX2J_a9OkX)({#SP{rK^t@LyX$<)1=2jjz@~ zMqcu4CLe65s;X+&lcQdj3(+!F)zy23avIcZ4FfBId!=NFf`$~YxW0h_v(T=|vXhla zvmPMv`YrS3TKOYsr5PC+U(2Am?|kY!1r;ZoBBZa^&Vz`3#_De}oHJ6yw7dZf>rXzd z>hQ`AmV2JS`-k?X-Xw0<5Cp7EJ&RO#IJ5RZH-#D|IQ zU6^X8=@K#R{M-LC^zV;Nq`)ob-^rm3>Y{EQeW!4{H%>K6<0`aYN=XqGpj%?&nYKZp z2%{YdFN-NP#Q^UBz|*T79M6y{AApyUW>9R5T;$6Ww-arWxRs$?_uSaavadSKcE5lW z+5o%}7$ESe;?k2_fC~mOAYui6c1z9-F4^rzP+JfuGNR#U$|hQa=#4Tn6$d|`5t&_s4P8L~CdbY6`Lf!6nRJ9g$# z-3rZ+3@;ERkzYRY26XQ}DeOLR9{Tq^QwY4!cvqy9W}s-aWRL^s7ijfZtq}{vSN3x@0iH{5ic8_uGQAb zKu?c>sSfn|fQdGJEjObNB~fevB5}gPm~0mB$@VN9W+bB;v^W3JRw}yjsi|V*otc@L za*;QpS-hb$lOsJ@tEVpNQg59d8MgwF?i6($nk6R5f!kb$7n`H@G)Be84@0@O#u9{) z|Lu)q5D1mU;xG`R&l1&_c0=RP?r2I<0*(0efx~q`JS3<2F#sl|h~52O1q^^mJxho# z3Ltegr2l$mtT&lEdcm3uHjo0etoD63sZ>h;NJe#!Fbh;vAqK+60068ge>6z&LNhdL zSa;;Rs5{Pp7mwjcu$k!JB?;*wM@PrHW-JUQ+Ce~Mw)lGF4FIXsG!a69OEBoe_x(Kq zG&#&9ARpb7rar~9{TYi@;$qoDg}(d!+9wfc0``x*!S~t~>EIqM*emP28yUG%w*_?C zPtfr4Qc);z`A>i;iKvu-i4J8V)}!CP)g@#@v>1j@)an7HYu(TVwPt{Gq;fn^qVMC3 zTkDmT9jnJYQU!rLvium{E&YHlIbuTXmD_lnV$a9@iu6GblE(neFczh&_*d!&ZT#` zH@2c)B9)hz^F3IBb+*#t3X=J7?c*UMgiazo1s@*MQu*Buqc%NORs8j5BcK>w>A@&V?Rk{X5E)zs?5Prp1i+mzCw;D^<;d{wvGf9@qhUND-i*O9%lHO zasT~&D!S&*e=-YO9!Pnp7&p#tDu+znkg6zVb7a;=j!{rke$Jtlo9LMObyKw#ho?-W?lZ>6 z4k!y@g+3>#ML|jIqYtawUM6~a9X-9z=>!17^uXvWXir992L(`N?i9U`!@%?a%jvrk zh|v#fI&(239JHIqJlOw^;cHx;+(sWuG6uVRK7OcBMuQbkYa^asepL*->fU~~S74L+ zC8w0p24JutyoOl@ZlhW43l-DwcWA6;?}dV)=`r2f8^J8~r}uwWtoPPcsluySUnIMq z(7zf}>YZDUlbxPT4??3ZKQQjSF`jB^Uj6olMN1bS=G5@@>sLENyv*CUI9~fOVLm{i zf(0MWJ9Z0_88!B5)&D>lVk`~0c;or7M)bk#)MP7RgMrxCy|@tWfx=_XR;*Sd_asRP zD#vtK(+SYXGJ(u97^!V&XwNV`SV5(;TpjRx2yN1N{a|RXLuN=8IlY1rXN%)0BPn6- zj-hYSR{QT>_!NR3%P%g;8D(|l5nSW@T#My*h9U2?>pM$I;I9WvAA@E~uDvb2thxCZ zG#+$`I^h~mh25)aY@{!;feezyCZIn%bJ`u=m&q|QH5uWqIKFCBw8i>c*6h}W?e28O zc(Kzzz9UQ^s`6Ky7&DU2RH=x#4>K+R3f8NP=JvsUPU1fIJm0E5PStOYaSXy~Fql{* z!8SFpUYcjdId=nt+6%m>;j z0@Hg&vH>RNb-DX7XW$O&gSKB6brF2i;co_j+uYW3(=d2UUVB9UwV?jSBYcmB;fi`* z-RXa14@$cEuPgl>B$~>@1)eC6>qxi0$S^dzFF>Id=DY#sfL<2hZvMj%ARJ;&gF4B$ zX#I!mD3R>hj_7l7x05W%Xvz zxTP8@=@kN`&{RTeoB3lXpJl?&M@4$T+81PdBFdtMG z=qmvsw{83Ou6ZytHnVaExgFCTC!4ed_~Z3x8P(2JZYZs-5(pWXBVpd4x=TUQ{WKu`YSk!fURa@PRHC{ghV5~8o9ZDd+e`ntN8NC~-iHXM%;X$T~h)|IdpqbV!H@$`j@Qp*`PVHmXsd}Tnciy^tei3On5MhH|skj zs@a90ly|@g!7NZh{~!enL=V)9`(ZHN$NG=pu-($$A1d3n2M zV8j-EB4Bi2YR5RF;b(Ma<5V)`l#$fJn(!doUki62E=?NjiwHt>DZank2OI1Py&5Fm z3TF2_lw*tiOQO{-=`odan@_^9wt|rufIYg^L6Fn5p76wGCzs z&gb}CwvO}>YBj;U3xvp52ECJ-kKAkDWzxy6M09&E7RG@hLZG;GnS}+0J#~Nf!oEZ% zkC@8A;6OgF%k0`EFF25)d7XbClTjd_j!ZORKU#%C!;F)^7vh07g_i(1&VA)gT-*>1 zj8K75G0su_eSOw2LoVN{`k=StEM?k^7N3|pq!p~lapla@G%FbXvFmVMb@k|Ag0aJx zA3Guvir$6(&;}d2`5!$`0WcnyU=-TI*XLpJpmy2=XHcUV7+Y~TH-3B}*+v=kwmzdfP| zJ>aZ*K(pY{lcF7e=xy5d=OMSv+zP5xb<$BWTLcn&RKr#Ib*u*mA9!*>BoxISqt~RzBd>FNMDRn z>M`2Lq@)v`C5Nn`G~p6d1|D$dp2Tq4(#yg0$OK8P}ZqUWwA zeO_SGAcwnl6A~z{{2OlT0Si>WZp(k}eL3+*UQL#BbZZi@@}Ld3A<4wD_v`QaY0?T| zSW0k5*oIz%)x0bPH2qQZc;Q}ItlOpa2L{eBXCTSx>q@fl$Hoa0>-Ryj@c-UI$eUyx zy=O>oB0@=v-VL)x!Xib>4Gre2a*Q-LB3a5Zu2b1- zCJ-Uu>YopU{-3;BlJftvS8rzgYi-x-15ej#L;nNCP6-U|_dobM)}ImpI`!^AQpIG{ zK}WBVPxu0eHd%Fh6N%0H%Dm~7!oQE+)sqnUtCRU3ztJYA@P`Zc&HwnFAirjuq^j6` z?GSRV4Xn?RS$*_>bhDFn7!*r3RB2Xq^)&v|pc4zl`6 zLvv#(cQ!AcXrDSDuA0u79AWv+(nib1VUkMt!ip5HE8ChFUhgV!*;~0d)8r@EM$4El zpzf-MxsjaSlN>MZy8Afw^PoTfn|njLhk4TT9Bg%Vm|O8Un2t1GXmj71IMdDtv__1~ zn$1B3d(|e~PHuv^Bye;F7&qdPhu2$PS4>zbswCTpAcFsXl9R1+ysy*6G5M*l+RbO65@8^p*pLMEUyMZ2j|NiV(D4+zJfFFeaRl1!Z z73}g7-0LfcVLpbZN(Z$6A*1-LZzw3JGu-#}_a7V{UV;q&v17+19gw!lOmpoE7m6Vl z5D^~!;;*Of?t!A#NvWw8Fk_VcbLw;G>2X&a8HRd+HH_T()CFLZ1qeK(lOn&MYnd1& zD;lx_h7WHY5N-Aywr{JZ zw|DLamyAz*_IrqxJCcFtD&KGruIlEa0H3@39O1GW4u6&KJ>-Nos8ReaGhrm#+6}lm z83$3w_9nXSjsur2?T`=s>!uXl>$%g?Et-!71d>iR-SPA3-svEg(i`l1`|!~s?@1n! zcD)f-*Sy&V1rS_DbIsg1x4^)_aefa3uKJ0_y4`-tg{uWtempwmtI@6$g2p@EOOIy~ z#xEGbfR0N|?=7Nnm_Nz6BhVTF`L+xqSzK9_VAbQR zonO~xH&%Wq4~X(i8WLRd3oqraA5z z;{|y1Ux+ldrlNb9cx|x%^w^!3`h#w?<<$~bNPIk>3dtQk1j8w1rJ8}~i+En0o+_$O~c-tw8W=%oxLsn9=Qh|;ja`HsqngI*(?q5y`upLMnh zIJ0%^lEDgW}pm&e6N2p#izteI0txQGEFc?MdE!`}SewAs;U2$CHiQ9h3)i zm%k_*=j@Y{YgT+G^K|eEuBqpa$U*h)crRHQSq}3Po@Juhy&e9>S>M7q2wj9ilBME~ zJXA;Gu72(Ih{aKfuKhl$ws~hBIatipiZbQTHkqfuuWWObj!!PneSY*$=+d2R(3eg$ zcL72(@U{kd6O@k+XRT=3(^h<{Xhm!>u?J(yHF z>~ZsKW7V;X0*S4=mT%R`u#8>fs`CBP3vERM^&O<|8?SUNfAB6^V*A^3#$Pu}7#Hwk zRV6ly@7eRRV?x}atWIHf@&)I9Zc@qB?RHiQysQU9?8>O2DrHouEH|d#-sOAQYjJC~ z9fh-35pHQ$`@UObzi6+=)Wy629W^od<~eujOzl{L7`t3QWv0n&lL3y@dEUWbwD6pn z87t0NY+5DjRob@D)oLo&wr&pM#OE5e?Z3O@Q}vsx7e4VKkd3TOkm)>kXC06O;utIz zYtV$P1!NNyxxEy72>(FGfYF?BN^^mIQ@{a}12r&qV^tLnaZdj->(Y>c0Qu_a1uQYq zZcD#rT0;JI5^wyjdW=JkvuUDap}X6Nq1mRBq5GYPZZ#XShF7hUvKP?r^^2{|+#0Ia zzDDijUJvwUlHd#sRI}ytF`o;tR~p^`hnaVoUq1l4?7anm44IuZKnt5g?Q(WlI;f%k zDFbx~OhHi|BP?YdV?4UrEGN6qkWxQRHiz8X`a0HP1HVZ}IA;L|S|<73XB2BVRBb;I zYIc|^C>O8pGiq@fK`*hAx2Q}w!yQ#+(3DH0I9?2U=%_rkJ};1?U}SXv-GH-opOMqR zifNEJ&}>|M4dg04AVl`+OTznx;CQ z{3k4(`y6}axcC~AJP~Pa+RMki6 zCf|3z?f!te(f#Zu5s|;$&ViyGVK?u?#$l8RY%|5fL6RP9?e!%rhYFz1Rc8q?fx8gP ze$QsQ!}`HVgOXwKIm&1BY}zeNba7SU2VNsW`j1qP9`1%!OSv{`%uYfCR1} zBHKGY{M(@v-Hm1PDktEw!`|r%$;BKZI_%=0#XP^_{PL5yi=C*lO3 zd7Pf;oE-TapBuS`>KCPjgV;EKG9=lLCu*Mep~Uc2XHhqj^fWsPwc`GwhCJf!3X$r5 zu#tErK8Yxwm>KX<(`UO`0Xi&eox4ug8Y>^l`Wpey40ciX-<67Pd|U~I7a1o)8KO}XnW6FxoO zQ($Tt`{^`Cq&I zo_SMezub#&J|Wd~wn|`=O-%XgNDca9?_Oo9FrH+YfjxREtx4KS$=I;ypz<-}1Fv`??5cttgZj zH#l=}TL;u%TbY{!KU+-Pg_P;jEjJ($Bp5k$NNsdqe+ zd5-*@?x@Fr4GoV%)VIC;SsSzkv^D@D)qTAJC>rZ_oLspn@%CVp!pzRn*CW_kHG?T- zpq4prj=%qv?!geZD_(wvY?Z5Rq~CsbIeT#1He8_IZjKkK1D_Z7u7j!2SeX=&MGyc- zT&R;6^C{ix=vgh5Vnzem)9P2=9h1tfaUIIQJE53BWiObh4g06RlbYu_B+UxA=b%L)97+y z$%Fe~IT0^^D;!cb2eJLW1Ih%ZCQZPZ|HV??#00P?2zNff)*A5+lLzt*(ne%~GvEEq znKT>;1?$!W!ez+zBbcel9GkH;vAC~}7^-s3|rr#p~8bOm4++j;Y=lc6^mpoa= z_C&F@5J45cZj-S8n=79K_I_%rWKi%Wpk6yx3u-Oui4eZLRPtus1jR=W!(Q!bz+|Un z<5Ieml%Kuo)Xp$AOC*<15bvivO1CP>Ua{)&(=S_C^#g6aYwtzJJ_aeN-lq?)ksv={ zi^|v)EZ+1F;N=HNii~`%tqt_wZYgo2Y30=t0^T8Wp!AkvT7=2p`oxF-={~d5pKD>S zbbT702X+KUgy2N)rWH;ALlcw4J=SbWTCZ~C2TxJw6IaBR6~uEI5-9Qea(y-omF*z; zwyeG*rA)p1LFI&~AC)IR=xont$M!or4)KA6fa#vv@y`tvv<1Xy;ZYz#pli;K35kQ* z@})EtJn^z;#HYe~@5L@a(a%_X6!(T~h)}~H!D)-1=3eg%FUM=^oe^8V2W);S%N3JU zd`|8Vd5IMcTos1pOWuLQlXyI)ICWnp!{4St|gZ>9?GWe8}<@?sR z>Eq8LzelF5j4BVKG~~PM4s^NOQCosZa$y^62C8p#?mOJx*=%yj!cw>!TocU^q%8ti z01Lqjut{=G?4Z#ARNjah$ic3GR{#`xRiIb zAy)bh=Jhe_T{K5Tx2zRay;j_RDeI*>7|?_jM~^~Y0QQ{)f54d#v-mew*L~TD3D7p_ z)Tb+HO{w5{@+*7(#GTs+M(bnA>aLq&xn!Xb_sRIZiqq;QfGzWvdN`2SUIe=_dXx}0 zUU|8HhzX`)Zjv{}&VRZM8*n3;(`#XeMUK6ywpPo8n6S-|Yv=cli6~QQv{3JHa$gH> z+$z66Yw*T{UcW~0_HvdUZWrj)L>U`wtgaasG&n7>?Ii-{vDWnPa*2qa!62u8?!&Qr zj0@xd9ti2Oqi3ElF2rbDc~C@h=x8kdlaGpyC+zQgt;P-9;6>otnQK_hX}(gazxb3o z?vA8o<3{nzmoGo$k~w{XnDEQHyRQ7uY8v2&Wys3)qQ8CBEMl5JuJ1hMyv}tXt}oB( zJ3FEd6mUOq@TKtNKZ&upV9}Hz!M?VfG^40dw|FP)@B>h0_+pj~!f>91GizoABX?xA z9UGiqya4z@0>pTJWu(c&Mba4@T9^}CbQCkCkAntV0Pn?T3{_^}K%J{*y(h_CcUHJ0 z@uzo86|Tdxz z_RIETlTh;k0FiLWXzXeOMDEb82llxpNTYnyxvMD>H?^D6o?V@cr%F+JzLc}v?4jNiley_~NULIoN96r< zjr*!WCG{iT_hE}g*+=!+zMbqz7`$i7?KjU5)%^;z?a4qfz6*e*Z}e!4AwL{&adG+3 zSOj+B3BNK~aDxyQiw6WuMbuL?J5d^%K@g*m41oa*)1zCzu75pYX;_s(+}jNjQQ(c{TXBioe=W zje@<~2VJ-EJEVdzR?6_A@Wt!*i;EY1Za3aq9W5+v{^l|mV99~@T{dw9w74UAy$&Pg z*qr5*uOqf3Sx+13X9)fl6?+S;+Ma^CR{Xt7`Z)0eIhOT;2xJTLdBWsQDI4@(wT!V7_lap zJ%|AXf21~8qM;nOJ_b@oU%!9%w1f!6?Ml*N=xRbTOzwhwsv65vIGWdE2AR%DSNUuo zC`!C_2x|7A(oIid)${T)H;v@?kw%l|?bNVZKl=#Hq#tZ5D+~~eBh5HMmB@_72TIMj zCXU+E`!ZWkx~+5h5>c+yOIpRf{_%qd{f}?j1c$*&J8hSc4WTAS)nyd&4(#t!8`i1G zLB9L(Q9sFpTf)k%Kt-_+LbZ6Xyqhey5$tF#-vkS@XM9-@qggpZBauV#P|fX*t9z~f z@=yUJx>&I1fUk|)ggh@E_2%Jr1~@ehX-yludvWV2*^u z!i#0Wbt=N!-$X~>S(OBEwfp1=P}@><=zK>cIA81>qy)f%fieY6XXc*sly-&qnQkOI zgBz++OHHwuY@g=nH6aGnJGf<;|FnwSfTl)vTgp20Hr9}{4hVi&&ASOitJq&8NDOnR z=Uihs)I!fdVsw2&Nt$KTW@ibgT$N^RzbOA{$3LIO&qGx=9JRWeyZzQ$s5Hqpe9_)u z1C3?uQGlMitRACyixD9%nVG>-srI~t?TB>9Ad0lZ0XCEO^-1A(5vIx6DDOG}C&M3a z04@B`T7Yf;$f>LQJihblD1cLxAT~mNKbB)&!=-m-XE{qf=G#7T=av#oW`9lgg)9g-FPoby#)ks%FrWOvR%pp{wI=}4jYpuygPPy4 zX4`p4Tg_N{<)<|?@>(#`LR*6LAjw}2d-D>I^R($G$bWHo8n&St*HQ;+jlGGD>3elg zM%!;b5ZA3^=sKR?z-g7+|Do^h=*P<&YVNz(=;3)eDbt-{LW52paxfQAb(ETcHoWnj z_z{2YF&(?ymOp|W6dx_>Jiz?gf;)seEY-cr} zUl{HxuCW-VSBz99GD4#kR4tSZPuzu+rz;dcnAsrZV4DVciJHtO8M*S$nSKB{ znG$d_Qx(;)ugAtM`xVZ%U=d#edZq0+@r>OWWVJ5!O3=*ZN0-dz)4Ow6()&E*L~Er` z=cz*Mw!@`TH8nNfnpxhKroSfz2{SGk~X>sZ`>vi_ei{#6GB1 zTgq9Qw|PKHPf|i+|LE5<0J*>|arx{&ZE#-L;Gb~NpgB1dK+HnUssN`EHBJ89@c6xv zc?so&EPHJ{oUUONqC@=tz3F-BvZDb&{?^7bTvXcDE?^EbcBm@84rBqIaDw5gwSR0X zA2=5CYlr#TeRe2>AZRiqr04SkM^_-H2N^m%D8*A-wk?6m1I9+)gHQ0$<3&*Qz}PL# zTh0FY7!#bz!ZFlovsDcQO~reE>%0joY(Glzkl6i>f#CD3V#@-H?fp-#>si5caP_Mm zm92}px3=G?TcX9J9_Yq{5)~a-HjUInK$(sRj|aI{h$!YhpXmObmOpR?LCHW)G3w}0 z{@#5@N??Ezv}^x{?ShjGzltyjP>7N{n}C}`uSU?Lmm+io2c4LZJpcXd-ub^?jiO;{ zS5ytnZDh=GItr*ydnAMXaTHWf7y-{r&u6=4t0$1lT!8G@TJ8C<(3jf$`(<esZ~ zu;B`d+*vGs;tWv?srj*-Cmvl<6jXtl)OBwuaLnTJY_mI6^A20fhO}e4%DK#XdJpR2 zMlt4P(xL~99vW>yU0-(#Wn`D7^p+*|+0s>qmBa6Bdo6bO_@VGG8}-?b<3IC}huxbC z4FbmVzc5n-;r;PiK!;iMsc6CKARKErnC>=u+ zpmBk=Kb)Enh&~9%eLVxPwd(UXrCVM&5z^fJPU>ha570?__hHj(OH=v zUO`(x$5Mc6=}g5#C&!b)(&|~Wq=O*&l8y^U8dUhzQ+C z=2!#0Qd(o_jf2?+Y<$5A?(*fswhfpf@F?*)kh=MFC(CtGe7dl{UMKi$a?Q#nv3BKv zZ8|z#JamjPCuZDBFKA<-oD`cm1C`Z*zD=y;p-z>UZy8`6;kZ}FguFY2i(=*Gw*TaX z!Lsu`o{1-&*H%`EGg2LRkK=-HhUvW6##eU$mE>9W#U9V)C!IIO#OF4U2Z+Uvc|~QbXGk+9$<8Nz!4K(5*-co(H<7`@mioCrR>< z6uVrn()lH$4&;}lz}@C%4+SToD?v2TPFey=?a2 z!$McV)+sdetCfN__mGH9NI3P1Thh)c62QWuo)HtqHliaxKlA_ox@2Cz&ao*1Y9w5o z1X%;ma5#?#VJkFc*-A`^RyiY(g3tJ7;dQk@%X;i*?7v(e`|a|raEQ?&s4JJ=*q3q) zEo_euYhdNHQxb`L9LQiPpu`JX3yCQFsi^8nnX_P1N*ay#F2hZdNynZk#cH|S=jKe? z468k_jb?R09)@=92cv;u)2OH@=;OHh$xuCJ=bdwh(6RcZ*xIU%Xl$7MyA%er^k9bg zg2rKR%4Fq!x2b*GBU15_%~#m1ydrq-tpD0V^v*HPh>bA$JC%>(I)(sm>S}8*S47TU zDA&Q^g#LQH$JScTJVNHcpn~W~bH+oyMjJ9jt2e_tJ3Hmdy!- zk9DBGfBHOM(~0OMuWYB`?JFfVKM*cHZ@Z6}@T$)Ih6Z1{k*L&jDE1J{e4@)2)_n|#B@)er8MY&c4#^SaT;`q z6&nGEIgrZ@V3Wt5z4XFYb!xf&G1)n5QI8ShBPPg|!{atOPfysW7F_XKU(xXMR;S@D zyuV_`26x_tF6@Ag?rYpl8qbhIo@y%|Uf!k{&1V`|23{Uw|MZLW(`Tr)+L^v2t<2RjG^}Ce+$|!KN#&d8nK{+g&SYt2 z^@M+UZt}Z#qXPpKrERUPph3h>2xT(#?6{YnJ@*cJrGqWX$dKLq;G+xl#MaQzNKH$- z_o9c=3f1HzBO~NSIQaF@+uQUzbfzmSFOO=G+rK|ulLWizbd(8u|GQumxZ#w)Nso!K z@ymNrR~iN#xgvi!^&6P!)GgrEwSJqKaqH=Xt>k-AX3w4?2ip73vFYew>8vqs_S7N} zhnNtUl0ukQ4|D7XK?3;Kf%=*Aq?updrLf)T?eG700F0~#;?yUbGuCk_`1Z;_W;#ns z@WhddQY>+PD0K1zhgpRGn8Tb_7vVwN{F1kHLz!DaR%SpT6;OV`{XJ}fv37?s5fk>E z!27}pg7G)YfEDIvOZWIzgH<5fbdQ*GBknD;2EUw8&%oY*hdqA0`peq|yk0o9V^%kR z*?bs)M~z>;z2KUF(|)mrPUPt5_x@ib1c`Okftgp`yLmC7zhnQu2s1DoW1jM2>i@QS z0Wv$n>MX!F?M&A3`{D?f|IVQyVIPPEV_rb7w2t>Y#+c0c%KOf+YO z65+sEtpzb5RMj(-Pw*^UBn~qsGeq#&kk()*gN~@im}87@2_pahK6{1b!G4%G8`jOO zDK*aJTiC)n`Dca!G+yK-4GmQxqhElx4!EDFzF*ieFbG9JjWM;e>y)Pk*@vVr+1ENI z3{k2Z6+Lc5QlXq}W9x5@oKt`K03go?r<6)cOJO6;!pVsS zDDe&2l!1c3IRpOi1Q>byHrV@BQBfHl9)_CadW;P0u8mLpeIg#>TsVID?AhIA2wXu{ zdQ#F_HpjtsC|hH_WLCGoe_kWeNnZ+n`}Xau>2-(KSYR-4?s5m?6|Kh`QQjgXrL^Ci1zUEnHkO)6z82gs6o?i(B!M7xbhIOo`_9mje&b zftX-;=so+#c)rG!;a{btI2A-Cco2CGa-W~U90|FX)?*+S9268pyy6A4hXTIsI{%D_%`^P>xf~D(5AfZao10gEgw}ZDV`KFVtSZpyRS^#d1KM%W|JCMG~n z%^yb>%m17lzdqfEiW3E?0! zFF&EqQ!A9@dq-CS*MHRLby9}mzFlazP@!;-+j?mH$rWHL z=*Uu_TYEflFFYu{VV*8?R-Xn?Yizu29|)Yql`HwI(t{0mPOYd@i^OUr-U{z;XaZ-^ zE{%aHK>{-9QoL%_twU{)F;8SZv~zkIt94KJ-!7AW*QqOQVq~@vk^}RFW1v$cwxFm*EtQW;qvSg)rxhlK zdN4QAuc?u-O9VT*;^J#JBaNBIV(}0ry(Itjg9x?TvEmaq2Sz&|6&60?qr<3 zHY{TfBcA{X>r}!3v|$w=Y>`At5FC52sg&smJFxtg&bpghPc7%uUg5!q;&jx${X(!nT-n@(bW0`PvTtKwqj?xx zYug|*#Us9nTDg#HbOeQjtkMQp7{FdbTkNAJFP%0BJeqAF`mp2CHw(#Xhs4}m-Xu6- zZv?H0IX}E@+BvU4<~&O10OP~ob}J$xVniQg$1~PdzJ&E9r&cPkUKtNI~zk&PTOgAJ}{BWkIn)Kk;1L%-t7)SposYGt-lH z5Y5$DM6R>8wqBidH~)NY3&f#C^s7&&$s=K)7-8rf%pLvha$I~ooD73D#BJ8n0M>tY z*Q%uu>aQWxhtT!Jpfj?;VPRg01R^ma9xW@oqMZF+KAB7&krEabz8U-U>C-!nLJM-N zku(=>a!B9;WK3Enp-a8u_oAXZ*xF0$?+tMsg_mD)%&-gpTd z05Xm)s-hd*B`-+8jfj|=oAa65*w~yNKd$?Qo(OYs2rILrtE(`ymW~0cZEI?7KB~?h zdgnzCNeS^0cD!e(j8WiswLw*nyMseO&f6AJKyl}zbMZAhT;fwA7{+TvF%Qc$&ceZA zY;9eg_S9X-N03@_y<#uFo8tMGp&j$#zW^TYy9OdImnydh>*_iU4c{KU%g&y`{mW(V zVH*-sNseuhu?FN8Ncy$i0*%LC#0!DKLV}zJQUC>kc-~!qp7J6Zj1hs&*zs2pC85zgSIVKD|X}zGyR^=NY5@W03jrujcK-P9ag|ED_f_#@K_TunFhmfySb z|65#5=TJ2wDM;gP)?+9@`1Z_p|F+jgY{i{xvVt(9Jojb{su`0(ch02scT(>_7x&Uu z?#LKAA%Ne~Ui%ij$irb{#R3;OdNHkH{G|WyF3Mv%>*&?{b6yJJ(X<)C{~z#h2z*ON zHW)AME9>P85GYRo#rS5Z0Mr6B&|CC>=R=M#{W+6a9zda{-Q^h33x#r2q5pjTf^Ce~ z7=>y+osoh5#XrdVEO}82Pz2?X=KHpvb^d}`=39uis8*4Pn9TVE+w9UJkD?zc-RCfc z{`m*Y&*A@{!u;y|-?<7Z^UF3rRL1g4V!FQ?GA50R{*PojY z(1h;Ms`PWt!ru--r`mA-^HFSSJkL2bD8}RI+Vkh5m%V$@Q*Xqw3zL27^2g^G-siWP z@f=zXi#A>nQ*0SpjvDJW@V-2rsuytfXa{dc$3)x2xn(rcmk}G1w+CEM`T1>Z>V22e z7_q-x8xe0^Hqcon8shhCf{We*r7w;9 zf2rH8)S&qL=RWp#+%kVmA4e`Ixq-aDa@tExb?HN)JTmbpkDbCb0)EL?QX_ud-G`t1 zU4D+fEe_6?@GEy6q}`<}#66&|3dZID_U_EFPSVuukCk&xT6W9i(*7KNj*Le6NqH_e z3S|vObD-rtT6Ol9?&iCSCjF3KJY7b+w=H5;ktrIb?~V?>k}N{|629+!Eiy**85Tlr zCeB71_&(Bfrd|LjdSr%yhceU7mSGd=E>QVTnwT|DrZwpTd66Yi4M&Km(Qq2MBl5q8 zI>!Gw>fy57(buyN_(*9iCs7Il$hyD00P>h?X9BLoZa)X97|7gp;g2P19dkn`PjDIn zMd6i~No;6}=uCGs1Ux4Xr`7OLN$xLN=S`Kjv(bLEy*4dVrPyw=WZVS)4qOJL&6@^M zLZ(+6=Cc1yQ-iJk=}iyZ?|XN6b!Y-T;pIqj%gjuX3vgG+)qbLqBrtl}#Z9lnZPV;y zrrkXa360m5pbo55tei>fU(36hB(nMo-+Q=rNdty<5BRN!Nc#J|@W<4aU!T;@$-lc^ z=NF=*5`5f)ur$1k=0rCkLV&{oW^{n}cZ4^0!&dJYz4SFCL|ojE*}`kSX?tqQkM=V7 zrdRUk_Que`af zdLtE;-Tlyd;_n;g@oJ{qqMMPB@oySim=)!Rz`g#y;Y7zSP0Kb~_|2~U3TfEwC5q4%x=pXAN*!kEGw4~YTGCnDVNes;y@ zu1m1HXy&y0`y`R!w}0QYgq7KYS-W2)-EUBqwVO{MZj6oSO*BlUo@MHJ<_7c)ZeZ#$ zGW_ft>?5<&yQ`2lDusH%-@p5ONQg0f+lVY@R$=emcu=!Ou%_0N8Lxh@y~{nt)N|wa z&8D}u7`}m7of+Y-F24%me!AOy*tn9|%O*50#R9w`2x@tKdB9{d>2q=#& zQ63tmsb8AbZ0?AioMP<`pMBgGfrhCb8D$^0gLA`!600zpWujd$#G_=QJL(Psi998c zd%N;bncDoA{+!CTWJDg}&7)1uVuE1RKl9|2a#iq40?Ygrf6t;#?(6ITjZ<4GO0={C=FR5D+cInaY3GXJ4lv`8o{!N8@hgB++Ak&c(E}Cav+f z8!SJHf}r1^<%V572@FmzxnJ#4LEet^{_^* zLsy-;Zsd;DTxLTh0PlI&q2c=E6giGQ0vFu7;sYW#c`jV82p0l5@(SJMCz$hc;AUk+ zR4qqI)llP1av9D5zWz_PNoWkP73#RkRi=1chsayc+mLHPjb3D(<;Hi$_ITImxr*tD z4))&+*lI_SdiEE84^R=wjE09zgdBr$q;sQ62E@@N<9ok@I<{7WhgvJZFA#PE0UCz2 z1wl*Tb$aX8GWkUo{(K(=U%cmqA0lD}5#1ycZIZuasSgxpYbe~H6$iR_{ud}RI*l3V z3c4c|Q4sw*kvBxCy+VE*0yWjGjjX7Pj!(I}$eWP6FnSJ+Lf&#UIV4vTM8`Isfg3b> z!$&0#{vvYPEO9u=rhp^0zw@ya1LdEu+5et z*pXFT%}o2H^y|(XU)@dd9o9Ujt1eS3D76$5vf6qNYI{f+!h>N}6Z-p6gxse-XT*1O zR)V=-3vjFqOcJ9A$BD5^Jni)amU zCF}p>4jS8UU#r8w*bybbbu8V_SFXX=HEWBqPh_n(qJ!lCf@4P0XF8Y`}BH_W0 zY2lXgPK{mrOIi0GT!|AytGX{Gpth`Er(D)(l<`#BOb?5h^6{RtGA)NU7trq!JjuMTk|12&KIP>vv zg)+quS8k(J;}3{tOZF6DH^%HxP689?b6iNq9VO<0lr4=bqpT^59Fc`_L>714G;+wL zA8m>*xgK}{Equ`D0unyev2rd!QR5bY;Pa!T-I?Tez)!QH5Jj-JmNl9C;z5FL5jK!0 zrtE|K$L_$NGozp5|Bxx~T(A--O0`8E!yI{bYheu$_3>U|@4Xhg#>#iY*g#}pTG#pE zYJO#%?5VGx(g@Wxr%?sc_ZScF;-Jf0HDbNfp973DaM5ko9cwe+i8AKOcUsJ7pve>a z)6%ZGU4<)a6`(R8{OYqprfIMI6^HM86eOU!@)M6;)HyG5;}BHb5bZDAWj_-Yf7+CAipyncVt3z_f1Hyt)j>cJpmInl&jidX^X)wUP?o^^H zZ_4he*zz(E4-dP$c0j1J4mhm*N0RA_y=y-mzy^ZF+scIcW^3PmX@}KxXOsX+yk%WF z)7Un!E^1Q-h}b6K31qkjB@}F1@R?vlP^Ss5H(SaN2QA+7hEbLVsVERM%DKL8w#K<}FeaX%+9J@?-&zp`l*dqJrWsYrYz~aQwn{*=*g>U7|a7*Et zV{UHWVH7YHEWCS6YG)s?-y*V8>H5acRi{N!Nq88P^)ldhyI9gUW)%53GG`5Nwu~$t zkeLrBJ0HYqJ%v@B9~1f!Owbr6ICik_#q1RNgOP`rj$S8-EkA!Ml5R9~^f?kXs+|o> zmfj?Tc>Co)m(*dbjIKjvQwc!h{T!Vd@PXqBTBl>ac?SGY>)i1pNNhULn=co)fsf;{4YaK zkm5TSTY2dRdqU4aoD)U4s{WAwcQ)!|+e|Xad)kR#A?N*c{&^i=?xnCCK)J?ii&1%8 zF$SmvHXV-Ngf82O$b}J3L-aFijKy^=*6GbWJP+6VxW9QJSoQ1xw)QLGD|CrN|E$EV zbd?ym&~^uIb%AEjS^0s4TBD0R+$u79lI3H-5w<>QGrtTH>pmeJqu2iklZ@Mb!Am4E zKb|@{I{Y=EyAGqq5%z_Zd0{$rvv-4UhA`O$uX7>?;p7!mc4|pX?kHDz<>yIAC}i=@ z%^oFwH`aa0lUu?HK(U8`=JfpG%#c3R`Bab4ju_bH=2A{z40gVWN|)^-ShTb^(SK700s>NYWe z`B^YM?W)dRdeJV4bDY$o*7wiCbFs^uU-Mm0w|u{}55Y|^-zw@Gpz@iuuZrm2g6n1@ zWswUVhK*Zeu3-&o&3VK0r(<7@VmqNxO=Sd>wqk3j4QVf307g>ffBLL90b4ZK^Pes8 zde_-G^kR7(rs+MUWAwFBnztHtESivD0=Q%Puv@$kZ~Ru4ty!&EK-uH|TfRdv44G_P z+IeKS3T~H#*Z4R+Jqs3}m4RhkjA>_H-nS&jx>M$Yiu|yr=ZUCA# z>(t9}mGQR&0MK9e^LT*gh8PF%l9nu_BmCBW8Y8vv_U)oBTAPHI9dm3OO!A(N#=9#B zqY3FS?!tS3VFy)yRd+Y@@_KVzfo4k86Cd9({m%yMr@Y#H-{#6}=v)Oy4!df~N=jY{ z98v$lHq6G#%6fEssCZox-WhwL{Wc+?8{jwBi*DYy5t^4D)KP~LA8!sKP!)sWV?xXu z%BbVF&ijL>0~L+5x2(E#ffcgZ9N4&J(tj;g!Mz~hN@q1P6j+iOq0ctCg^}? zkYd%61O0mH>oCxpA|{A?>F=5RyZXJLyA6BPmCI&8`$xrx2sVeKl(YWzyL=HYeqjuV z>_^mJJ?z|J1@JAnol?WuCR5XuPrdJwkGvq%VRY{~lF|kTPjL}k#zu+vrrXL|I@RK= zz~CkX{}h0Fj)l~uM^!lymJU(p*Sge7C&XS*z7%>r4)af1A#fWMK~D+vUWxg3T>pz` zk?3@8XU99Y=HaGLY}n53u$N8oWV^5U8cmvA|7FHpmV>5J9^MPyLNclEm#Pv=LlhRG z)C+QXy`AkRKC7M77FhcUFpj=DS!?|Sjd~&XPCr@I?0$<@r-D)v9<&~9Ir5rR5XazI z7!&voZicf)LLW>8qDKch6>{!7+mC)0Ro0$d_Xz-j*trp)@pn4W%O*R6lqBQNhYfZg zL#WV9yCJwQqetBerO>Hdbyf0eUDP7pF5Z%`&a6# z+%C66RF4lY*Oq6`8Q(6hSLU6ZbB|>!>r?>Zo`auWf~}p(Udm(QFU|CTi3NF)1XF?ab_xcge5Og~0-)?Kbq~d8#IC$g1#DxAB z7P&7E%R@2XtDy1%gAJKlbF7hnBd>w}!&oT*ojtktkc*^@ZC@-{~yyUP~*2~|As$39Cm!HkK1pVyah`+ zvILIjhMlju97B{%;=Tw|v+z=e|MKftSrkffwCyldu;C13c4x<8B+~J|^tx6wRfhYl znFyX1gCH>ua(M|&Y*DqhndX0=hx`KfgeXRva2@Lth;2F~F3Shy*%5{an~;ngO1Nlp zJ*t0pfG7^q$(!$V%_RsqX~ej^)URDYvMcZOl~VD@=x8xdf^-9>Nt46Tmpg1f9vn85 z#~zv7Me|Q>ZEw1hfFs3uHjU@xa@4XmxZTx{$xiM2OgG*Qrf7>917`0ee6lH$?nR05 zcWa{FgU|TurI&?XBiTK9OB0V<>TxIr<1W=1orl#L+lh^{y;@TVUBg$WJP^FkJW*{E zv3mU)?)7_g*NQHU^K#UcI&=B5hT6*wnNFM=S4L_`-|pU;_LS@9jn56nm~)(Z4%l?$jhwiz1Oxi?`l@CK_6z}{E}-rmdaTph*E!qwVN5;ajn+9*B&04NECU;1Db zNi1chVy1TfX%4_7&AVZ!wPBr0?vjo;cdNTT*3-p5yqK)b)^)${m_s0JvcaZf4{J5I zf6ri_aS&VLAm)SuQ!5YHKSJV=ERc(Q-EOaVV6sdxkiNE|6L^=LoRv3P*ysE4WssWG zrZms&TFbQk&-T9Eh71v9@5N-V;t-g%sqtb*feNY-2?F+O7y#8A4XrJ)F9@1l!idXl z6#xp9P(HLMh&RZ$>}6^BiRL(r(!Kl_%j^oSzCx=yZ1jN9*_#ywy^Z}sE+5zAeY?BG zkViqSK;aW_hhc&HW$|SmF5qv&v>R>=$5?ZI%v{}1aTRFqANNlCFnLY|g^O=%Txln1 z>I9j_m19`=zdVYt=)efEm%75+zr2{Bi#K3DQrR19!+o`dI}#oHwh!O-9H1+hU>+3_ z0-~t*NVMRpsb&Dld{3F6>M7}Cy?R;U4EA99%gRf+Eq$zLv)_|qLG^<>jcWP!gaZ{Egejw=Nf`!i zttBtoz`>Kh%(PynLa~6O4shiac-((qu zUfD{bEhjm@j5|+5yP3@Fu6UbIO0sxWBHyMv#dmalb~E*7N!u;wz&^r7@37!R^KkJV-e@Op;v}v z*K$B_OLwsCmvG-uocv^0WQASxluJRnTl0AEcnmsLfr+**d8VT!EU33ZtK=b#83c=+ zU?qhxqe2izt&5|TJ-%**x8-dgFTbPaTDG;;RnU%wC7ul`x>>S)(Syq$os>$z3_a%q{F@fw5|<1sjv`}+ zAr_n&Zhgved+oLtJqj;+0@U}7H+%_CFXC0Bblw(JKOTpPLXbFj)dub{h8}l^KKLwi zhlY3ek~+1!qt#Bvq0e$`>>2m-etnN(Y%o&1ys~k~iaIXh?V~_>wQEvi$m6j4RalH5 zfKrRs$%bw$&@y?qCV_oITF`-O5l{Lr>ouTn=F&;Eo@pC50_rA+mmN?6A0IxuoH!Cp2F?5M-Wyd%d0 z{GFKc_Cws-n(W+Fx)he+KWLHcbkIR-d5Wh=L&jC}uP(*~_a~u$W+p%?0~na~>7gS- zg+D}}SRKiB_$i&A=hkU+JKmM>CAbOGsq#hb!pR<1=#^##Jw9)lSy+RdfYN;Vpx~;=*X`zq|b~syu|rUFI(KGX^@ge z8PiDF@+BbM{VBS(|E1NXOSjAR+5Y$pa4n}i04e)Er_^rQ6Mz|cjJ<+eLt8ro|2 z+wlx9IzY8%gP3w6HWa3RbuZ-cB@sQ-VhQ4!;4Ue8p_*G`MI1&O!4VvN@U>m)Ah!1P z0ZItBz=|H$254mKs{;M3A3hnSK17suYjBj5{PYk$(=d~qlpnC(HgxZg9KJK5VM9|< z@!g_psv*UM=&U^X?^#`cPGA^Gin(ZvD+mWf6$NCG#((0RsoKqn%f|N;{kxrDo?x6SHe!U%y`?- z3{~fgr`_z_K3BQMI+exP4TTI$o0W&zdxb3e@5~?+0>cO7SHQ1+IHhVk@Iz^_y_bGT z2_iQhr9o0^!P0wnscLK20ct1`;X{{*o>$P=B&xdC`ZR#5@AA8QclagmOb@iIfJRF@ zzu9?c%Hsq~sWp$to>>z$9Od;%uDvf*?Bv}lgYE?n^ZydC+QMfwS*X^GO><_)0ohm_ zEALv;go*gR*}oGo{k^9SfX&&Xi0DdCAPErN-o1M_cnJmoBn`402Ym!oEHio|Un`x7 zR4uw7p6}pg;?fiD1*%T7(Wb}U=YvDe=0DF?z;HeBUFQlhfeV1bY}!8qlewV-5%9K1R! zzJ5JxV89a+4Hzark^ma~3|pDMYs}&@rYalfPgQGVSaP?=2XT2xj}#1r6x;D!?wL_k znE83;e?+*`maB>{ug(N(;c{-PznrwwaX3r&ej;3@I13zDW_GVqNF&KszpF85sH|L5 z)&)(CLAeNJp@nS#F!qS4^GKzVA`hIlf}Td|{;z6;&31G4bfYHgb9PUT3WyZy91=BY zFIg}2wkQ2gi45B>*N?0<{EP#oCxwTtJ8&aVWoLqsOyCU7g6>T7G^xvVrvgkZblz!R zzGLR)3E|1}AC-&Je3tREu`n;mNcqL=V57xkp^>z#^T;JZRXEo_H1RPLk6@inH(}Dt zkG#~|uv<_1c{x*kM*Wu!ex0#X&$4Z>(mTw@-WECK@r|#FwtDMO#>`OUPKgs55H3Ub z`^6$(BlC?tRpO!$B%q)pR!EO3fE^*$DmxMITYL5aJMVl0P*(a5P3ujRBThp%6XtQQ z*0wa>-8tPtncjq|BLQ7w%|{EIk=`#88(-qcu|=ur&kWc4`1KIonAjNtvjBrCW7loizw(GyOM-mMW6kW$UF;W0ZP}Hpo;-;fdGv#+ z2tvsb1;n~6H~Nz!?7Kvz-|Ebw#9cp{8&gT*< zkH7gX4AA-ajBf<=wh4{_oiM8Ipv6@Ppwe!>5vi%zEuqY>I!10sY_rv{5qM|l^^j-9 zkZ^AjBsKuxrcUr6x_H8c&M3$bgWsDGdp6i-0 zbuioLS^Xf>@cwl4SE&})b!Fekq}&#zCQP9>FE2DXD6;o*183<~fsiSi=FhgX4v}bf zKGwlc3MWfyhDXP`t-Pi+`gNYlb#eK~?Li%&+RgcM&#ffhNgT0z(Gx28j7ro!GOR|i zIqBR;NEcC@FcLwnsYzm_|hgpC2*0q&!nCHJqv=jjs z23=bo#(TGd#s-xfO$e+6ZKZsteIa>!&5<>sBk!TBfF3pDr(v~?EPHo2k*yO=sdfov zbt3G~l5)zE+2Q1j@}NW_+heZC@>DqZ6SS&^Igb`GPxGX-d>qv+Pt#Cpw@TO(8r;R^)k7b7FTSTKGT4F~Y(7s*EE2uI0uUrwHxg#XADK{V!10zo*tKS7(*bkxj2>le>l zh^{~F=bBbqa_5EaVY=6=AL4~BN4Ng*65t^@h}LFoS$W{nD(3wg-PVAjy0*W%PBFLV z=g-Xm?u&KM0;8J$9nl4VAXqC{++daKwk8M1Vn1%~(4Co*@)oCW=-?I6VgFgYt!R07 zIGVttx%LR%bC2&CcPu|f_rc-AuRe9m^be}tXJcLsi_Lb_a4}d;qjLMP3d1H07$6RJ z2QBD5iY?Se5W+dS`_fiJkOgwz5)rYA*YckuE~6cqE)CooIj^SW?7d1I1k~y7|B8KY z3!{m$8Oq81HBpF6O&n~Ie&En*gfQNp@PjY~E^8yW79~&jzSPr*H{f2&oDO|A-_>+x zri|qB&R7Z7>$9So0yvHJUwYoH)c-TfmL(nUr;&0KMl@5r1&$DnWBNby_L;5-y!=etJ zFXHMlBhw1Q27cTeuHeS1?KIfLPWP0@E?K7h^poDYRe*vUpV(2bZ0YkH8l&1`K``;5 z%2P{_9%$>=*EJ!nL1wDB$9i6R`xo@3O<2Z<#Z78+wVw*kM{oG83U;5YuG}FBf!5V61>j zZ~b1@GFA|c+P%u|m=D*NsQY(^y6hg=--O}bA&YoIStN?NsJio)|J4>@p?q;LKxqNh|7#-`{i9ql*$l{C7&(&GIScFs`-=26P zW~9XrHk4twn42?W`4j&U8sF0*pgn|Aj%>-bI0x3xK?!x`wm9D-ADpH<)D{#pJ2YAS z3w`i(;D!lPvu@iIkrHmpEvr$P1exeuu9vuSo|RR+B9hC~%JeEoMk44*i%>b|2=X_RN{~yQKjf-cUyZpbmw& z)!Oi=$1jsi-ZXCLi`gaaIz4r1ayy&$0S{T?F+#}dc_U7*uf7(?;s`2PQ%DKREBzQ} z*!hM{XpTw1TqDR3n$DK75N^_nePn9P@K+bFX)2wYR3N&r*W9wPE9Z3RN6&cE3f#(2 zU3mYtlg@`t;rA6<1nR9}pD~*s+&a8DK)+wUayU^ngS|3f$K9Py<{FnS1u`1L$PzGU z^Gav#oEDk(-)^I1r8zSyL&GGxqefa--d{y{-;gekx@(KTh=s&D00XLyRw^^yA4$j? zzxZ~q_3J4YMU!)_HmP&Z3jI^M*OD z)bengv8hsE;vnoJ=+A^=vX8uK;z6`BWc?wCt9d9$?1%6DvV~ATKR>Wr4_3iJ_X^S! zerj!fbUrRN5T-=#-j-MDJUipVBSjS(>Ew*9e-e6)ws8>M`pQAsX=Oc`W5&pq>XggY zuM5yFtocVEyfI9Jn8(QI;Gn8>!zu|2TL%YikhQhaFla-cJ@8NgIx#QL*^=nucX~PF zgm_iU{0U%IDPjLxf5xpMOy;oMJI7i$jr7+R9h7uQ(1hCGm7T z!tD)RUJSq%Emn`xlPOh)#Z(Ji!(BJo-mV#OUkwE?=s>hUfLdeLib5`6@s!S*@XkP*E~63u2bJ*0j)B!e(INGcLSpt{Jy;7y?z zF>pZL=f1C1jJ)=X99(98_jO$glQmx?oG!wObAb8z-O^16H3QiNj#b#0B^b#U9B4tE7TmT-O`X5RSR)+@yNiM_b!CXgh-rbFlabN6ybMxl-+>+d41j%(m99JljqVCc$ z`20hXW>U{HzwJyG9>n?UJY6A^)7wdc)6IAE*ACV5)EjbGVO|Ild=Uxz7pR3Z-RO*L zm*4&M^b%(g3-|3B*3*+Li$1O52EF$tQs2CM`EmrNESh|hY0|KfgQ?UN`Y@jMA`eUk zv9T<2ClyR$!TxE?553+f*iRgzy z)9p*xm8wdQk?W?-164d8W=;B_bSO+Zd)Ix{bdWej^VP#8V9^6dK}0<4Kv)3u5)%?! zQfQ$gpFkjHm}WE>kQRJeNXF%>b;kogM~t2h8Pxw^qZJjHa(7t4h4{?nD(~uuGdGy& zF;pFXNmW${AWlC?9!6&odLK$LJB=n~7eU0qGTL!v(A7z7iI^c!XnCn_AaqhvE$c<% zOiSgnty38(Vhj&(bpNO%s3=!G6;RN?bQb#LeG-82+tB97j&|onu)j7&m75Q|&OF4q zvX4)_L%e0^H6P(dd^9R3)80zsW1q*|Pk?=Sz?kJ(RyNMDlZ%dsDo-7yl zPSf8|-K6GRijS`*@_YJx_H8>$K|R8TLjAT*h1FB@H&i@@PGYI_&h(>urR6s0)q zBOa?7U9zkFaA>oQ1<#|(zR%I{=;YM58$IoHmRe$ zbJ30#$+Z!)xE`uqg+eawKI=&?ST}e5Hx5X=t41gXJAqiFI_*~GhVK1rgl8z)!~){~;a%VLkH)=9*#5ou!?)3NGv8Xx3l z{PLcX3EuRUG3Y0#uBN7xq_#5-kTtkU%SU>^HR%r%x0Yded{K^Nk3@bcvF%{wXQ7=Z z&N{WtH)dT(%_icLUXO}6%;Z{ki2i1eI48ysHPeNt8Ns1$v3zhLAw>>|JE?~J^W%jM zUFt1cV34O|wh&Co$_a!KO8KQ?Nh&RZ>X})GC*P*zqKDqI(v+zOoT*CE4!WF*uhM2T;4Lqa{>?MSG{ z(jEC3PIBiVzdjiJVIx3l5JUBTnyZ8)u|8`|QQ=}QLT z=dwQm>wRjddgCBFS>epNEpKsz!F$2OFXn$2XQJqKJX7TgzSH4 zNpSUST9`s!q@-k{6Sq=|i|hglQBQY}KKLg2Qhr@>LELqjgR)CfdY$BQ0u_3`rR;6HAnD|o&4I!BW@mUuj`>K6^%TrL-&S9JVc`k(q9B<|NaX{mlpGdjbXO6ifugvDo*F!xN*aw(g#RNIV@}B45Z9=AF?J)<9gB4pcOMhnecC0toaa=F` zJ?A8I^5?mR)45MB{3-Y@gDApz9ozH}Cnb@G98Jn@Nes_MrO1d3lH= zy*1H~Ae}!M|%RtDn)8Y2B8bVotcmU*lbuD3&8U zzS!2;N~ieR<5P5j&L_5F<`M{Whp?a;UnlM+>CsJ9KyD4Et!u`z|FyB(+h(M>qG+#DfeBmiggg{&JN=NIGi-&_HS|hPL3zA!i$M$eGYm;E0svHZ$>O<(C3>nknEa zgAsm_W?R+M^d$LW8xoYWGc(zg&97hAL~uP8>p{c``jwL=QfE7~*h~vQ3cvME5$w-( zDbM%gAgSqLBqdtNa-HHa&f2)gIJdv7rzoB52vkP=v^eQVf%Y#Vd{un(<{n3=w|UnD zP1S%k_`RgvRP%~g#w{+2DTopJVGE^}n6Bm7c=7w@IArJ>q&K)M2bY)II;hMoetyz^ zA?L%)N>!i-cV-!;{Gg&L-3B)?(v@>{^iRratdTMn_{UWYDr8oFJRrSY1RKRb%jc~Q z5h!~f@U6l0Im-y>-dPRQc)hH-0vg0Z&c)LnB-2pwomFJwPG9eY#Kh&PQrhy#iB#>P z`Ks61&(R7KjHAGFf(+)zaSF#L-%g~)iQRe7p=%G>R+TT~{&{hr)&1>|wVsNuo=CND z$3-Z#>w%>oF3X-LmyS03MB)TARAZFEs_6mM7NhU??Ah~v1SsNNeYU)Ui|OJ_c<5=2 zmK(l74`OhQ1{1LI#+Wk|6TJD5$u@BLW=7=Nr^YD!Rgzlw8`fs%(1%N3WQF7*HwP7P z?j8xH+J6lOt9e%$9P8-l=(BZb*2jv5%s0+XGI`Llp=~EFq~({^X=&S%6w+bCywZv- z{ahTY$B7vV{Ccbbvl}XGhJbmRne6>rAYME_hMu5dfHtp5N%y^x@u-gNOd*I;Y+b4w zSPJzC$ke);iI!b`X&wE2#7{HIH(xO4Ibg5F+CWs@Eg2x4D#tt$WHzA zpaMi3qU%K1$O^NCNvT3H6|%))Dt&uZhc5I{t+m7u(-{QJ@0EAxCeS9!yO`z~Oa@#? z2hHhQNURqBP(YPm8WK{^u|8mx6hh?xd7bI%d*lNPfh!C$)WTnLP=T(f7p5hp@e-2l8!VRd}9aScfk3uXX4Y{&5|1k&oaifK%LT;LzON ztpm|}(Ke>Wt}g9MmvFgcAAg^fL-Wh%OC}a_2~EnzeP#zwG4?v4hvGCn@FN|pF@2il zGF?m|8V7>dZtrs|;#rRp=5e5N50TMgWcT~T9p1O>L67p>Cb$}C#z_xJliA#JRnRPL zn53UVniP;J{vBlgPxgU-2SQNq;on7XiVz6W^+*Y{&`STcJNc!|gwp*^JYptg&$9Eo zXbufdM5LxF-8Ie!OiWj4luG$vAyb}`Mj znx;q!FhMu*qA?m7B9_5FzqEHN*3sx}r$apL^5Tua4vy2mAHi$8TMpcG;vvSx7k?7} z#DYk3txE6_H=QO>pr*o}X|O!_3&Twj4%9G^!R;!3@x)~~O|O2bS+#@D9Q0Ezgo%PO zJ^U?Z_OcF$0~luR_yO(Q84MYGjeo&FEMyJpp36vy*L0ew$<;j*;cw2|0pCi0I(Iz^ zk)p2!?}nVcSZXYl;~gP>#4o^OvmroU@a+K{kk>&ixTa5^?7L@dBx@2qGcpvos{RV_ zF$%&8yn_qe?T-L&3Qm}(*-h49O z#3iR_K0aljS7TRF%nBA;m%I!zr!-1rB_-ZhlQCrZ{4NmQA`}^jWQW(QLmA`HmTzwy zR12A~jn?Sxdi0zY8ytIbpxHiOAZ|y9pjhRhxoD;n#j%z7cTHz51?DH)d0oV;f<2z4 z3%Ju1EjKQBg1)CO66A8S+6A3GesRfBm}=csr~_~)d5i{aGbqca0icMn9E6)nZ-axj zoO(qjK)PMQjZ{e{P3=>YTb}5Qvt&wjg`;O0Q~Nhysz6Fc-w3Wj&Y6tmJaOKC16>Hn z15*JqgGyoSEx4LuBOu2ofMpUWWhll&Y>#5W{B4 zyQ}DxKJn_SVV2K4&YiFNYMVl(#3Of$h7+)H0pbUcsP6J5$RL`cPP8RsS27#@pgLib z?I#comIc`p7oNco-hmb>rPej<(?_9P#S~)JSeV=zH%?PUdb9(& z;rn_oL9!gfwmw&gs`g4{i$8K`Q)Q1zoid^YBR&1vRdxuwM&D>b zte~H-s4hYlRk!<~r>oeW35Vh(&4ce>T}e<>@{a?IU~mkSmhPG2#fB6yJSV`+?K*I& zl^n`N1&dWq4(@VY!i7^&+Tui#c#X?LjDj2y?2iFn0QqaH9wPHYcR>%CIldzGY)4qu z-lw*yNm)~qX-nwx2WYi@u)4@?DfZ06{L*dWi?#kRw)>pbRQH>!IiXt4hk~9b+MCR2 zOup1m4R^pbEz=K?vHKMZNX{JvJTKf~lg9{WT5=o|GYYlW>*u!!o&k_hynuBAAu=sV z5Fsw~!O%47kz^P_46~xIH>a|mzXzHj7P6BfK6tmm^jE3UB(==L2M|;+JEu!~LOjTU z)U@Bjv45p%(tpagt7ERCpjf5$a;;NthU>p?fs6@M);T*nXPI}je)=?9IO)cd7YP0- z3)emd@Saft%L-m^eSNTlg|tw<-ob|rM$>|i!pGbDtsJ0+?8*IY;1oS5*D_JJr-H`S zr9AuT`-2w#qWETUVNz{d7lZj{hB34?u|i>f`M~%b0Q%9z?m6pd0kB|pgXQwYRQ&;< z!lmpeLf?b>At`+T65IeP79D2jR0Rq4*z#`+g~7y#+ybqX>~%X#WK17&M-O2Gc>;Tedb;a%@YA#7CPk0v zMSzjab&!TYCy{jZlU-9a@II8Y%K`}e$KpszJoF|q^BLItiw}-NPWjK@2vu_btvCMT z()r{U((i`_QAkllnUxt@7LK941Zl$bID7P)qalACYIf)}xId6Dg7GM^F&Y{g2C7Cf zGXL^BrIo9{^Ss_Lv^|om$ z(68w$DGrZ2BcHP9?GOV0ZT&}b3Bn3;q0mk0=q~D5k-Uy%Zf+nbONtB-w4R;G-w^NK z@2Kl(?ZL{YU6XD9xWL=*7Qh0$h2?W@w1D1toH{G*1k{C)E)Pn)Iai+{S9kB`$MqDW zx|b@0HfiTae(Gn^rfD%`4`70qJn=FZlLHcFQs*rao-JVfU zwno3G*|o#>Mk;Nf%KaZ#UOQgh)oPv2WirW>S90>89xL=lBa(p3OD~@O#RKG}8K915 zZTlYuU}c~tas|pTdAB-fYNWsiRQ;eaA_kx=1g_0(8y+bLA+zd9rY|@9Woa_Cl3(Ik z)I(mGEIdv^jRc%wn=aDm04`lX9QmN(v>Bkr;lLc^J6DPN+V@NUO#+cuCJVd2E(NLn zfj$ZZmgc(C5CI{C9Cm`j3o~a*0dyj}LnbTo_8zpPqL634r=ukJiW0K(l~Y{*|ubnIG8B?t8Wa6xjVYy)=RF*_!ZOV@>3l4_IVt z&WQ!U;)@3+R6B*&H1by>MM&k}2>EB^WC3Qy-v!)%mz=V}3i^>${yXG^G-LcbWBors zPOydlHaW$>$-60bjxOD0)4SiiZ^kaG$zP_u_z@c$ilWO)B!i`Jd>rr4Lo8qETZt*6 z8dm;iGHC9CrYT~FCY$_IDi%s}NjlzT5s);;QiidV0BiXum$eOEGMnq$B;|t$!>A zf2+IJGzgGa=W+odcL;oCuvVMDSSnMNT7wm1dH6~qMVs!*@Gt)2JU{%R>gq3=!7pC7 z__beT*sWjw3iesk&Qb1Xf6IN~TOD$wVimiPrOr$qcu(N#uKNhV^I4@IQ`$2+|B1>Y zz@xeNtl+u@1;f#ZD@^59ku6w$UdG1x=S)xj;dX$nBVt_K;f?T%E5q;&32VP7oXXVb zpZsgT=rmYj->i3~+=|h7K7$&dXSn#OVrwi(>Z>GiPqQiKPcA*V^<*|>!_((Mn)?ol z&2=j==5EP)yv^*bx6RqC6OKHK_{jj)O_sMdD6MKzvgffHtm7r9b{`I$$$EN!^7e=a z!JN|0Lth)#GPRQQc1_)qh{|fkaFYJ*wblj&jWp3XQxZHF(m$EV*gzVAH?V z9>~T~VFbic;>ips(~;6D#S;0-Rrt7|^#DP8Yq!*Y0>b`;sR& zyD4e`0rhJAXHHpNa_wL%ViC*c3kV=z(+`vle@~{xZkJPtiL}P1flZ0f`R$jMJoiLl zjb{IiF@Z3CTRT|QADL+xSsL*3Dq#rzg~(lb$WnKWWM>|o0MG9)EqMrpGnr<|Joiuh zyS8Na>cQ^y{nq|Kq=09546-zs3glbbO#aGM!kF9uW&^nG5iX&Y)ygpkzLGS6_E*}2aznRC}gS-aWH_x4&jm; z7}Lg02rBs3CE@8`k}P0|b)G~y;@249Z;<@|h%n=VkNH($#;^%BDfW+&<$qe3!HNHx zWC8g}v97y=@*gG3|FAGiwOF%g5iu)hj0gPj9nZbki^607(y)lA`g&}5sMlPR8$d*~ zFzz~Mjd+R(=XCzKhu>ZF1Wa{3agLEhNp4uiEye+%#{G+(NzUOzy zRh!Lsy(ycHF-4o(t>8pFOW!QvTktc}M4r9i$)G@twrxOfi0HJW?bYZ(qm{oXyf5w! zimy+CfA|kX82#UQ^4ItIfA>j*6lKr++9~~yJy`;ywDFtQ`~q%@0EO^-Yl0DX*WWQ3 z4Ml1h#n&gvLbv@U=9bL>8c|W-Dq67A&8ATch3gTc-FZzXwBHm|UieGFe|6HJ)I~m; z@mp9}@bK^`$jd|cke{Fbd|VxL3WMqu2=G9QD*lLZqRXu=&My}5{Ij7AtGi6h2K@Fd z6a!C=x(GNj`>k`gN*oSW)6z1}Zo3$JAxY^p4}{hKa8LPa+Ha4dMhO- zx=+wnJEuiyXlbwe5a1G5y)!YNV*b-hsDqRef~y94OSLl9xbMDf8l|PB&Ck!@zI}U- z!)C9yFo1b_dRm(#C@2V78B8oJv?M)q^NGH`{k;jIVq)KJ_wn4sn7qHf5YgF|v;nAp;*`?X zRyFN5-J@_CQSv@v7!2m!2cH(2(#f5xzC1Dl&7qV=4ONoe+~4_VntOHK+zPwKQ^W9h zye#{6JsAA?4r}hy^MzASS~Rt-D=DP?r}g#Gi9SO^L$<<9dQdU2&)pJDU97z3i*n8f zD|f=pGTHS9o6UZgCpUAOZedh(w0D@Tux3ire)ns?^sA5Y;KIssH1n|&j*@t?71{8u z@zj)|FB|r}wR*1$Fb%d_&9H?;ySz-X9<`|iCFog#x)AB<@4i*{n?ZZ8QXT0BPY9!e+1a)Y?tV_ck(Ts zK3ciES^@F&Eh23&@q6cYHX;o}A6qDcuw5v8jNo^qk(qD2!9;uRc8SCqm~;*SS&JgV z^UTZ>zsVFXP2|J>8H|MM!D1Y`KTP+Qy~GsERB}QF<1Qv9xqXt@jI^|))yIpc zpj$+#4=riBoCOlK{EDJ_v&%!c)ej#&tms6<#gNR}bF6f9_8!`ME5|EoC*5agN6?mQ zW4yrJl%$Stgti{j?-_ItNfavVFMXT5H0eQ#aE?W)Ml5-qR2{W$92ZBL>H)NO;ff9*K+l6qUWJg?0z!lYP2Q$f@LlmU)lp~%S67ik zW+dVY0i#NQI(o;Y`SE9)LV2`l=;NaeAs-Y5QcFMIVMK&B63^~#jV+R}SDz7)IHp{| zB(sxa(f;loYfkGyNE(f@4ZO7}_42x&rOhu5dLB_w(mZ2_QrH-#=YvigYDzwhA~w{@ zGiamevURCa7@?hyKAUl_9}>Xs63=f(}v!cNeKzQVw!ojBP&bzzVHH4{~w><#u{+VNmoM zZ%*6qbm+fuFX3TfIZimEinPryukeVVxgtI&UAYoBV+MUi>U_K0m&PyqZ7rLFPALZ| zOo7NQUb}Mcpv>k?x%wCPDBrHUn=IrwrE|C(a!O|OGyZ(wKo{r0t&uZ@@AB|JlJ82G zfd;0Rgx+d*cJ>^sXz3kxo9>lady2*NZ`a|K>v`d&QPjJ z5a0&jGVmffnMPL&bWn(@tyRT-2H>d8NMbPGjU@GK_6=j5g-hY1yV=sYRnrdy_dy1a zJiE=}?8w#Tl%mDM;nk4ee`y1kcF}TUl6uc0V8G$0SaFibp?A2=kvCp8ksUMAt1=_l zt`Pw}i{y^SL_~fdO|2i4oxc5hgn&gS6^6#w`|hoiX~XG2cbAc3v37&xie%0F*bAx9 zet7uNn>TO5j~hR?h8q(Nm%YvGVw6^ULbtzoTl(e^D89aI-T&5$iZHEy@v53Z+1;Il z?MJMWAV)JmMZ?IvU-gLvtN0$SNAICNELH(>Bm&8_^NXjvN$3&}KN=yGmm<1*fUhyz zTg>?HKKeX7d~S2T`-*cARfu@u^XJbm``HSM3Ja@MZyShruyb&rXSumkc?V@=St#^o z5{ZZhpKeYQi(@;1fguC@i*#m z%qQqG4MI2A4(R~BDs+cq8q}TP1fdh~gR=eTM1W`EExNTQMr@rO9R&}WnVBWV#_kK& z2XPGKm)oOP%LH{80T>Y=VqnorMm}YxyLt=ZuLDJ@YM)9y)s2XVcxoyiBgUjz|MBC4 zeoPDwDB71`kMsx=g0vEw(MktUCRfEw8xs#1`Shnq=hVWb$7rPjM?SkOl2Wo8X)uoZ zsPGv8*N<|CTXa={RrEe&qASziNi(zv62#X(=P*0g6e`AQney}U0x-82;GpC#jzN~s ztcjeQ+)>kAgCN?T%D#qV>w!*ZDA}s*hAs^}SL{`G6{n{k3w{cnfEFJ11!ec9m+tGa zU=efOb^pRPP+8Qnh{_t~n8TvFMQ^(qMj_3=hsnJ@7mepam;s|9J)WnbH}S~G9q+r_ zUe4@KhJ?ErE|6a@8KHR=s6&kYlM*M~pk&OTx4oqOcJ=H_?i#g2z`Cq1&&XkM0%$psHOG`@wB3^#{x;LYAs^D#Sj59I-1EK%#RVdsh zYz=nf>2Xw5B)t@h=HhFR9Nl~Sl94WNpPI(sdi(f@LkiN>YD7Dxsb`x@Qix@I-a3*A zoxb21Nng4sP?mQeq<8mY0;R2xLgAI`kS{%R#@N{Sa0Tt>!x!zF?`-FYojy&Yc1|T< zvl&|NJ}t-qq@|<|<2iN;;sOz;rWmwA?-o7xuIMdUZ_JV#)E3i!S~~Vc#WA<&PG5Kk zT_^hQL`O$|>e?>pJV2Xst>Kj!e}qVJsuC3)*X^@Zr}U)__Ef1X)NeEJDeF_vc0UN@ zf#tLuLyH17b=q{YsCs;~+SvIw}8255m`AMQ@w~ z{4w(`>v~(P0`w&&)!IP4VxCps*_Z4rakg^k1EU|GoUWA(;n9x%U=)a;iuq#Dn+{NV ze*e8TKrSilp?k|yJ*Q#*%Xe7mkEQRvaZ(26CLn!e5h&;70_~-EcJ8PNuf!rrbeP#Q zf&P@P(=EEJSk6T0*@iPXF6i`r!z>+C<{?6xfsfO_ArWo)FNe4vZ3cKJIR5!_b_W_z z#oU;}Uf%R&G_kKm7cf<=EGUh@^7Iz7ia)A&3U0ON!jyLZ_u@`7&&W5mk)3=~(A6H; zd5m)nj!rm$LuZv>_rl*Jc2;N4o`uS} zr?pV?5^?5v<~^vkJmhBI9ONKw_c`bn7D7Xq2SL7w;0XC(1hd_rS{XrkEkA!q|M2Lj zZ!#21Vqy%YAx$oJ9i%;?#l)h|+~w4T{NA`q8ei-B8S(4TlS|iL1*)z2h){*PdWdA< zN)`v5H+5jD4APE&(Y_dZO`jwsc1pvdpq@_B`H!XIhOqH7jA;8r%WX;~f4+c*b#)`Q zwq3x825S7~?Yp*QLIXf;sf;>P2Ry zgQ+0(_N2zev4w{~`|+zUT3cH$bntB}svDUFlpnyccHnP#H1jUM0+_AJN4&TDIHZUM z#(K3>ezOT=JVF5_$t^V{kvzb_4Xzsb_%%3>9QgbjN|poIr;y>dhc!wbY-5f<6AKIf zBk=7sIId&QxNbQiD5y2l6tf*J7E`({A21dARn z=aas1O{6q4(rAhA6J#w08ms2pUw^$GY^vH5kUZJ*^x&;g&~TU_=mB`Qng%eb263S& zMO)$dj)6yoB;wMS&88x@*}uSTxX^}%hBDyz*NG;^KAG9sLqk_Ib1YfI>j2KqkUm3i zE=&*rsA#RO+S-TxQ1qrSAOxl4iYojOfT3kX=NCs)#5G?4ayXd4+3)KWl=dtYAQ3O= zvLAf0^kk0hNZpjlER$T}Cn-P1JH!Klm>sWP0Ig_jl_Nr_I3}nFT9O@{k^Lgf zkP_6}gGIc4eUzy6n|_nnC84qJ58mS_ITZhf^(sfN`JQ>U&Cu-pX3Vybi+5!Y?}*zM z`{G1U-K#wr!Xzo%>yw4~`IDox3+^aP?vN8qg0m##QhGWC03CIUZkpKX_8g%lRQ32L z&~Gs2;1VL>$!d46ug_R&NJxm{%V(p%dr4I8i;_2$3Si!O=gj3yV4wJS4o!t87p5FV zJa!7(+u1d=wsaLMjiu)UsuVC zP%!|fp1Dz9wmzJ(1V6&2v&ow-S(Zf*D_K2xaxwQ?3mw<23OaY-_5R~gmDik|g=4Uz z*8(Imi;G!ke1glsX|{XhO6a>=htQ>^rJb|m zJn43K`@_GSQz1j+NY!?>xkPKZwmwceUvFI%feTh=!P)7Gd#bevdKLzZ02cw?$WeZb zZRdplu=l#RO`|vh(J|J*9eiS+_cS&&F)0PE!1pFx z^YQUf%c0r;J#`Z9vE~;Q(RfL`dbA^MRGK|7Q~p(UwsPa_(#q%1@;)oUN1&%nFSpdy z1-ycB0&noAuLSNV?xz}?n2_(SGe~IM5++lomj-*tm5)=Dz6ma^E%%&908+tR7ntM% zR(ZG94KbS(i1c{2B7ON;7}&^cPu-iG3lkr8N{n39sR zsNK=tehw94ZLFiy-Pd;-jUeBN1=k{tBk@e*V`I(i_AT#U?Dl3Ixav?h^4gkp&;9c* zhK5(#-n_YyRbiA-nMoix<(|uHota6umQtHuUQT>7xpQIT*}_>Uv03AR$y1goCu4Gz zkxkj45tRe2`N_E7w0 zx+sOPAJw^Upl(0Ddwcz<19PZ#0b4ih4Okx=d$N4p14UspT`FC6M_Otz%aO;6@52bm zJzZu%4W>kNAf~^q>43DJeHd=Dh5L*elCc80)ZL^!%CwZ!AN=V6hm58lJRh;nrN*UR z%WT!*y~?+zP|HFr##lAPV`9#kiN=Q)mC!bxrIs|6Hg1oWT>y?F3^Dslh4nW~;;RN` z@G3zt>yzY|JbrJpa-(Xee~HL_t)=ML!lh}!dH!~0;gv?CGq+N4LHDKhFqp{fEK%WWG8%hk zGFVXT)O(*4)X~w>#1-Rzs-b#D)Q?2CuV0MnX8a9I>?-sbNJ(i&W;ukB>u{hgkLLt0 z;*&^Y@RE3`Hi#} z;oyFJqt3N!pC9L!?z#UyI=^(rk6AP?Jv|+wX*4CloXWik0P&R)2AnoblpsC8bo?N> zClai@Emguu&^L^n(1Jsb8R=gIUD3?0UoUi=?uBAHFA3J7>(0)38b^x3s|)c26MVV? zcowc18pc8JP8{6z$(Ijyz?*iR9Ym^?N|wo4^RO(u zIZ7TG993&-ZJiEd7v4bNHcs)7v#8r5pIcMBLJSN6+OfjL!$W&uX{0{>X%kQJvSLb; zXi5naGH?S1OF`<94PyHvucY2@gCz3lxRVPSVEw#O&$zg_VLND?Bp)AWy|JyXp%~2- zulVweI3N`hk87D~vo<86+s|%Q|EIUw4gJzH!BBt!u1?q4#+vv`QQ!Wu&`r2-kihY%v-4MPZL^?>o@ z>?@!eploPI*9FZG_8S`+J%vzl%E1!3^`f-A0&8 z2T6m-mRB**cUy**pA)HPpI$s1yl)8Fc9`I6V#HZA;V_YMPOUOMD;F2^mWr1%FT?IL z6{QPsSW>c2KG6bfwRThBYeH`7JNgD59HyyCOiVme14tg`N#$QmX`=FyICJmbJ(&7t zG_L;;2Qw}BHWjbnvcv9c7N+|j`0LF;sz3w(;mvKWt%vD+A0qzZ*9_1kitLfG&+oX( z2Y_t$QFu56mrOk5gB8lm#(IL?cvp%&5%Mh{jjoIp8~JlHE{)VFklbjDJt~NgR`ln! ze}_{--@*kGb_3G_3TlD5$$xzlHOUR|^kcXj-S5yTIHNxZ>N4b*wj#n^sCv+HdUYTF`JUE~=%u`F65i8aVFDKh1#{tH`w* zRciH#Ax-1l^GehG<5{SYwQPEZT4{m(Y2N($Dk)9AWqSPu?kmFM)$Q#XwuT<(v>`a% zSMD#B0u!ms*;=%?idFntnuj=-SVu~}9%fAprX^xK46>Z}sa75|Mp@G6fm;iPgQB{Z z9gnw}=CWvV|LoJthv$+QTwpp|KLixwMTN2~$6!+I zjSZzIca-;JpR%tIYuUH`*4_)0!}6y(&QW$-#=THtb^h}+9=C4OdggK%pU9PUo4|+S z`eP)ujD-SasSQn{@|j>s_(L2hi|cm3AA`&ciFhVs@i;W4?p-HOCe z_#-_FHnVWs-R+=VmeLD?rI6McFmnp2`+^M~=4{iIym-s)WsFmH8^k%i+@j<;n6D%> zywz0=`7neF(;9fX?eml0NGr!t1#LF6@TMZL<{aR(kv|$WOX;7DPlO;7f8mud=BZ5= z=1R5DjLtd7U-yxVuTPOoZ84+s-{W82^TIrvp`L1Psy@3El@n=v45rV5)nSPcBm6lj zDu>Ju{^roq)0to_oxJ+OHU0?QuF+A`kw2a?PTC>aGY4UVFv!;cYWc!oHkP3wdW=92Vg&P!G=muD_s%}m z?&4#l$>5^$(bU%F39SlK?5wOWf4j^~(OsaW7>(g6Itnw0p^a)z8{)fx6%;!|8$2>> z#8au>2J&M&Kc~wb6h%`&sUvEx*j7ZK^MyB`@r&!!JR;E4{EMI3_l8I50lP(BI8XViPA?=W1EPd{aakD=T+JCYlis0o!kC+Nt2*nTW z!1lO{3FYQiEctZd#PDwJ0t%gz2~~YNU@HbbH;^&DjxfMBF(_dUkN2rWav0JW8C>|4 zqLB_BjlAdDq%K+%wue$k(FPIaAW265@ioV|~-a;yQ>j+HJ*E3XURY_th8tS*IA(AULJdLq7Qq!8q5A z8#jUnx6~10$dD=aT+nI80MO7bBn|~$;Vs+G)8zDcGt~8B&NpSIBm|75_RnsbFS!QM ztu}Z5Wq7k$(!BDbF)EctPiwca8!*h*kf!e>;BN5sUq0Cw;5_XLfsZ4h49v{XbLY|{ zayJFbyWsH-GY4&`dzn3u0FA(zWq1Vz!wv++b;Q|H<UhoKFQaZQ;re82fgo%5&i^Zh4+p8?vL9m&IN%(T*AtXdv7-^cE%YM&c zx{N+X#OYXw$^8C|sx34!@^^G-6Az@9^47pkRNRM`;wXLCD5X*< zl{AZs?DPWpgr6F9d{EOmZ@j%S2qcWjK z?g!R2HPOpI)F43KO{cOB7AtT$ng@c=Xi;o(sgJa5 zHSU)w?lj0D-ab|8NBX=_Zb96R^T-_tjd13lqnRJ1a%xd@EV5)5T^h@H5(bStn8e*h zo(m##y2jfeBSNCrwnf)VLKiX{o`gZ1CqCNwGeF^KZQwO%nFqmHZL6}K@yx}Lb>%1w zu_75i>b@j6QOF7l8G$@4*`?6Q&ce2(R~vO`tFzU20Ty>lETZ`diFCdKdL(o8yhj%4 zeW=Cq=T|A-13j;cO|s=9@Lf19^nzN^gHUd-A*xFTRUzEPgbx-WT&e*WgSWSeNGp@1 zF=O$iG9GuUwio?DP%UlE6_Vf>tK{L~aqnov2eFmedYF-d$sH;8&%bCr(C=YyYb*QU zSV+}?ULN#C8F`(Z-ya|oAmL70>hhSuaHNHq@wYWJ*mb$#*+|ir!kC7M0$h!#%eoU+r-;FxSl8{1y8r?e>Y-O(v!07L(kz?(-$L}FrEb(No z>B}=d3XDYaA%}YFH$_>CrcFhT*N2j8y2gne>B^yQrXAUJeg)k%RGllM`RQ>}t_f7; zptX2Uz+@-lLni)X$Li|pwp9l8+d&!}`yV<9N=eR;xh4+1=FIpRWI~?Z^9q0_Qt$Kv zJe+1MHVrsVy`d~jS*UCNrJWjNw7_eF9{iyy6Q7L>j2h~6H?QSNtzyY9Fn(OYOS61k z2O}d>x9uIX8@~3qD$k(JjK^4h)huyoQVKQthjFwh?=J}3_fu1rHZ~b!sTil}oAkbe z9&-71t;Z)tw{v_#H@kFJ;_gNl%_wkUWedZw7>2#Tk;jmzq;>8l9ns!fP=B;-8^JXFxb9!PPa3c_>r4^n1IGnKe3Jk}fpcP34Mg^(6 z0NrN)C~YE%Ie~cgbV*`uWrY^ z7v0(K8aMbbDto3NHgu&nP<+vPRMK7r0*7O~kk|4z<&`?2uXQouXUeONHUEHe#fKc1 zv$YRWszt-i#27f@wo=&$eBgF&v2nMn>Dlg6mEdr86N&Dv|7jIr`>435FgBp?-eS!) z)&oUCi+mQ;Jt1jBE>*+O8gn^#b!`gVmYpCeJ`PpvMWIH;;0{!~zIedIaPgme2_C+>IKsKK*G!-RVc8o+%+OY~jLKy&x zu^R;MyBT`_26oPFC|cE^z)IGL zWQwcFP#i%*EV?EyyNQi5bU}v3?^EywO{()AMVL1YSek?w0gAPiH}_G4hBnxW@+8B8 zL<=yX0A)cr=T}?+$=l|jfp?yh-v26MEI@-*pl@Qg* zuztft`=y6kvMsvMlLffX3D5*`4ZQBFRP8H zk1(zhRU#Zl0}%Tsc&SB~;OhQ)+n=CX0uILJRUJ{ybi1M^Q9tLABc@~q_{F42yTHjx z_NZ}v#@;s2E6unD)+fX;DH&UAM7ZiJWy45k75tlmSEQdQL4Yj^;w!e0 zSgx#T*U+C{s-~{a;;}ppDYZ8#Y28IWr;O0Bh%NUADtI3Sv~cudd5i8yi`LF&0;cBo zZAF{Ywkk}^lhBwhr3INI+g?f|<|)xN&^Hn@mip4|%TfQkK<$IPAua(l47P9r$QP1$ z;o$P|XNl0&9vo)Is`kyXAAFzlf%6XTn&()zfJJWZjM>Z71Gi#6^jftvp#y)G%GoKo_+>q(WYZZ($QCa@AK8 zsec|VcPWY~gtNc*&=Hq~^uq=|9hVa@s_s><9x&MxnT8Y~H!a-dXJ5Mi=eUDQs~~4~ zEET#s({1*`7zP?13y1NqpY-jeS?P|97w~aMj}TU{<#!8b-^dIY`JCu%Q1Kc|HOzbz z38NG?lfmC29InUDmi)#t{D#pY7+Z9qY4aJba*!^J?``eu%FehM!MxGwyRRLe(|3BX zDve=TR&v|NQqw37FGqctR!=Vt==x;rBRBmo$C<71jT|xX*+NTed@OwHTS>!^lUA zw6wPFIjiY9U4~&9705S0h_^)+Zcj+bY={GG=+n@lV6Sq&a5vcS0EY!G0~|gXv;QUv zmAItyy|KS)O|@ly#6YA2#=`6GuIp^)W+Dw{A z?>$_fUbR>0)4YGBB1FxezuW>t6JbC4`m?c5!~B;oJB{$#2IRmB%hHC|PZVJ3+#}ncxs9 z-q50ZiDZO$bpA~r$1|@QOg>~I8l<1{HU9i(GiE6)iKJ7kbb5wL*R_M~SIQ#j%k|7V zt!;Lumxi1hdDYM*ccp^H)Z<0r#`My|KPAN<=;G2Az{B>t(o4bj119CJhR#mNR2>z~ zf98-Xz#WYURpp8@M5s!pbL;oNhH(q>~VDg>O|5k-m?-QX|x z_n*y~m(cqHbP{BZHYQQ&LpyORI)hN^7)EoImJ58*BkgTirbWFMZ^u$C#HYq%>0{j6 zW(z4?^zRBq3|`*G6&%TIx{E%!C^Z074fFOBflNyO6;=nG2!0UR8E>Lfrp6HmSb2xu z6Y$!^{w}wQbGCC@+V&4Sabh{0r&AIaD$m&;cs@*gogZNKvVT^kbhx$Y3I2KqluVRS$?j*(4v!pGj*=J@iiy5g^xr2YDe2BJ3V~l zE>mX2D>Xr2=XigH+tB9<@s}tEJPQw)&IV_cLPFr%FetL%2o*L>mk|@3Ii)6Fk7p)o z74Z_zr?^eGzUCA!CJ`KkIkS=u3aA|ZR)KHZo(X=c;4jF*o(hn|WB-Pxb)I&-H@=mi z3*t~_o%L$bkA6Y?{jPv#N2#XY3kI+Ws0Z3owPdA+^T|1~vtu^xr&4XYEpxeA;x^az z)1M3v1q+1IXF9etl9KWF=M>dH0lM8R>L;kB{!z|@(Yb*Jb2tp^Bc?2VHQq0jLEx27pYfrLp*wtwSp0v>4d%y zH@BEMf4&*ttJ^{tsd>|hyFeNCpra6d-^%0KCyOoYP5uj6%nVMxnE3 z3%lHV+bI05SCX)t5_q=RQoF^EjZr z=!`}1F#TIiR*|i5dy7``a~7J=fjn{Z7Q2mnf(NSM`!+`3AdJyveKF^gZwe-x8IQsS zzAeVNM?~%bZ99BnIIv*IF-mjB|0!wH7Tpq&{K=M_Gx=g2Cz|s`=iXd0d_kY#cs_zj ziFll%+jYY)y?YUPw{PsQA9`YwBut3|KXsp-z4Q(#aZOVFx_CD^XUDphnvCfOb7w>a zh=lj+x<2QVM)NVsAFg4<;7}cmP?0I$UnlRD@9z^y_RA=(rb&P?sqe>9q2$h6Y;JC@ z&&3`S8d|jcKBnkscXbL&3UT_QF-&5})TUivZ(8Ze>(gcyNMKun+ZYXBXIZrVyW4xi z_s#WvO_8pqIgU<*tOIak9+BK3ncZ$JbMV!R7m)k@E+?h^)6b;b;tHVb&`OPfh2Y3e$Bly->djv~!#Om)Iq6YJ z-?=n(?03POu*xCalVS)wm&Y|j0`oAgT%2h2XY~>3_dXrK9qWcXR)$l=h3CuCI9>HS zs_ZD-`=0r5WV+TKW1rKb!(swC5?;NMIDc#&DZPQty;iZy#v4lrn?)#aE!<|tYfdbU z|BtfkfX8z0-%6Y4l%j!_5FrhU=+Ht%N~r8rDYNX+l7=FiM9QehO!kOud1OBsPe{t% z`|8WJ?>Xn+IiL6Qp3eI@?{nYxZ+yq~y}s9XzWEt)dF@|tToDO3lozO7TD0>Q zE|j%f=&UWK5r7ghTTZPbp-N~eo9VMAx=~uogi;$VCyaz=1h?Oq1yEC(@*yE9Gir}e z=a=4k^Yeun&Sk5+N2=Bw6MM?H zx#RD)=g*hxPrLK5;t8L;A%n}hXNWt|;S>91q)v;~(Njl%nVD6w!hEg3;r_6SB{v@# z`<+R5qD_j{-Bp()I^!Iq!o1B+@#X!8XFY`oF!LMCDy{)&%o-CFW!zc)Je1F`6p)Hy z8JVXkvq{)#yp{DN^>Ouc9g1D|Y3C+tU5t$CL|49GFzP0ldF-+j4Ds-zOa|iH7z|yn z8fild5P9otTf(h=D-Oe%M8TSQH4LvgY(@)_=00qZwpzl??GPCz%W zlJ{ZlT^J9euAo(;{$)D4Ezwu_6idjS#>U#9>6WUY5UWep{x!KAy;?@|h_;?DM6CBV zZ*Y2ucOoe;DXh6W(fQHJkLUtsbwtY}cn$$ZuHn?rV%fVK#?7o$t@q3( zO*`By!IZ*^4mHeW9y31^>TGoerRpg*Smhk?Z;A93vQ7n}sM2?>VT_XUPY_XSY)4S9n49>@G|Sq%uED7MLl z=&!l0uF&~TYN{?^mgg_0LbLU!PfCiS`4*sQXf{T(^WAB^dM3-k7Ns#lgFAO`u)|<6 z+OwEn_S($}o|s_vp%V3kcp-+A-nJAOT6YS}{}?|(4mbba@{ySL806~V;*KF?hK5_7 zi?wxQn{GWhi_YZGZ2sdBP`EDKkO;e3LBUWkbknp6d`LFcvg=lD#Xuw}OqQsR{r{gP z`>nwwF;5%JjZjilY}R>H`?7_IhcRazUOmwQ@d8P=uNt?}(cX-{+;u!5B;IB33T!Ud zZRjr}89nO;`0IH8@~oW8+=a_0jS7i+ui~-3aTxz^eia^%?$6PB0xgGkr<8@slg|va#E+s|X}R*rXtf8_n)z%?DNHTpOSl&3m@inI zFDNuKQvOLH=Ag~I2+aoa0CC&5)Dbt071#Ycbk!7zTmP;0Vd(lRmR%}@b^kWQGCsCN z*d@R2J}ey3j>vIFPp^%moJHYPQc}A`sz(A^U)*AYYpWaCdYM97?xYHD6uztQQ?UR- zA{;k^+1*+n0XnnpC;DJg%yhm8qZI*j5?Z?B-YN)ZvMHlWZjp-y7 zYkp>ZKXaK;avWwF&})HaoNvtyBu@V&TgRO(!?v_J&}R4a^q`J>L+RMD0kTmDibeM8 z+MBE?oDF0h7-MvUu0z>o3;E2Ro?0W*#fwA3Hd2=Q&Hgz@#hmC{T`Eq=&Oz6g%rW>m z(G$iwyVTLHb??bpW+PV~;04Q+QNr*_F8R=T&NA@xjhiBF8z~&ujkG%-*)*iK-}Sv| zz3O~$OhAUipmVt^#yDheqHUY-?2$xO{0;ML&_80PKBf!~$#vadO5EPo8GNc)_D9~|+^6m&c zi9~U7Aq3d%cq^@(E=@gEmD;*VIPQ_cT!tlOYb&G~>BmDl>rDKODcFx_ zc7VkwP(HLSSQ|ko`uk*Iyri9H9L@~GAi8=R1=|{4Fmm00Y&&kN2YR7>55Ekys=D*= zfT)Dv#AwPKJT-u+ZR}0M0;rwtYtaGthzg2=6y@wb!xoAHDW@on& zKAs=F!o>MOy^d-BSL@Qxowoxcjb&sx&T%of^e$ZT%LAA2pw;Y#adYUij;V>a@Yjqy zeV+4M$2-J7-MW>+%BecCGoxw=XgIic5jWUcZ@=vp`S>!qd9sfo8d@RF`9Sg^Kl8;D zLoM|rB)XrvOD*C@NfaDXd}Iu*YUHViM6{Exq~4NWY%9*}|JSFzQ_9?-Soaopovh=* zk8jJxR^Iv^G6O}n2uc7$wL(kC5AzSX^T;}g0vGN7>a4O;Rq@PF#g5Q*ZZf^W48Q#H zTuk-b3~rhrCM!S5UP^zgdC2!M%e}JOPV{|h_tK-UVv)CpjHC_>W{{-qV0Kk3nh9II z5#G6Yqnmwe5NB;o&5p~R)mI~}4J=0XEtK9aCUJP*+tmN(0VhEmBJz%arOLN>krZ7) zYr6}?KUU;3%FVk#+=D$fQIU~G(T1*$6YYMu|HFQy4hhIXB&Csc)~^rVLEnTgA;k3Z zVbyPM-h2Gp!0oq=&&WDYL6pGy$SfLoi-5S|+gmEVBFeN&h=_-l~ z9RY{bEUS~ebPsHUd$$fb^79r3arq3t=r$WU6H zj~&s)6YDX5jPFHEj1b$Rfwky1RaH@0K8e;xvf4YM?0<-6Us;u&kZ9LBDXk%09kO96 zQ|Olm^A&c9N%_B7O8{-fs`A25uV%TxF##^m5#6G=H^EPzC7*b0S<1de zR$6S6@N2rQ508m*o(Gq_M%78`T+;*Gnt!lNM0#8sqp|ux1Xginw#p1y=i$zai};bK z1)SQ`6R}+Ep1zsdV9!=K#pZ>HkGPv=z9^O7D=tM|a>aAbwgn(WrSx8JDO3;zF}-6VWFoPq zv!GhsS~h%ff$XyV@4*X`b@uV`K?$`zh|||8WFLm{z?P(skWVXcuJLtHU=D_ahZTKy zRVR0k%>I~mrA?kj04POE$N2G53?H3-CAuP!tsq>;pK%#H2c}TFMd%ky%^mOnzh+Aq zfU>Bd#5^t(Au6=?@6SgWY+JhBhoFdEvfOKYGsNeSZd4mfG!QwjfFrsu%`|e%!<}CX zft};7n>qfbC7t*I74-Suc13`7Ht;P8&+!V zdHFn*ztKABjShj#Y_-`GhWLs=g0#MNRWn`bntfk@N&qrfx<`8c?n^}Z*%lQS#VNf4 ztu19A0uUy`UxT^BtY@c+8ujz4bm9z8VgMcF-pWQh8JTYPxtJL(V7(ESVyao++N#xe zIO~ξ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 z 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 C?GeWS literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/ControlledInverter.svg b/v0/src/simulator/src/img/ControlledInverter.svg new file mode 100644 index 00000000..927dc8c8 --- /dev/null +++ b/v0/src/simulator/src/img/ControlledInverter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/Counter.svg b/v0/src/simulator/src/img/Counter.svg new file mode 100644 index 00000000..ee2aa77b --- /dev/null +++ b/v0/src/simulator/src/img/Counter.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v0/src/simulator/src/img/Decoder.svg b/v0/src/simulator/src/img/Decoder.svg new file mode 100644 index 00000000..9a48c394 --- /dev/null +++ b/v0/src/simulator/src/img/Decoder.svg @@ -0,0 +1 @@ +01 \ No newline at end of file diff --git a/v0/src/simulator/src/img/Demultiplexer.svg b/v0/src/simulator/src/img/Demultiplexer.svg new file mode 100644 index 00000000..61cad635 --- /dev/null +++ b/v0/src/simulator/src/img/Demultiplexer.svg @@ -0,0 +1 @@ +01 \ No newline at end of file diff --git a/v0/src/simulator/src/img/DflipFlop.svg b/v0/src/simulator/src/img/DflipFlop.svg new file mode 100644 index 00000000..49f4ab5f --- /dev/null +++ b/v0/src/simulator/src/img/DflipFlop.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v0/src/simulator/src/img/DigitalLed.svg b/v0/src/simulator/src/img/DigitalLed.svg new file mode 100644 index 00000000..a9259c2f --- /dev/null +++ b/v0/src/simulator/src/img/DigitalLed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/Dlatch.svg b/v0/src/simulator/src/img/Dlatch.svg new file mode 100644 index 00000000..8aef7671 --- /dev/null +++ b/v0/src/simulator/src/img/Dlatch.svg @@ -0,0 +1 @@ +3 \ No newline at end of file diff --git a/v0/src/simulator/src/img/EEPROM.svg b/v0/src/simulator/src/img/EEPROM.svg new file mode 100644 index 00000000..504f61b0 --- /dev/null +++ b/v0/src/simulator/src/img/EEPROM.svg @@ -0,0 +1 @@ +EPROMADIWDO \ No newline at end of file diff --git a/v0/src/simulator/src/img/Flag.svg b/v0/src/simulator/src/img/Flag.svg new file mode 100644 index 00000000..87ef27f4 --- /dev/null +++ b/v0/src/simulator/src/img/Flag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/FlipFlop.jpeg b/v0/src/simulator/src/img/FlipFlop.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..5c3d87cea34b60ff4158c2222ca06425f065213d GIT binary patch literal 6224 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 literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/ForceGate.svg b/v0/src/simulator/src/img/ForceGate.svg new file mode 100644 index 00000000..28b50f3f --- /dev/null +++ b/v0/src/simulator/src/img/ForceGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/Ground.svg b/v0/src/simulator/src/img/Ground.svg new file mode 100644 index 00000000..70f453f6 --- /dev/null +++ b/v0/src/simulator/src/img/Ground.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/HexDisplay.svg b/v0/src/simulator/src/img/HexDisplay.svg new file mode 100644 index 00000000..10c89e13 --- /dev/null +++ b/v0/src/simulator/src/img/HexDisplay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/ImageAnnotation.svg b/v0/src/simulator/src/img/ImageAnnotation.svg new file mode 100644 index 00000000..8fbd9f75 --- /dev/null +++ b/v0/src/simulator/src/img/ImageAnnotation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/Input.svg b/v0/src/simulator/src/img/Input.svg new file mode 100644 index 00000000..42a626ff --- /dev/null +++ b/v0/src/simulator/src/img/Input.svg @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/v0/src/simulator/src/img/JKflipFlop.svg b/v0/src/simulator/src/img/JKflipFlop.svg new file mode 100644 index 00000000..9e723197 --- /dev/null +++ b/v0/src/simulator/src/img/JKflipFlop.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v0/src/simulator/src/img/Keyboard.jpeg b/v0/src/simulator/src/img/Keyboard.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..9922daff6949b554cde6f755ece5ce349e18761f GIT binary patch literal 12636 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 aQjzDO9w$(jdf- \ No newline at end of file diff --git a/v0/src/simulator/src/img/LSB.svg b/v0/src/simulator/src/img/LSB.svg new file mode 100644 index 00000000..31148b47 --- /dev/null +++ b/v0/src/simulator/src/img/LSB.svg @@ -0,0 +1 @@ +LSBEN \ No newline at end of file diff --git a/v0/src/simulator/src/img/MSB.svg b/v0/src/simulator/src/img/MSB.svg new file mode 100644 index 00000000..21997b94 --- /dev/null +++ b/v0/src/simulator/src/img/MSB.svg @@ -0,0 +1 @@ +MSBEN \ No newline at end of file diff --git a/v0/src/simulator/src/img/Main.png b/v0/src/simulator/src/img/Main.png new file mode 100644 index 0000000000000000000000000000000000000000..3bb25dac12eca21bc94afd0e87439830545b6b4a GIT binary patch literal 2061 zcmai!dpOgN9>>2f%l(kDQYlI5$0DReX}SE$vzSxT^lNRo-{w+8C7T^15<7k@N~}_& zWE%-Znqv?YFquI^Lqk%jw7a`|VPQcglW{nl!NEZj6B9>AM;#rV zrKKfHOUsFgiTU~YA3uKB+1a_fyR%rV+}vD0KR+KIpS88Mix)4#;c&6^i~e0)5c%?=C< zB#}r(MMa&Rovp2{XU=S-ZBd*$1*dG&O;bftca5QJ8Q2SN-@fhZ>nkiQ6p2JRIXTtU z)e?y$BqSs=GxN)rFP}euuBfQs^ZC=$(`II75fKr+y}gllgz!^6WPBO_ccx2dV= z`Sa&>b#-NBWjr3QxVShyJ>A~k{^re_&z?OK3WaTLZExPZiHnP))9FYgGA%7FDJh9e zCJzh@)YsS7)YQbp#56QCgoT9xI6$FLjE#*^sZ<7op^8_PE97FS7==Os2tZd?*UHLj zd**h)3jh)TnOrtJHw>r1(P(sbcJ{h_{qW(#c~A26^z?{CBI_GVJw=^4&g_}$K~Yg? z8hTJP2qi7;SCs{EqzA$=0l_EMsG1-85Y$lgX3tI{BT8 ztBX_Lr;56Y*4EcX#iQnV<_Yx)zU99BMgIA+^B+b&;2ZG<83qHh17}OlHcvFy4c8rg zeAJj|oWaT%5)FME`I0%~s{KdWG)YPzbf1Y-(@JUF%Oo;eEqlx(Yo z_`r+m_a1bMUF`#RSNE_(C3O(C&lT|fT2p_nrEQCeB^SY+T`A29fASbp7j%!;yt7u8 zq#&7=!%@bfevOWs5}DgdYAedN#revF&Sb5X~O)sl1RJcP*W8PgmFa$`~htT@o3{Ip3y+O(J{)%>)KMAc)>Rs=}0{& zAu4w9x zJ;N_ukTC_0+oYJ4iU){08ePu&%1fVOnTuW0!G??(nuBeuR6l<{UY>@q2NHHUB`7zV zz@kNRJ^X9`fC}r~kJc}_8GMM1t&QP_oG~&oMRUo@q1n6rUVd;Po7>4BS(ARxJDJ;j zQ04ynyTOUNowiNAr3b057e2e3M&znO9%M-VIJAdTiE!vcZAhMdIWjnfMX5w2n%{Tx z#?vyg6;=yn5O5$JLSj`S{LV8f?~nLyWyhax?gF zQ_x8rf8VIre#r(4j5#IJb|ozcjj8++q?9o~PlJ>ZwO zah<2B3p%$oFZH|J3^1Qm7hLpKu~ zhm}IS%AdxCpH&A3VEV2iIlOj$rCF_ZcU{GJx3ln z@KVF4f6KC-kjQsTgp>_mzC^D2daT2Eys-c4DF>8KQuWankwCP5#(s)*v;I&N9X7{Y z`1q~w*>3d7aI){U{0qG&O9Bcp!s*-2bT*aJf`I>HO>*^-sOZxX!i`T>y`xwEsi;smdn>VI2~-{Kbc8WmS_}i2JeK5!c6Fvfr0`sR~^>d`KncX{O>O8%=So~Ax~&ZV3{ zc(Y|S&a1`N1&E3EHSzKspptByF+no~xgtx#RpUD62AovKsb#EosR}Vum;FduzHNGV zI%d_7U8>BcuWb+a;Tl(k+2I_E%6g)KZD0t32GNOlLE+xQgrY5WO|I|U29AtJH{wBB zKX?DfSaiyf59$29YC01 \ No newline at end of file diff --git a/v0/src/simulator/src/img/NandGate.svg b/v0/src/simulator/src/img/NandGate.svg new file mode 100644 index 00000000..04cddce2 --- /dev/null +++ b/v0/src/simulator/src/img/NandGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/NorGate.svg b/v0/src/simulator/src/img/NorGate.svg new file mode 100644 index 00000000..55e9abc2 --- /dev/null +++ b/v0/src/simulator/src/img/NorGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/NotGate.svg b/v0/src/simulator/src/img/NotGate.svg new file mode 100644 index 00000000..a0d40ad4 --- /dev/null +++ b/v0/src/simulator/src/img/NotGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/OrGate.svg b/v0/src/simulator/src/img/OrGate.svg new file mode 100644 index 00000000..741ba9fe --- /dev/null +++ b/v0/src/simulator/src/img/OrGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/Output.svg b/v0/src/simulator/src/img/Output.svg new file mode 100644 index 00000000..7d4298f6 --- /dev/null +++ b/v0/src/simulator/src/img/Output.svg @@ -0,0 +1 @@ +x \ No newline at end of file diff --git a/v0/src/simulator/src/img/Power.svg b/v0/src/simulator/src/img/Power.svg new file mode 100644 index 00000000..a4619920 --- /dev/null +++ b/v0/src/simulator/src/img/Power.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/PriorityEncoder.svg b/v0/src/simulator/src/img/PriorityEncoder.svg new file mode 100644 index 00000000..417325c6 --- /dev/null +++ b/v0/src/simulator/src/img/PriorityEncoder.svg @@ -0,0 +1 @@ +010EN \ No newline at end of file diff --git a/v0/src/simulator/src/img/RAM.svg b/v0/src/simulator/src/img/RAM.svg new file mode 100644 index 00000000..92fd8293 --- /dev/null +++ b/v0/src/simulator/src/img/RAM.svg @@ -0,0 +1 @@ +RAMADIWDO \ No newline at end of file diff --git a/v0/src/simulator/src/img/RGBLed.svg b/v0/src/simulator/src/img/RGBLed.svg new file mode 100644 index 00000000..299657c8 --- /dev/null +++ b/v0/src/simulator/src/img/RGBLed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/RGBLedMatrix.svg b/v0/src/simulator/src/img/RGBLedMatrix.svg new file mode 100644 index 00000000..cbb52e83 --- /dev/null +++ b/v0/src/simulator/src/img/RGBLedMatrix.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/Random.svg b/v0/src/simulator/src/img/Random.svg new file mode 100644 index 00000000..4da0fa99 --- /dev/null +++ b/v0/src/simulator/src/img/Random.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v0/src/simulator/src/img/Rectangle.svg b/v0/src/simulator/src/img/Rectangle.svg new file mode 100644 index 00000000..f2ac9773 --- /dev/null +++ b/v0/src/simulator/src/img/Rectangle.svg @@ -0,0 +1 @@ +Rectangle \ No newline at end of file diff --git a/v0/src/simulator/src/img/RippleCarry.jpeg b/v0/src/simulator/src/img/RippleCarry.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c1fbf61f06e9431bcebe1c2fe0af1c5cb53b6f52 GIT binary patch literal 17664 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 zNdaFxc$AYEzKVb~GKFuOXNpU;*W3*!w^G`(Qd&4(LW9oClADEn000000000000000000000000000000000004080c \ No newline at end of file diff --git a/v0/src/simulator/src/img/SAP.jpeg b/v0/src/simulator/src/img/SAP.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..79b76da052540ec1a57e295476003e558cc8f4af GIT binary patch literal 41613 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 UQA${o`xShw_t{w%TKs(JfBtH#PXGV_ literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/SRflipFlop.svg b/v0/src/simulator/src/img/SRflipFlop.svg new file mode 100644 index 00000000..c41ff746 --- /dev/null +++ b/v0/src/simulator/src/img/SRflipFlop.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v0/src/simulator/src/img/SevenSegDisplay.svg b/v0/src/simulator/src/img/SevenSegDisplay.svg new file mode 100644 index 00000000..bb3d2ae8 --- /dev/null +++ b/v0/src/simulator/src/img/SevenSegDisplay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/SixteenSegDisplay.svg b/v0/src/simulator/src/img/SixteenSegDisplay.svg new file mode 100644 index 00000000..ad05274b --- /dev/null +++ b/v0/src/simulator/src/img/SixteenSegDisplay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/Splitter.svg b/v0/src/simulator/src/img/Splitter.svg new file mode 100644 index 00000000..fa4a969d --- /dev/null +++ b/v0/src/simulator/src/img/Splitter.svg @@ -0,0 +1 @@ +0:11:2 \ No newline at end of file diff --git a/v0/src/simulator/src/img/SquareRGBLed.svg b/v0/src/simulator/src/img/SquareRGBLed.svg new file mode 100644 index 00000000..7900e614 --- /dev/null +++ b/v0/src/simulator/src/img/SquareRGBLed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/Stepper.svg b/v0/src/simulator/src/img/Stepper.svg new file mode 100644 index 00000000..f18aa4fa --- /dev/null +++ b/v0/src/simulator/src/img/Stepper.svg @@ -0,0 +1 @@ +5f \ No newline at end of file diff --git a/v0/src/simulator/src/img/T-clock.png b/v0/src/simulator/src/img/T-clock.png new file mode 100644 index 0000000000000000000000000000000000000000..66442d9e3ada92704aaf5c3e6bd5005242b240c2 GIT binary patch literal 47639 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%0Dv>aXGAiYQ4=zns+wkgne** zAR)t%?P~g^nnjYzjp3;02VR_}5$2L;P%D^g{q(d9$a6Ora_DdhAa~?8DBr}tBw|(FBzMXj>tltybo|sEdv%cIafetdm$^q*^E{hyxE+>s! zVvh*Wp7x;>tvUUA!WVsd#m!*r+K3M|G6PsD^@+u#?lw(p+OGBSrWI6e9t3TMwa}gIi`>qrFWCHEV#{-cjm*Y7JZ1MP6DLI z6uofhQ(IQO-b<_=SSW%%=9aHfKoFBfoy29?l)L||C-2Fz)O2(5*Cb+&L2FxaPDzK3 z5ob~0>JT{7xD?RBx1t!4&$BUzi-V zyjG4A@)0=3M~z<@-Jey(MIJ`-r{r6wma8qYk~fWqu*O&TTX&nfXq`5be*<@+|A0Se zodTku4f=ZMc=C6Se3QOnsPN;j;K!Fnr}{s~#V5Y{_#5@BeE^hDMcoVnlp_2C8t87qw{O*)PEhe1 z2KvAs9Ku2sv)&#+2(e*vV-Z?kklo4TD{p6!P(@c>2|3WA#s zAkZf{(O>$K-a)dW++lZGLmRqtSmZwSLyj{vBt(Dk3M(tRjjzR?DQRCV(Qmm*=1GBW zEP&3>*lrJ*uy1wHnOA?uHsr`zS_|MzT4yr_;6OB;zdizJ@PoE#bF`4E!$LXqDFQGb zNJc^H#^`&zcltbulv?}wvb)7VEJOcAK}R>bCwPIBhu8U7Jj4UaN zQD5VqSrd?+eD*U-l5KQvx~KH`U)KnPN+X{%SiI#Q*W!tuxG*A$;~bng&=c6eRz$qXI)iijC9`!71vKhW1* zpqHWl{(JQ*Y&i;h#g?PSbD>epJl^B`<0Gp|r&g7y(EoYxb!Bd0XkvfVy|DLVuh{2c zhheXnSvp5305#`FKB|dsj>~JP*q)s2TTbUTZt29M$GLQGu9v;Pc!xth_PD&;6~7a1 zf6=@7mffO#b?STu-9qwZtNVBiFJ2Rho+7+@``A04S8^X7oaK{ZlnWgwFmQX&Pstf< zG`}+VMX|38zlgVyeNUf%k5^#J;ks%a$==lfhLLPk@<-Lc?zdu}V;`p^GDRA>o{^N} zYhoWKTlR>!)tCbtb8W4o+rKY$*r}dKm88t&uB&c;=JV3Ckae3LsvW^Od&y` zHd)=~ns~N$izitj_i;p>1oPfxbY63BGYyZ|w`7yQ2QQ%61H^mE(*@nRdoDZaL-s?P zo>zDzyjDC%PK;*QXLNOaaiNbho9Il@U@Bue8OcY$@Ej%-rL&x@v+OYjId+@*v6nr4 zGb;2dG>K9Ufnd4*b`RUY(TfQtCoa zUvF`I_KsDSl~Sku#c$P0jl4TsdI&7U0R2C=8b6PMb(D;=#2iZ_zU{v$G0Ad1$M3M~ zC*n#0fr#$61W!aqS`sIu{2v{G*_afPV((l_U;r2Tb7%W^50+&|JJ5Ebkb0=mBZ7A`jAv!i@wl-3c>4E zmwT?#FAJCqC}f`PFd|GMG`w|NS)1rGwVSBHlW&K~&q-;h`@R*at7~(dD-WqPA$FwH zUi(p$KW8Gb-e(4y)4v_Q#O}_XsN=7pN_DKZB|DB~fvluPJYNvvpz$XMDBM4+LNrnZzuTC6#1fI77pgLHpI&#n zKxU$Mki=_Mv@^0GXG`k>BeV7vnXZ#lNMDDAMTF5yB}y8n_I0vmp68?#`=Z~G(4PEN z&S`Z<8maH>1=Mi179taqi&aULHc`^>ahljW$}#`farxQohK?LtjDO}^u)S)~nUm-! zb^YdR2g36{ifukwL?>V(`JRF7Mg>so_w(nRi{^bjc`Sy65d^7klu+G+RBiJI3(`I9 zJ5S8*cdg@$lSNap?fXyE%>HL@|JW0=>9jl;-!n)jG*5cdyQbTf z-B}VnkF1sB+_;cB_dd?g4N{UxoMdU4ygGTGPbwi=t7Nu2H}BS;!=ktU(RQb%4>iZy z%A(&AtA?uahdKCj1)q!e?es;1b>2k;f4D})TENu5c2?}5b3ZMS#7)@kK9-GYfB4f6 z4R1j}i?vlgLtk$$+KxFm&N*{fc1u_)chcLdAd^I!J5c6Q~R|pF@Tp zV{L(^GnmHjX15m5Q@;T%M&2JS9vd zB$b*=O*;_-&uoyfS0jZ6m%>UwFkrQ0!e=TB*n)k0b%vU-c*%PAi%53M_gkH&wUc)f z92TN|<|7@Q6V%X9-6Y&%C)~n;%$eFaW^O<0bB=GO^hO(m7Zgp#s%mE@J6uiAlwtS; zR`)LSj?LE1waxABY+WNCipb>67|)nI34KVgx|@lt@ulGdh$V@k$aTX}oa@J4Pay9pw5f&TWY7@WHunJ&E&+*O@@QxyP24nMuu^ZehHYPAkF){Gkan>aU z!c#(L*@jT{E5%=R==iAHk4!?APDNsxysp94!3S2_`iA;jZRY8U=bHm1<5o(x?yEi9 zocQca*osuhfeHTbUV%0CCD};-W4r47y_For169)xcYK|R0RUQyCwxxyZP)jV=8WM7 z_fZ?`6anvn)}pWN`*X2qn9=X)D?8ALGN|+gM$)b~OOmWoyLj=VT{ge)vaarQH?fr- zwJvVhg;SS{>xBuaFJs^>HQso){@plY-PYVK#A%4VMF0JVzRMfukvdGwSlFIMwFZM1 z8-sWB0A@Y%gdM%rVe%o*pKlig@Fy`eQCThjF@GBUSLLLV^zmTqW&M37HP66A_QMUD5lH6=m1r;@4XX8Tzfe_I~pkL6Fg4iI7C zQq`tsIZAJCPkIt1a>Vbpu$({@cQ;nK_4>!jC4rWPz*ZJIn}kH&C+oJcr&hg@uJQAu z<1}Tf&usTLesp@8AjDyi=J2QAVpW6Pj+%`qc*qa1cjQTsA{4MuvT6cW3-Tc2 z@SIm|{QAE)=v$`nf60MA+Gq75GUt&FQEOCcdEt!eGFAIHRAGoNxK)$3=DnfY2pwIZ zQaF2uDu41Y=R#(f1QNU{0PNfJ(7W2UOmE&QHZ6NYXhqW{iux*4%#RGE-XUY8*UY}5 zHYakkkSYHRYVMShpuR%}D3{uhyTwLBw2+D&1N9y0slUJTNhA^&zzz1Y5JxqB@)Oc1 zq@@d!xM$ODzVgZS{*s5u21>3%~qNj6(Y)d}MLA%B^vi?63-1VyVQ zo8QDd+GZ`{ERKt%91f$89N1=!bM?xWt?6e_zpi!h{`C#sQ|A`d)mrA?blJB}>SJg& zn@jFr5OJ#fhPwL*BXfMPIe!0#W7wbPqNC)0p5Bg={m_hpg#*u@=c?lbe-w-4<6^E@ zeQiX(@>%8V{OI!?%g>H=5N_4a{{Hv=N#tIxic=Y}nvdqitb@#1Rnr~Ii_`Hr-%u%{ zns?44H~ie0@YEPa_~TFOhwq(4D==-J*gK6BNE51UfE{rCwz${)#sNU(nhx)so~p@! zQ|xw)l@^gRX$@_Wu|Fv*mhQF_Aq=O&okFRTn}`HuAAdO3=hxhqY0H87|F2T0s`T%F z^>MIowY6u(K7;mc&-3jDs9ey3Vl|tV*&E%dwjAjgXa#D&_|6_*C`R6x*lz<&aU%1R z|2;F}5*|;7jaJ)@KQe1;)gMz9nM^k%ZB~QUAi4eUdkQmrt8b+zUvW&)LCIUyJEoyt zo3oT~l1viTgj(xwzO%zfv<6(+=Z_G1n?rXyPYn%i!>9La8R`Oe;AkBgj*yanNDl*= z%T9Hht@8z9mod3s( z_Rr-1Hb3jN30&P3F1cOG%=fF9Z!2G?+Nt8{GsSD};Xy|el9z8~Mtc+&J(T=Yiu5A@ zlr6S~(iWl9m#L{bl(^S4wM+z#dhBUL&FA-Uj(#ZLBUtf9U8mM)9R2w!r_qV2WnFpa zgIV+8CHtTT=3KX0|B(2qbuZhzA-3pjTMV@ARuJiEUHlmoeVZ#Bk6VphSCh;*pm)FV zL`-HxWpCt@pdGGYllq9-e6q-VwUy_LEfYPQ>|-nEP;1(yFFHTKl!41MbK;kJR8zKv zN$n)=VaSF}*+NuTnUNjLvlXML$n2KX$LRkyNcg0f6hk+-OlAK|rm>+S0gHTGi>3c1 z)5O@e+I-(;b=14o|6E03UV1@Z_=Be*lCRByTp~A=(g$994TRl9?aoYM> zsNP$L-aCOBmoQ?feYp95)OkCr7S){SF3659%IxLm^+YI*f(`pTTVG!N*3N}*N4K=WK(;g;X7L%%{sy2ZOKb2?0y zv1Q)H7Gni-qUTsN{yEbiiU4^~CByspF7fgEc!?jy4E*0lIjtht3Gn=fX@9&rj^F8| zM9S3a;KM#dYU0ww1?+aQ9DnDIC^3k6 z3v{*T)6MZ&WHm9Lb2yC8{+)pAbrjeI5z`01F&t=UoR_l|2Q+(Iz* zL`}^PfD&~c>n@ZQ5iPQPwcpg6Y<+NWp~t5tgnhO=9~*0f*mvW*1H*xx?QY`Ii~Qt3 z*~wC#M8tx~I}1H?RDFOW=J4Lq)xW27HJEj&L2$vkk$rK3TkQN#X2cwaN|}w6-)g~a zPKxfrFPmqEFMC%hJp6Ey zacdZ&x%6~pOLtGrwkk*F$Cyu$s}%_m&5?MgyWM$T%XWwL3TL8E?nG+Xe%=0@p<_F$ z%=Tj?N=k`7Ol)d{O=>f`@~B^ zqSiq9PMf6taoFIMxt~Tkx8a!jxu}%zja9mh5N^6)X;pBQ9zi`>Q(ohIysG$NKU&}( zHFRr>tRFRbNDRo zS(+Xer@IqHGuN}OD=jn-kU99&FXYp1YnrwR!b#SL%^iO%bCDXpEl?hX+&br5o3tb{R^0rRcX43A70W zOj_<)8i~cVN=QlxN9~MmoUuQnnLQCYxl^|2r$Oqxu{o@JhJ9$It@?*NukK-AiN_$8 zTj*vMSKSz6TkvTa^chqXyT!VIzT|uE!G?UeO^g1Hy-73UkYy>el{xJ>(T1NIf6lNz zWT`l3S=7*;t&%2o@oQDTec`^Vfa&nqH9?tE#wD)<@8oh!o8u|lolq+e{VRw4xfzb# zU%K2XdZo0KFSbhSW_fKmcAYB8OgfCMZ>iOd-Sw^Np^fr%b|l{NT@VQt`AuBQxKpTZ9|G>mRzMJy?GN$x`v?)2a*qlJclF$@gkIiN;sTe?u*h zqjJ@jYrzkFs~7L^VmkgI(KbHjl$+r*`8ccDtD%5_t9WmWomomqs-9UhIR;<^@_SFFqM_3U^oXdqQUB90g+61>NZ0zF?}d{!#AvNZ=gRU!LwCuc^{izM_9` zCx1nw@%bR@C$Hzx?=j5~5(lwSE!gieZnODQFL@Wx2{s;{4Te)OWYt~fz zHnj{rYxRsD3GNTxlEsz3V2wrE|C~|h9AZ8`a+M(Ay1!@kQuEFmb2|-O;&#Z~vTj<+ z8?AU+(et!t)o*(3!mL2}{jBGk8x?DNYuE?2_OS&&vfU)(Bb!eej2owy&~ ztfdRaPAjX~?;^}3;k!orjp;19iyv-Bk1Dt1tM*zX=f|@*{=-v)n3C`h>>WmbS1b!$5yzBDS z5j&>VjzhS7sfBsAGqrMae>u&x$fDa|d^blK>QR0r)KB~l9KViF-oD;Ewa~g=z5e;H z3#=FNvHP*iB=^mh%@@p{L?IRhaF4;pRu1cYSYWy$@$KTm!~#_b{f{q2Q&!;A-Sncryqs@(LDq50=; zIFa9c4Yv=B5_RKnVe%=fck^fZr`tD$JS@YbCl7+ zM2E{GxwV?CJ0?M&kV5EOf@OS%=PB=(Msp8}WaXxuhrj3QP-hI#$ldII^}48$_JQD) z;La5HOLy23sw;0?4-5-W-Wl{_4gE#8&C|G$?PxRfE9!UI8?fwu+v1+oy{aqILR(YH zcQqv5R9tOFz_&xmO8vz(r1vkO>@u9B{V&UPx0hPYcYdZzjd;Ac!j#@L<1fM_%)!Djo2J8e$uiz@R{Y{h);V5qmB=6<{ zzEIXRn>9CLYooyct7cC7S)<&?D6{?Ep%a4-Nk*m&X6-O8Tq4h>hQ;@>i1_+{>`U9v zSZ-7eBrnVT!>iHy3q&s?6Fbw>D9K1L_NN=F;+c!S(`rk3m@I3XygStqi*)m`<-P*6 zKy^!loUd|{k)3Hz0x896ub&k&)iv$he!l$d&wQV+O?RZ}gHayb6kB($5@sh5X|kh? z)7X$F7^lmT?4IdgAIr-&*6qB*#`5@lE>fJxE9latPr69=ByD7kt#8gh$VGXrj@%(C z1;`Y6?;OlJZ_tN3Lnrp`AGI9)4%zk2z{>tK-;z-3Qj=V!i&Xm`C_NEuo)_U6vujgwBFd?J$&mRxU4QV}W8=v;C;69Mc zjVT~U5*+)!P?hdXQIyrpVj5c?9(PUCKM2`-6NmEX{j>f?s=1toMH^iuN=a`Vs&%Tr zB)o}#^N)7KBE9`_CvYKcdcR?(Ly2|l(fQojmJHo=d;UJ6e>#VdI_IRD7~af{lWftA zYPsF~#vw|Azs{~J%g|Wi&tdtodv9gkFFz5PV~NiE7dXGtmpL(RU9+OaeL#{vUiezTQp^#-wPwA}h8uwlriwGlzUPY#{vsE2HR9U$ z^aI5~lOC@cHW+jtx)o!e0eNujA8|o46fvxcTIWq}tIZDZDD?PD7pycsVu~l5xYjgl z&t-?2AV-d!Z_oqR&ekoN`s(sZGj2X-q-#j$H}z@pO_ZcA<&~xl`bT04WHx^RAXRS6VoBq(R!k?-XUQr)+4zbqH0+ozY>M}t~!d~Il& zWOv>loot_O+-FfW5d{C+kqedt@xM7LZx8OvB*wamP)|}1&1%2e_u5Nt%UkQivLZW& z%&nuWFCbY{QsR{s|LASsUIdTl!cJDEOzP`{2{$!oQOEF)ax_o3_8(loiE`@eV;~iuiX3VY)dw2>2ztu%Zi!{Blm0* zK1@jp`mx!tCk{$Qx=psmP90!QJg{hW&6s_vES0zI>U08W$a#<@7PFspe}i=JpA$3T zACO#&ixD{=jrUd!Tfyn^K5Maa4*$OO*WX#sfAJGFu#A_FeMCcT5e{p}>nqGiZf+hFx|W^sX{)YYs9trOZf|J+85%z&M<1EWo2hN0 z+j|EMby`8G$0#LP;~BoH;U%`ITBIbNS5;|gY2JDDt=Z+V;=0l7QSnAW>z|Wk zO;S8zQ^SjW+YMoeQh$7mIr?iiNE6!N2W%1Pk5i5DzIE?qReb+7GFtVCTOc&Dgs4B# zkwclGJ#%8&=ja57{0`JxSFpo;Nmic|w&;EVR%Kp0s)iAIx{HEt_y^vc;Q#_D2{lF&a6#e=c{-S4%X{D?3y~U=% zT9=*tzkdMQ{!x`9zuPy0^DZnt9qnAj?@$@Di(F!67cotyhuf3=`yNbp4iqX+8Qs8( zAC9r8N*>03KJ%FF{zv6|7w2AZTYi@LWI1KfMmHd_nn0CrOS<4+>Am=T__+p}%h`yQ zw|>K6WrrtKlhRI`H=05l+ABzRz=2Fhz5tq4_NDv z+@;N{EsZL2%?>?4G$bI|xb$N4rDlgURxfF#)AiAty?hf3^%;+hiMQy8QqNsoi+@;QU@@ z{FkQDCb_KlmGb4QtteZ<;gQ@a20AgB6YWF%0YRyo&oC}_hg7o^7C%XX=i@Jo4yPDA zHOyfYP#GWUVQZNEO_t~`u7R%JMq3@`PGjo}7ot3s>TELyw0_J*J#x$uOnN%sAWanWkyQW^tENC2=*AC@+znGYGIbKw>Unz6CcO^94x1w7W8d>y?pnSeIMnVQN(>Zjr>Z<`$nhuFFtExe0t8zT37CB%d-gW zgs+}wqHJ``vC*K~>Lw-&+uK~&r(u2xqx5=YP*++eWQRC>yxU%Rwdd#L$XyWvwpD>+ zqsig<9BB|;*%L`e1^qGF+nX%qzj=wV@bK_fT#jmeGz>_7h6B0nHsQkbZLiecnyxz3 zASqTnqL@r`Frgb?ysx={#`c&E`6d8S#3ciNPBX%0idpOoF_5*cj9Y?U1${w$j zZSvRa##6Uf*9RB1xz5y?R7>aMI!^c?7N4_Pw@WY%FH zrCfE0M%v3V4441acgp7LB!x&QE4C}x|9y=;iuB~#ejYU1KfYEr1k|!z&G9Nb8DNq$c3i}2J8b*gBSM`zb`h5Y_EJXMqvTeZ{s&y>h zknD5aOb_b_a}mi8d5+&`$RP}Qj^D@+oO^D&;=Fx^kESF}$ubr|!Xsckg^yLwPqf;0 z_RA~o```RB9({RDJC&ak9aQ<;jqHmN<9*$^wL)K8@BHrObcvA)^k}=Ep-CHKXnctu zeiK9|p%M@*IeE+0-cnJj*>F?#x*w?Xd6(hP?wcuyf<2h($OQ*JuIq*?> zCjndJxq3;*Dqi#wLG)6g6J&z?)Gi(3;ovWG?+bx#b0&w(Pjjx ziZRq5ejk#kX4{(ibxJ`Mq$t|jK~uj|R}IZ{)oKy)f2+3`wsR+2=M<5@HIh^7y}yz4 z>%j7alXx_FFMhiH!Uz>DRVLh9MLwEP3~z&S6mK8PCX9KQNDh-25mPAM9#Yip!@ABw zaY#jf=L+;z!D*nFs93~;pzrK6(_jl4q-)Zq4{SNsFe2Ss+!%$j5 zi?#bpbsxk3UovcUFaM~I zb0_81Eu(__ZS|^X0)8&jitp+2?~X8j<37Qd6u-rnTO4_b;h^DtkEEZhy$S1?<(X{0 zS@^JQr?sraA-1*GUYqlYWC6Qoso<$mC|<)ahoq!>A(ItGe)vJ;lR>*wyUgt*cauo zM~d)33|=V5baK&#bfQT-ePTm;;wO<T|NK8y-aoc zKBb5t`MbsyWzBRt!}Tbw8?s&!gPE+(TD$Ablux5~+gi34GI?IOh|y94H}hj^i4xlO z#arwoWP8$gqv}{{S!^+EZ?ues^SJT^>LO_R#}6t*_wXP8`0HnWi~@(*<>Xaak7IE(DFZ2rO**O=3}y(@8tPePy1VQ%*5d1&H`o2eFh5gF zUyh(HQ>e^L%4fFyqwLM9LtzMMSDC)$PnJ5a^s&p6QAo-Pu*^!OD=+|qy;J5^CjVBE za{Av%=llu*ngaruGJ2C3%+1X!DXvklQ)uW5w$IQEFegOC4_3N+h{uG|*_-uvXRv&q zdF>&5Pr96_Z}2bg^AZK`uhAdHCjf^)SYu-&VDdn`9k5ZzPft%B@cg-Rm7MqP-8*sO#E9qI+#JMedbCO0 z2;9D2^7U)w1Vl7K+?BMcm!~K2WGi2}dX){prh!LAW}jqhPc*cpcno*ULpbwB$w*O6 zE~ehijc@`^S>Af1_5B_T?B)*4(@hqp~ogGbd^DFNZu5aJcXr2fqXB2|-r3a#A&x(tv0NnWCxEh%!z zNOO#p}sLrM1zUR5lspaIJ_bxoo@O_V7RR6OtddH*lZ9fb`p1P8x zD>A&NA*vJNa?C9(02yHeqSYYwMyRRj%9Sg-fPDdspckoMzkUs&zDp2{M+Bfvb?CPs zu1_|WT3=ruB6o1`AmUcau^s|Aft`)QcWrU#00^2Me7Q;LD-Dn{nz@9N5SyBnl@%kh zXY&MNkBY>3JJTSBOeQL_)M>j1x5YDRoZ)s?5YzUIT)Kt&=80C8@#34alIb|y$0Nf? zmJRS3#(|$6T*vj&ta@6e*bp{iDez2r?lZKpp#EYTy1@K)~ zQCv|vPZG?;;8r^Kb3L>(R~at3nU45+#4u@%`n!L0f7?M=4>TZ$57g~h1x7KmFe?tg zP^H|vX-ic)qX5ht=w?d5x&riV*9i@1;|sjaq6zzf!K-(Rh?STk9w29$q367?V`5{S zH-DY+yQvwp(5UWMV+DAc163e*t!UnPeo_$i4Q7FzgLy8aqOH)AlqS zmYabF!6|DmRQMSUQk{iO-WJ69in0ehBbOD@FwRWQ%O5Zj8OJ&*(}hpi*j@Vk);t!V z6sa@fR|)|QF)iPt(=CAJ5U+BRmX?ss=!uNXyKV^eXQ8AN)-w)?sMo1y!)?Q5Vifrs30Io%&E6M1 z86fvVZtUoF_1gLw#895*b@0*c0^Bi^0xe;-WiM1F$YO6ZkQW>H?g zQyzs25BeCvwH7qkK{H$sfoydX&=_*LrvQ2a1|}|z?y5M%M#if^5aS+%c~wn7&>9Ha zcQ2CK8|CDE+@lDC4fWVC3cub@&<%_l`PSo|O*QA;Dp6g)NVPIG_wK~S15JnDBIP60 zBNjuONul%U(Mc3mFVT)lt!1gT5JHDZk>1ZR_*88U0`i!`B^EHnfD`JW(eCbUy$}J* z^WnQ$1VF$8bjL=yuXVYePrGnj?4kLo$LMMA;LSJkEnvvk9X-olvr4 zS%%!|L@;J8%iX9G%b5PU{*&jC_j4i12}eVb8bH^ z$|>+B;B(jn_Ec}-SUFLfa|`Z$Tx?S`Si2#65g-eeR)VA1qXubA9_6Q+l4BEnds39( zZT6%t=-DF@R4+n%kP^SiW$fU$0-sZQK@;1v713;^bP&i04Wb!AHUJ3q`8~a-Uw_#~ z-#+wv%>BSnvAzWNzVD;o#}jxY&~}X&CQp@-&DlCG)V(N$ z{jbXdwKnl5PkwV~1nL}0LfFVhrrYP50WZL-Aq-*#5%MP7Pu_(A_5#FH{U5V=)QfiX z*Y}E~`X?!{3DC&)b;MD9f*SlWTZI|=-sh%f;D zV$yz`wIDfg8%vH=0XJWJLdVlfQjP!i!b*r6rVG1sc0A0Vqn=*=V96^+djqtfl-EBx zae>R}N=tB97(OX!DUkFQw(KmHm8qAXOh%hgoZ)QDDi`n9S;}(v`f2g=*8N-O80qSV z=>9Qg-hBjM2Knv$3V>(Q-U?M(P*GAs)Tnzk>~H|0Lqpnh?JfOQNqq{8y0?*#RYuEVVJrxi9i?$ajm$1*7;Kz9R9Funk^h_6TT#WnL3+xnP%bE zJ2%X`m;SvqDsA}*au*2mE0eCdqc zn^k5)@0d$Ux8(Y56iAuTY_=k9pZ-T{uI4IP4OPD6K5ZlDH-E{%q!>oeg?qOt&lF{}BTAWTi zhVvD=X0a{%2ct7S@eZ$^1>IYH68hwC{rg(W7{OSfmO#bZ2hhkZz}TB{uLg7@ush44 znL>0f0EY+(_%v5mRe4YwJW79AWps(RO!puvFq&ea(BG=OHR>RNHNum$BR1)QaQ{aW z=P6+1>d34txkxSfC{(&yj_zO029^IV8L%8%v_2}92hBO|BqKg1;3m!hmWN(tWhIa< zvX7WKlsJ;eN z>16YWQcFbv*Icgq2M)9E>u(xBVz$#rz&@b|s4^6QB{MXn#^c`GwcOd9FW6ERxX-(g zYz7CLn}N4=^W4!XzKe)@2=jAtjapZ)4zyL_lJV@kERrT=LUWy26fR9wJ^7E?0F$5u zQ%B7d{i8yMtuF=FSy-|G{R(udp)cBAJdBT1tsov*BQPT3mUaga0z=@qr?8SzuiE}{ z=&M&Jm#&rXmk0Qe3$?(0KFv8TbK_0tcLtoYD~M*^a)zHFKD^WRy|^s%jE0pL&-U>a zxXOg^GXmS|z&%*cfNV!^f&h(`ELs4Im#sQ*SLXw?;H9&enC+Ma1qrZuA+TdUaP+CJ zsj=^-XaMb=L+N_<+T7!tftsOyPeI>X-7T3NY7)-Yo06=f{2FjAG5$)T(9>$I<8#@M znxMqUbx?2dF0A>1jwy2kK(rKgelK=V0w3Px$*?9J1vkxhw*4LUa(8!wbm7!yS(T^Gnkcg3Vh^j`YXPx_#Q^NeVGL2& zfK-WxC!e8G_}X9wDD6X)?vE}N?{&Nlb6(#~oD!>($l|qbWEFAd-|m>s6l|#};d>nH zT`=QWOB&E3G$IJf8Ao5=K;GYqlB0wzallp$|NeDCz$c{;_I_?Yi* zE=!H9CzUV1f4^_sHVW!=vj>0-IIG9QaVF(K>)w@OB5X3gv?5}&G{9w=$?qf?^6>Pm zudiPYyUlF4ow1ZT#z1I$+EzL>R<41(nV{G>ZD9gGyY=gya~{zJ;eSfR@O{Gxg z4nRU(ynNXlfI4rs0_f@)Y*HSl-4|KXYDq6Io6W&trkC0UAPodRe1?NeIE$_)4&Z_2 zt}wyzIN&mJGP4P21kO4D&9qwR=Un=$!yzRy@_DC5o_n=a+1_gJM3-lpP|T+R_Lb>Y zDWQrnZ7!w>L05wd|I+)zc1j=?-&a_mH_wHaQ72-;d`z5MV4g<5wks z%4*1eU2xRvHA63hzVr3jR~*mx*4N6_ zF8KD~#uitovGO(SUa58Ih;cd(+#d|`qz zftvonb}QyUnbMA&NXW!qJ0deb^H>PoB^z}od{bzA%iq2I9kWglTk)sbAl>g;qPST~n_LNu4 z2rO0_O4Z(WoyEgrP3wHV6n#~>eMx^|`&sV#>KP}`Xb5YNO^o~gdwrR7wes3pk@Zfm zv&{ZVQ;(_jhrWP-i0gKAI$m~ndc2xc=k{ON7>?G#=TH}ps0uEu3w?qz2$w~{JwFf&yIZy{Oh6O=G%NE zeAqRaqg#_I@@-)WiTW!=iu{=eKzfNhKQz@@ABQ$T)C)X!A*cX({v$a5VX~L#e_1f3gH->ZFwZ!|VRwgG4?5xOa~FH{1dF=ll2){Kqr@+y6fP`p;bcxb%LU z?D&10eCn`s|NQUcum8y9|27Q3?y#zV=JH2w$Auoh|3h+@sPU5%sOtV1esMg!$M56t ziz74Bpa1>GEI1C{IDY?!|p=-H`s)Q!ikoBzKK z`BrIc@ z_v`9@39LU>$6Rx_{QrR50J2>XmeRJ}P#5=|`Dvs)sHP!y$l8i zOQU4`B%3)whcW}!xNT$bEd>BO$GddtlhU)wuPvH`}Y-Ge{FrOsL znHXa))PTTMq8|Sm@G_+C3Rs>*M;8zfkRSCjc+~?3nkEt!a6`ZjXdVcPZv8_Q6%{)D zwg3a^hin>I*sSEse$Km^fD{G1$(M+NpEH-M;IA}=nYMd6-3%>@ILH#KalqT2p$J#V zFHx!~Z4O$H{af!_uSxnSv{pG)5eBeI8wi9q=zhSp85;t>Gb_6=(4#bQa`A;9A{GD^b_2X=Bm?Ujn=yPZd~reXki z8CA7k${Q@7d1oc8McnXxc!fe*P1w9a}ohS!p>L*L;#4r4p2UTU+XFf z5O(55zjkv2=Fe24gzt}ockW2>t_8h+y$;?EuVw_KFjF3=xfLgTr4vwYxY|M2DRNIB6ty%l=4f78P3c4 za}>yG4p<6^m!Y+}b~NG8Y$c?n1L{TP`rP^jjYs`_ec8e#WCDP2H)TmfMt?>ZVIJRB zscCMOtdE!R2NH|PiC;PZNcTmq7ag1DntUthq6GyUt%^mK`UVCm-JWy1b6q&9coYnl zcI8by4^u?vBf>B72zaM)f2AKc^6Y#LdC@VfKvh?uq2zbzD zTD7sZ7VL=}jC?NPG=X4|-|<~PYY67k3QW8~N=i!i^v$VnBBAFP2&!orcz(Z<6Av?e zvd6V1lo*$z)ttd;o_IV%{A)h&*vbrP$7o=Sh=?Sg%UvjaAlu+A;ufCxc-xPVb*6eS z6wLFS92}w-EX>S62aTD6MF4s%G|y%%jQt9R-qwiyv84G zqnZ+zEXp6CE0o|_spps6+pyoOoJ)4pJQp6}boHAST7c&ZbFEA+ARsimXy_VsJ`1dyK4XpnP(%HIbDo?5mK-wF ziNn81N54zHc0T#TfzF=7{+o3)1Ef5#%YAMv z2S`gv<#8EpaMK3Q0;Tz^7fPcQFA5= z5L$FUDze=QIVN2l$&$*oWdf@B>9BUA?=FR&+w|gk7)h6l^LJw>0Dd|oLVtidlG`T4 zKp*^JU<=yKfGsBqcsIaK)r#O@!_yIsTOH@oL$GP)zP7)%_bX&*+W(FgP%?|FAgEdXrXk(32+EaAdn^3@J`7C`6E za^YJE1I7x#lNHJaG5qb@-Q?47645j@Wymi~>rb28HDVg+_|X7!l1`mD{5`uKz3{Tv zvfqLA*WKo@>Apm9++=YR?NCg#YrNb~3Ed04?%?QW@V?h)Aks6H$4g2jP-~gO>8df# zh|qs4#@mjwCPN};D&6wUSg{3d4f9dUM=u%fp9=_KK1RVMO`#%}tQuPGA?__j!e?QH6gXzuYYj*;X7P8yA zy55}xvLrL#m9v3amvOPrc5u;79Q{&aM6c_7PUr=}l6XmfgA-P`D-Ro+qiv$f%vJBq zc-SRl&CGb(VVDHkVI=9g*kP<;`quzCPjTa=4ua9~ajL7oS64Cr`s-oN=>Ww;I+l`zxSXMpeJSsuK7v7tN~p1dg3&N%&0f1%THBQ0Au?( zOmc)$M;FxQv2N%7zA{A|?2?0CKvENuM)162vQS8&~{?CjRAur#Z1 z$6zxpUNm5iMAESjEp*Bd4sif}>$xieNmyy)#LNxCxx?JReB(Xq@U zXlQ5#i!-g_$Da@RN$8O9{tM=gCn^XpjA zY`qC@-rxdrRqth|TaO$$0seLd7&IPum_#|+96_Iv$MBYhXs7X@~!840ofCr!yZjc9?4Q(e1_PWxD-QC z+iaE8f^@OzZdu3D4~;EcBXz-lWJDtiBRAg}Zl=Uo03{W8C8D`)nrSK8!N`^RhAD5_ zpiZ8Nf}3BN?$NWrhrDif8kH4Q0(1)Gtbd_B(pX#6dZf_K@~Cf?09H3lFAJQ>8yZ*d zlE%)jbmgTf-+T7#m-{7(iI!*vu0*M5AR+(k^vh@bhUAAA!{1(l&t?v+_8^3|X=q^2 z;^tO1k`vSS2>UfQOnH^te8D~J(hQM-=@&c_XLjeTe);5kXfCOb4=37uPll=v~~ z9`Big)3wO3&$uSb@9bs{u#=N(05E+_Ah@>(2oz;x$jegUR>m0&4Co(L8k(sl_Mvu$ z6tLJvFl&2Ss}YU$e3NYy<&2P_4SD=MTwJ%(`&G)qZ#-^~D!t=rdgZyhPZd{6(T0xYZS?eSZ?x5# ze*A|CEl`b@pQ#EAtzwdrR}DdP@bL57`2G7LNv^1H)5SnS9AaV~!%n(Z0>Fv~ zgKkwG2RB!Q7yUV}^HSp|F56$rd{*%`82q9`7vM(Egb1mvpe4ev22j;~eSKb+&YPxu z;B)M4Ym>DELD5@{M!+D;mwo(O8y~&N_*E?dnD%-I813OwTE|KYf9BPn z?x(+h|BftGPm`K`*p1_=5r&7hgoiP3_X|;$+%HI5RJ>Bg@Cx8f+|U}=5zD<2dNq@) z-~n=Y!(Jt&!IiFi5L~3yUYE<{{V(-0Od|OTT~rSj&}@1@n0O3?3AZeg-S8aA1F?6j*dFMFLFn3je{D z-+WM7-9n_lO{Hk>n>)sHPdavgH((pebh!s?+#iw+@RpNL5Pc>3p;jdTf1XLfKKx_J zar3YFCGRbi9qh9Yz7VjK8)^hUTs&>_2hJ6Qn@R_6+AJ(AEOReyY#abJpO6Ua2)J_! z3ksg3RKdPj-w`W`)Ku5poELtZIT~{>PI^E%CQvPiERR_t zo=%2yl--BDpE%aK+Q`WuyQEHaLE^Z_m&4%PZ!-9`=edYDaIE0bJ$dvCV+VlSU)b6v zo8YzrOmu5&t8`;q<_OUJEyA_Rda`sjkUtgJTb;_LKKM){BUN58a^nfGd*Wu)!7U-h zJfrYuhLWH@$cg)RzkVxu!B3KFMyW>LvXpyeAk0eh!2@wYkuuYXJ+eVOk~7?H=nSO4 z4W_7U=#DF8>pe0t0s53)Hx-L^eGuFmvMqCYNFFs1XHSBa`vn*>mSS zeSBEGwcfLvW|%mx&Bzz-6>=8GKa{kvvBrzUt-FO-QTI!fmuX7)%!fVKeg~oHWvMkSx?L&o=3oNNO?q5|JdA= z(VHQ>qcH$+5RuHfPaFN?q&F?X77-H@(~jj_@#1b1PTSRGg~wpOl7EdHg1BhU$z+Lu zXDrANZcU~niV(3rR;2agbl7|j&gIHluzxaJL9zU+Gskst(^J1353@OcJ zVz++({{7mB=gzUehE?h7=iHsOt@QE5-jBy0pMO4ATp3vLU(ML$_?@?E#aHKDd;fj` zF8GIl6Uo4^%&c^+oX(}Ua;st1*`8h9lba_`-Wz;)7jLXg?3&-d|LIqkg)lR4I6J=S zeZ&60?I7#PjAA`KdvIN_z*zjvz3n!Tf=U}=<`1aLL1(go0F-V3ZfXF52T;plGy&xf z&rMgXIzvkf{Hn_`SPTSM40C?x-&*+4{o{K=}rU zp&ybV^dIOFdKe8lXA1}p05@MC(*%?^K!OO}X+(xHOc{)Z`2<=4Dvyz`aab xB;L@6n2M>r0^$iY$HM#sqhXGuNjN@WzQUSh;C)04*enMgH|Xl;vd$@?2>>Wx`Qrcp literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/TB_Input.svg b/v0/src/simulator/src/img/TB_Input.svg new file mode 100644 index 00000000..c1c42ead --- /dev/null +++ b/v0/src/simulator/src/img/TB_Input.svg @@ -0,0 +1 @@ +Test1 [INPUT] Case:0 \ No newline at end of file diff --git a/v0/src/simulator/src/img/TB_Output.svg b/v0/src/simulator/src/img/TB_Output.svg new file mode 100644 index 00000000..b62e1993 --- /dev/null +++ b/v0/src/simulator/src/img/TB_Output.svg @@ -0,0 +1 @@ +Test1 [OUTPUT] Paired \ No newline at end of file diff --git a/v0/src/simulator/src/img/TTY.svg b/v0/src/simulator/src/img/TTY.svg new file mode 100644 index 00000000..208e42b9 --- /dev/null +++ b/v0/src/simulator/src/img/TTY.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/Text.svg b/v0/src/simulator/src/img/Text.svg new file mode 100644 index 00000000..db86087a --- /dev/null +++ b/v0/src/simulator/src/img/Text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/TflipFlop.svg b/v0/src/simulator/src/img/TflipFlop.svg new file mode 100644 index 00000000..50925f80 --- /dev/null +++ b/v0/src/simulator/src/img/TflipFlop.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v0/src/simulator/src/img/TriState.svg b/v0/src/simulator/src/img/TriState.svg new file mode 100644 index 00000000..d251882c --- /dev/null +++ b/v0/src/simulator/src/img/TriState.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/Tunnel.svg b/v0/src/simulator/src/img/Tunnel.svg new file mode 100644 index 00000000..ff5b95bb --- /dev/null +++ b/v0/src/simulator/src/img/Tunnel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/TwoComplement.svg b/v0/src/simulator/src/img/TwoComplement.svg new file mode 100644 index 00000000..6baa7056 --- /dev/null +++ b/v0/src/simulator/src/img/TwoComplement.svg @@ -0,0 +1 @@ +2' \ No newline at end of file diff --git a/v0/src/simulator/src/img/VariableLed.svg b/v0/src/simulator/src/img/VariableLed.svg new file mode 100644 index 00000000..e2829407 --- /dev/null +++ b/v0/src/simulator/src/img/VariableLed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/XnorGate.svg b/v0/src/simulator/src/img/XnorGate.svg new file mode 100644 index 00000000..4a8bae40 --- /dev/null +++ b/v0/src/simulator/src/img/XnorGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/XorGate.svg b/v0/src/simulator/src/img/XorGate.svg new file mode 100644 index 00000000..639b4c0b --- /dev/null +++ b/v0/src/simulator/src/img/XorGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/assignment.png b/v0/src/simulator/src/img/assignment.png new file mode 100644 index 0000000000000000000000000000000000000000..c27df5bc834f3a776bb4bb97f903d45c1d4650c7 GIT binary patch literal 33699 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 literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/caret.jpg b/v0/src/simulator/src/img/caret.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a382f8daa86f7cb0127faaf81dc53abd0e760535 GIT binary patch literal 11217 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 literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/circuitverse2.svg b/v0/src/simulator/src/img/circuitverse2.svg new file mode 100644 index 00000000..23dd6118 --- /dev/null +++ b/v0/src/simulator/src/img/circuitverse2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/circuitverse_black.svg b/v0/src/simulator/src/img/circuitverse_black.svg new file mode 100644 index 00000000..eba77c2a --- /dev/null +++ b/v0/src/simulator/src/img/circuitverse_black.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/circuitverse_logo.svg b/v0/src/simulator/src/img/circuitverse_logo.svg new file mode 100644 index 00000000..27202ecb --- /dev/null +++ b/v0/src/simulator/src/img/circuitverse_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/cross.png b/v0/src/simulator/src/img/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..bb7126e2a8083eee1f63ee7d714db1d45edec46a GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAIz3$+LnI_w4>kre88WaO&~9K< zh($ literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/cvlogo.svg b/v0/src/simulator/src/img/cvlogo.svg new file mode 100644 index 00000000..ce4f7e59 --- /dev/null +++ b/v0/src/simulator/src/img/cvlogo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/simulator/src/img/default.png b/v0/src/simulator/src/img/default.png new file mode 100644 index 0000000000000000000000000000000000000000..8e183a8a21dda36485b94de239e6e8a7911f982b GIT binary patch literal 7548 zcmeHMcT`hZw~wD=nGyRq3`KzvML+=|0uc}el_pJ5q{}EJAVi4tDvY2aMUWN(h=`~N zh;#@EMQU;>p(i1s-p~Vt4#K-Pes9)$Z>?{=zrMfTbFG+j_u2io_de%_=SBuv`+pJq z1%W{9*U`Ru6M@);Lm+mB?A-}bnuQYips$}CuIOJuAPS=QZQAaFo<;9#-_%DSd`}|~ z!G9qT>kuh;9D(qVLm(#aArKdn5D5N9_zGiH1Y*a6(G8Pp6SMP^oQ0`5?&$c`zzEnk zFxb^cZ|~{_I=U$Boh@xtN=H{)S1+}vzlYAG4~`6h6YObDKXa&w(pKM0scmQ`)iqSr ze5)kYmRD7m5l9uJT0(Ulv9`XZzUf;Nxslx3)z26NC#L5Y$!*jMVohyhOCzOiaFjj4 zSr`}^t!r#)2HJZWEY=8E*F*-VW{GtT4J`n31Y``35JXZTW=}R!T3Ms)j_y7JsjjS& zSpBWBhc-~t&`e_ulfE^U6G+|tjDg{?va0I-fx*GC@yR)EXD_X_vxiXgjXg8h($-O3 z-_*w(>gefjAh!b4?$SykwU<`kLSYP#P0cS3433OXbEY^8q}uw4*@e-Gsj0bzv8h?c z&}e0KU2|)DMO95RrLDcYZ){?^mD=6j-CIGb>0_`u`{>;?Mpf-MaB^mZJy}Vt85{w> zHMWdS&VW-h4b7C1iD?FFxPn++T2Tc~bEw^Yls0NdPv77edtzpeJvCcZTmP+@!W?CH z_0n3}JG*HEKxfY|I8on3Zf@-uVo%mJG&i;Y&&5D|%Zr1VS)e=js&`Z`#bjT9ELVZM7|M zMC5BhZgJMY@q&w%&WMvof9pT<+xb|H>YFov$i4aFk?yFCweRCoO%U`5nonAp$U=J4eOh>7Z`=|MM+_U{3X{%-tf-!n}(b9c#hIrB^AVxD=df`IX zC-zyV%gnQvjF08p+H~D@U45%bY#}ttV|NH!%-;@IMM+saEqgip*-(UXEda_UD$mt0#WfJFOBIFZ;EDC<<0ykvKhyn{SU1&E6tPtl_WqUReF

HVKS4XshDWUUmAKLiwZUQ~US& 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 uRJHLYk`Hn1^92J2%T#NSMxOPh5QFS(@^IC literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/drag.mp4 b/v0/src/simulator/src/img/drag.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b211439caec8d453b07c34376e6f4b8c212504d2 GIT binary patch literal 43892 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 literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/edit_icon.png b/v0/src/simulator/src/img/edit_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..32f99fb15b2e2ade3dd74e7370f97c9659c3fe4c GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU0wmSG7d!(}Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4Z?C=OJ)|JO_CWfepiCq08;-sUysy~SUEnQY zzIj40q4~P}R`sh*Pu~e$zA?SNpz=^ShfDM|S&KUi42VR^8v`vqM-a zW@^fzt>@)-eL=gtB8NVUW@q9i4;B-JXpC>2OC7#SED=o%X8 z8XJTd8CaQ`TNxT^8yHv_7<}FR?+S{B-29Zxv`X9>TAsOO05vdpy85}Sb4q9e03pzz A@&Et; literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/embed.png b/v0/src/simulator/src/img/embed.png new file mode 100644 index 0000000000000000000000000000000000000000..54a7d78d83ea8a502b5eeeb783da8c811e6c30f3 GIT binary patch literal 27061 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 w0pLKuSvF($e-vcFvsVHx0B7 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 BDwzNP literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/facebook_signin.png b/v0/src/simulator/src/img/facebook_signin.png new file mode 100644 index 0000000000000000000000000000000000000000..e78185f0b4515999078505863203d212633ec7c1 GIT binary patch literal 5050 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 F@IN^8HJ<qi;4hrLdZ!j<%!~HJ4 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%0D$Jp-c7dz7cAH|o2zAp~sfQE*? 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 F{0A7tQg8qO literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/google.png b/v0/src/simulator/src/img/google.png new file mode 100644 index 0000000000000000000000000000000000000000..2accb4e6e56d6f5bda516a6e81594602d7a77ce9 GIT binary patch literal 16985 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 T!G!MXh^3;asZjpLD&YSB7m+7j literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/grading.png b/v0/src/simulator/src/img/grading.png new file mode 100644 index 0000000000000000000000000000000000000000..166ee57eb22c34019d2f4ab1561a99bbca71ce8a GIT binary patch literal 26275 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 VF*o>azzwT3E?&Ekea_tPe*o)2^NIif literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/halfAdder.png b/v0/src/simulator/src/img/halfAdder.png new file mode 100644 index 0000000000000000000000000000000000000000..7c9f3f0c1b59a3854f0deda28e7351b5a23b720d GIT binary patch literal 26281 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 Bzrz3k literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/help.png b/v0/src/simulator/src/img/help.png new file mode 100644 index 0000000000000000000000000000000000000000..5c72dbb733500993cd3b7ca00792d5e5cc5b221c GIT binary patch literal 18810 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 literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/iDecoder.png b/v0/src/simulator/src/img/iDecoder.png new file mode 100644 index 0000000000000000000000000000000000000000..d55e9bfa1923ca43ad918f91deef2e7a4533ba8c GIT binary patch literal 68782 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 literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/implemented.png b/v0/src/simulator/src/img/implemented.png new file mode 100644 index 0000000000000000000000000000000000000000..6766aaf6bd9803ccea6e7f6353f438950f924cd0 GIT binary patch literal 14155 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

Nlj6MuMWu!=Vh&=o4a;lR*bT+xR?q zl*T_+Mn9(U+Wsl*})^Q7Vl2lAy%tD+L$NRrg- zv&NJuuai@abjD%^VRDMBmj4i6_T2NoYx^Fa@RgX$(B^h=uIg|q1Y`JlpW+2aU}f2>wnap%o~UVLfjr;QYuruW10O0)azH^T&VYkfk z)Nn-eJKXQHB?K?NT(w|lyY0m(dY6CCLgtuBi=Ir?46k6rulz^+K*_#Fkd0K!yO(J@ zU*PjO94 zx2WG(;Sxyxg*)^ru64H=8JHsJjAu6i* zWXVyh#Ka|dL-#zNU6cLD0H1w(oG*YxJt^dxXwP=|#XCgCvA*p4*AvdwJ1HAf3OveT zC2ENN&0SlO&*2NBXsSd`We@U5!%5p^1!QGE6 zhEX;yqG#^a(|n2bJ!Uz3-VjtB?+BWa8K+d1cj4Mek6!M+AXc7gb6tq*AvUzZp@3Zh z!-D0*3+p`}cJxhegps95V}rzGc2BdSPH51mi*1BD-WWSJgCELinu0DegOZMES>*Lz z4j*E?Q5ZeWLr!Q>(8WbhjmSSP8(mzW{?Y7+|1PjSt1bx#EkYeNF|dID4y$I?OV+g& z-F>b!-)=W~$BBP3sA+d+3QiZ7co!I?Z4I)dzh3zcy|PQ|l;AEYD0!;VSQ&<#opWse z>^Q%C#_%P3ThFHVWVwu%TPhGks*o>cS~J?_(U4Yo7^=4+^aB`w#>3-^m9Hlro%5Mo zy=ouCbais#hNq+)VKpW|Oh5!uM!2_af7N}Q?ke{<&vYx^_IZPCy~Mg6HRukJHY4~N z+OE(_B*KcO8nR>`ao1{mIiMSTC))GZPgx!otJeZJHv6v8w$;jQ)|eM$KOgmAvHV>= z-Vc#f+`OxP^ItPhY+0Skn2DLT`{H5x`o}jtNfn#4AsY@~DZ#odZLj^4?cu6(sO-P2yT;fpDcmeT5IZS=gHn##UsPnhedUvq-1 zAIPt?vXVKep>Bt0Pnd8}T@+>9*IbKVn>mPMSO1E&zo~-ABCAT8Hn^$E1q%3qq)k&T3 z@Fn}HN#JqJ~NRl|6;v`(5PDV}iF= zGYVlrTvM$Dq)>ykl7!^9f$a*xkxRCvC{)XmZM?j$EEo4D8XumvQv5=qv?`##$k#YCQYr5nH%gfBWj|-N2MdpHmi^zb#;`bRRf9OrkY+^qzwy(LJ zJsqwzs*zMhrBPqTdm)DVS;cO9HA-wP`%PF(&zoo+QdhWyy5?oIS|sFc*}oLc4C}|I z>q<;RmK|b)E^sg8ds(e>{%U*@LY5f)D}?H29KlG1`6~}ZrHUQf8Kf>(3_VRprUtn( z*~U~Z5iON0Qyk=j!Y;_&Z7854=(Au$R*Pf%iU@3~m6kz*t2-i+%UwJi^S&s0{qS9& z+tZi(=v*aPWAJo{6*FxJU?eM_>RfJ7lQV|Wlfc-?&*puR`BJM_Lh=-OgEwAZmlzmd z`nc0Yhk;>0nlnSn6)DsmK-eVg7fY}z7Eg*95#d0AcRCM8R`#Q`Iew%E-L4*cWMqZa zPl-0jp$8cNF9!lM$9F@rq(T~@cCX;JDl9y z{3bPy76lN2-#e6*_R66!4RRMNppjUYhkfr;3p?JvbK9^uX?>{pwpic$+rc>9(i-1S zELBda4qr$0t-NgW_mO$_BhjB(%YnfeS@nf-{gUC@U8c&989$0`ryz3VAJdWf_{>|R zV?1U`nnR+k1yw3v3{Jnh)rn#j!_tE&i$QP!XOk8q?|DjuzmZLHFOptz)xF63nC|t4 zdZYQNXr*zyCK*Htp)459;GDv#5~-2nVXGqTt)r3ZsS82P<0&O|pc5AI2VqjCCXB+t zEq__42IaxXrtA&2FY*y=ht$Z8(s?K%ePs*i1|q_U1t;oMV)gDq07B64Xs5^XZD-N; z{LXt72ahb}J6+blPAK8riIBsYG!FVc!Un0*sn^9hi6s{~KCrv`tf9^peKHw^;FI2=uDBjNntuWySGmfcZX zk6+ZF!%vJTdyQj(Aggg4fnjsOKTi75RQi;|QyvCgLx~10bRvG8=qgfmwjSNVFAsZ; zE_|tXOcM;!^^T8u{fAX|BMW_s^uz32Rfve6=Ag$K*inBfV6OO@w;p-F>sKLFU?3?t z{a@T$nzJ||w8n_9iZ<>ICHUN-Fvb&jj7DqnV;RIg2u`P_QU$_*xFH@z5@qhTi;H1Z z4Y9#0*Cn!&sCDqDvp3O?`(2mk6duxWA7 zKRxgMd9`tURs9riCDpx*fg2{jOIAo2@(G$deq!Bwb!Ffu5`hs~&;O(8Dj1^by6(`R z0}S2WB|~?2cT0D7cS{OGcXxw;NJuIj(%mf~DIoC8tIzij&b{}Xz1LZLt#y-w&M?*= z=RY5;_}$_~`S(aim=)gH;A_Ugf@t|h?6V=|is=WP-luc3-d%rK_955N*Q|=Z=%d^% znzm#y&8vNEv6u3cBUIQ9-BiA|4_wZAo!gIhXRjR%r`#TH8KFydXsy^?6!Ms8QrOWg z`JBGbA1@&~PCu7;j=TG6G~Mapvsf%?#UcIhZf^&OEpdIts!lK$l2Yi3c@Xd|8v7iC z^^6tJ$?Bug>;fIHwhYV2MpZ|rW#A>MVCiRR+!Ru5R;_H)SLO1RG*-PjGY&g-x@@}) z+pMH)wd>L#@$)1JmYCCeA$)N_)CCom)PCarVsU&xD>s(&c~6Ic8@!wmaYGPn?m)bQ zYh}R6^Igp0Q_jncnHZW`8O2f}J0doaeEUWXDaG*0!~f>?_N}qm5`Y-FMQ(MXylV$a zwW!PjTFa?jBJ}Z>oR}rvF0OBVeaiW@wTMZ>fZkCZwuJdtA2(B4Irho^v&PcE{p-V3 zZbk{z6_;f|8&cHI6A1ajzzDDOnK4e1Q?mrAgN|rtIPjLKpoZ)jnP+qG*_+)#xBcL` zACLkAm0P|6Af9VpGv3G=t#Rx|P3?4g9OI-czPFqTQvUkM*~Z(&s+o@*G6K@n!~ZmC z@__}XPrt?gaUj_1*S>uPPrw^g!wr++MpfLTW$+HDhW_49aJz6FfrPveoH;-8u9iv$L1z1*fkqYY(mGGcuJ# zbA9SJhAI)Derj@4M4Y!+i1|?tLqL^uo74<0k{_i%S8%Lzzwue~sPMK6?Q3p!THlUj z&}ZA|(-P!pb1@e(X-xIY4x?NTZ^4KiDrk4I2B*K+c%jCUhbJu^Nb_Ai!o?XsSq4uk ze7fidFXUV%5HgrLFtq{-tHU}Blr!bDD)NRj3QFSM8L#~wO2rn7s;3p$t-Y(7I;l17 zRfoqkDFI}r@bA=M6)V)G8Oi%SjAdtZ2Mu?YPt&Aq zhe%X~Y*R~onAk3ruAD~VoGz>cuJ27h4{#Y13;z*wdX#^Ns{ z%7|HxCVLuvcMbm7w|fzxi?^;c-+n~S*~JmX7b}V>d+x07s($|fd9Zz|g{)B{nkLF8 zg|W~gz^A(a;BiL=)}vgq9-RhAJHGdL!7UnBoPMpAAq%p&omp|5d*HwJM1_l`ra4Lh zV1?P=1^ti;+Lp@oR^z*k z*Ik(?J$}oJ4~r1-KD*F&)b?!JOM;GjB%arJP& zHZm;TD^2^fLfAxtSsan)t^?aCBB$;RE+l((0pslBWu1jQe`HyUb|ce7M#+$t^-n?t zkCeuLZd4b96w->6s>K?${^<1m~w-fg8sn zc7J-7K3g39MzJ1{BkWz*^O$xwBk+6_{``nhb-~Y(T7@`YDQ(eTgapEuxUsg zjxU=eK=Fx*W zN+7N28;pXQB|4qT#))9)eKi=!+gjByY33%;Z=hx9%pJ;}Dd1-h!>y{wYe&*xGE~#E zw^-2foGmp}h!~RvR*-h#_$G`_8lH`9Oz$Eid86X@i>mc4TU`yHFL-xRt>0@!h3=Q@ zVYfQD6Nx$`{MDh_WTtn&MZ3f5zOC~b;jl}TKJmj67n4V}I3UN?VqaSZ4i!`DgaHRI z*01)5F1mA6g1()95oS$P#^kCU6-&(4FZKiUv#A0!$t6#yD8fTv-NyTV?cnlJoKg~VrC3MWt zQt_T&(8b^uyZ)}refNhoe?(Ee=yaP0uO`Ckl*_Ho?;q9`r_o=ePgL#7sLMDnEv3#VrYyF4 z!pWXP6+t7`=k)I9jEsvfw!6bc`j4Vz+2kM-5Tvpn0NP|M1;B-dh=#?^ z!QmjIeCS`933@&ny?BW(De!;YdwRVYJ>6_ArMEtjAnPa&=)*rSQn;Gl%DNqH-@a*B8}0;zX36QR*3c*4tpH{o8Zw-ehkU&7Jf zz=ssR>4gPGhyq{=V}U3zJ8YPu2uU#_vH?`|Z19?*$f_T^qC$SSo79OQudT0nItEW5 zEwvkG7@1B51O=_MoW);zan{Jxzkr{m-#lV>wAJIUl_0LJ+CcYw`Cg`{OyZwAR<0@k zWRcr4&&s7)nND3!rs=9p2Y`^k9dW0U{;=-*v5Y zuV?}BbU(~_*@%$z?=!$esB-dT4F2bbk(qZw&6%$|U$!2_3)2tIg4uiqLC^eX=R1)sn392AO%f+fyFW9-aQ;LCV7 zY7Q)o9vJiQ)`Aw#EtH|YgAf2vrOztck=d;5xQ5NficquKa@drUP4T?5B;e|KovUD8 zr(t0m$?>SOXTjP3!`Iz8eu^HBo9Lc*FNM?XJqWX^+UPto=!Z`iN9UirgHEo!`pSZ4 zG!Arfr{;Bd44svwq9Thi9sH?SJrV*wAnX)9;a&XB+ov;RQ}ptcFDEu-CkFy6`+I%f z%Wh4Y!{fsO;;lwl1GDpAZafAmcH=o__f;~8MNMc$0qjY?c(cQ~#2r}zbM#P;zT9^! zw7-|h(-B3c(0YMVHrFyx<4ZM+X*2jjXipbX<)!HPu>by!dMXPI4hYJTiQ$wyXDZwy zm8M`Gia6MUyQR8FK>y?PvXa2Yj5t+99nYe@_Mv0_Y5pqI`o)^@_%8)CiKr zhi|}4S99IRXwgvr)5oOQW3Mpqcy`}=Q+x9|=lCsI-bS#0XOop$4P6_>)E3Ihw8!oA z-g(Y!hVaS7Yu)zx#qOklI|&fvgt*lYMO6vNHKB+cCm`cLVe5BV6?h5NW#s5S$QAOm z)=z9ya>Ki+8mF@b3lqxQVRTIw9tsW;N;iFf*>IBGlsNscGC=1?k=L8+!gSw0bH$+GtYq4{Rz&0pZ~t%Lw{yeO|^^n2dC1 z-B3A;QYpqJ*zt3y31)O%8OSw>0>Vgqsh{swquO72&Og`3L`JwY&~V_J#c|Cm8G&pk z^A?vHp2ME+oLw*KegxReTQh$9)il!R-`rDZYKC-Nq8Jl2lo<~``C(~^2&;V-A~h$PL>1pm_b$e^kIe~@*?`P?35wj1_ zF$sqWCm{+F9618V%wqXZVXE$5s4Ibq-UJog)5V19W-Z7}a}G276k%R5$0y;xw(pP5 zzV-?k4@E^hZH3n!i1sa{u+S7r7sR~JX;`vMsOE68`k(IAP^laGVB6_P3hrmlFpBNg7MaNBkc&&TifQNdpBwW=6* zE(f1xd@+7$--rA9ZJ@n)k`sO|wFy|oVQc|CDe$lo%B4pw8M&0v=-oB$5qxNf?8<ZvR@nvwdnq5zTW+rK-0vcj^3H5zrRU&r zLD44{f0_f&m}vZ(JpW-}a#es4mMr%k$wMS-tF>T_%}T_!YIVhX7j7+_*j{2v%T?DK z*?>Rcj}rxlFGSt%nBA%f)Zc2Q(vCrkPZGm;(y$u^N!RS=ZOy|jnNiU1p1nv#c9nwz zt4UhMks5yp9R(iDjN7^I1JtSzXdR^jK$bJbq;AqH&Rcdja+(SzIIFk8muD$WN?J18 zsF4$1)xBj6bo<>Jy!d)IwK}0wF)yP?!9h_=DA9^pe~F#G9ORZ1uDQ?N-}qibgGH-? z|Bd3gG$b~Pa>EnPNi3~(mYvnVs{aTWg=Z&nGwr7oPVh_F(fkxwiz(Ke<+u5Yg2yyf=(QeldLA z*S^5Tw@TlCC*e?Rra7~dLNU&$$G+$2e_Ymc!TBKRMy-bNjy=cPwyfvqq3ww|?!Eg> z9qKZMtOHw?(m~uv9?!3rO%^ggx{qrZgw%>rAI&Nnxa9qATSD zCxPegA*_j)+xKNM=Q^pOrF;+h*5?Q4aSn-Z*`J@DsS$qrH zd?G$tkv~T>-Y?S6OGxR5GI5m*;e0m>thGM*(>xJPLxl2jpIP?#&s@6{;!r6^D}*}QlGXJbX#kV&ctfixMT=`bBYm3IRg97<|x~z$VcM0Gv8^#vSL^-p(f^)%dla4!u z7Jc$dM)$oV?1V0g?(Z7NWFPx0cNOPG?G$ua#F z0ej?|y-&h??LAkXt~X-B0oL`Q#oPybQm%9E%(RU*Ya_Eg#s&HtP~_;Cv-13VllhEK ziMye?l|qlJahz5@+au4ws2x{BTJzF$6K~_bx8cR@`N#ajkytnwnVDEKX4D)u3ACy~ z67oh1fXpb^hC+&^se1?yK7rvs01)+_@LwWxuCGT!J6dP{b*$f=uYG1aR*ttkiuI~1 zEI)ZI>@>`$d7rfp*rQf)`Yzkbb;DRy3nbU;oan(yU$5ROTvHKM)m5jg+>^Hr+H?_u z2@@m})sKnF;}SOFuk$&(k05ir-?TZhP)AA++Hw|xe|@beJ9dM?X)DlV`4YaL_tjA3 zMGcL3GEaYmGORAcc9M@Z?^V)xxkMhBk&D_dF*&60E)d2KRq0p#H;w}9!(5?tHieOD zln60+=pjmX%4B7A9DkAoskQh!Fb5yU-M{{5m}7mPmsqbXg-Z(thb{$4mt=338;m_| zrYtVnWRcdD#=IRQbF#pWQ~qpyt;ox{)f$rd*!6UT^vG)5O-dsZVnN$B{_i$aZGbOI z388(7U1TosGU7^vtI?%EuUT(+760<`Rv)NrUhNIa(r?b+8a0h_nNP3!byBXRe$oP+3M(eANxlB zo6FqhGKILo*{F3KQRd$juPEY5+^Cf~XOl2y^eJJWQ9^U%X5_9Bv$*epJ>K zJ!S|;0j^D~EhS2qoTLzY-DlvD`RUA(9P1MR-@Sa0J{N^xM8VMa>X{u0UpnVCRl@w{B|@J2Y;F1OX_=keHjx#TkjsenYM0XK~0T)#1-)~e(JbK zZ#OjjVNxwQwQ%asd+U&YGuQ0?wIfF|Lg0I~tOhdki7Jee@4Uj!_}gkaVug_w1W6P- zatiJQrSw|;cJdaePSN`n_u|oW;iG1Wx1;J}f{Tn50%fVm6G1}mr|E$6nswIa>`gb+ zRwDM)ezGB1vl&Z0^95df;1bwJt@{^Y&_(yziQikLMI4^q?7@ZqSvCn1{0eIp!Y=UZ z{iu50S7f>p|13RRLI2g~jf30=U#r=4m_V~H{gxSS z=aEIk5eRB|=9Zew>Sbuf+qH4N8*$N`6a?q#z2s0>!H~n3Gn6;a&%9cCj5kmrq8hY+ z$oB`JXGj0)K0^z^I>5)rU!AhCu#p9u`t21BIrmH?Zs4@isr;rQoX>U%1v2VpDLGaN zG(X(CL>dr za3fdn^xG&n)~b71?qAIpaExDS(TO?;4JK@&EB)Auj@yNyhL`v5n+aG<+NL2ejNB3T$8DU>4{@YWR8?zJ`N_ff?>q6udT%v-LB)H8a5(5%?v2t)7n zoffi-L}FQl-oC+hP>yuAI7jLy=V1QBfE5Bnd`@Dj45^gyOnk?d!E0kq+k1U>AmB;* zYEE7cNH|JM>?GO?dlWT9b@6D}`72H$uah8Yo^!^p6s0N>i0>xqAX1`cp@fHvKVZfl z{K@~je}L=UVKYE96ASk_~I9965#AcWtdYN37`06SCZquw}yth0r4~8jPiOOzUz^zjJ zpY*G$8g2zR9X@^X>3_Zuoz@xemsyulK;6+NhY2Z!j3H8KG~5zD0zCQUEYqX(0P}gqLveJ_qE#tZkGtWMC4w!-x2z0%%#jPcn(!?y+miE!V0G zM0r)oWgETD%y0g=_g^5@3z3PFF$IK3U3!*TuM#GN4GuO1Y0r5E{GzG|-h%tswI81r zRF*Scql~07a=^k>Qx$0^l=VISh!0UmU2^$g!=;49gw(zgL zP+m3;y|fHZ`9cSudBn9pyY)QI!l8cO{M#4zCMj8;I0_b3GBEJp)LEEcYc`6*M#C5C`iG!*1v3`x z$W_n1IY=ZhBWfnE9Ew%csvM1$^1kM}o(c|AA4cwilzyYcpx{=ZS0YCt___kKKo zHc8<7c<*|l+@VOv``>$vCGrl8IxIk`k$7B1$)b1ZiGoYd3#)oxMbh}}s5)^D$f4gr zjRpAwOs*Ifr6V!l zSK`az!smmQiGll036PX{`UriP5>~q48dK%}aXvA}nvhNKMRD@bzy|CqwC zX1J0Cg;*LKBBm1-cEKNHo`4{oYD5$@fZf3$J0TzP0PHoO?_BdaG3U!BR43-o(PVnc z-U6v6K#>R-7(P;WyN%Gql?ggM^d|118gB~Sb^a?9h45JyNT=`@ z3_@;W+7|8}a~ym)KgetLr^FDphUL(-6@Xwd0J=l)xTewQODv1Zj~$}At?%n#KPXW} zX~yc1$GV;@AJ@81G8?bWsx@l z8y;uhuF2n}+hI-lteDyApi#<(+o&J*9sDw(lofL$+_@}zh!$A~Uy!Uw!hTRsuE=FG zf5IR&fq&!PuyJE?pQ`h55Knkx5uqPxiMN!SBfU-WSq=NzwoDR4HD<4?8{V zp{A9#^q-^$$}v32sp99Xnn$+>ZWWB{5S3#XF*E_P3=Cms-vvYYbR*=`Di8AJ$oMSU z4Kog8CYs<0sz%`kY2~7P``}B#1@FF38h*k`%$vsk8RqWWzx?yl2%?p|{5RT~w92hd zSzo?<({Wl-!yQ*xe0LE6Y_ecjku=Yhl`etJgmJv;9iALqWa^~9l^_#xo5+a6h3}v* zD%VPRh)T|^MS3dtn((}fL9bQis7Hx#UrYGb@xKHRdjDuVVbse|PPu1zZWG8dHDcXR zw(n_*X?Plc?dD}r91){x&}LWFQ77Lj#0&_WF1Uqc7f#EqIwqF8ZOdmu~70Dxcsapv#*?Y>s;=k}450`}kq zjwtR`6X*o}8=1hia3(F6i*;EuVR*+`Y=93^#ah5^iOB0mue4j#qwB$HrUPQ{l3#Yv z93DrX*xlGS|ou< zInHci_;iuFn~keZ_Xz{!12%woB`jG)MDofQXl9DTtLl=N)w;0%1rQC#$)SsG$s|nO=_3S5Cwf<|I8|pw40ipL&UpVsL@I z)5L)`zwV3=HUxBz%rHKWi4~2y^8AILzB@4)Xq?E+B0WO&!nm2+N9n2(%USm{7YU;!Za z9Y6mX_jK;TNY^@3`8k@ktH9fH_vmRuIN+8;-~W^9n@ExL@hn_P62c?47CpT)k^7OM zr%iKy2r~n^%!Wg4OS!mXe5Tce-&U|5Z!SKIj`9Ip}Q!?`606}J0dJ}r&>fyorZ|lBDxInCV)UH(#~pJao6SI13iP$72MbXmZfT|K}TE zSE~RxLh|i^8f~_RvWk`R_7wo3zu)W~3mvFh@Gd}ma zjgxhKeI5L6MHGE9Nb57oq7b!Y`GJM|f7vY3CGgY|cEx&%uyzL7F9^;*i3W~P%@7xq zK&n;_xFtFIn-`Zwjjl{Q?`1wA{Fv5K4u~R{IMIKdCTV*-YV>$Vfa=4|9n)zpi-W9! zQCjqI&g1a?INOOzhli!_cYW^D1bJRgWu%ZMK1w~pFILU(&7VVa_&nO@+swCkp_*lD zrS{-SwWGVdiS38d`aAelMFkSVw*=XZf~!P<`3%-tk|DNPDi&@VkCcGJk zl!+WH9AIEV(3*wCwN_aqPOcm?ltA7josrAY4o~h4C1W%i2q$;f43`L_Y>YU2>1LD% z)%kI|%xh{6H+nwytc){eVbxSOf7X+Ti0rqg@Na(_;DpLF8a{#?Z5JijU22`zZ)?o> zhSk`*!uW?u^PcX?5t2O!WtZAY+Nn|2Fd4Pxw)}KQh)l0^lsEz)3g}z-2h%KMVWII} zW3wZ+6&?;kFqP@NKJc(o6t3zR&%N7PcOjuzW>|9laD0fcDvIUIbuRIL`rpcPl<3n7 z@~KK_Q#9F1x`JBa??pnAv@%edhV@W0^>OsB4#B<*&59Bw465 zJP|_G=IG;28Hw<0y*pPFca%CkhajY3%~mo3IaDKoPErH<-e(o%1^!n4lO1ts-Bt%m z^?@O34y5jw%c=MWR(yex)^TS9HrqQ^cqA z3v%j*Q8`L5R_oG?mSts9yh%$Y1<+kl6NA>hY@u9XXDKzXg8X|ALw_}MQ^y|SR$<`L6g;^$49W~&2-dVyPiZ5+8C=kj<>7}gR!gju#!zVZzGUTbyQ0H=!k+YXa*g9O*{DB`v_f=;Sw|Q`@lcW8ejsi_0Dee_P2#- zB%*nv%*Uhwzdh;wQWH^tgf)`RFY@DU|&q`wSD#<$hOerUSXSSLSQ-f?AAp9O2*UE=cEOf*XvUm-kw6Q{zG3*Z-|@EC2l* zIXS!0NRxZy?m(&fZm$^qyK46zU`5&}BbmexX7bb=<{S*<0A^EJTBw+58^6r(sYact z8diZC%!I4HvIZpoQvAXHJg;!nRRaL*)tKEo2JJ;=thJn3yv=UxOJ-!tWYjYSyHFD1 z;89p;*KLvaCPdsE1@60(jZ~c9W_)$cJhzMOn2#lQziMVL2zpS6yYHEOq*Ah+;T}v9 zO4H}t`0ok|Ck7Rqxmoe={syV}85mUH0;!eR0~>BV?a~0&*Rp_!2xxkg1iShGn>>?1 zwF^Ea*kyQ*kvln5j!hCi8XY!dn{vsHtJS7HWM$s-0aj^EAu-CaoLgJLCzFp7!jPkb zumjIk%@88}&Js?KoFX0+_xmIx>R8!-#ogn)p7X*wrL842B_p2K$LFr^w@5{dxYG~S3`!?=eLBhUp|KyF^?UmZh;yGIh3@n3X<8>@Mgts16+&%!F{dq}@ zfy`)hiJNg`it!#qSww+B+Bs3?oIiyV)T2{V38P%Rd@Hg5&yL z_r|SXkw#rqTo{1Asw5V>W15_RebrZ8Jr1HPSA$VQK0-hyH)(_)l_70z2q^D4Tvrfr zEk9h=_W;DCXbFfkKds!8KKEYKGe2@E4ck^ZzL>o5M%K=HkZl4tOM4c-cB0t+ShE_*g8i4Tz=2Mt3Z7FDh!i%sS5(68cN z5WtEaW+ffR1g5?h0%j&h2DlazqKJNQrm?W9hO7Cwl(5Kszfse|O5EHb$ZI>aaeQ}F@%=^UtE%<>=YvU8Qes| zwY=8DHvo^1pYsh6flLkp;0H4&NJsGj7*D^PjjewdhNh(svncKCX?^+PRS4~U340QW z`sxPFN|ZkTRXy0=abC32y%<8vCNOxn)YN3y0@&)+jS@kW*n(OX-wA|)X2P^|z{A4+ z`Yr@3O%+M)4UzA8oqWI(nXhY5$F|(sOY{Dz-}Cd$*$R=CFm^3AAJq@M?Dn>Z-&Wl;foEet#%?;@aeSDbRqHjkih&ZdPRf;Z+&_m{PB z&RD^@T}HTUQLo(z#>a|(wGP0Wr~|i#ip5?`2!ie9&BEWK?nMTzLJW{m+y`I=)4@P< zPC`?B+&++SuAf)XNZj@4J8upGx`yl@k64qt^E$4RLs&F$Zd{>*yEcE9*Ss6ld=MoE zI6&l&sYgWajgWOxqUuconGsae08ct-VuT2@U}gVlgJ4Lqjs-@4me$4 z8fEVPZ%o8*=ETH;oG$N?3HmIuBEkuF_DtNqH>Nr^Gsns~oFsfjL{2Y zl0sEAn%{%CrV^?SA_q2&gu{u8nxHxvwrIitT-AvZ{N$<8TVMkziJ8}`4))isuiW!z z-g}VZFml;R7P+an>{J;*l0WSdzYKn~^L6&=qolkMasBg8(P4_*2v!Xlw$0I!He@}Sw%yL(sg7Bh~p=ydQlZJ!%+Y=Y4wM?X?>^wiVsR;#6{oJxjsMi1V-A0 zxc?8Zzfs+qe~;2-#xB+}oBx|L_z~xJZnkzSYHcDuB{%tf6}9iOCn2jZNrniE))eV~ zH&d!*o}lbPEAhZ7Z7g~a7mw{d=_PDh$_Ic3hv^}j9b+anx5_2HVx}Z*_Dajr7JgNZ zH4;)u7&TR>vlkA+f=T`LBn!age+a#Gu2RnFyi%VYK|AH$=W*kk6Tfo=iENufehXS9 z|A-+sa45VVgbC-!-IJB8j!dPP_JC-h#A}j-DUjaB z1_rt|yTp$SdetYvBq=%&;sH!P)*(M8&T}Qs2b{mDZUg{0xHAaKV*!8WX4!xexogr? z4WbSu&+K-qyj_&d`m6V|dwb=w-Z2Q>E_XeA&nf@4 z`^RJOAELqk*vCwPgi8e2IsKGo=wvlZGr$IZpGyqvW#$pi^Mf@{AwYH+cL7M%Nmzf+ zcL9=UGAnMGWQyVE)WbH~BeZmU}bV&Uq(0oeg>nPib=Tm}x3(533aUod=HlBsq&*Rq4WoUdo3-jyM|>77b>-tLfaEI$(Og_l))Hfa&d(gk4J); zPYkA4`i%L@irR4Fs1~Zxre{Yh$r8jRemC@C;#$+(*p&|Ka8pBlYWRn_BNF#60mIG1 zh!Hb9`i7;pQa@77%`{Q95S)=4xXMz&3rNWiZPF#R>=ty@w1t)%H{~Pl4Ra1#;;D)LEz01 zBZmt$Xlc%6{p|CrtP@1{cBFKFf7utW);HY+<{K@$Y_S%=4#m7p!8%Wd zQ_CWPPDQd&&jJw!7R+_+D;!{fzrZK`eAccQRj;5hplV6p2xSyevbI4!`A5D}BhF9r zc1TNp65~I#07d21BMe${fq^$_ ztGd^D0yPA%1N}=5QV5pg#g5U}`5#(S^HUIm3H- zPHul@zh;NeLInj|gd!NJWhwqaXvqFU_R4*i&tDlu_hxg!W^Uz^U9y0}RIsb>uTzB$ z1*Ck?rbFuGNvF?j&f>;%VxG)bFL*)hK-2$RXNdpHch55=to8aeJTNw1I+$fdbw;;#w|J2-`8&nP@)G?7q0jN2B$RqnE;xLRzWJ>qzJlFi_ zi4#=l3j;`wi^4Q?jQwjvR_tLefO!fUfoH*dm!LIIy6<8PlBo9^;=UH09YstJ<_d{>zgpxhQ>4C1~a96svJNQrN#l5gBU$THtU+z;?QV! zuV^{7g>`RkmUAXg(WQ?yI4AyN(^v+h;Z5ts=)M-(lT#PxF>E)sqE4|Zof7ar>!r}nBxQlurR>ssfjr!5k%>j> z^kUO};-Erv1Byr-dLudQG`k7itw|fsP!eWSf17OF0Eq4KVm7+@v?4 zsf@XK?D^kO$%Qf}l-x@l_Ah_hYlEf=RJQ$3^(El)O$ZEN!&4pl)BgcgY}dW>PQEYI zq=NfVMOZ6)>9`9BZc{^@4i8~1l_~nXq3~~D0j%XPa`G6xPg9Qj7So(tyrY8AIYHc4MLO%{8wb4BG7 z8;xRU&|xd8xUJ|l%J~R#lJ~^q z%_Gm;SV4Ii0hqct@>?%x)662=;9C(9r|lU{!`AI)OP?|vyJBIHC?$q=-hXPC7$@P5 z(*rqdSb_~JhZKXAwM(&SIxtg3E`Q+0+dLFHOayt819|EG2(6)dA-|PtGfP%+L`*l3 zCU+dTqo0jR>%80Gex2sjkhlfD2I;E1eHIw;_$F49jXQ=sq!$<|ps7t&XB;FIwD8u= zaC8!Yio=%~k2PV#Nku{AN3S*3&u?%1;wN-CI>cZtQ*fNj2>6_JJt5t%fOV7RwIZp5 z>#uC^<)kjoJ%7iC6bb?{sS8d2>(6RCOa%pMu2Jltuqwk-mIR}cQ{&_jkFu8Rjh9>c zQ6xiPq5wP~_a6cG49Cq(h*sF+NqgiR*bcaAkuDIfb^R~*XlQF6Z)p>=I4oJ}zv4P> z#gH<~L6(@+D8$_KG?7fmy;xYj9w@ag^I)H(;_uDBNpvkHNFWZ?a3g`=&UJhFIkDL= zJEc7_Zi|G;E?FoVP?MY@D&}Y!!gU>&KZ@Sdsv=R6&`js)03Cz*U;3;H#O%-a)Y8~U*^zGoc2*-L9vhlccc1i*18^e zK%&;$c&ss-R1gBN*=1pg3z`$!t z$)Lf5RAU-@YaQPOTk=cF9%HByWBktVS-|W)nIb}+vk=x zhc&m!GMrm{(S;Kj4unOq9W(r9^g=1AKk5w|d{F2T9mo-6lU4hLl&lYpKJ7xrfLzm` zC1FMicX)FKmC}2g^mjv}cY6m8l114QlVggC_^v?FXkhyAv_1oFHF8RbpdRe}2f5>% z1gFL>k9nr0ufcQ&D9ziYThL>QgCj_l9=0(1a}=*$5RRYhI z7L=(1j3>34O&@rEx$wopGv+L{0?W=RZqfh0+CAS;?J;fhg|!yMMFcJt)H83vx6sJC zX{G2jAV?cIv1A=%4d7_$B5STdQOM*l4QqJ@a>}pBiQrUkbnXIzTALLeV8Qcvse31@1SD1*7%`Bh2T(LqZ-lP+JbxKrv)I+Q^|8T&u_1 zEx|R8KDAPxHO(%v4-LwBTqIp~bwUk?JpE)>rY}jZk!w}xBR064_)wh>V33E+tPNuHXg50gm`ZC`5Rogs8GBaYH=$*pwZSA=s^|BkEa=zJ zygonz5#OQjFqmZqUv^OG(r4&pxJHh=^S@k$J6ENUFsG=$+`YoYJ6l_1z6AhbtlaNO zDvWy3Urj!Z+1bHclwmvM{iT3p$JH*U0~K_F^BM3zTPiKvb;RKHKYH14x-dz=P>I)ZBht z6W{h#RGfWI&AdiE8j1T*EICI_5WMof5%p9U3x}5xNRVM}mL;zSK$iU3oF89`vdlis zgZ=|%)!R4Mttvq#chl>D(xQ+hx9ny6&0dXs+j#>9MHW7mr6~5y8SSy;KR0xxhhOI= zdp`7aH}50NWJgb%Wxa@@|#V)J;lNK%WAyqbt0tcszSwYjJLP z1Lhb(5i=emy!K6-6P6^t{P)Byg@omd9G$ySci;Yxt#f{iYi+;Nk+XePGPuyN9; zQDZboW81cEv$2!LYHZs!=AHAL^Zo7p2WHQ{_r9^OYpu_!Se?o6tD7$-_DV*1|ExSI z;BwRNQYs6elfZI%9WaG(e+?ji11tMkFGer`IW?=1a*X%9Yo9oZXvn=Gn z{|-oND*)af%0hP=zcr~vSB1RBoOe z6vq6ouJ(%s5Q3}mUeVL~h~2&2wdM3WP2{o10n$UX#>@Se++skaB)b zxp`Y8TN3*Rt&HL(EV_?X-B0QqFAk%$LVSk~GvXQp{w|%-+4Q;UU(fT{>s`obt~j@z z(b!bdh21}%QLnjgej}5U%jA(Pc!+cezVxb6bT*=!cB_&@LF|&FByIZ&UtCmuCNKO} zPuGurk?Wp}cS!^@8U|PNvo#50YJis4Ohe0!hmpOz zYQcozG7YfTu7s7XiXFmej5^tZAQPF2(qxU*G`^Ve<9EuEs(z`iM*_VOE=r?e10K5M z9$jg=A>{A+YdY@lW1Wvw2^fe7DTZp%Nz8$VD?47e-h0ZruSsh)&D3^j1CC0ntb5V3 z84MXzb84;rCwj;ur#EHSJB!aqdLxsw>!w&!_?T2{zoaF17gBkB4P(iEc}7agBPI8) zo;BbDp=@{Nh1V{Hg-u)n7{-a%Glycd1|XpV`{>h7h5>M@GqD{zn*Lu^YKcv#Ri+C$ zuy=MMXf?XTW;?MWp(O)!>@x?42TlL27F6=3og{?M9tU&_>UiNXlUoJSD-F~F@ZpUb zLI;tJ`|r;7NniDMwKV#y^Lvt1ETvH{%Bb-rGuD>fb+7r zAKw;arH=KfVZ|*oL5i!PBd~u@?XS{bnAg98yL6FIqd>;$V;Hg)r>beyw&?lMJ0vXR z_5{H=zZRb%MYWw;neS`RFlWKMwY9*zwf^_d7Y!!RNRD-N$EX5tL*1N+C83-Ro~eBb z#MV}^F?cHunI2Y!gzAuym1mRoKHlFiCsp5IiA1MXi-L%AC6YlW`y}ZLbm)(Src#EB zNDqR+)2v1LG6)#+5=ZxVkl%cwX}_9DB#`@?O8F_(qCt}F-&4J0Ig^Chq=DUSRND)Z zLXw|3WeEgnEi~->Kj0oj-rWA2n?DC3U1lwJ;d<>Vjgv>ph>bAik7dW#Jxf34xzknR zES8Rg3Qina;_w_ob4MQuDD8{(!_DUJ}WILKOle^B@eJVI>Jw@&O=cgycEh*mf=0i!QaVhwUK?rx3klR*3H0pPjltn)VK~F)){{i$Rhn1yMOh`q!k$P@*n>3EiH(%55hQhT*ZzkQu14XabvF)io>~& z|NCDwlvftIc?vOdMH?G3s>q=PLp;Qu9u#DLcPgRBu#4u8%?~3|h1>aICS(Fduru2` zUL@Cd*pG#-sj?v_QU6uaIft{LQ9?%3CYCqK5WI=~lW9gNE&^|8fYR&t`bq!E_=3w$ zy#x<1A{|_phHYH_1-?0W<>6J)R_{6dqfBve^1X~}IZOgifeNWfPX=MEo&v2u?OfrL zaFyHg>02fezZE*_w=d`z(lXX0>J=?TkiHuHS7eJ`U0Qajj~pfWRR^ zrhisfocN&Lzkl|pLQ8}?-3j5L*pWpr0$n{3hQ1=wBlqM#`GwqMaW^+_8guKVpb2H_ zBrObw0sVgtqcFgKV&;HSORX$C>`J8-kg+IJV+=OqCW4Cm56Gq#MnwqQKmO7MH}`n? zp0%%Io0-g+t`s|t5lSAo#K8$~9nUvXQOQ*?dKJJBv(`JF=>*zASSO?BK>1b zt1)l-FD$3Y!~K+ZE9h8wR(N+H!dWX81x+n*WL%euOI2E-PddzTE7a#2>G*&p+2-dq za&SNZ6Z94?QH5`@yi(~rlarEKhW1lW`wC%oR`N!8Iqy$#HAb-3p-!(PK^mu-DTDAy`$Us`OvOy5LB|_C574 zX{>SEJ?T;vznBCfhn8mCl>FOu9^Fe1u&}os=p$75+2y>tqkFmXd=w!0r4CyYPB3^$ z!t|%U!`!fmbU+9lS0ZLg_m3M|5Jk=N#=!BX;bJXZSHaIv)DFb<=giz^JdHx2`D4X* zmi`F+4Q6oSYECIbxfnim$uGs|C64S^gcoR(^D39Y5MeGsSH++m8CR@@(5oXsL~_g_ zX-x$3ufv|wZa^Ry?&{F0ZW5s+2-B8SuwOWCk4 z3>ZdFrQQx$rY_sP)@21;%|LOFCwU(5NAO^Nt2M6r5Zt3%K98*LOWRtSp+0pz!CvTYP@IOUQDtsCbgFF?6V337Eb?le#OeIV0%~tjpso{nQ>> z;y93Bs;x8FIWw=YL^PE5nR7gzEfK!nJ&png0i{rH&My@g8Gsw$c$>+7*C>O{ zW~sNSk*3)zMP3gxi}D{g`sGuuU7E!*zY#0c15Dg@@k}x23>v89QtACAkSo9pt(kj$ zW#JTFV{pH*5>^=)|0{B@Y#}@@ia>PK_4ALgFOSz~;7SYMi@N=NZW@OWYdmZgk7#D5 zIv5DS9qkx3UGpNpIK<3d1PPN41oK#-`kDL~oZ?Dhp{au#CP!>N8!q`*M-XDP%m27= z5twjIn;UcJmFq+q)3frLH!ZG0vGVK$Zv7Qg9*$K`^L0Cq{~}y#fJ%1I;|awB?LqP~ z~0IJjqQM$uXPa`U$it$04>dvP zZOwE49p$1rRQ7UMx)t`$7Y_PwtyX^UM7;l3=0&gk*B+k?;+CI&{<5^9aPWvq5DY`* zk`TTSxicEMeg1PqT@KeD`i-iJyWwW2rBRV6bfTtmyf{N<(9kh;jjEroG=vRr3R6zm zNf{QsoAf~V!gfCCH8Ar={xUS^45`M$hUOTOJpR7$Vz8!fLXbTW=&3!u=k4Te zu>s!^DmAOiP%6xOxj6y8=rI_+yq*Pk#q)5A0Xn6BgNrzn+dHoJ%+8-Tnk&CQpGZAq zuCuIR@?sUMEW2AWc!g2x>%V5X47}@C5C{;ElQ(^1=DLpYWB>!c>@Qj;KG44C*K=eiOzLYy&7WGm8$nV+BQ7T| z6^vdNjbSb$hd5j>vXBSa<1uk5-{O8E>3u! ztv?583_ofpP;vI6m;HP(6XMo;@BDQs$alkeDn`WpPotD_A9UXO~G-}>>c6jYqol{S~e zZhcusq-A81c18^+zO%;`-y?04rlwBR0~ODGU#4;Pl1=KVghgbsLNjeptidqyUPX~?wH5#s^J1-K}KMD6EZ5j;l{0hA48f&oFZ0tC@e>tN)V@E4o zDkY2lp9m~&)-_>;W0=9K>Zi{LmKU#-%rFl|qOnwZHgT^pLJH?^!DNCkg&^CKpnHkA z`vTB=_f4c64`^WBIN2(u(ZIThnDE!{WAkFBX|+;h;$-XdIXTx`n2sl$`xTZYDIuHY zbz`)39IhOv)7i!^=whPfGG5_`c)E~)0+A>Q+2ndfF6YZD=ad|;Fuj|T2kM%=wc8g{ zi=%)%O6v5ppyFWZ-^{2uf0FIZ%80ZWdIm-i8$ z8@MkQ(@OlwcYjU$iBJ7!v8_hJ8EaR8#-)3`mT)*zd@xPo_A9p*V=yzpHp}7*x zDRD3zc`y>wumcBNTpa~c$l&1})}%+$2klqooyT3W4oY$a+jpMN_cf5uv!gys)1%Yo z#QBMGmhqq}D8!#sJDd%D{0VqfC;||u7(_!4auwv38zk4d9@*Hu<&(N;l39upQuGm8 z3fO66fba)e<^12Q69Gr35$UWJ8GceHE{P$B*w00?!vU2V)RaywGJfTYY zMB&BKal7+t#b%5Bwdze!iuL$|(*jrhSLCj?hUM02mm(&D9L?1S@oBP^$VlcU%-cq^ z57bLf9pOqwZax0B8?+-U^-z62Pcws2BI>Nc?Af!TPq+CgiVLI@6)~t%i!UK0+j&yFc2vZAa;Hdy!3s8vax3k98|#@( zDGdq}B{}iV=ZM1hN3k^h#_@5pk`G3;Pc6~z;dGc3rgjmV7faW87wKp)!GV zTpP(1M-0P>rMZQb^*e?t8X6Y8?B6tbXh!?sJG66c|=%L|?R` z1vY)Vzkk~8Y7eJQz@I0xWTRc{Kt0d%z`b;P+^IigT^$SSlclYlqsI8AF}Zhd`@6k* zw<1Qxy=m=#l7nRHT$w)xWqhoTjPkYynLy;oaC$0+-~dA!m`%Ur3ybJ37yocO^r_x*Yt-Q}N z&4R*h0P(X!F5W<@8f;0%Oe+AAqadCJStKY^i9%LfbJ{@0G{gJAuctQF(&gyUJAkko z(_%@TN4Dv?!vt?eZMwifPOC>{!g8VA+Q0s3={2|^d(bgPw@oz}aP~-g!OU6sH30$| zhr!nnQH2xi>Cx;HP_v>lV8es@%QVZ>aEkri)isBT3gST+3?gAAqm#sdhvcr$i>5Pn zsX->t4*o)7nKh#}ibl{1__ zC;B6@jdD8u`D+f%K|h7Z2%;i|x&A*9aXXLrBP5-hAB&`W6*-7Bf77;EE5@Ilowq7R zQhOzJ5f8cw%>)nox^EUQ_(1bcTo_0z2nP+?>L;<4#lfSbmUC*bqO(N;WrTYs=k1TZ zA)D7VcSs<=dG)3w?hdD8TJO=%9mYbs*CZ}4*g~-$mnD&18E5fm1~OW6Pl}+wAG^Zj zz6{awgW(8qBh)w*p(Z}J8M`GPq|TRSjQ9hV(Tpw)O@8GV_Hu?vThQA;h!xYLkQENb zfSTo8_RqU1n^Rr0Jff9}hBgQHO3!II>0Sp=cWBOk)fni2c47#Z)7p`3$USLb4KWXD@X>WB&684|=rTMvBCX?0w zxfo5@{V9EO+6Q!5S=F%ac@?m33;OZcb8gKfn@`)3$TiCXcEc4Y_dt#U6Y;s`yj48g zSl)xWfm&(yJ4fS2yl9JhRUS5%ZD3)fG-o9&3i951by)6aLmnvInWN4c{c^F|^_ z=!>8H6-hrCL`0BPnD>h71lwmS^p8IYa#Cn9kig(WK@Ed3E0!GT6*V3HvKsnq?KA zrMsE9U(WAezO$3G*e)Ae^HUehhdfs`-)^`Z+>2X?G$biy$n6vY3Gic8H{j*WEvVnG zVw}(QtOpSa2W;AdYCQ9Fg)`yPAdSH_D?f78K=hvqO?87q-pzVGf{a^K>c*V;zl;bm zB~s%EVfe8`kLu(=oIDUQ^p+Z!R-Xr_&BaB9u%M2vT=0s_%1lyi2 z;B1|s05oOkzTQsL1+0kV&X~0{(5a8b#`S8GE6@1|@2>d3QvqHhL`3@KGn>!8S<7xZ z+e9tpQgp{8lj+SQ>e?TckMGaRIs1Q!7aqUz@VG*Nu7yc5-$ge}PW@prc1!jM)<3~w~mZNV;mdl$$Vj=s({0_Om`*`i14e_qo zc+Fj?@aTIkz$@ynn7yx=>wfD#Yk6)6%RLSK@`HbLLH>8G(qD(I!M8m9a?lCsasl^b zv~wo1BxS#fmDSnibmuYL3H6kr6CQ!(G4HR$DNlimHwJA3R4r3YX)&reXb5s-WJ57d zSf8ijyXZ~%cRqSIDMaZ(E^LFaJzq-z9@UzA{?fAIO^R+&M2`8*oH|t8)8~H`y%Y&p z(Kzz?ld$q|&6Z`gahh4l_M1^J&7icYH8ot_EZl+{DPa0*e}wR3!Wg%gX=ra^vcE*i zQZz%HJUizF%Ip;nkH_NbE-7g9cA)>C|E!VqfZG0ev(W6yZ@92iX!2_()#p0m*O924 zX}Ve?ottl(AxWWxEV!!X2iZzT7&27 zHHqJ1qVn0&b4uM_9?6hS^3ljb*l?CXXu=#K&lpuSvoVCO%JB z1OQ--sX^AC2i1W#DtCtQV~B6he`;=3n@hTHSyB`PE6&!1X;o(=kkJudEVE51)Tw0q zDUetagNH`U=VFl&8-tJqEr7IN7@X*T66to4fsR0Wlb)j;f1uk$o!Ii~&-a{Oil{5c z9BL+Vt%c6s-pshGU(bNTGf?Axi13!!bRzqYWq1}NH!n9QQKy%n`(wqo@s;dx_wITO zDecRKf5(AI$2kSZ_SgeF{h_OH1Ey}mrxb-aDS`I&<(_%tj)_$ zCz@BPw(~VY(1aK=M>AQRH%%Rfbae~6=H3z0!e7J9Wm{F3`5c;Y34yZR1SR005c8p( z0f_qxi$52u4VAMRlYsF@TluLZG_so_?YVl?>j~JI}4%H5Yy>zvf#%tS}~jQIUqbKVvjgp4ke5R+5CU zI9TvQ5I~nP`FJ%dua+#8c$gkUO6+Bh<}unvgB z5;71P?9fz-h=&7`vIhi`*-p)snnNmKx}Pf6H$TdX3UW@{suvKKjCiICQ)|}l=wGEk ziQvpGt@a_8X{eEjWXnD+8Zi zdPXY2E5Y!R~lDt7%yetpttv@{=PkCjoo9B<+=M! z`01!!%SXv$#ZZAsfIA_KCyahtzQY$ywzGs>K7ZNpd@}Wy#BYVMyGfm~sSk1Q2hua| zyM53<|_q3DeS?|tEw%~!%-_x#IFiIIq9<8*RM^{*U^%9Ip|ZURw~ z%fpb!a3ZE05bX-vqZKy}dVg6iBgJ?unM#5gn(|~NAna{kMhg=M;5Ka^*CmmOke~`K z=VmgPNr=54xl>RDfdFv)Ct@a9itM0PDV zkczT;Y=&MYdYWoQA9lB`kB2_DQyHL}%d_f?(@4EU7~Op;GuOKB>EBvW%NU7J7BI); zxaj-$urBrA#`Py`Ulki}wg{+=HZvjOc_0uN7u@l!U8Qr}Xnk%=XuF>x_!mjJ3QPg+ z`LvGm*DP!(xZV3y7>!1KB(#)4R5C+RiM#uoKqe(n-t#j67uJ z>qp6oCxD+=>HR3MG03~*{`Dg)A{Hr8hSA}sQm<8b!qQq+#j+=Er~G38~|EmUJVFgj^lSy^_SLnUkNV}GQ5Lj$~( zQVk`A(gYoL72?^i9*xt2^G;a!Q)HldvU7VU$gkJ`orU(~+_Ay=8=b$)TaoqL*)i!^ z;-{(-)!X-xu4}xVcQ@Zo3!3%&N90thiZqxJ$O*Y_h?^@xgSM5R1kmNE$0nD@6>1Rk zOmy`~`nMI13Y1*XNY_Z1I*cF6!k(#^xlq}uYO+z6;}b^rWAY6PsMjy&omOh|G1~n~ zC<7ym!8~ec$~8LczGG|tUW(d@6uP>ZkbB(F&;6VvvnkH=FbSO)QO|B<*mP2j?*(W z6N`}m4K`VqPQfo5FiqzK9F;i-1rQ5_6@eGcOGF{*h;v!P&w2m(+S^@scV<>ht8dSt zsAZsV>Nvg244|%nD{riiOb8JgXL932m!JT~Hq0}*w{9!Q0w_MI0L?LAzm78@1ga&$ zt@$J17mSm%(hA*{T@ZI4Ec!SfzMO0yK`566F(3k&o?vA%Qv<_c-Nk?8YFop{h6hKr z-yV{j*}iysU)o-NWRpgkb>D4GHk6{DZv2+47KbS+mQe^jiY13aplvP7*Pa-UmrDiO z74Wf%i4E@lQKgPG-fl612H*h#fVa4Q3_Zq2kmjl~r7UFZx3w$9&cou3ZR3utDajTO zzu)~fj{N1h%eSLzzYwTUJf0^;uqf8JoqGxu!36x6xigR8#cnDIJ6Ja!gq^KF+IRq6 z@Lc`Xw)~r37H)*4K(^R1-O=NouGxAR2KoSXJePd1pn?-i>ru3rb(>l9j?;tBY1ts4 zQ}Jnd(|C^}ph`kAwGcB|na)DaAyRXCK&Yd5v+!W{?1xt0yE9zx5bp&ys*wK+qRxtCwL5?RF!sa95>&RMG#Y2(eiEU#yr~Ap2 zE6GcaP>45n3@acvunFE7yqpakUcO|xuYb}KRx02pz>E>y{LLFC?Q^w+)@kk$Eual9 zZwF{>PU4U@aqBhS)F0N^gUP3T>6J>vZI)X$@<#sQKn5J?SS-IVYlGoZC9st}*)=l| z6Vh%78YfVswZMXHP^m*v5T{i!D>YGtvnQ4eB6S}9J-^X##OVI2K){|f_NZp$IF{+(yL;bvJ9izy*u+dh_y7CN zhW&gb{xYf!8t(Ue*4BLvC!TWuwd}LfLF*(JVO)fB)L5NeMR>`2HLLJOuennj*0SSkXQSS@x;kF!JY%?yN zj^&(RcGGUUwcp=97bd|(_{nptfW1Wd<|W^+D{tOX_BaIVW<2dm0@enkHl|L*aX5j6 zg#^+>SSHwP5`cp|8`d?KW}iF3XAgaSV;%_$^8?gg1PRk$qaUsVr_XC8r@D*7Jv#Zj z{}J?{1HQhOuRHah#l1f5lpKB%X4ktdACc4hUFYcBG9rz^HQY~x#^jW0h!-ppT|Y|z z*0nO2xHHg<50Cu1jF>tFE(5<)e<_+u?&Nsfn3!Muqfrwv)is4GU|kW@*TKUU$w$m_ z7*k-wWm1=lT9hlqthu(h_O^BNbMda(%W3!b?WZZXuxt=p`_>F!nu>)*GShr{-laI3 zZRNy4X)s|65*1(%kQ%Y|D?yG~4G<52bfa){9T_IFWq_T4=7ixThu6BGeUCecg9A%a z^)6bQJs(zHdIW#nkrTJ2*z_~0#G`$S@|)nsOoo(GqgnA0s_{`>cbNPER3mfnS3*Ns z^MulWA+wSyuc$)4nA_6)0%=UbKu1upF!@OwlmRk%m@!NCI%NIJq4y%1JR)hAkB&TR zB6w}T@n-tbk8&4)Mn4>;!uubD3;c?m*xiZnx$}^8&|W;fUA3G2L3?j~xNAt6a#LAu zbYWKOA1A|NC=Nu1DD_9g`0HDj6b>~K2b%zoPu~##l@r_5qAlv+Kqo}e%kybxsO5E` z!=0*zgh?r(wHN^#90vnc;#3;Q{PY(Z0gNwP5?jH9rUqp{pfHU|xU-Q{MEgYNb@yb`M5#lHfYjkS zmx*L&NT;Wqid+MGlG3y|PDtOxbXz zkQPB@6FRs6i=)YxwAj52&RrTY6aLm~ZP7Q45?%A}oX)Lcb(Js$R5&e=?o3ktTCBQ# zCB=Klse8CHdu`C?@fe*o+SH1GM$)V%@Rye8`!&po!HUP$q^1TG3-${LB@?sw#k1)I zr~jm~_BQ{~RCAP9vpg-;ahD4@0$%{`t(3XyXlvfRT{qMp9hTa5w5YB3#}}zkD>5K? z+1Cz9Oi}NCQ(LTRi-Y5+2!M4JTPN|E8r* z#1v12XS~!;;^J6bmbysDmgpy%fcB+_!N->P@$6+89NO`)A+Z3S6l(1f@RZC_{I_N= z1w_0UTTkGUBc=Fuc~gA$1BJ(XMo3X-mmgy}KW#KZ;%iMzOsC>|uxL~%I{BYESs7(& zWaLT)Of~bD`R(S7uE%E<{Z+3)pjt5&Ax|$nSz|&QDF1CxIFHblMG6&=_J5cNWchv| z6Ph8gr>`e|AKzv3>~Ss5rrqXgt9>l((@D75b)?x;_ETY#OOeGTqn83XMQN-cK21|H zKIVl}^5{%$bqMJOcx8I-e4JDCUc2ZHfO@nzw`-_d_@g8}P%=_krCWl?F?Y4nE+gaR zpDpZN9;QS>Rf*^)r;rEPnyO4WvDl%r+Y4td^hy6CG}$GEeQF_r#Wv?gjUTkr2D)R@ zNe|@qN~B4$o`+|W@TDf<&R3IGVpL`tijRBEuGS&`=JsT`?xx{0#_WBnaoz*dYlL*qfiTawgWXJhHeP2k@xTz+n{bVHh?Pc1yCs5b=Y-s^bG!4qA)Wp6@Aub`kwOuk0cOZQ$?@U$S;T^xBrhvFlNqhMgZ7t#=iuC;iROVp z!)bAp0xG1mk%`K^LQHyWN#8s!2GJo>sZKcxDxkQHJyKBOcV$Rm8np~=lBV5eRrR=6 z^Rr;{(7pb_UBii%S<(9|&-sq`X6s5LrSo|$7nBI=n(G?gD8&2=$^zT*E7l`HO;E#8b@BM=0VY=af?m0dgY zl}yX-=9aW8{Oq-u)2V6ayy`6O2#areE1DHFiXHz`n1!u|dzETrzY>c4SE8p58$E(4PD~T%aY%OGm2JPbVJF z!fFz&uH)O=ez=`2%5|v6yGKuXv`r~)TO3FcU*$YLGL27$oI&I;IChoj3<_66Dky+h zWf)98q^J(ZK30syQp2RQhR8v{gC0KU-hv4BKOUq4_U6%sGvt>uNX3OyJ^u@rjW zXlT^G5K~Rm;3Qa@N!sfwRm?FbJ{W1Bkx_zkw|0yh;K&rvcaWbIP-v zK5OPJG|F$oB3w?>-ljs_7m8wqsYE(l>O;XCpF_WPn=-#Kc0_c;&oD#f-|WZ&d$9Xr z{b*^tJYS%k&ogEn^l{E3CD{M+(jqrVsDu^Y*V41J%m_VduRlKg0pb+~j`tL(0sH#` zw)WWA6f_H_={QRPQH_jsASV9Z@4~yt&Q*VI^j13;A1=)=Jx3(Ava96-*~};~^C)EeHwjhdVjhCT{ln^?npb z2gB|XqXM3z1l&V#^)zEEbrGtQ(j}RL7rN}NCrSdJ-cR{(Me$iX^uWqPT-FzKns0cY33?}A{{T2fh#;lM! z9dysGkw@KVxE}VicbpfiDl;z?3GQy@bR&K{bZToj(=mUpsUtTCPhMLjrA`t z6%opuqwu11y%__|6GhHYZEW0mrE9&(CCB;9xXF6fWGaC#%bYFjj0Vfq=BAK3{}Ps6 zwdxOgKYEc7p7jxZ0I};Z*Mig5^!DEZC!t5WWy^1s{K`nd?c`}`RMG9qoI≈Lx)S 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 Pe@xxdyo0Vp*@gcP>R*Q? literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/logixBanner.png b/v0/src/simulator/src/img/logixBanner.png new file mode 100644 index 0000000000000000000000000000000000000000..b9dad5d557ba7bae511bbf9ed94157ab37852361 GIT binary patch literal 25633 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 Q{>=wY*AV?o+xGtd0N(%-x&QzG literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/logixBanner2.png b/v0/src/simulator/src/img/logixBanner2.png new file mode 100644 index 0000000000000000000000000000000000000000..9e7b044a64ba1e37cfe733310ea9209377f413dd GIT binary patch literal 24713 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 literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/logix_banner_new.png b/v0/src/simulator/src/img/logix_banner_new.png new file mode 100644 index 0000000000000000000000000000000000000000..13d7fc635243f79d707d0043c859f32e74204b1a GIT binary patch literal 143965 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%0Alub%GfMsI)aRm(Y(BnAQG75m|{H}_#bzx@2t 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 literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/multiselectionDrag.mp4 b/v0/src/simulator/src/img/multiselectionDrag.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..6a193d8e5bcafd7010b4b8b533a39045b5250144 GIT binary patch literal 79933 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�aW!}f{*=(ph63# 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 literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/stats.png b/v0/src/simulator/src/img/stats.png new file mode 100644 index 0000000000000000000000000000000000000000..700bd7fb9ec3c2af3f506ef24bdbe41e165c7139 GIT binary patch literal 4824 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 literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/students.png b/v0/src/simulator/src/img/students.png new file mode 100644 index 0000000000000000000000000000000000000000..0be22e0ed593b83fcc85ef1aac523eddde932a7d GIT binary patch literal 62506 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 Y#Yem*#``$##Pyz%D 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 SHu%2_0F*5uo9n)2ANyAU%@NrE literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/img/wire.mp4 b/v0/src/simulator/src/img/wire.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..8b246df9b9cdd8ad32a17d4c35843ee1611b683f GIT binary patch literal 20226 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 U|Bpu3KUTjmcVNlu3#@Jb7u2@p#Q*>R literal 0 HcmV?d00001 diff --git a/v0/src/simulator/src/layout/layoutBuffer.js b/v0/src/simulator/src/layout/layoutBuffer.js new file mode 100644 index 00000000..1c339d28 --- /dev/null +++ b/v0/src/simulator/src/layout/layoutBuffer.js @@ -0,0 +1,88 @@ +import LayoutNode from './layoutNode' +/** + * Buffer object to store changes so that you can reset changes + * @class + * @param {Scope=} scope + * @category layout + */ +export default class LayoutBuffer { + constructor(scope = globalScope) { + var w = 300 * DPR + var h = 50 * DPR + + globalScope.ox = w + globalScope.oy = h + + // Assign layout if exist or create new one + this.layout = { ...scope.layout } // Object.create(scope.layout); + + // Push Input Nodes + this.Input = [] + for (let i = 0; i < scope.Input.length; i++) + this.Input.push( + new LayoutNode( + scope.Input[i].layoutProperties.x, + scope.Input[i].layoutProperties.y, + scope.Input[i].layoutProperties.id, + scope.Input[i].label, + scope.Input[i].type, + scope.Input[i] + ) + ) + + // Push Output Nodes + this.Output = [] + for (let i = 0; i < scope.Output.length; i++) + this.Output.push( + new LayoutNode( + scope.Output[i].layoutProperties.x, + scope.Output[i].layoutProperties.y, + scope.Output[i].layoutProperties.id, + scope.Output[i].label, + scope.Output[i].type, + scope.Output[i] + ) + ) + + // holds subcircuit elements + this.subElements = [] + } + + /** + * @memberof layoutBuffer + * Check if position is on the boundaries of subcircuit + * if the desired width and heiht is allowed + */ + isAllowed(x, y) { + if (x < 0 || x > this.layout.width || y < 0 || y > this.layout.height) + return false + if (x > 0 && x < this.layout.width && y > 0 && y < this.layout.height) + return false + + if ( + (x === 0 && y === 0) || + (x === 0 && y === this.layout.height) || + (x === this.layout.width && y === 0) || + (x === this.layout.width && y === this.layout.height) + ) + return false + + return true + } + + /** + * @memberof layoutBuffer + * Check if node is already at a position + * Function is called while decreasing height to + * check if it is possible without moving other node + */ + isNodeAt(x, y) { + for (let i = 0; i < this.Input.length; i++) { + if (this.Input[i].x === x && this.Input[i].y === y) return true + } + for (let i = 0; i < this.Output.length; i++) { + if (this.Output[i].x === x && this.Output[i].y === y) return true + } + return false + } +} diff --git a/v0/src/simulator/src/layout/layoutNode.js b/v0/src/simulator/src/layout/layoutNode.js new file mode 100644 index 00000000..ddf199b3 --- /dev/null +++ b/v0/src/simulator/src/layout/layoutNode.js @@ -0,0 +1,124 @@ +import { drawCircle } from '../canvasApi' +import simulationArea from '../simulationArea' +import { tempBuffer } from '../layoutMode' + +/** + * @class + * @param {number} x - x coord of node + * @param {number} y - y coord of node + * @param {strng} id - id for node + * @param {string=} label - label for the node + * @param {number} xx - parent x + * @param {number} yy - parent y + * @param {number} type - input or output node + * @param {CircuitElement} parent parent of the node + * @category layout + */ +export default class LayoutNode { + constructor(x, y, id, label = '', type, parent) { + this.type = type + this.id = id + + this.label = label + + this.prevx = undefined + this.prevy = undefined + this.x = x // Position of node wrt to parent + this.y = y // Position of node wrt to parent + + this.radius = 5 + this.clicked = false + this.hover = false + this.wasClicked = false + this.prev = 'a' + this.count = 0 + this.parent = parent + this.objectType = 'Layout Node' + } + + absX() { + return this.x + } + + absY() { + return this.y + } + + update() { + // Code copied from node.update() - Some code is redundant - needs to be removed + + if (this === simulationArea.hover) simulationArea.hover = undefined + this.hover = this.isHover() + + if (!simulationArea.mouseDown) { + if (this.absX() !== this.prevx || this.absY() !== this.prevy) { + // Store position before clicked + this.prevx = this.absX() + this.prevy = this.absY() + } + } + + if (this.hover) { + simulationArea.hover = this + } + + if ( + simulationArea.mouseDown && + ((this.hover && !simulationArea.selected) || + simulationArea.lastSelected === this) + ) { + simulationArea.selected = true + simulationArea.lastSelected = this + this.clicked = true + } else { + this.clicked = false + } + + if (!this.wasClicked && this.clicked) { + this.wasClicked = true + this.prev = 'a' + simulationArea.lastSelected = this + } else if (this.wasClicked && this.clicked) { + // Check if valid position and update accordingly + if ( + tempBuffer.isAllowed( + simulationArea.mouseX, + simulationArea.mouseY + ) && + !tempBuffer.isNodeAt( + simulationArea.mouseX, + simulationArea.mouseY + ) + ) { + this.x = simulationArea.mouseX + this.y = simulationArea.mouseY + } + } + } + + /** + * @memberof layoutNode + * this function is used to draw the nodes + */ + draw() { + var ctx = simulationArea.context + drawCircle( + ctx, + this.absX(), + this.absY(), + 3, + ['green', 'red'][+(simulationArea.lastSelected === this)] + ) + } + + /** + * @memberof layoutNode + * this function is used to check if hover + */ + isHover() { + return ( + this.absX() === simulationArea.mouseX && + this.absY() === simulationArea.mouseY + ) + } +} diff --git a/v0/src/simulator/src/layoutMode.js b/v0/src/simulator/src/layoutMode.js new file mode 100644 index 00000000..c400cb71 --- /dev/null +++ b/v0/src/simulator/src/layoutMode.js @@ -0,0 +1,544 @@ +/* eslint-disable import/no-cycle */ +/* eslint-disable no-continue */ +import { dots, correctWidth, fillText, rect2 } from './canvasApi' +import LayoutBuffer from './layout/layoutBuffer' +import simulationArea from './simulationArea' +import { + hideProperties, + fillSubcircuitElements, + prevPropertyObjGet, + prevPropertyObjSet, + showProperties, +} from './ux' +import { + update, + scheduleUpdate, + willBeUpdatedSet, + gridUpdateSet, + gridUpdateGet, +} from './engine' +import miniMapArea from './minimap' +import { showMessage } from './utils' +import * as metadata from './metadata.json' +import { verilogModeGet, verilogModeSet } from './Verilog2CV' + +/** + * Layout.js - all subcircuit layout related code is here + * You can edit how your subcircuit for a circuit will look by + * clicking edit layout in properties for a ciruit + * @category layoutMode + */ + +var layoutMode = false + +export function layoutModeSet(param) { + layoutMode = param +} + +export function layoutModeGet(param) { + return layoutMode +} + +/** + * @type {LayoutBuffer} - used to temporartily store all changes. + * @category layoutMode + */ +export var tempBuffer + +/** + * Helper function to determine alignment and position of nodes for rendering + * @param {number} x - width of label + * @param {number} y - height of label + * @category layoutMode + */ +export function determineLabel(x, y) { + if (x === 0) return ['left', 5, 5] + if (x === tempBuffer.layout.width) return ['right', -5, 5] + if (y === 0) return ['center', 0, 13] + return ['center', 0, -6] +} + +/** + * Used to move the grid in the layout mode + * @param {Scope} scope - the circuit whose subcircuit we are editing + * @category layoutMode + */ +export function paneLayout(scope = globalScope) { + if (!simulationArea.selected && simulationArea.mouseDown) { + simulationArea.selected = true + simulationArea.lastSelected = scope.root + simulationArea.hover = scope.root + } else if ( + simulationArea.lastSelected === scope.root && + simulationArea.mouseDown + ) { + // pane canvas + if (true) { + globalScope.ox = + simulationArea.mouseRawX - + simulationArea.mouseDownRawX + + simulationArea.oldx + globalScope.oy = + simulationArea.mouseRawY - + simulationArea.mouseDownRawY + + simulationArea.oldy + globalScope.ox = Math.round(globalScope.ox) + globalScope.oy = Math.round(globalScope.oy) + gridUpdateSet(true) + if (!embed && !lightMode) miniMapArea.setup() + } + } else if (simulationArea.lastSelected === scope.root) { + // Select multiple objects + + simulationArea.lastSelected = undefined + simulationArea.selected = false + simulationArea.hover = undefined + } +} + +/** + * Function to render layout on screen in layoutMode + * @param {Scope=} scope + * @category layoutMode + */ +export function renderLayout(scope = globalScope) { + if (!layoutModeGet()) return + var ctx = simulationArea.context + simulationArea.clear() + ctx.strokeStyle = 'black' + ctx.fillStyle = 'white' + ctx.lineWidth = correctWidth(3) + // Draw base rectangle + ctx.beginPath() + rect2( + ctx, + 0, + 0, + tempBuffer.layout.width, + tempBuffer.layout.height, + 0, + 0, + 'RIGHT' + ) + ctx.fill() + ctx.stroke() + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = 'black' + if (tempBuffer.layout.titleEnabled) { + fillText( + ctx, + scope.name, + tempBuffer.layout.title_x, + tempBuffer.layout.title_y, + 11 + ) + } + + // Draw labels + var info + for (let i = 0; i < tempBuffer.Input.length; i++) { + if (!tempBuffer.Input[i].label) continue + info = determineLabel( + tempBuffer.Input[i].x, + tempBuffer.Input[i].y, + scope + ) + ;[ctx.textAlign] = info + fillText( + ctx, + tempBuffer.Input[i].label, + tempBuffer.Input[i].x + info[1], + tempBuffer.Input[i].y + info[2], + 12 + ) + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + if (!tempBuffer.Output[i].label) continue + info = determineLabel( + tempBuffer.Output[i].x, + tempBuffer.Output[i].y, + scope + ) + ;[ctx.textAlign] = info + fillText( + ctx, + tempBuffer.Output[i].label, + tempBuffer.Output[i].x + info[1], + tempBuffer.Output[i].y + info[2], + 12 + ) + } + ctx.fill() + + // Draw points + for (let i = 0; i < tempBuffer.Input.length; i++) { + tempBuffer.Input[i].draw() + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + tempBuffer.Output[i].draw() + } + + if (gridUpdateGet()) { + dots() + } + + // Update UI position + for (let i = 0; i < tempBuffer.subElements.length; i++) { + tempBuffer.subElements[i].update() + + // element nodes + for (let j = 0; j < tempBuffer.subElements[i].nodeList.length; j++) + tempBuffer.subElements[i].nodeList[j].update() + } + + // Show properties of selected element + if (!embed && prevPropertyObjGet() != simulationArea.lastSelected) { + if (simulationArea.lastSelected) { + showProperties(simulationArea.lastSelected) + } + } + // Render objects + for (let i = 0; i < circuitElementList.length; i++) { + if (globalScope[circuitElementList[i]].length === 0) continue + if (!globalScope[circuitElementList[i]][0].canShowInSubcircuit) continue + + let elementName = circuitElementList[i] + + for (let j = 0; j < globalScope[elementName].length; j++) { + if ( + globalScope[elementName][j].subcircuitMetadata.showInSubcircuit + ) { + globalScope[elementName][j].drawLayoutMode() + } + } + } +} + +/** + * Update UI, positions of inputs and outputs + * @param {Scope} scope - the circuit whose subcircuit we are editing + * @category layoutMode + */ +export function layoutUpdate(scope = globalScope) { + if (!layoutModeGet()) return + willBeUpdatedSet(false) + for (let i = 0; i < tempBuffer.Input.length; i++) { + tempBuffer.Input[i].update() + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + tempBuffer.Output[i].update() + } + + for (let i = 0; i < circuitElementList.length; i++) { + if (globalScope[circuitElementList[i]].length === 0) continue + if (!globalScope[circuitElementList[i]][0].canShowInSubcircuit) continue + let elementName = circuitElementList[i] + + for (let j = 0; j < globalScope[elementName].length; j++) { + if ( + globalScope[elementName][j].subcircuitMetadata.showInSubcircuit + ) { + globalScope[elementName][j].layoutUpdate() + } + } + } + paneLayout(scope) + renderLayout(scope) +} + +/** + * Helper function to reset all nodes to original default positions + * @category layoutMode + */ +export function layoutResetNodes() { + tempBuffer.layout.width = 100 + tempBuffer.layout.height = + Math.max(tempBuffer.Input.length, tempBuffer.Output.length) * 20 + 20 + for (let i = 0; i < tempBuffer.Input.length; i++) { + tempBuffer.Input[i].x = 0 + tempBuffer.Input[i].y = i * 20 + 20 + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + tempBuffer.Output[i].x = tempBuffer.layout.width + tempBuffer.Output[i].y = i * 20 + 20 + } +} + +/** + * Increase width, and move all nodes + * @category layoutMode + */ +export function increaseLayoutWidth() { + for (let i = 0; i < tempBuffer.Input.length; i++) { + if (tempBuffer.Input[i].x === tempBuffer.layout.width) { + tempBuffer.Input[i].x += 10 + } + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + if (tempBuffer.Output[i].x === tempBuffer.layout.width) { + tempBuffer.Output[i].x += 10 + } + } + tempBuffer.layout.width += 10 +} + +/** + * Increase Height, and move all nodes + * @category layoutMode + */ +export function increaseLayoutHeight() { + for (let i = 0; i < tempBuffer.Input.length; i++) { + if (tempBuffer.Input[i].y === tempBuffer.layout.height) { + tempBuffer.Input[i].y += 10 + } + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + if (tempBuffer.Output[i].y === tempBuffer.layout.height) { + tempBuffer.Output[i].y += 10 + } + } + tempBuffer.layout.height += 10 +} + +/** + * Decrease Width, and move all nodes, check if space is there + * @category layoutMode + */ +export function decreaseLayoutWidth() { + if (tempBuffer.layout.width < 30) return + for (let i = 0; i < tempBuffer.Input.length; i++) { + if (tempBuffer.Input[i].x === tempBuffer.layout.width - 10) { + showMessage('No space. Move or delete some nodes to make space.') + return + } + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + if (tempBuffer.Output[i].x === tempBuffer.layout.width - 10) { + showMessage('No space. Move or delete some nodes to make space.') + return + } + } + + for (let i = 0; i < tempBuffer.Input.length; i++) { + if (tempBuffer.Input[i].x === tempBuffer.layout.width) { + tempBuffer.Input[i].x -= 10 + } + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + if (tempBuffer.Output[i].x === tempBuffer.layout.width) { + tempBuffer.Output[i].x -= 10 + } + } + tempBuffer.layout.width -= 10 +} + +/** + * Decrease Height, and move all nodes, check if space is there + * @category layoutMode + */ +export function decreaseLayoutHeight() { + if (tempBuffer.layout.height < 30) return + for (let i = 0; i < tempBuffer.Input.length; i++) { + if (tempBuffer.Input[i].y === tempBuffer.layout.height - 10) { + showMessage('No space. Move or delete some nodes to make space.') + return + } + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + if (tempBuffer.Output[i].y === tempBuffer.layout.height - 10) { + showMessage('No space. Move or delete some nodes to make space.') + return + } + } + + for (let i = 0; i < tempBuffer.Input.length; i++) { + if (tempBuffer.Input[i].y === tempBuffer.layout.height) { + tempBuffer.Input[i].y -= 10 + } + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + if (tempBuffer.Output[i].y === tempBuffer.layout.height) { + tempBuffer.Output[i].y -= 10 + } + } + tempBuffer.layout.height -= 10 +} + +/** + * Helper functions to move the titles + * @category layoutMode + */ +export function layoutTitleUp() { + tempBuffer.layout.title_y -= 5 +} + +/** + * Helper functions to move the titles + * @category layoutMode + */ +export function layoutTitleDown() { + tempBuffer.layout.title_y += 5 +} + +/** + * Helper functions to move the titles + * @category layoutMode + */ +export function layoutTitleRight() { + tempBuffer.layout.title_x += 5 +} + +/** + * Helper functions to move the titles + * @category layoutMode + */ +export function layoutTitleLeft() { + tempBuffer.layout.title_x -= 5 +} + +/** + * Helper functions to move the titles + * @category layoutMode + */ +export function toggleLayoutTitle() { + tempBuffer.layout.titleEnabled = !tempBuffer.layout.titleEnabled +} + +/** + * just toggles back to normal mode + * @category layoutMode + */ +export function cancelLayout() { + if (layoutModeGet()) { + // eslint-disable-next-line no-use-before-define + toggleLayoutMode() + } +} + +/** + * Store all data into layout and exit + * @category layoutMode + */ +export function saveLayout() { + if (layoutModeGet()) { + for (let i = 0; i < tempBuffer.Input.length; i++) { + tempBuffer.Input[i].parent.layoutProperties.x = + tempBuffer.Input[i].x + tempBuffer.Input[i].parent.layoutProperties.y = + tempBuffer.Input[i].y + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + tempBuffer.Output[i].parent.layoutProperties.x = + tempBuffer.Output[i].x + tempBuffer.Output[i].parent.layoutProperties.y = + tempBuffer.Output[i].y + } + globalScope.layout = { ...tempBuffer.layout } + // eslint-disable-next-line no-use-before-define + toggleLayoutMode() + } +} + +/** + * Function to toggle between layoutMode and normal Mode + * the sidebar is disabled and n properties are shown. + * @category layoutMode + */ +export function toggleLayoutMode() { + // hideProperties() + // lines from hideProperty function() <--- + prevPropertyObjSet(undefined) + $('.objectPropertyAttribute').unbind('change keyup paste click') + + if (layoutModeGet()) { + layoutModeSet(false) + $('#layoutDialog').fadeOut() + $('.layoutElementPanel').fadeOut() + $('.elementPanel').fadeIn() + $('.timing-diagram-panel').fadeIn() + $('.testbench-manual-panel').fadeIn() + globalScope.centerFocus(false) + if (globalScope.verilogMetadata.isVerilogCircuit) verilogModeSet(true) + dots() + } else { + layoutModeSet(true) + verilogModeSet(false) + $('#layoutDialog').fadeIn() + $('.layoutElementPanel').fadeIn() + $('.elementPanel').fadeOut() + $('.timing-diagram-panel').fadeOut() + $('.testbench-manual-panel').fadeOut() + fillSubcircuitElements() + + globalScope.ox = 0 + globalScope.oy = 0 + globalScope.scale = DPR * 1.3 + dots() + tempBuffer = new LayoutBuffer() + // $('#toggleLayoutTitle')[0].checked = tempBuffer.layout.titleEnabled + } + update(globalScope, true) + scheduleUpdate() +} + +export const layoutFunctions = { + decreaseLayoutWidth, + increaseLayoutWidth, + decreaseLayoutHeight, + increaseLayoutHeight, + layoutResetNodes, + layoutTitleUp, + layoutTitleDown, + layoutTitleLeft, + layoutTitleRight, + toggleLayoutTitle, + cancelLayout, + saveLayout, + toggleLayoutMode, +} + +// export function setupLayoutModePanelListeners() { +// $('#decreaseLayoutWidth').on('click', () => { +// decreaseLayoutWidth() +// }) +// $('#increaseLayoutWidth').on('click', () => { +// increaseLayoutWidth() +// }) +// $('#decreaseLayoutHeight').on('click', () => { +// decreaseLayoutHeight() +// }) +// $('#increaseLayoutHeight').on('click', () => { +// increaseLayoutHeight() +// }) +// $('#layoutResetNodes').on('click', () => { +// layoutResetNodes() +// }) +// $('#layoutTitleUp').on('click', () => { +// layoutTitleUp() +// }) +// $('#layoutTitleDown').on('click', () => { +// layoutTitleDown() +// }) +// $('#layoutTitleLeft').on('click', () => { +// layoutTitleLeft() +// }) +// $('#layoutTitleRight').on('click', () => { +// layoutTitleRight() +// }) +// $('#toggleLayoutTitle').on('click', () => { +// toggleLayoutTitle() +// }) +// $('#saveLayout').on('click', () => { +// saveLayout() +// }) +// $('#cancelLayout').on('click', () => { +// cancelLayout() +// }) +// $('#layoutDialog button').on('click', () => { +// scheduleUpdate() +// }) +// $('#layoutDialog input').on('click', () => { +// scheduleUpdate() +// }) +// } diff --git a/v0/src/simulator/src/listeners.js b/v0/src/simulator/src/listeners.js new file mode 100644 index 00000000..460be076 --- /dev/null +++ b/v0/src/simulator/src/listeners.js @@ -0,0 +1,761 @@ +// Most Listeners are stored here +import { + layoutModeGet, + tempBuffer, + layoutUpdate, + // setupLayoutModePanelListeners, +} from './layoutMode' +import simulationArea from './simulationArea' +import { + scheduleUpdate, + update, + updateSelectionsAndPane, + wireToBeCheckedSet, + updatePositionSet, + updateSimulationSet, + updateCanvasSet, + gridUpdateSet, + errorDetectedSet, +} from './engine' +import { changeScale } from './canvasApi' +import { scheduleBackup } from './data/backupCircuit' +import { + hideProperties, + deleteSelected, + uxvar, + fullView, + exitFullView, +} from './ux' +import { + updateRestrictedElementsList, + updateRestrictedElementsInScope, + hideRestricted, + showRestricted, +} from './restrictedElementDiv' +import { removeMiniMap, updatelastMinimapShown } from './minimap' +import undo from './data/undo' +import redo from './data/redo' +import { copy, paste, selectAll } from './events' +import save from './data/save' +import { verilogModeGet } from './Verilog2CV' +import { setupTimingListeners } from './plotArea' + +var unit = 10 +var listenToSimulator = true + +export default function startListeners() { + // added the below functionalities in QuickButton.vue component local script tag part + + // $('#deleteSelected').on('click', () => { + // deleteSelected() + // }) + + // $('#zoomIn').on('click', () => { + // changeScale(0.2, 'zoomButton', 'zoomButton', 2) + // }) + + // $('#zoomOut').on('click', () => { + // changeScale(-0.2, 'zoomButton', 'zoomButton', 2) + // }) + + // $('#undoButton').on('click', () => { + // undo() + // }) + // $('#redoButton').on('click', () => { + // redo() + // }) + // $('#viewButton').on('click', () => { + // fullView() + // }) + + $(document).on('keyup', (e) => { + if (e.key === 'Escape') exitFullView() + }) + + $('#projectName').on('click', () => { + simulationArea.lastSelected = globalScope.root + setTimeout(() => { + document.getElementById('projname').select() + }, 100) + }) + /* Makes tabs reordering possible by making them sortable */ + // $("#tabsBar").sortable({ + // containment: 'parent', + // items: '> div', + // revert: false, + // opacity: 0.5, + // tolerance: 'pointer', + // placeholder: 'placeholder', + // forcePlaceholderSize: true, + // }); + + document + .getElementById('simulationArea') + .addEventListener('mousedown', (e) => { + simulationArea.mouseDown = true + + // Deselect Input + if (document.activeElement instanceof HTMLElement) + document.activeElement.blur() + + errorDetectedSet(false) + updateSimulationSet(true) + updatePositionSet(true) + updateCanvasSet(true) + + simulationArea.lastSelected = undefined + simulationArea.selected = false + simulationArea.hover = undefined + var rect = simulationArea.canvas.getBoundingClientRect() + simulationArea.mouseDownRawX = (e.clientX - rect.left) * DPR + simulationArea.mouseDownRawY = (e.clientY - rect.top) * DPR + simulationArea.mouseDownX = + Math.round( + (simulationArea.mouseDownRawX - globalScope.ox) / + globalScope.scale / + unit + ) * unit + simulationArea.mouseDownY = + Math.round( + (simulationArea.mouseDownRawY - globalScope.oy) / + globalScope.scale / + unit + ) * unit + simulationArea.oldx = globalScope.ox + simulationArea.oldy = globalScope.oy + + e.preventDefault() + scheduleBackup() + scheduleUpdate(1) + $('.dropdown.open').removeClass('open') + }) + document + .getElementById('simulationArea') + .addEventListener('mouseup', (e) => { + if (simulationArea.lastSelected) + simulationArea.lastSelected.newElement = false + /* + handling restricted circuit elements + */ + + if ( + simulationArea.lastSelected && + restrictedElements.includes( + simulationArea.lastSelected.objectType + ) && + !globalScope.restrictedCircuitElementsUsed.includes( + simulationArea.lastSelected.objectType + ) + ) { + globalScope.restrictedCircuitElementsUsed.push( + simulationArea.lastSelected.objectType + ) + updateRestrictedElementsList() + } + + // deselect multible elements with click + if ( + !simulationArea.shiftDown && + simulationArea.multipleObjectSelections.length > 0 + ) { + if ( + !simulationArea.multipleObjectSelections.includes( + simulationArea.lastSelected + ) + ) { + simulationArea.multipleObjectSelections = [] + } + } + }) + document + .getElementById('simulationArea') + .addEventListener('mousemove', onMouseMove) + + window.addEventListener('keyup', (e) => { + scheduleUpdate(1) + simulationArea.shiftDown = e.shiftKey + if (e.keyCode == 16) { + simulationArea.shiftDown = false + } + if (e.key == 'Meta' || e.key == 'Control') { + simulationArea.controlDown = false + } + }) + + window.addEventListener( + 'keydown', + (e) => { + if (document.activeElement.tagName == 'INPUT') return + if (document.activeElement != document.body) return + + simulationArea.shiftDown = e.shiftKey + if (e.key == 'Meta' || e.key == 'Control') { + simulationArea.controlDown = true + } + + if ( + simulationArea.controlDown && + e.key.charCodeAt(0) == 122 && + !simulationArea.shiftDown + ) { + // detect the special CTRL-Z code + undo() + } + if ( + simulationArea.controlDown && + e.key.charCodeAt(0) == 122 && + simulationArea.shiftDown + ) { + // detect the special Cmd + shift + z code (macOs) + redo() + } + if ( + simulationArea.controlDown && + e.key.charCodeAt(0) == 121 && + !simulationArea.shiftDown + ) { + // detect the special ctrl + Y code (windows) + redo() + } + + if (listenToSimulator) { + // If mouse is focusing on input element, then override any action + // if($(':focus').length){ + // return; + // } + + if ( + document.activeElement.tagName == 'INPUT' || + simulationArea.mouseRawX < 0 || + simulationArea.mouseRawY < 0 || + simulationArea.mouseRawX > width || + simulationArea.mouseRawY > height + ) { + return + } + // HACK TO REMOVE FOCUS ON PROPERTIES + if (document.activeElement.type == 'number') { + hideProperties() + showProperties(simulationArea.lastSelected) + } + + errorDetectedSet(false) + updateSimulationSet(true) + updatePositionSet(true) + simulationArea.shiftDown = e.shiftKey + + if (e.key == 'Meta' || e.key == 'Control') { + simulationArea.controlDown = true + } + + // zoom in (+) + if ( + (simulationArea.controlDown && + (e.keyCode == 187 || e.keyCode == 171)) || + e.keyCode == 107 + ) { + e.preventDefault() + ZoomIn() + } + // zoom out (-) + if ( + (simulationArea.controlDown && + (e.keyCode == 189 || e.keyCode == 173)) || + e.keyCode == 109 + ) { + e.preventDefault() + ZoomOut() + } + + if ( + simulationArea.mouseRawX < 0 || + simulationArea.mouseRawY < 0 || + simulationArea.mouseRawX > width || + simulationArea.mouseRawY > height + ) + return + + scheduleUpdate(1) + updateCanvasSet(true) + wireToBeCheckedSet(1) + + // Needs to be deprecated, moved to more recent listeners + if ( + simulationArea.controlDown && + (e.key == 'C' || e.key == 'c') + ) { + // simulationArea.copyList=simulationArea.multipleObjectSelections.slice(); + // if(simulationArea.lastSelected&&simulationArea.lastSelected!==simulationArea.root&&!simulationArea.copyList.contains(simulationArea.lastSelected)){ + // simulationArea.copyList.push(simulationArea.lastSelected); + // } + // copy(simulationArea.copyList); + } + + if ( + simulationArea.lastSelected && + simulationArea.lastSelected.keyDown + ) { + if ( + e.key.toString().length == 1 || + e.key.toString() == 'Backspace' || + e.key.toString() == 'Enter' + ) { + simulationArea.lastSelected.keyDown(e.key.toString()) + e.cancelBubble = true + e.returnValue = false + + //e.stopPropagation works in Firefox. + if (e.stopPropagation) { + e.stopPropagation() + e.preventDefault() + } + return + } + } + + if ( + simulationArea.lastSelected && + simulationArea.lastSelected.keyDown2 + ) { + if (e.key.toString().length == 1) { + simulationArea.lastSelected.keyDown2(e.key.toString()) + return + } + } + + if ( + simulationArea.lastSelected && + simulationArea.lastSelected.keyDown3 + ) { + if ( + e.key.toString() != 'Backspace' && + e.key.toString() != 'Delete' + ) { + simulationArea.lastSelected.keyDown3(e.key.toString()) + return + } + } + + if (e.keyCode == 16) { + simulationArea.shiftDown = true + if ( + simulationArea.lastSelected && + !simulationArea.lastSelected.keyDown && + simulationArea.lastSelected.objectType != 'Wire' && + simulationArea.lastSelected.objectType != + 'CircuitElement' && + !simulationArea.multipleObjectSelections.contains( + simulationArea.lastSelected + ) + ) { + simulationArea.multipleObjectSelections.push( + simulationArea.lastSelected + ) + } + } + + // Detect offline save shortcut (CTRL+SHIFT+S) + if ( + simulationArea.controlDown && + e.keyCode == 83 && + simulationArea.shiftDown + ) { + saveOffline() + e.preventDefault() + } + + // Detect Select all Shortcut + if ( + simulationArea.controlDown && + (e.keyCode == 65 || e.keyCode == 97) + ) { + selectAll() + e.preventDefault() + } + + // deselect all Shortcut + if (e.keyCode == 27) { + simulationArea.multipleObjectSelections = [] + simulationArea.lastSelected = undefined + e.preventDefault() + } + + if ( + (e.keyCode == 113 || e.keyCode == 81) && + simulationArea.lastSelected != undefined + ) { + if (simulationArea.lastSelected.bitWidth !== undefined) { + simulationArea.lastSelected.newBitWidth( + parseInt(prompt('Enter new bitWidth'), 10) + ) + } + } + + if ( + simulationArea.controlDown && + (e.key == 'T' || e.key == 't') + ) { + // e.preventDefault(); //browsers normally open a new tab + simulationArea.changeClockTime(prompt('Enter Time:')) + } + } + + if (e.keyCode == 8 || e.key == 'Delete') { + deleteSelected() + } + }, + true + ) + + document + .getElementById('simulationArea') + .addEventListener('dblclick', (e) => { + updateCanvasSet(true) + if ( + simulationArea.lastSelected && + simulationArea.lastSelected.dblclick !== undefined + ) { + simulationArea.lastSelected.dblclick() + } else if (!simulationArea.shiftDown) { + simulationArea.multipleObjectSelections = [] + } + scheduleUpdate(2) + }) + + document + .getElementById('simulationArea') + .addEventListener('mouseup', onMouseUp) + + document + .getElementById('simulationArea') + .addEventListener('mousewheel', MouseScroll) + document + .getElementById('simulationArea') + .addEventListener('DOMMouseScroll', MouseScroll) + + function MouseScroll(event) { + updateCanvasSet(true) + event.preventDefault() + var deltaY = event.wheelDelta ? event.wheelDelta : -event.detail + event.preventDefault() + var deltaY = event.wheelDelta ? event.wheelDelta : -event.detail + const direction = deltaY > 0 ? 1 : -1 + handleZoom(direction) + updateCanvasSet(true) + gridUpdateSet(true) + + if (layoutModeGet()) layoutUpdate() + else update() // Schedule update not working, this is INEFFICIENT + } + + document.addEventListener('cut', (e) => { + if (verilogModeGet()) return + if (document.activeElement.tagName == 'INPUT') return + if (document.activeElement.tagName != 'BODY') return + + if (listenToSimulator) { + simulationArea.copyList = + simulationArea.multipleObjectSelections.slice() + if ( + simulationArea.lastSelected && + simulationArea.lastSelected !== simulationArea.root && + !simulationArea.copyList.contains(simulationArea.lastSelected) + ) { + simulationArea.copyList.push(simulationArea.lastSelected) + } + + var textToPutOnClipboard = copy(simulationArea.copyList, true) + + // Updated restricted elements + updateRestrictedElementsInScope() + localStorage.setItem('clipboardData', textToPutOnClipboard) + e.preventDefault() + if (textToPutOnClipboard == undefined) return + if (isIe) { + window.clipboardData.setData('Text', textToPutOnClipboard) + } else { + e.clipboardData.setData('text/plain', textToPutOnClipboard) + } + } + }) + + document.addEventListener('copy', (e) => { + if (verilogModeGet()) return + if (document.activeElement.tagName == 'INPUT') return + if (document.activeElement.tagName != 'BODY') return + + if (listenToSimulator) { + simulationArea.copyList = + simulationArea.multipleObjectSelections.slice() + if ( + simulationArea.lastSelected && + simulationArea.lastSelected !== simulationArea.root && + !simulationArea.copyList.contains(simulationArea.lastSelected) + ) { + simulationArea.copyList.push(simulationArea.lastSelected) + } + + var textToPutOnClipboard = copy(simulationArea.copyList) + + // Updated restricted elements + updateRestrictedElementsInScope() + localStorage.setItem('clipboardData', textToPutOnClipboard) + e.preventDefault() + if (textToPutOnClipboard == undefined) return + if (isIe) { + window.clipboardData.setData('Text', textToPutOnClipboard) + } else { + e.clipboardData.setData('text/plain', textToPutOnClipboard) + } + } + }) + + document.addEventListener('paste', (e) => { + if (document.activeElement.tagName == 'INPUT') return + if (document.activeElement.tagName != 'BODY') return + + if (listenToSimulator) { + var data + if (isIe) { + data = window.clipboardData.getData('Text') + } else { + data = e.clipboardData.getData('text/plain') + } + + paste(data) + + // Updated restricted elements + updateRestrictedElementsInScope() + + e.preventDefault() + } + }) + + // 'drag and drop' event listener for subcircuit elements in layout mode + $('#subcircuitMenu').on( + 'dragstop', + '.draggableSubcircuitElement', + function (event, ui) { + const sideBarWidth = $('#guide_1')[0].clientWidth + let tempElement + + if (ui.position.top > 10 && ui.position.left > sideBarWidth) { + // make a shallow copy of the element with the new coordinates + tempElement = + globalScope[this.dataset.elementName][ + this.dataset.elementId + ] + + // Changing the coordinate doesn't work yet, nodes get far from element + tempElement.x = ui.position.left - sideBarWidth + tempElement.y = ui.position.top + for (let node of tempElement.nodeList) { + node.x = ui.position.left - sideBarWidth + node.y = ui.position.top + } + + tempBuffer.subElements.push(tempElement) + this.parentElement.removeChild(this) + } + } + ) + + restrictedElements.forEach((element) => { + $(`#${element}`).mouseover(() => { + showRestricted() + }) + + $(`#${element}`).mouseout(() => { + hideRestricted() + }) + }) + + zoomSliderListeners() + // setupLayoutModePanelListeners() + if (!embed) { + setupTimingListeners() + } +} + +var isIe = + navigator.userAgent.toLowerCase().indexOf('msie') != -1 || + navigator.userAgent.toLowerCase().indexOf('trident') != -1 + +function onMouseMove(e) { + var rect = simulationArea.canvas.getBoundingClientRect() + simulationArea.mouseRawX = (e.clientX - rect.left) * DPR + simulationArea.mouseRawY = (e.clientY - rect.top) * DPR + simulationArea.mouseXf = + (simulationArea.mouseRawX - globalScope.ox) / globalScope.scale + simulationArea.mouseYf = + (simulationArea.mouseRawY - globalScope.oy) / globalScope.scale + simulationArea.mouseX = Math.round(simulationArea.mouseXf / unit) * unit + simulationArea.mouseY = Math.round(simulationArea.mouseYf / unit) * unit + + updateCanvasSet(true) + + if ( + simulationArea.lastSelected && + (simulationArea.mouseDown || simulationArea.lastSelected.newElement) + ) { + updateCanvasSet(true) + var fn + + if (simulationArea.lastSelected == globalScope.root) { + fn = function () { + updateSelectionsAndPane() + } + } else { + fn = function () { + if (simulationArea.lastSelected) { + simulationArea.lastSelected.update() + } + } + } + scheduleUpdate(0, 20, fn) + } else { + scheduleUpdate(0, 200) + } +} + +function onMouseUp(e) { + simulationArea.mouseDown = false + if (!lightMode) { + updatelastMinimapShown() + setTimeout(removeMiniMap, 2000) + } + + errorDetectedSet(false) + updateSimulationSet(true) + updatePositionSet(true) + updateCanvasSet(true) + gridUpdateSet(true) + wireToBeCheckedSet(1) + + scheduleUpdate(1) + simulationArea.mouseDown = false + + for (var i = 0; i < 2; i++) { + updatePositionSet(true) + wireToBeCheckedSet(1) + update() + } + errorDetectedSet(false) + updateSimulationSet(true) + updatePositionSet(true) + updateCanvasSet(true) + gridUpdateSet(true) + wireToBeCheckedSet(1) + + scheduleUpdate(1) + var rect = simulationArea.canvas.getBoundingClientRect() + + if ( + !( + simulationArea.mouseRawX < 0 || + simulationArea.mouseRawY < 0 || + simulationArea.mouseRawX > width || + simulationArea.mouseRawY > height + ) + ) { + uxvar.smartDropXX = simulationArea.mouseX + 100 // Math.round(((simulationArea.mouseRawX - globalScope.ox+100) / globalScope.scale) / unit) * unit; + uxvar.smartDropYY = simulationArea.mouseY - 50 // Math.round(((simulationArea.mouseRawY - globalScope.oy+100) / globalScope.scale) / unit) * unit; + } +} + +function resizeTabs() { + var $windowsize = $('body').width() + var $sideBarsize = $('.side').width() + var $maxwidth = $windowsize - $sideBarsize + $('#tabsBar div').each(function (e) { + $(this).css({ 'max-width': $maxwidth - 30 }) + }) +} + +window.addEventListener('resize', resizeTabs) +resizeTabs() + +// $(() => { +// $('[data-toggle="tooltip"]').tooltip() +// }) + +// direction is only 1 or -1 +function handleZoom(direction) { + var zoomSlider = $('#customRange1') + var currentSliderValue = parseInt(zoomSlider.val(), 10) + currentSliderValue += direction + + if (globalScope.scale > 0.5 * DPR) { + zoomSlider.val(currentSliderValue).change() + } else if (globalScope.scale < 4 * DPR) { + zoomSlider.val(currentSliderValue).change() + } + + gridUpdateSet(true) + scheduleUpdate() +} + +export function ZoomIn() { + handleZoom(1) +} + +export function ZoomOut() { + handleZoom(-1) +} + +function zoomSliderListeners() { + document.getElementById('customRange1').value = 5 + document + .getElementById('simulationArea') + .addEventListener('DOMMouseScroll', zoomSliderScroll) + document + .getElementById('simulationArea') + .addEventListener('mousewheel', zoomSliderScroll) + let curLevel = document.getElementById('customRange1').value + $(document).on('input change', '#customRange1', function (e) { + let newValue = $(this).val() + let changeInScale = newValue - curLevel + updateCanvasSet(true) + changeScale(changeInScale * 0.1, 'zoomButton', 'zoomButton', 3) + gridUpdateSet(true) + curLevel = newValue + }) + function zoomSliderScroll(e) { + let zoomLevel = document.getElementById('customRange1').value + let deltaY = e.wheelDelta ? e.wheelDelta : -e.detail + const directionY = deltaY > 0 ? 1 : -1 + if (directionY > 0) zoomLevel++ + else zoomLevel-- + if (zoomLevel >= 45) { + zoomLevel = 45 + document.getElementById('customRange1').value = 45 + } else if (zoomLevel <= 0) { + zoomLevel = 0 + document.getElementById('customRange1').value = 0 + } else { + document.getElementById('customRange1').value = zoomLevel + curLevel = zoomLevel + } + } + + // previously used for the + and - zoom buttons in quickButtons + + // function sliderZoomButton(direction) { + // var zoomSlider = $('#customRange1') + // var currentSliderValue = parseInt(zoomSlider.val(), 10) + // if (direction === -1) { + // currentSliderValue-- + // } else { + // currentSliderValue++ + // } + // zoomSlider.val(currentSliderValue).change() + // } + + // $('#decrement').click(() => { + // sliderZoomButton(-1) + // }) + + // $('#increment').click(() => { + // sliderZoomButton(1) + // }) +} diff --git a/v0/src/simulator/src/metadata.json b/v0/src/simulator/src/metadata.json new file mode 100644 index 00000000..8ed4f225 --- /dev/null +++ b/v0/src/simulator/src/metadata.json @@ -0,0 +1,179 @@ +{ + "circuitElementList": [ + "Input", + "Output", + "NotGate", + "OrGate", + "AndGate", + "NorGate", + "NandGate", + "XorGate", + "XnorGate", + "SevenSegDisplay", + "SixteenSegDisplay", + "HexDisplay", + "Multiplexer", + "BitSelector", + "Splitter", + "Power", + "Ground", + "ConstantVal", + "ControlledInverter", + "TriState", + "Adder", + "verilogMultiplier", + "verilogDivider", + "verilogPower", + "verilogShiftLeft", + "TwoComplement", + "verilogShiftRight", + "Rom", + "RAM", + "verilogRAM", + "EEPROM", + "TflipFlop", + "JKflipFlop", + "SRflipFlop", + "DflipFlop", + "TTY", + "Keyboard", + "Clock", + "DigitalLed", + "Stepper", + "VariableLed", + "RGBLed", + "SquareRGBLed", + "RGBLedMatrix", + "Button", + "Demultiplexer", + "Buffer", + "SubCircuit", + "Flag", + "MSB", + "LSB", + "PriorityEncoder", + "Tunnel", + "ALU", + "Decoder", + "Random", + "Counter", + "Dlatch", + "TB_Input", + "TB_Output", + "ForceGate" + ], + "annotationList": ["Text", "Rectangle", "Arrow", "ImageAnnotation"], + "inputList": [ + "Random", + "Dlatch", + "JKflipFlop", + "TflipFlop", + "SRflipFlop", + "DflipFlop", + "Buffer", + "Stepper", + "Ground", + "Power", + "ConstantVal", + "Input", + "Clock", + "Button", + "Counter" + ], + "subCircuitInputList": [ + "Random", + "Dlatch", + "JKflipFlop", + "TflipFlop", + "SRflipFlop", + "DflipFlop", + "Buffer", + "Stepper", + "Ground", + "Power", + "ConstantVal", + "Clock", + "Button", + "Counter" + ], + "elementHierarchy": { + "Input": [ + { "name": "Input", "label": "Input" }, + { "name": "Button", "label": "Button" }, + { "name": "Power", "label": "Power" }, + { "name": "Ground", "label": "Ground" }, + { "name": "ConstantVal", "label": "Constant Value" }, + { "name": "Stepper", "label": "Stepper" }, + { "name": "Random", "label": "Random" }, + { "name": "Counter", "label": "Counter" } + ], + "Output": [ + { "name": "Output", "label": "Output" }, + { "name": "RGBLed", "label": "RGB Led" }, + { "name": "DigitalLed", "label": "Digital Led" }, + { "name": "VariableLed", "label": "Variable Led" }, + { "name": "HexDisplay", "label": "Hex Display" }, + { "name": "SevenSegDisplay", "label": "Seven Segment Display" }, + { "name": "SixteenSegDisplay", "label": "Sixteen Segment Display" }, + { "name": "SquareRGBLed", "label": "Square RGB Led" }, + { "name": "RGBLedMatrix", "label": "RGB Led Matrix" } + ], + "Gates": [ + { "name": "AndGate", "label": "And Gate" }, + { "name": "OrGate", "label": "Or Gate" }, + { "name": "NotGate", "label": "Not Gate" }, + { "name": "XorGate", "label": "Xor Gate" }, + { "name": "NandGate", "label": "Nand Gate" }, + { "name": "NorGate", "label": "Nor Gate" }, + { "name": "XnorGate", "label": "Xnor Gate" } + ], + "Decoders & Plexers": [ + { "name": "Multiplexer", "label": "Multiplexer" }, + { "name": "Demultiplexer", "label": "Demultiplexer" }, + { "name": "BitSelector", "label": "Bit Selector" }, + { "name": "MSB", "label": "MSB(Most Significant Bit)" }, + { "name": "LSB", "label": "LSB(Least Significant Bit)" }, + { "name": "PriorityEncoder", "label": "Priority Encoder" }, + { "name": "Decoder", "label": "Decoder" } + ], + "Sequential Elements": [ + { "name": "DflipFlop", "label": "D flip Flop" }, + { "name": "Dlatch", "label": "D latch" }, + { "name": "TflipFlop", "label": "T flip Flop" }, + { "name": "JKflipFlop", "label": "JK flip Flop" }, + { "name": "SRflipFlop", "label": "SR flip Flop" }, + { "name": "TTY", "label": "TTY" }, + { "name": "Keyboard", "label": "Keyboard" }, + { "name": "Clock", "label": "Clock" }, + { "name": "Rom", "label": "ROM" }, + { "name": "RAM", "label": "RAM" }, + { "name": "verilogRAM", "label": "Verilog RAM" }, + { "name": "EEPROM", "label": "EEPROM" } + ], + "Annotation": [ + { "name": "Rectangle", "label": "Rectangle" }, + { "name": "Arrow", "label": "Arrow" }, + { "name": "ImageAnnotation", "label": "Image Annotation" }, + { "name": "Text", "label": "Text" } + ], + "Misc": [ + { "name": "TwoComplement", "label": "Two Complement" }, + { "name": "Flag", "label": "Flag" }, + { "name": "Splitter", "label": "Splitter" }, + { "name": "Adder", "label": "Adder" }, + { "name": "ALU", "label": "ALU(Arithmetic and Logical Unit)" }, + { "name": "TriState", "label": "TriState Flip Flop" }, + { "name": "Tunnel", "label": "Tunnel" }, + { "name": "verilogMultiplier", "label": "Verilog Multiplier" }, + { "name": "verilogDivider", "label": "Verilog Divider" }, + { "name": "verilogPower", "label": "Verilog Power" }, + { "name": "verilogShiftLeft", "label": "Verilog Shift Left" }, + { "name": "verilogShiftRight", "label": "Verilog Shift Right" }, + { "name": "Buffer", "label": "Buffer" }, + { "name": "ControlledInverter", "label": "Controlled Inverter" }, + { "name": "TB_Input", "label": "TB Input" }, + { "name": "TB_Output", "label": "TB Output" }, + { "name": "ForceGate", "label": "Force Gate" } + ] + } +} diff --git a/v0/src/simulator/src/minimap.js b/v0/src/simulator/src/minimap.js new file mode 100644 index 00000000..6cfcf49d --- /dev/null +++ b/v0/src/simulator/src/minimap.js @@ -0,0 +1,193 @@ +import simulationArea from './simulationArea' +import { colors } from './themer/themer' +import { layoutModeGet } from './layoutMode' + +/** + * @type {Object} miniMapArea + * This object is used to draw the miniMap. + * @property {number} pageY + * @property {number} pageX + * @property {HTMLCanvasObject} canvas - the canvas object + * @property {function} setup - used to setup the parameters and dimensions + * @property {function} play - used to draw outline of minimap and call resolve + * @property {function} resolve - used to resolve all objects and draw them on minimap + * @property {function} clear - used to clear minimap + * @category minimap + */ +var miniMapArea +export default miniMapArea = { + canvas: document.getElementById('miniMapArea'), + setup() { + if (lightMode) return + this.canvas = document.getElementById('miniMapArea') + this.pageHeight = height // Math.round(((parseInt($("#simulationArea").height())))/ratio)*ratio-50; // -50 for tool bar? Check again + this.pageWidth = width // Math.round(((parseInt($("#simulationArea").width())))/ratio)*ratio; + this.pageY = this.pageHeight - globalScope.oy + this.pageX = this.pageWidth - globalScope.ox + + if (simulationArea.minHeight != undefined) { + this.minY = Math.min( + simulationArea.minHeight, + -globalScope.oy / globalScope.scale + ) + } else { + this.minY = -globalScope.oy / globalScope.scale + } + if (simulationArea.maxHeight != undefined) { + this.maxY = Math.max( + simulationArea.maxHeight, + this.pageY / globalScope.scale + ) + } else { + this.maxY = this.pageY / globalScope.scale + } + if (simulationArea.minWidth != undefined) { + this.minX = Math.min( + simulationArea.minWidth, + -globalScope.ox / globalScope.scale + ) + } else { + this.minX = -globalScope.ox / globalScope.scale + } + if (simulationArea.maxWidth != undefined) { + this.maxX = Math.max( + simulationArea.maxWidth, + this.pageX / globalScope.scale + ) + } else { + this.maxX = this.pageX / globalScope.scale + } + + var h = this.maxY - this.minY + var w = this.maxX - this.minX + + var ratio = Math.min(250 / h, 250 / w) + if (h > w) { + this.canvas.height = 250.0 + this.canvas.width = (250.0 * w) / h + } else { + this.canvas.width = 250.0 + this.canvas.height = (250.0 * h) / w + } + + this.canvas.height += 5 + this.canvas.width += 5 + + document.getElementById('miniMap').style.height = this.canvas.height + document.getElementById('miniMap').style.width = this.canvas.width + this.ctx = this.canvas.getContext('2d') + this.play(ratio) + }, + + play(ratio) { + if (lightMode || layoutModeGet()) return + + this.ctx.fillStyle = '#bbb' + this.ctx.rect(0, 0, this.canvas.width, this.canvas.height) + this.ctx.fill() + this.resolve(ratio) + }, + resolve(ratio) { + if (lightMode) return + + this.ctx.fillStyle = '#ddd' + this.ctx.beginPath() + this.ctx.rect( + 2.5 + + ((this.pageX - this.pageWidth) / globalScope.scale - + this.minX) * + ratio, + 2.5 + + ((this.pageY - this.pageHeight) / globalScope.scale - + this.minY) * + ratio, + (this.pageWidth * ratio) / globalScope.scale, + (this.pageHeight * ratio) / globalScope.scale + ) + this.ctx.fill() + + // to show the area of current canvas + var lst = updateOrder + const miniFill = colors['mini_fill'] + const miniStroke = colors['mini_stroke'] + + this.ctx.strokeStyle = miniStroke + this.ctx.fillStyle = miniFill + for (var i = 0; i < lst.length; i++) { + if (lst[i] === 'wires') { + for (var j = 0; j < globalScope[lst[i]].length; j++) { + this.ctx.beginPath() + this.ctx.moveTo( + 2.5 + + (globalScope[lst[i]][j].node1.absX() - this.minX) * + ratio, + 2.5 + + (globalScope[lst[i]][j].node1.absY() - this.minY) * + ratio + ) + this.ctx.lineTo( + 2.5 + + (globalScope[lst[i]][j].node2.absX() - this.minX) * + ratio, + 2.5 + + (globalScope[lst[i]][j].node2.absY() - this.minY) * + ratio + ) + this.ctx.stroke() + } + } else if (lst[i] != 'nodes') { + // Don't include SquareRGBLed here; it has correct size. + var ledY = 0 + if ( + lst[i] == 'DigitalLed' || + lst[i] == 'VariableLed' || + lst[i] == 'RGBLed' + ) { + ledY = 20 + } + + for (var j = 0; j < globalScope[lst[i]].length; j++) { + var xx = globalScope[lst[i]][j].x - simulationArea.minWidth + var yy = globalScope[lst[i]][j].y - simulationArea.minHeight + this.ctx.beginPath() + var obj = globalScope[lst[i]][j] + this.ctx.rect( + 2.5 + (obj.x - obj.leftDimensionX - this.minX) * ratio, + 2.5 + (obj.y - obj.upDimensionY - this.minY) * ratio, + (obj.rightDimensionX + obj.leftDimensionX) * ratio, + (obj.downDimensionY + obj.upDimensionY + ledY) * ratio + ) + + this.ctx.fill() + this.ctx.stroke() + } + } + } + }, + clear() { + if (lightMode) return + $('#miniMapArea').css('z-index', '-1') + this.context.clearRect(0, 0, this.canvas.width, this.canvas.height) + }, +} +var lastMiniMapShown +export function updatelastMinimapShown() { + lastMiniMapShown = new Date().getTime() +} +export function removeMiniMap() { + if (lightMode) return + + if ( + simulationArea.lastSelected == globalScope.root && + simulationArea.mouseDown + ) + return + if (lastMiniMapShown + 2000 >= new Date().getTime()) { + setTimeout( + removeMiniMap, + lastMiniMapShown + 2000 - new Date().getTime() + ) + return + } + $('#miniMap').fadeOut('fast') +} diff --git a/v0/src/simulator/src/moduleSetup.js b/v0/src/simulator/src/moduleSetup.js new file mode 100644 index 00000000..5002bc69 --- /dev/null +++ b/v0/src/simulator/src/moduleSetup.js @@ -0,0 +1,135 @@ +import modules from './modules' +import Adder from './modules/Adder' +import ALU from './modules/ALU' +import AndGate from './modules/AndGate' +import Arrow from './modules/Arrow' +import ImageAnnotation from './modules/ImageAnnotation' +import BitSelector from './modules/BitSelector' +import Buffer from './modules/Buffer' +import Button from './modules/Button' +import ConstantVal from './modules/ConstantVal' +import ControlledInverter from './modules/ControlledInverter' +import Counter from './modules/Counter' +import Decoder from './modules/Decoder' +import Demultiplexer from './modules/Demultiplexer' +import DigitalLed from './modules/DigitalLed' +import Flag from './modules/Flag' +import Ground from './modules/Ground' +import HexDisplay from './modules/HexDisplay' +import Input from './modules/Input' +import LSB from './modules/LSB' +import MSB from './modules/MSB' +import Multiplexer from './modules/Multiplexer' +import NandGate from './modules/NandGate' +import NorGate from './modules/NorGate' +import NotGate from './modules/NotGate' +import OrGate from './modules/OrGate' +import Output from './modules/Output' +import Power from './modules/Power' +import PriorityEncoder from './modules/PriorityEncoder' +import Random from './modules/Random' +import Rectangle from './modules/Rectangle' +import RGBLed from './modules/RGBLed' +import RGBLedMatrix from './modules/RGBLedMatrix' +import SevenSegDisplay from './modules/SevenSegDisplay' +import SixteenSegDisplay from './modules/SixteenSegDisplay' +import Splitter from './modules/Splitter' +import SquareRGBLed from './modules/SquareRGBLed' +import Stepper from './modules/Stepper' +import Text from './modules/Text' +import TriState from './modules/TriState' +import Tunnel from './modules/Tunnel' +import TwoComplement from './modules/TwoComplement' +import VariableLed from './modules/VariableLed' +import XnorGate from './modules/XnorGate' +import XorGate from './modules/XorGate' +import Clock from './sequential/Clock' +import DflipFlop from './sequential/DflipFlop' +import Dlatch from './sequential/Dlatch' +import EEPROM from './sequential/EEPROM' +import JKflipFlop from './sequential/JKflipFlop' +import Keyboard from './sequential/Keyboard' +import RAM from './sequential/RAM' +import Rom from './sequential/Rom' +import SRflipFlop from './sequential/SRflipFlop' +import TflipFlop from './sequential/TflipFlop' +import TTY from './sequential/TTY' +import ForceGate from './testbench/ForceGate' +import TB_Input from './testbench/testbenchInput' +import TB_Output from './testbench/testbenchOutput' +import verilogMultiplier from './modules/verilogMultiplier' +import verilogDivider from './modules/verilogDivider' +import verilogPower from './modules/verilogPower' +import verilogShiftLeft from './modules/verilogShiftLeft' +import verilogShiftRight from './modules/verilogShiftRight' +import verilogRAM from './sequential/verilogRAM' + +export default function setupModules() { + var moduleSet = { + AndGate, + Random, + NandGate, + Counter, + Multiplexer, + XorGate, + XnorGate, + SevenSegDisplay, + SixteenSegDisplay, + HexDisplay, + OrGate, + Stepper, + NotGate, + Text, + TriState, + Buffer, + ControlledInverter, + Adder, + verilogMultiplier, + verilogDivider, + verilogPower, + verilogShiftLeft, + verilogShiftRight, + TwoComplement, + Splitter, + Ground, + Power, + Input, + Output, + BitSelector, + ConstantVal, + NorGate, + DigitalLed, + VariableLed, + Button, + RGBLed, + SquareRGBLed, + Demultiplexer, + Decoder, + Flag, + MSB, + LSB, + PriorityEncoder, + Tunnel, + ALU, + Rectangle, + Arrow, + ImageAnnotation, + RGBLedMatrix, + TflipFlop, + DflipFlop, + Dlatch, + SRflipFlop, + JKflipFlop, + TTY, + Keyboard, + Clock, + Rom, + EEPROM, + RAM, + verilogRAM, + TB_Input, + TB_Output, + ForceGate, + } + Object.assign(modules, moduleSet) +} diff --git a/v0/src/simulator/src/modules.js b/v0/src/simulator/src/modules.js new file mode 100644 index 00000000..41bacb6f --- /dev/null +++ b/v0/src/simulator/src/modules.js @@ -0,0 +1,60 @@ +/* eslint-disable import/no-cycle */ +import simulationArea from './simulationArea' + +export function getNextPosition(x = 0, scope = globalScope) { + let possibleY = 20 + const done = {} + for (let i = 0; i < scope.Input.length - 1; i++) { + if (scope.Input[i].layoutProperties.x === x) { + done[scope.Input[i].layoutProperties.y] = 1 + } + } + for (let i = 0; i < scope.Output.length; i++) { + if (scope.Output[i].layoutProperties.x === x) { + done[scope.Output[i].layoutProperties.y] = 1 + } + } + while (done[possibleY] || done[possibleY + 10] || done[possibleY - 10]) { + possibleY += 10 + } + const height = possibleY + 20 + if (height > scope.layout.height) { + const oldHeight = scope.layout.height + scope.layout.height = height + for (let i = 0; i < scope.Input.length; i++) { + if (scope.Input[i].layoutProperties.y === oldHeight) { + scope.Input[i].layoutProperties.y = scope.layout.height + } + } + for (let i = 0; i < scope.Output.length; i++) { + if (scope.Output[i].layoutProperties.y === oldHeight) { + scope.Output[i].layoutProperties.y = scope.layout.height + } + } + } + return possibleY +} + +/** + * Global + */ +var modules = {} + +export default modules + +export function changeInputSize(size) { + if (size == undefined || size < 2 || size > 10) return + if (this.inputSize == size) return + size = parseInt(size, 10) + var obj = new modules[this.objectType]( + this.x, + this.y, + this.scope, + this.direction, + size, + this.bitWidth + ) + this.delete() + simulationArea.lastSelected = obj + return obj +} diff --git a/v0/src/simulator/src/modules/ALU.js b/v0/src/simulator/src/modules/ALU.js new file mode 100644 index 00000000..19cda667 --- /dev/null +++ b/v0/src/simulator/src/modules/ALU.js @@ -0,0 +1,200 @@ +/* eslint-disable no-bitwise */ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText4 } from '../canvasApi' +import { colors } from '../themer/themer' + +/** + * @class + * ALU + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +export default class ALU extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['ALU'].push(this); + */ + this.message = 'ALU' + + this.setDimensions(30, 40) + this.rectangleObject = false + + this.inp1 = new Node(-30, -30, 0, this, this.bitwidth, 'A') + this.inp2 = new Node(-30, 30, 0, this, this.bitwidth, 'B') + + this.controlSignalInput = new Node(-10, -40, 0, this, 3, 'Ctrl') + this.carryOut = new Node(-10, 40, 1, this, 1, 'Cout') + this.output = new Node(30, 0, 1, this, this.bitwidth, 'Out') + } + + /** + * @memberof ALU + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.inp1.bitWidth = bitWidth + this.inp2.bitWidth = bitWidth + this.output.bitWidth = bitWidth + } + + /** + * @memberof ALU + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + inp1: findNode(this.inp1), + inp2: findNode(this.inp2), + output: findNode(this.output), + carryOut: findNode(this.carryOut), + controlSignalInput: findNode(this.controlSignalInput), + }, + } + return data + } + + /** + * @memberof ALU + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + const xx = this.x + const yy = this.y + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + moveTo(ctx, 30, 10, xx, yy, this.direction) + lineTo(ctx, 30, -10, xx, yy, this.direction) + lineTo(ctx, 10, -40, xx, yy, this.direction) + lineTo(ctx, -30, -40, xx, yy, this.direction) + lineTo(ctx, -30, -20, xx, yy, this.direction) + lineTo(ctx, -20, -10, xx, yy, this.direction) + lineTo(ctx, -20, 10, xx, yy, this.direction) + lineTo(ctx, -30, 20, xx, yy, this.direction) + lineTo(ctx, -30, 40, xx, yy, this.direction) + lineTo(ctx, 10, 40, xx, yy, this.direction) + lineTo(ctx, 30, 10, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = colors['hover_select'] + } + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.fillStyle = 'Black' + ctx.textAlign = 'center' + + fillText4(ctx, 'B', -23, 30, xx, yy, this.direction, 6) + fillText4(ctx, 'A', -23, -30, xx, yy, this.direction, 6) + fillText4(ctx, 'CTR', -10, -30, xx, yy, this.direction, 6) + fillText4(ctx, 'Carry', -10, 30, xx, yy, this.direction, 6) + fillText4(ctx, 'Ans', 20, 0, xx, yy, this.direction, 6) + ctx.fill() + ctx.beginPath() + ctx.fillStyle = 'DarkGreen' + fillText4(ctx, this.message, 0, 0, xx, yy, this.direction, 12) + ctx.fill() + } + + /** + * @memberof ALU + * resolve output values based on inputData + */ + resolve() { + if (this.controlSignalInput.value === 0) { + this.output.value = this.inp1.value & this.inp2.value + simulationArea.simulationQueue.add(this.output) + this.carryOut.value = 0 + simulationArea.simulationQueue.add(this.carryOut) + this.message = 'A&B' + } else if (this.controlSignalInput.value === 1) { + this.output.value = this.inp1.value | this.inp2.value + + simulationArea.simulationQueue.add(this.output) + this.carryOut.value = 0 + simulationArea.simulationQueue.add(this.carryOut) + this.message = 'A|B' + } else if (this.controlSignalInput.value === 2) { + const sum = this.inp1.value + this.inp2.value + this.output.value = + (sum << (32 - this.bitWidth)) >>> (32 - this.bitWidth) + this.carryOut.value = +(sum >>> this.bitWidth !== 0) + simulationArea.simulationQueue.add(this.carryOut) + simulationArea.simulationQueue.add(this.output) + this.message = 'A+B' + } else if (this.controlSignalInput.value === 3) { + this.message = 'ALU' + } else if (this.controlSignalInput.value === 4) { + this.message = 'A&~B' + this.output.value = this.inp1.value & this.flipBits(this.inp2.value) + simulationArea.simulationQueue.add(this.output) + this.carryOut.value = 0 + simulationArea.simulationQueue.add(this.carryOut) + } else if (this.controlSignalInput.value === 5) { + this.message = 'A|~B' + this.output.value = this.inp1.value | this.flipBits(this.inp2.value) + simulationArea.simulationQueue.add(this.output) + this.carryOut.value = 0 + simulationArea.simulationQueue.add(this.carryOut) + } else if (this.controlSignalInput.value === 6) { + this.message = 'A-B' + this.output.value = + ((this.inp1.value - this.inp2.value) << + (32 - this.bitWidth)) >>> + (32 - this.bitWidth) + simulationArea.simulationQueue.add(this.output) + this.carryOut.value = 0 + simulationArea.simulationQueue.add(this.carryOut) + } else if (this.controlSignalInput.value === 7) { + this.message = 'A>> (32 - this.bitWidth) + this.carryOut.value = +(sum >>> this.bitWidth !== 0) + simulationArea.simulationQueue.add(this.carryOut) + simulationArea.simulationQueue.add(this.sum) + } + + generateVerilog() { + if (this.carryIn.verilogLabel) { + return `assign ${this.sum.verilogLabel} = ${this.inpA.verilogLabel} + ${this.inpB.verilogLabel} + ${this.carryIn.verilogLabel};` + } + return `assign ${this.sum.verilogLabel} = ${this.inpA.verilogLabel} + ${this.inpB.verilogLabel};` + } +} + +/** + * @memberof Adder + * Help Tip + * @type {string} + * @category modules + */ +Adder.prototype.tooltipText = 'Adder ToolTip : Performs addition of numbers.' +Adder.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/8misc?id=adder' +Adder.prototype.objectType = 'Adder' diff --git a/v0/src/simulator/src/modules/AndGate.js b/v0/src/simulator/src/modules/AndGate.js new file mode 100644 index 00000000..43c3fced --- /dev/null +++ b/v0/src/simulator/src/modules/AndGate.js @@ -0,0 +1,168 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, arc } from '../canvasApi' +import { changeInputSize } from '../modules' +import { colors } from '../themer/themer' +import { gateGenerateVerilog } from '../utils' + +/** + * @class + * AndGate + * @extends CircuitElement + * @param {number} x - x coordinate of And Gate. + * @param {number} y - y coordinate of And Gate. + * @param {Scope=} scope - Cirucit on which and gate is drawn + * @param {string=} dir - direction of And Gate + * @param {number=} inputLength - number of input nodes + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +export default class AndGate extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + inputLength = 2, + bitWidth = 1 + ) { + /** + * super call + */ + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['AndGate'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 20) + this.inp = [] + this.inputSize = inputLength + + // variable inputLength , node creation + if (inputLength % 2 === 1) { + for (let i = 0; i < inputLength / 2 - 1; i++) { + const a = new Node(-10, -10 * (i + 1), 0, this) + this.inp.push(a) + } + let a = new Node(-10, 0, 0, this) + this.inp.push(a) + for (let i = inputLength / 2 + 1; i < inputLength; i++) { + a = new Node(-10, 10 * (i + 1 - inputLength / 2 - 1), 0, this) + this.inp.push(a) + } + } else { + for (let i = 0; i < inputLength / 2; i++) { + const a = new Node(-10, -10 * (i + 1), 0, this) + this.inp.push(a) + } + for (let i = inputLength / 2; i < inputLength; i++) { + const a = new Node(-10, 10 * (i + 1 - inputLength / 2), 0, this) + this.inp.push(a) + } + } + + this.output1 = new Node(20, 0, 1, this) + } + + /** + * @memberof AndGate + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.inputSize, + this.bitWidth, + ], + nodes: { + inp: this.inp.map(findNode), + output1: findNode(this.output1), + }, + } + return data + } + + /** + * @memberof AndGate + * resolve output values based on inputData + */ + resolve() { + let result = this.inp[0].value || 0 + if (this.isResolvable() === false) { + return + } + for (let i = 1; i < this.inputSize; i++) + result &= this.inp[i].value || 0 + this.output1.value = result >>> 0 + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof AndGate + * function to draw And Gate + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.lineWidth = correctWidth(3) + ctx.strokeStyle = colors['stroke'] // ("rgba(0,0,0,1)"); + ctx.fillStyle = colors['fill'] + const xx = this.x + const yy = this.y + + moveTo(ctx, -10, -20, xx, yy, this.direction) + lineTo(ctx, 0, -20, xx, yy, this.direction) + arc(ctx, 0, 0, 20, -Math.PI / 2, Math.PI / 2, xx, yy, this.direction) + lineTo(ctx, -10, 20, xx, yy, this.direction) + lineTo(ctx, -10, -20, xx, yy, this.direction) + ctx.closePath() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + } + + generateVerilog() { + return gateGenerateVerilog.call(this, '&') + } +} + +/** + * @memberof AndGate + * Help Tip + * @type {string} + * @category modules + */ +AndGate.prototype.tooltipText = + 'And Gate Tooltip : Implements logical conjunction' + +/** + * @memberof AndGate + * @type {boolean} + * @category modules + */ +AndGate.prototype.alwaysResolve = true + +/** + * @memberof AndGate + * @type {string} + * @category modules + */ +AndGate.prototype.verilogType = 'and' + +/** + * @memberof AndGate + * function to change input nodes of the gate + * @category modules + */ +AndGate.prototype.changeInputSize = changeInputSize +AndGate.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/4gates?id=and-gate' +AndGate.prototype.objectType = 'AndGate' diff --git a/v0/src/simulator/src/modules/Arrow.js b/v0/src/simulator/src/modules/Arrow.js new file mode 100644 index 00000000..24eeddfd --- /dev/null +++ b/v0/src/simulator/src/modules/Arrow.js @@ -0,0 +1,83 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, arc } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * Arrow + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Arrow extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT') { + super(x, y, scope, dir, 8) + /* this is done in this.baseSetup() now + this.scope['Arrow'].push(this); + */ + this.rectangleObject = false + this.fixedBitWidth = true + this.setDimensions(30, 20) + } + + /** + * @memberof Arrow + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction], + } + return data + } + + /** + * @memberof Arrow + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + ctx.strokeStyle = colors['stroke_alt'] + ctx.fillStyle = colors['fill'] + + ctx.beginPath() + + moveTo(ctx, -30, -3, xx, yy, this.direction) + lineTo(ctx, 10, -3, xx, yy, this.direction) + lineTo(ctx, 10, -15, xx, yy, this.direction) + lineTo(ctx, 30, 0, xx, yy, this.direction) + lineTo(ctx, 10, 15, xx, yy, this.direction) + lineTo(ctx, 10, 3, xx, yy, this.direction) + lineTo(ctx, -30, 3, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + } +} + +/** + * @memberof Arrow + * Help Tip + * @type {string} + * @category modules + */ +Arrow.prototype.tooltipText = 'Arrow ToolTip : Arrow Selected.' +Arrow.prototype.propagationDelayFixed = true +Arrow.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/7annotation?id=arrow' +Arrow.prototype.objectType = 'Arrow' diff --git a/v0/src/simulator/src/modules/BitSelector.js b/v0/src/simulator/src/modules/BitSelector.js new file mode 100644 index 00000000..8c91cee4 --- /dev/null +++ b/v0/src/simulator/src/modules/BitSelector.js @@ -0,0 +1,173 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode, extractBits } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect, fillText } from '../canvasApi' +/** + * @class + * BitSelector + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @param {number=} selectorBitWidth - 1 by default + * @category modules + */ +import { colors } from '../themer/themer' + +export default class BitSelector extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 2, + selectorBitWidth = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['BitSelector'].push(this); + */ + this.setDimensions(20, 20) + this.selectorBitWidth = + selectorBitWidth || parseInt(prompt('Enter Selector bitWidth'), 10) + this.rectangleObject = false + this.inp1 = new Node(-20, 0, 0, this, this.bitWidth, 'Input') + this.output1 = new Node(20, 0, 1, this, 1, 'Output') + this.bitSelectorInp = new Node( + 0, + 20, + 0, + this, + this.selectorBitWidth, + 'Bit Selector' + ) + } + + /** + * @memberof BitSelector + * Function to change selector Bitwidth + * @param {size} + */ + changeSelectorBitWidth(size) { + if (size === undefined || size < 1 || size > 32) return + this.selectorBitWidth = size + this.bitSelectorInp.bitWidth = size + } + + /** + * @memberof BitSelector + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + inp1: findNode(this.inp1), + output1: findNode(this.output1), + bitSelectorInp: findNode(this.bitSelectorInp), + }, + constructorParamaters: [ + this.direction, + this.bitWidth, + this.selectorBitWidth, + ], + } + return data + } + + /** + * @memberof BitSelector + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.inp1.bitWidth = bitWidth + this.bitWidth = bitWidth + } + + /** + * @memberof BitSelector + * resolve output values based on inputData + */ + resolve() { + this.output1.value = extractBits( + this.inp1.value, + this.bitSelectorInp.value + 1, + this.bitSelectorInp.value + 1 + ) // (this.inp1.value^(1<> ${this.bitSelectorInp.verilogLabel};` + } +} + +/** + * @memberof BitSelector + * Help Tip + * @type {string} + * @category modules + */ +BitSelector.prototype.tooltipText = + 'BitSelector ToolTip : Divides input bits into several equal-sized groups.' +BitSelector.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/5muxandplex?id=bitselector' + +/** + * @memberof BitSelector + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +BitSelector.prototype.mutableProperties = { + selectorBitWidth: { + name: 'Selector Bit Width: ', + type: 'number', + max: '32', + min: '1', + func: 'changeSelectorBitWidth', + }, +} +BitSelector.prototype.objectType = 'BitSelector' diff --git a/v0/src/simulator/src/modules/Buffer.js b/v0/src/simulator/src/modules/Buffer.js new file mode 100644 index 00000000..f3e9cd69 --- /dev/null +++ b/v0/src/simulator/src/modules/Buffer.js @@ -0,0 +1,134 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, arc } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * Buffer + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Buffer extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Buffer'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 15) + this.state = 0 + this.preState = 0 + this.inp1 = new Node(-10, 0, 0, this) + this.reset = new Node(0, 0, 0, this, 1, 'reset') + this.output1 = new Node(20, 0, 1, this) + } + + /** + * @memberof Buffer + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + output1: findNode(this.output1), + inp1: findNode(this.inp1), + reset: findNode(this.reset), + }, + } + return data + } + + /** + * @memberof Buffer + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.inp1.bitWidth = bitWidth + this.output1.bitWidth = bitWidth + this.bitWidth = bitWidth + } + + /** + * @memberof Buffer + * Checks if the element is resolvable + * @return {boolean} + */ + isResolvable() { + return true + } + + /** + * @memberof Buffer + * resolve output values based on inputData + */ + resolve() { + if (this.reset.value === 1) { + this.state = this.preState + } + if (this.inp1.value !== undefined) { + this.state = this.inp1.value + } + + this.output1.value = this.state + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof Buffer + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke_alt'] + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.fillStyle = colors['fill'] + moveTo(ctx, -10, -15, xx, yy, this.direction) + lineTo(ctx, 20, 0, xx, yy, this.direction) + lineTo(ctx, -10, 15, xx, yy, this.direction) + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + } + + generateVerilog() { + return ( + 'assign ' + + this.output1.verilogLabel + + ' = ' + + this.inp1.verilogLabel + + ';' + ) + } +} + +/** + * @memberof Buffer + * Help Tip + * @type {string} + * @category modules + */ +Buffer.prototype.tooltipText = + 'Buffer ToolTip : Isolate the input from the output.' +Buffer.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/8misc?id=buffer' +Buffer.prototype.objectType = 'Buffer' diff --git a/v0/src/simulator/src/modules/Button.js b/v0/src/simulator/src/modules/Button.js new file mode 100644 index 00000000..b108afaa --- /dev/null +++ b/v0/src/simulator/src/modules/Button.js @@ -0,0 +1,184 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, drawCircle2 } from '../canvasApi' + +/** + * @class + * Button + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @category modules + */ +export default class Button extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT') { + super(x, y, scope, dir, 1) + /* this is done in this.baseSetup() now + this.scope['Button'].push(this); + */ + this.state = 0 + this.output1 = new Node(30, 0, 1, this) + this.wasClicked = false + this.rectangleObject = false + this.setDimensions(10, 10) + } + + /** + * @memberof Button + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + output1: findNode(this.output1), + }, + values: { + state: this.state, + }, + constructorParamaters: [this.direction, this.bitWidth], + } + return data + } + + /** + * @memberof Button + * resolve output values based on inputData + */ + resolve() { + if (this.wasClicked) { + this.state = 1 + this.output1.value = this.state + } else { + this.state = 0 + this.output1.value = this.state + } + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof Button + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + const xx = this.x + const yy = this.y + ctx.fillStyle = '#ddd' + + ctx.strokeStyle = '#353535' + ctx.lineWidth = correctWidth(5) + + ctx.beginPath() + + moveTo(ctx, 10, 0, xx, yy, this.direction) + lineTo(ctx, 30, 0, xx, yy, this.direction) + ctx.stroke() + + ctx.beginPath() + + drawCircle2(ctx, 0, 0, 12, xx, yy, this.direction) + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = 'rgba(232, 13, 13,0.6)' + } + + if (this.wasClicked) { + ctx.fillStyle = 'rgba(232, 13, 13,0.8)' + } + ctx.fill() + } + + subcircuitDraw(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + var xx = this.subcircuitMetadata.x + xOffset + var yy = this.subcircuitMetadata.y + yOffset + ctx.fillStyle = '#ddd' + + ctx.strokeStyle = '#353535' + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + drawCircle2(ctx, 0, 0, 6, xx, yy, this.direction) + ctx.stroke() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected == this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = 'rgba(232, 13, 13,0.6)' + if (this.wasClicked) ctx.fillStyle = 'rgba(232, 13, 13,0.8)' + ctx.fill() + } + static verilogInstructions() { + return `Button - Buttons are not natively supported in verilog, consider using Inputs instead\n` + } + verilogBaseType() { + return this.verilogName() + (Button.selSizes.length - 1) + } + + //this code to generate Verilog + generateVerilog() { + Button.selSizes.push(this.data) + return CircuitElement.prototype.generateVerilog.call(this) + } + + static moduleVerilog() { + var output = '' + + for (var i = 0; i < Button.selSizes.length; i++) { + output += `// Skeleton for Button${i} + /* + module Button${i}(out); + output reg out; + + initial begin + //do something with the button here + end + endmodule + */ + ` + } + + return output + } + + //reset the sized before Verilog generation + static resetVerilog() { + Button.selSizes = [] + } +} + +/** + * @memberof Button + * Help Tip + * @type {string} + * @category modules + */ +Button.prototype.tooltipText = + 'Button ToolTip: High(1) when pressed and Low(0) when released.' + +/** + * @memberof Button + * Help URL + * @type {string} + * @category modules + */ +Button.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/2input?id=button' + +/** + * @memberof Button + * @type {number} + * @category modules + */ +Button.prototype.propagationDelay = 0 +Button.prototype.objectType = 'Button' +Button.prototype.canShowInSubcircuit = true diff --git a/v0/src/simulator/src/modules/ConstantVal.js b/v0/src/simulator/src/modules/ConstantVal.js new file mode 100644 index 00000000..d5f9028a --- /dev/null +++ b/v0/src/simulator/src/modules/ConstantVal.js @@ -0,0 +1,209 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect2, fillText, oppositeDirection } from '../canvasApi' +import { colors } from '../themer/themer' + +function bin2dec(binString) { + return parseInt(binString, 2) +} + +function dec2bin(dec, bitWidth = undefined) { + // only for positive nos + var bin = dec.toString(2) + if (bitWidth == undefined) return bin + return '0'.repeat(bitWidth - bin.length) + bin +} + +/** + * @class + * ConstantVal + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @param {string=} state - The state of element + * @category modules + */ +export default class ConstantVal extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 1, + state = '0' + ) { + // state = state || prompt('Enter value'); + super(x, y, scope, dir, state.length) + /* this is done in this.baseSetup() now + this.scope['ConstantVal'].push(this); + */ + this.state = state + this.setDimensions(10 * this.state.length, 10) + this.bitWidth = bitWidth || this.state.length + this.directionFixed = true + this.orientationFixed = false + this.rectangleObject = false + + this.output1 = new Node(this.bitWidth * 10, 0, 1, this) + this.wasClicked = false + this.label = '' + } + + generateVerilog() { + return `localparam [${this.bitWidth - 1}:0] ${this.verilogLabel}=${ + this.bitWidth + }b'${this.state};` + } + + /** + * @memberof ConstantVal + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + output1: findNode(this.output1), + }, + constructorParamaters: [this.direction, this.bitWidth, this.state], + } + return data + } + + /** + * @memberof ConstantVal + * resolve output values based on inputData + */ + resolve() { + this.output1.value = bin2dec(this.state) + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof ConstantVal + * updates state using a prompt when dbl clicked + */ + dblclick() { + this.state = prompt('Re enter the value') || '0' + this.newBitWidth(this.state.toString().length) + } + + /** + * @memberof ConstantVal + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + if (bitWidth > this.state.length) + this.state = '0'.repeat(bitWidth - this.state.length) + this.state + else if (bitWidth < this.state.length) + this.state = this.state.slice(this.bitWidth - bitWidth) + this.bitWidth = bitWidth // ||parseInt(prompt("Enter bitWidth"),10); + this.output1.bitWidth = bitWidth + this.setDimensions(10 * this.bitWidth, 10) + if (this.direction === 'RIGHT') { + this.output1.x = 10 * this.bitWidth + this.output1.leftx = 10 * this.bitWidth + } else if (this.direction === 'LEFT') { + this.output1.x = -10 * this.bitWidth + this.output1.leftx = 10 * this.bitWidth + } + } + + /** + * @memberof ConstantVal + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(1) + const xx = this.x + const yy = this.y + + rect2( + ctx, + -10 * this.bitWidth, + -10, + 20 * this.bitWidth, + 20, + xx, + yy, + 'RIGHT' + ) + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + const bin = this.state // dec2bin(this.state,this.bitWidth); + for (let k = 0; k < this.bitWidth; k++) { + fillText(ctx, bin[k], xx - 10 * this.bitWidth + 10 + k * 20, yy + 5) + } + ctx.fill() + } + + /** + * @memberof ConstantVal + * function to change direction of ConstantVal + * @param {string} dir - new direction + */ + newDirection(dir) { + if (dir === this.direction) return + this.direction = dir + this.output1.refresh() + if (dir === 'RIGHT' || dir === 'LEFT') { + this.output1.leftx = 10 * this.bitWidth + this.output1.lefty = 0 + } else { + this.output1.leftx = 10 // 10*this.bitWidth; + this.output1.lefty = 0 + } + + this.output1.refresh() + this.labelDirection = oppositeDirection[this.direction] + } + + generateVerilog() { + return `assign ${this.output1.verilogLabel} = ${this.bitWidth}'b${this.state};` + } +} + +/** + * @memberof ConstantVal + * Help Tip + * @type {string} + * @category modules + */ +ConstantVal.prototype.tooltipText = + 'Constant ToolTip: Bits are fixed. Double click element to change the bits.' + +/** + * @memberof ConstantVal + * Help URL + * @type {string} + * @category modules + */ +ConstantVal.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/2input?id=constantval' + +/** + * @memberof ConstantVal + * @type {number} + * @category modules + */ +ConstantVal.prototype.propagationDelay = 0 +ConstantVal.prototype.objectType = 'ConstantVal' diff --git a/v0/src/simulator/src/modules/ControlledInverter.js b/v0/src/simulator/src/modules/ControlledInverter.js new file mode 100644 index 00000000..c846abec --- /dev/null +++ b/v0/src/simulator/src/modules/ControlledInverter.js @@ -0,0 +1,122 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, drawCircle2 } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * ControlledInverter + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class ControlledInverter extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['ControlledInverter'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 15) + + this.inp1 = new Node(-10, 0, 0, this) + this.output1 = new Node(30, 0, 1, this) + this.state = new Node(0, 0, 0, this, 1, 'Enable') + } + + /** + * @memberof ControlledInverter + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + output1: findNode(this.output1), + inp1: findNode(this.inp1), + state: findNode(this.state), + }, + } + return data + } + + /** + * @memberof ControlledInverter + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.inp1.bitWidth = bitWidth + this.output1.bitWidth = bitWidth + this.bitWidth = bitWidth + } + + /** + * @memberof ControlledInverter + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + if (this.state.value === 1) { + this.output1.value = + ((~this.inp1.value >>> 0) << (32 - this.bitWidth)) >>> + (32 - this.bitWidth) + simulationArea.simulationQueue.add(this.output1) + } + if (this.state.value === 0) { + this.output1.value = undefined + } + } + + /** + * @memberof ControlledInverter + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.fillStyle = colors['fill'] + moveTo(ctx, -10, -15, xx, yy, this.direction) + lineTo(ctx, 20, 0, xx, yy, this.direction) + lineTo(ctx, -10, 15, xx, yy, this.direction) + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + ctx.beginPath() + drawCircle2(ctx, 25, 0, 5, xx, yy, this.direction) + ctx.stroke() + } + + generateVerilog() { + return `assign ${this.output1.verilogLabel} = (${this.state.verilogLabel}!=0) ? ~${this.inp1.verilogLabel} : ${this.inp1.verilogLabel};` + } +} + +/** + * @memberof ControlledInverter + * Help Tip + * @type {string} + * @category modules + */ +ControlledInverter.prototype.tooltipText = + 'Controlled Inverter ToolTip : Controlled buffer and NOT gate.' +ControlledInverter.prototype.objectType = 'ControlledInverter' diff --git a/v0/src/simulator/src/modules/Counter.js b/v0/src/simulator/src/modules/Counter.js new file mode 100644 index 00000000..7ffb23fc --- /dev/null +++ b/v0/src/simulator/src/modules/Counter.js @@ -0,0 +1,194 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { lineTo, moveTo, fillText, correctWidth, rect2 } from '../canvasApi' +import { colors } from '../themer/themer' + +/** + * @class + * Counter component. + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {number=} rows - number of rows + * @param {number=} cols - number of columns. + * Counts from zero to a particular maximum value, which is either + * specified by an input pin or determined by the Counter's bitWidth. + * The counter outputs its current value and a flag that indicates + * when the output value is zero and the clock is 1. + * The counter can be reset to zero at any point using the RESET pin. + * @category modules + */ +export default class Counter extends CircuitElement { + constructor(x, y, scope = globalScope, bitWidth = 8) { + super(x, y, scope, 'RIGHT', bitWidth) + /* this is done in this.baseSetup() now + this.scope['Counter'].push(this); + */ + this.directionFixed = true + this.rectangleObject = true + + this.setDimensions(20, 20) + + this.maxValue = new Node(-20, -10, 0, this, this.bitWidth, 'MaxValue') + this.clock = new Node(-20, +10, 0, this, 1, 'Clock') + this.reset = new Node(0, 20, 0, this, 1, 'Reset') + this.output = new Node(20, -10, 1, this, this.bitWidth, 'Value') + this.zero = new Node(20, 10, 1, this, 1, 'Zero') + + this.value = 0 + this.prevClockState = undefined + } + + customSave() { + return { + nodes: { + maxValue: findNode(this.maxValue), + clock: findNode(this.clock), + reset: findNode(this.reset), + output: findNode(this.output), + zero: findNode(this.zero), + }, + constructorParamaters: [this.bitWidth], + } + } + + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.maxValue.bitWidth = bitWidth + this.output.bitWidth = bitWidth + } + + isResolvable() { + return true + } + + resolve() { + // Max value is either the value in the input pin or the max allowed by the bitWidth. + var maxValue = + this.maxValue.value != undefined + ? this.maxValue.value + : (1 << this.bitWidth) - 1 + var outputValue = this.value + + // Increase value when clock is raised + if (this.clock.value != this.prevClockState && this.clock.value == 1) { + outputValue++ + } + this.prevClockState = this.clock.value + + // Limit to the effective maximum value; this also accounts for bitWidth changes. + outputValue = outputValue % (maxValue + 1) + + // Reset to zero if RESET pin is on + if (this.reset.value == 1) { + outputValue = 0 + } + + // Output the new value + this.value = outputValue + if (this.output.value != outputValue) { + this.output.value = outputValue + simulationArea.simulationQueue.add(this.output) + } + + // Output the zero signal + var zeroValue = this.clock.value == 1 && outputValue == 0 ? 1 : 0 + if (this.zero.value != zeroValue) { + this.zero.value = zeroValue + simulationArea.simulationQueue.add(this.zero) + } + } + + customDraw() { + var ctx = simulationArea.context + var xx = this.x + var yy = this.y + + ctx.beginPath() + ctx.font = '20px Raleway' + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + fillText(ctx, this.value.toString(16), this.x, this.y + 5) + ctx.fill() + + ctx.strokeStyle = colors['stroke'] + ctx.beginPath() + moveTo(ctx, -20, 5, xx, yy, this.direction) + lineTo(ctx, -15, 10, xx, yy, this.direction) + lineTo(ctx, -20, 15, xx, yy, this.direction) + ctx.stroke() + } + + // Draws the element in the subcuircuit. Used in layout mode + subcircuitDraw(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + var xx = this.subcircuitMetadata.x + xOffset + var yy = this.subcircuitMetadata.y + yOffset + + ctx.beginPath() + ctx.font = '20px Raleway' + ctx.fillStyle = 'green' + ctx.textAlign = 'center' + fillText(ctx, this.value.toString(16), xx + 10, yy + 17) + ctx.fill() + + ctx.beginPath() + ctx.lineWidth = correctWidth(1) + rect2(ctx, 0, 0, 20, 20, xx, yy, this.direction) + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected == this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = 'rgba(255, 255, 32,0.6)' + ctx.fill() + } + } + static moduleVerilog() { + return ` + module Counter(val, zero, max, clk, rst); + parameter WIDTH = 1; + output reg [WIDTH-1:0] val; + output reg zero; + input [WIDTH-1:0] max; + input clk, rst; + + initial + val = 0; + + always @ (val) + if (val == 0) + zero = 1; + else + zero = 0; + + always @ (posedge clk or posedge rst) begin + if (rst) + val <= 0; + else + if (val == max) + val <= 0; + else + val <= val + 1; + end + endmodule` + } +} + +Counter.prototype.tooltipText = + 'Counter: a binary counter from zero to a given maximum value' +Counter.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/2input?id=counter' +Counter.prototype.objectType = 'Counter' +Counter.prototype.objectType = 'Counter' +Counter.prototype.canShowInSubcircuit = true +Counter.prototype.layoutProperties = { + rightDimensionX: 20, + leftDimensionX: 0, + upDimensionY: 0, + downDimensionY: 20, +} diff --git a/v0/src/simulator/src/modules/Decoder.js b/v0/src/simulator/src/modules/Decoder.js new file mode 100644 index 00000000..6b6d9278 --- /dev/null +++ b/v0/src/simulator/src/modules/Decoder.js @@ -0,0 +1,291 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, rect, fillText } from '../canvasApi' +/** + * @class + * Decoder + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Decoder extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'LEFT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Decoder'].push(this); + */ + // this.controlSignalSize = controlSignalSize || parseInt(prompt("Enter control signal bitWidth"), 10); + this.outputsize = 1 << this.bitWidth + this.xOff = 0 + this.yOff = 1 + if (this.bitWidth === 1) { + this.xOff = 10 + } + if (this.bitWidth <= 3) { + this.yOff = 2 + } + + // this.changeControlSignalSize = function(size) { + // if (size === undefined || size < 1 || size > 32) return; + // if (this.controlSignalSize === size) return; + // let obj = new window[this.objectType](this.x, this.y, this.scope, this.direction, this.bitWidth, size); + // this.cleanDelete(); + // simulationArea.lastSelected = obj; + // return obj; + // } + // this.mutableProperties = { + // "controlSignalSize": { + // name: "Control Signal Size", + // type: "number", + // max: "32", + // min: "1", + // func: "changeControlSignalSize", + // }, + // } + // eslint-disable-next-line no-shadow + this.newBitWidth = function (bitWidth) { + // this.bitWidth = bitWidth; + // for (let i = 0; i < this.inputSize; i++) { + // this.outputs1[i].bitWidth = bitWidth + // } + // this.input.bitWidth = bitWidth; + if (bitWidth === undefined || bitWidth < 1 || bitWidth > 32) return + if (this.bitWidth === bitWidth) return + const obj = new Decoder( + this.x, + this.y, + this.scope, + this.direction, + bitWidth + ) + this.cleanDelete() + simulationArea.lastSelected = obj + return obj + } + + this.setDimensions(20 - this.xOff, this.yOff * 5 * this.outputsize) + this.rectangleObject = false + this.input = new Node(20 - this.xOff, 0, 0, this) + + this.output1 = [] + for (let i = 0; i < this.outputsize; i++) { + const a = new Node( + -20 + this.xOff, + +this.yOff * 10 * (i - this.outputsize / 2) + 10, + 1, + this, + 1 + ) + this.output1.push(a) + } + + // this.controlSignalInput = new Node(0,this.yOff * 10 * (this.outputsize / 2 - 1) +this.xOff + 10, 0, this, this.controlSignalSize,"Control Signal"); + } + + /** + * @memberof Decoder + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + output1: this.output1.map(findNode), + input: findNode(this.input), + }, + } + return data + } + + /** + * @memberof Decoder + * resolve output values based on inputData + */ + resolve() { + for (let i = 0; i < this.output1.length; i++) { + this.output1[i].value = 0 + } + if (this.input.value !== undefined) + this.output1[this.input.value].value = 1 // if input is undefined, don't change output + for (let i = 0; i < this.output1.length; i++) { + simulationArea.simulationQueue.add(this.output1[i]) + } + } + + /** + * @memberof Decoder + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + + const xx = this.x + const yy = this.y + + // ctx.beginPath(); + // moveTo(ctx, 0,this.yOff * 10 * (this.outputsize / 2 - 1) + 10 + 0.5 *this.xOff, xx, yy, this.direction); + // lineTo(ctx, 0,this.yOff * 5 * (this.outputsize - 1) +this.xOff, xx, yy, this.direction); + // ctx.stroke(); + + ctx.beginPath() + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(4) + ctx.fillStyle = colors['fill'] + moveTo( + ctx, + -20 + this.xOff, + -this.yOff * 10 * (this.outputsize / 2), + xx, + yy, + this.direction + ) + lineTo( + ctx, + -20 + this.xOff, + 20 + this.yOff * 10 * (this.outputsize / 2 - 1), + xx, + yy, + this.direction + ) + lineTo( + ctx, + 20 - this.xOff, + +this.yOff * 10 * (this.outputsize / 2 - 1) + this.xOff, + xx, + yy, + this.direction + ) + lineTo( + ctx, + 20 - this.xOff, + -this.yOff * 10 * (this.outputsize / 2) - this.xOff + 20, + xx, + yy, + this.direction + ) + + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = colors['hover_select'] + } + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.fillStyle = 'black' + ctx.textAlign = 'center' + // [xFill,yFill] = rotate(xx + this.output1[i].x - 7, yy + this.output1[i].y + 2); + for (let i = 0; i < this.outputsize; i++) { + if (this.direction === 'LEFT') + fillText( + ctx, + String(i), + xx + this.output1[i].x - 7, + yy + this.output1[i].y + 2, + 10 + ) + else if (this.direction === 'RIGHT') + fillText( + ctx, + String(i), + xx + this.output1[i].x + 7, + yy + this.output1[i].y + 2, + 10 + ) + else if (this.direction === 'UP') + fillText( + ctx, + String(i), + xx + this.output1[i].x, + yy + this.output1[i].y - 5, + 10 + ) + else + fillText( + ctx, + String(i), + xx + this.output1[i].x, + yy + this.output1[i].y + 10, + 10 + ) + } + ctx.fill() + } + + verilogBaseType() { + return this.verilogName() + this.output1.length + } + + //this code to generate Verilog + generateVerilog() { + Decoder.selSizes.add(this.bitWidth) + return CircuitElement.prototype.generateVerilog.call(this) + } + + static moduleVerilog() { + var output = '' + + for (var size of Decoder.selSizes) { + var numOutput = 1 << size + output += '\n' + output += 'module Decoder' + numOutput + output += '(' + for (var j = 0; j < numOutput; j++) { + output += 'out' + j + ', ' + } + output += 'sel);\n' + + output += ' output reg ' + for (var j = 0; j < numOutput - 1; j++) { + output += 'out' + j + ', ' + } + output += 'out' + (numOutput - 1) + ';\n' + + output += ' input [' + (size - 1) + ':0] sel;\n' + output += ' \n' + + output += ' always @ (*) begin\n' + for (var j = 0; j < numOutput; j++) { + output += ' out' + j + ' = 0;\n' + } + output += ' case (sel)\n' + for (var j = 0; j < numOutput; j++) { + output += ' ' + j + ' : out' + j + ' = 1;\n' + } + output += ' endcase\n' + output += ' end\n' + output += 'endmodule\n' + } + + return output + } + + //reset the sized before Verilog generation + static resetVerilog() { + Decoder.selSizes = new Set() + } +} + +/** + * @memberof Decoder + * Help Tip + * @type {string} + * @category modules + */ +Decoder.prototype.tooltipText = + 'Decoder ToolTip : Converts coded inputs into coded outputs.' +Decoder.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/5muxandplex?id=decoder' +Decoder.prototype.objectType = 'Decoder' diff --git a/v0/src/simulator/src/modules/Demultiplexer.js b/v0/src/simulator/src/modules/Demultiplexer.js new file mode 100644 index 00000000..feb21cfa --- /dev/null +++ b/v0/src/simulator/src/modules/Demultiplexer.js @@ -0,0 +1,324 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText } from '../canvasApi' +/** + * @class + * Demultiplexer + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @param {number=} controlSignalSize - 1 by default + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Demultiplexer extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'LEFT', + bitWidth = 1, + controlSignalSize = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Demultiplexer'].push(this); + */ + this.controlSignalSize = + controlSignalSize || + parseInt(prompt('Enter control signal bitWidth'), 10) + this.outputsize = 1 << this.controlSignalSize + this.xOff = 0 + this.yOff = 1 + if (this.controlSignalSize === 1) { + this.xOff = 10 + } + if (this.controlSignalSize <= 3) { + this.yOff = 2 + } + + this.changeControlSignalSize = function (size) { + if (size === undefined || size < 1 || size > 32) return + if (this.controlSignalSize === size) return + const obj = new Demultiplexer( + this.x, + this.y, + this.scope, + this.direction, + this.bitWidth, + size + ) + this.cleanDelete() + simulationArea.lastSelected = obj + return obj + } + this.mutableProperties = { + controlSignalSize: { + name: 'Control Signal Size', + type: 'number', + max: '10', + min: '1', + func: 'changeControlSignalSize', + }, + } + // eslint-disable-next-line no-shadow + this.newBitWidth = function (bitWidth) { + this.bitWidth = bitWidth + for (let i = 0; i < this.outputsize; i++) { + this.output1[i].bitWidth = bitWidth + } + this.input.bitWidth = bitWidth + } + + this.setDimensions(20 - this.xOff, this.yOff * 5 * this.outputsize) + this.rectangleObject = false + this.input = new Node(20 - this.xOff, 0, 0, this) + + this.output1 = [] + for (let i = 0; i < this.outputsize; i++) { + const a = new Node( + -20 + this.xOff, + +this.yOff * 10 * (i - this.outputsize / 2) + 10, + 1, + this + ) + this.output1.push(a) + } + + this.controlSignalInput = new Node( + 0, + this.yOff * 10 * (this.outputsize / 2 - 1) + this.xOff + 10, + 0, + this, + this.controlSignalSize, + 'Control Signal' + ) + } + + /** + * @memberof Demultiplexer + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.bitWidth, + this.controlSignalSize, + ], + nodes: { + output1: this.output1.map(findNode), + input: findNode(this.input), + controlSignalInput: findNode(this.controlSignalInput), + }, + } + return data + } + + /** + * @memberof Demultiplexer + * resolve output values based on inputData + */ + resolve() { + for (let i = 0; i < this.output1.length; i++) { + this.output1[i].value = 0 + } + + this.output1[this.controlSignalInput.value].value = this.input.value + + for (let i = 0; i < this.output1.length; i++) { + simulationArea.simulationQueue.add(this.output1[i]) + } + } + + /** + * @memberof Demultiplexer + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + + const xx = this.x + const yy = this.y + + ctx.beginPath() + moveTo( + ctx, + 0, + this.yOff * 10 * (this.outputsize / 2 - 1) + 10 + 0.5 * this.xOff, + xx, + yy, + this.direction + ) + lineTo( + ctx, + 0, + this.yOff * 5 * (this.outputsize - 1) + this.xOff, + xx, + yy, + this.direction + ) + ctx.stroke() + + ctx.beginPath() + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(4) + ctx.fillStyle = colors['fill'] + moveTo( + ctx, + -20 + this.xOff, + -this.yOff * 10 * (this.outputsize / 2), + xx, + yy, + this.direction + ) + lineTo( + ctx, + -20 + this.xOff, + 20 + this.yOff * 10 * (this.outputsize / 2 - 1), + xx, + yy, + this.direction + ) + lineTo( + ctx, + 20 - this.xOff, + +this.yOff * 10 * (this.outputsize / 2 - 1) + this.xOff, + xx, + yy, + this.direction + ) + lineTo( + ctx, + 20 - this.xOff, + -this.yOff * 10 * (this.outputsize / 2) - this.xOff + 20, + xx, + yy, + this.direction + ) + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = colors['hover_select'] + } + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.fillStyle = 'black' + ctx.textAlign = 'center' + // [xFill,yFill] = rotate(xx + this.output1[i].x - 7, yy + this.output1[i].y + 2); + for (let i = 0; i < this.outputsize; i++) { + if (this.direction === 'LEFT') + fillText( + ctx, + String(i), + xx + this.output1[i].x - 7, + yy + this.output1[i].y + 2, + 10 + ) + else if (this.direction === 'RIGHT') + fillText( + ctx, + String(i), + xx + this.output1[i].x + 7, + yy + this.output1[i].y + 2, + 10 + ) + else if (this.direction === 'UP') + fillText( + ctx, + String(i), + xx + this.output1[i].x, + yy + this.output1[i].y - 5, + 10 + ) + else + fillText( + ctx, + String(i), + xx + this.output1[i].x, + yy + this.output1[i].y + 10, + 10 + ) + } + ctx.fill() + } + + verilogBaseType() { + return this.verilogName() + this.output1.length + } + + //this code to generate Verilog + generateVerilog() { + Demultiplexer.selSizes.add(this.controlSignalSize) + return CircuitElement.prototype.generateVerilog.call(this) + } + + //generate the needed modules + static moduleVerilog() { + var output = '' + + for (var size of Demultiplexer.selSizes) { + var numOutput = 1 << size + output += '\n' + output += 'module Demultiplexer' + numOutput + output += '(' + for (var j = 0; j < numOutput; j++) { + output += 'out' + j + ', ' + } + output += 'in, sel);\n' + + output += ' parameter WIDTH = 1;\n' + output += ' output reg [WIDTH-1:0] ' + for (var j = 0; j < numOutput - 1; j++) { + output += 'out' + j + ', ' + } + output += 'out' + (numOutput - 1) + ';\n' + + output += ' input [WIDTH-1:0] in;\n' + output += ' input [' + (size - 1) + ':0] sel;\n' + output += ' \n' + + output += ' always @ (*) begin\n' + for (var j = 0; j < numOutput; j++) { + output += ' out' + j + ' = 0;\n' + } + output += ' case (sel)\n' + for (var j = 0; j < numOutput; j++) { + output += ' ' + j + ' : out' + j + ' = in;\n' + } + output += ' endcase\n' + output += ' end\n' + output += 'endmodule\n' + } + + return output + } + + //reset the sized before Verilog generation + static resetVerilog() { + Demultiplexer.selSizes = new Set() + } +} + +/** + * @memberof Demultiplexer + * Help Tip + * @type {string} + * @category modules + */ +Demultiplexer.prototype.tooltipText = + 'DeMultiplexer ToolTip : Multiple outputs and a single line input.' +Demultiplexer.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/5muxandplex?id=demultiplexer' +Demultiplexer.prototype.objectType = 'Demultiplexer' diff --git a/v0/src/simulator/src/modules/DigitalLed.js b/v0/src/simulator/src/modules/DigitalLed.js new file mode 100644 index 00000000..df17fbfa --- /dev/null +++ b/v0/src/simulator/src/modules/DigitalLed.js @@ -0,0 +1,188 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { + correctWidth, + lineTo, + moveTo, + arc, + colorToRGBA, + drawCircle2, + validColor, +} from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * DigitalLed + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} color - color of led + * @category modules + */ +import { colors } from '../themer/themer' + +export default class DigitalLed extends CircuitElement { + constructor(x, y, scope = globalScope, color = 'Red') { + // Calling base class constructor + + super(x, y, scope, 'UP', 1) + /* this is done in this.baseSetup() now + this.scope['DigitalLed'].push(this); + */ + this.rectangleObject = false + this.setDimensions(10, 20) + this.inp1 = new Node(-40, 0, 0, this, 1) + this.directionFixed = true + this.fixedBitWidth = true + this.color = color + const temp = colorToRGBA(this.color) + this.actualColor = `rgba(${temp[0]},${temp[1]},${temp[2]},${0.8})` + } + + /** + * @memberof DigitalLed + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.color], + nodes: { + inp1: findNode(this.inp1), + }, + } + return data + } + + /** + * @memberof DigitalLed + * function to change color of the led + */ + changeColor(value) { + if (validColor(value)) { + this.color = value + const temp = colorToRGBA(this.color) + this.actualColor = `rgba(${temp[0]},${temp[1]},${temp[2]},${0.8})` + } + } + + /** + * @memberof DigitalLed + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + + const xx = this.x + const yy = this.y + + ctx.strokeStyle = '#e3e4e5' + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + moveTo(ctx, -20, 0, xx, yy, this.direction) + lineTo(ctx, -40, 0, xx, yy, this.direction) + ctx.stroke() + + ctx.strokeStyle = '#d3d4d5' + ctx.fillStyle = ['rgba(227,228,229,0.8)', this.actualColor][ + this.inp1.value || 0 + ] + ctx.lineWidth = correctWidth(1) + + ctx.beginPath() + + moveTo(ctx, -15, -9, xx, yy, this.direction) + lineTo(ctx, 0, -9, xx, yy, this.direction) + arc(ctx, 0, 0, 9, -Math.PI / 2, Math.PI / 2, xx, yy, this.direction) + lineTo(ctx, -15, 9, xx, yy, this.direction) + lineTo(ctx, -18, 12, xx, yy, this.direction) + arc( + ctx, + 0, + 0, + Math.sqrt(468), + Math.PI / 2 + Math.acos(12 / Math.sqrt(468)), + -Math.PI / 2 - Math.asin(18 / Math.sqrt(468)), + xx, + yy, + this.direction + ) + lineTo(ctx, -15, -9, xx, yy, this.direction) + ctx.stroke() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + } + + // Draws the element in the subcircuit. Used in layout mode + subcircuitDraw(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + + var xx = this.subcircuitMetadata.x + xOffset + var yy = this.subcircuitMetadata.y + yOffset + + ctx.strokeStyle = '#090a0a' + ctx.fillStyle = ['rgba(227,228,229,0.8)', this.actualColor][ + this.inp1.value || 0 + ] + ctx.lineWidth = correctWidth(1) + + ctx.beginPath() + drawCircle2(ctx, 0, 0, 6, xx, yy, this.direction) + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected == this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = 'rgba(255, 255, 32,0.8)' + ctx.fill() + } + generateVerilog() { + var label = this.label ? this.verilogLabel : this.inp1.verilogLabel + return ` + always @ (*) + $display("DigitalLed:${label}=%d", ${this.inp1.verilogLabel});` + } +} + +/** + * @memberof DigitalLed + * Help Tip + * @type {string} + * @category modules + */ +DigitalLed.prototype.tooltipText = + 'Digital Led ToolTip: Digital LED glows high when input is High(1).' + +/** + * @memberof DigitalLed + * Help URL + * @type {string} + * @category modules + */ +DigitalLed.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/3output?id=digital-led' + +/** + * @memberof DigitalLed + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +DigitalLed.prototype.mutableProperties = { + color: { + name: 'Color: ', + type: 'text', + func: 'changeColor', + }, +} +DigitalLed.prototype.objectType = 'DigitalLed' +DigitalLed.prototype.canShowInSubcircuit = true diff --git a/v0/src/simulator/src/modules/Flag.js b/v0/src/simulator/src/modules/Flag.js new file mode 100644 index 00000000..f332622b --- /dev/null +++ b/v0/src/simulator/src/modules/Flag.js @@ -0,0 +1,234 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect2, fillText } from '../canvasApi' +import plotArea from '../plotArea' +import EventQueue from '../eventQueue' +/** + * @class + * Flag + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @param {string} identifier - id + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Flag extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 1, + identifier + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Flag'].push(this); + */ + this.setWidth(60) + this.setHeight(20) + this.rectangleObject = false + this.directionFixed = true + this.orientationFixed = false + this.identifier = identifier || `F${this.scope.Flag.length}` + this.plotValues = [] + + this.xSize = 10 + this.flagTimeUnit = 0 + + this.inp1 = new Node(40, 0, 0, this) + } + + resolve() { + this.flagTimeUnit = simulationArea.simulationQueue.time + const time = plotArea.getPlotTime(this.flagTimeUnit) + + if ( + this.plotValues.length && + this.plotValues[this.plotValues.length - 1][0] === time + ) { + this.plotValues.pop() + } + + if (this.plotValues.length === 0) { + this.plotValues.push([time, this.inp1.value]) + return + } + + if ( + this.plotValues[this.plotValues.length - 1][1] === this.inp1.value + ) { + return + } + this.plotValues.push([time, this.inp1.value]) + } + + /** + * @memberof Flag + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + inp1: findNode(this.inp1), + }, + values: { + identifier: this.identifier, + }, + } + return data + } + + /** + * @memberof Flag + * set the flag id + * @param {number} id - identifier for flag + */ + setIdentifier(id = '') { + if (id.length === 0) return + this.identifier = id + const len = this.identifier.length + if (len === 1) this.xSize = 20 + else if (len > 1 && len < 4) this.xSize = 10 + else this.xSize = 0 + } + + /** + * @memberof Flag + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(1) + const xx = this.x + const yy = this.y + + rect2( + ctx, + -50 + this.xSize, + -20, + 100 - 2 * this.xSize, + 40, + xx, + yy, + 'RIGHT' + ) + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + + ctx.font = '14px Raleway' + this.xOff = ctx.measureText(this.identifier).width + + ctx.beginPath() + rect2(ctx, -40 + this.xSize, -12, this.xOff + 10, 25, xx, yy, 'RIGHT') + ctx.fillStyle = '#eee' + ctx.strokeStyle = '#ccc' + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = 'black' + fillText( + ctx, + this.identifier, + xx - 35 + this.xOff / 2 + this.xSize, + yy + 5, + 14 + ) + ctx.fill() + + ctx.beginPath() + ctx.font = '30px Raleway' + ctx.textAlign = 'center' + ctx.fillStyle = ['blue', 'red'][+(this.inp1.value === undefined)] + if (this.inp1.value !== undefined) { + fillText( + ctx, + this.inp1.value.toString(16), + xx + 35 - this.xSize, + yy + 8, + 25 + ) + } else { + fillText(ctx, 'x', xx + 35 - this.xSize, yy + 8, 25) + } + ctx.fill() + } + + /** + * @memberof Flag + * function to change direction of Flag + * @param {string} dir - new direction + */ + newDirection(dir) { + if (dir === this.direction) return + this.direction = dir + this.inp1.refresh() + if (dir === 'RIGHT' || dir === 'LEFT') { + this.inp1.leftx = 50 - this.xSize + } else if (dir === 'UP') { + this.inp1.leftx = 20 + } else { + this.inp1.leftx = 20 + } + // if(this.direction=="LEFT" || this.direction=="RIGHT") this.inp1.leftx=50-this.xSize; + // this.inp1.refresh(); + + this.inp1.refresh() + } +} + +/** + * @memberof Flag + * Help Tip + * @type {string} + * @category modules + */ +Flag.prototype.tooltipText = + 'FLag ToolTip: Use this for debugging and plotting.' +Flag.prototype.helplink = + 'https://docs.circuitverse.org/#/timing_diagrams?id=using-flags' + +/** + * @memberof Flag + * Help URL + * @type {string} + * @category modules + */ +Flag.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/8misc?id=tunnel' + +/** + * @memberof Flag + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +Flag.prototype.mutableProperties = { + identifier: { + name: 'Debug Flag identifier', + type: 'text', + maxlength: '5', + func: 'setIdentifier', + }, +} +Flag.prototype.objectType = 'Flag' +Flag.prototype.propagationDelay = 0 diff --git a/v0/src/simulator/src/modules/Ground.js b/v0/src/simulator/src/modules/Ground.js new file mode 100644 index 00000000..f1c88932 --- /dev/null +++ b/v0/src/simulator/src/modules/Ground.js @@ -0,0 +1,129 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, arc } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * Ground + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Ground extends CircuitElement { + constructor(x, y, scope = globalScope, bitWidth = 1) { + super(x, y, scope, 'RIGHT', bitWidth) + /* this is done in this.baseSetup() now + this.scope['Ground'].push(this); + */ + this.rectangleObject = false + this.setDimensions(10, 10) + this.directionFixed = true + this.output1 = new Node(0, -10, 1, this) + } + + /** + * @memberof Ground + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + output1: findNode(this.output1), + }, + values: { + state: this.state, + }, + constructorParamaters: [this.direction, this.bitWidth], + } + return data + } + + /** + * @memberof Ground + * resolve output values based on inputData + */ + resolve() { + this.output1.value = 0 + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof Ground + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + output1: findNode(this.output1), + }, + constructorParamaters: [this.bitWidth], + } + return data + } + + /** + * @memberof Ground + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + // + ctx.beginPath() + ctx.strokeStyle = [colors['stroke'], 'brown'][ + ((this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this)) + 0 + ] + ctx.lineWidth = correctWidth(3) + + const xx = this.x + const yy = this.y + + moveTo(ctx, 0, -10, xx, yy, this.direction) + lineTo(ctx, 0, 0, xx, yy, this.direction) + moveTo(ctx, -10, 0, xx, yy, this.direction) + lineTo(ctx, 10, 0, xx, yy, this.direction) + moveTo(ctx, -6, 5, xx, yy, this.direction) + lineTo(ctx, 6, 5, xx, yy, this.direction) + moveTo(ctx, -2.5, 10, xx, yy, this.direction) + lineTo(ctx, 2.5, 10, xx, yy, this.direction) + ctx.stroke() + } + + generateVerilog() { + return `assign ${this.output1.verilogLabel} = ${this.bitWidth}'b0;` + } +} + +/** + * @memberof Ground + * Help Tip + * @type {string} + * @category modules + */ +Ground.prototype.tooltipText = 'Ground: All bits are Low(0).' + +/** + * @memberof Ground + * Help URL + * @type {string} + * @category modules + */ +Ground.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/2input?id=ground' + +/** + * @memberof Ground + * @type {number} + * @category modules + */ +Ground.prototype.propagationDelay = 0 +Ground.prototype.objectType = 'Ground' diff --git a/v0/src/simulator/src/modules/HexDisplay.js b/v0/src/simulator/src/modules/HexDisplay.js new file mode 100644 index 00000000..b96cd096 --- /dev/null +++ b/v0/src/simulator/src/modules/HexDisplay.js @@ -0,0 +1,420 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { + correctWidth, + lineTo, + moveTo, + arc, + rect2, + validColor, + colorToRGBA, +} from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * HexDisplay + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @category modules + */ +import { colors } from '../themer/themer' + +export default class HexDisplay extends CircuitElement { + constructor(x, y, scope = globalScope, color = 'Red') { + super(x, y, scope, 'RIGHT', 4) + /* this is done in this.baseSetup() now + this.scope['HexDisplay'].push(this); + */ + this.directionFixed = true + this.fixedBitWidth = true + this.setDimensions(30, 50) + this.inp = new Node(0, -50, 0, this, 4) + this.direction = 'RIGHT' + this.color = color + this.actualColor = color + } + + /** + * @memberof HexDisplay + * fn to change the color of HexDisplay + * @return {JSON} + */ + changeColor(value) { + if (validColor(value)) { + if (value.trim() === '') { + this.color = 'Red' + this.actualColor = 'rgba(255, 0, 0, 1)' + } else { + this.color = value + const temp = colorToRGBA(value) + this.actualColor = `rgba(${temp[0]},${temp[1]},${temp[2]}, ${temp[3]})` + } + } + } + + /** + * @memberof HexDisplay + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.color], + nodes: { + inp: findNode(this.inp), + }, + } + return data + } + + /** + * @memberof HexDisplay + * function to draw element + */ + customDrawSegment(x1, y1, x2, y2, color) { + if (color === undefined) color = 'lightgrey' + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = color + ctx.lineWidth = correctWidth(5) + const xx = this.x + const yy = this.y + + moveTo(ctx, x1, y1, xx, yy, this.direction) + lineTo(ctx, x2, y2, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + } + + /** + * @memberof HexDisplay + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + + const xx = this.x + const yy = this.y + + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(3) + + let a = 0, + b = 0, + c = 0, + d = 0, + e = 0, + f = 0, + g = 0 + switch (this.inp.value) { + case 0: + a = b = c = d = e = f = 1 + break + case 1: + b = c = 1 + break + case 2: + a = b = g = e = d = 1 + break + case 3: + a = b = g = c = d = 1 + break + case 4: + f = g = b = c = 1 + break + case 5: + a = f = g = c = d = 1 + break + case 6: + a = f = g = e = c = d = 1 + break + case 7: + a = b = c = 1 + break + case 8: + a = b = c = d = e = g = f = 1 + break + case 9: + a = f = g = b = c = 1 + break + case 0xa: + a = f = b = c = g = e = 1 + break + case 0xb: + f = e = g = c = d = 1 + break + case 0xc: + a = f = e = d = 1 + break + case 0xd: + b = c = g = e = d = 1 + break + case 0xe: + a = f = g = e = d = 1 + break + case 0xf: + a = f = g = e = 1 + break + default: + } + this.customDrawSegment( + 18, + -3, + 18, + -38, + ['lightgrey', this.actualColor][b] + ) + this.customDrawSegment( + 18, + 3, + 18, + 38, + ['lightgrey', this.actualColor][c] + ) + this.customDrawSegment( + -18, + -3, + -18, + -38, + ['lightgrey', this.actualColor][f] + ) + this.customDrawSegment( + -18, + 3, + -18, + 38, + ['lightgrey', this.actualColor][e] + ) + this.customDrawSegment( + -17, + -38, + 17, + -38, + ['lightgrey', this.actualColor][a] + ) + this.customDrawSegment( + -17, + 0, + 17, + 0, + ['lightgrey', this.actualColor][g] + ) + this.customDrawSegment( + -15, + 38, + 17, + 38, + ['lightgrey', this.actualColor][d] + ) + } + + subcircuitDrawSegment(x1, y1, x2, y2, color, xxSegment, yySegment) { + if (color == undefined) color = 'lightgrey' + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = color + ctx.lineWidth = correctWidth(3) + var xx = xxSegment + var yy = yySegment + + moveTo(ctx, x1, y1, xx, yy, this.direction) + lineTo(ctx, x2, y2, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + } + // Draws the element in the subcircuit. Used in layout mode + subcircuitDraw(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + + var xx = this.subcircuitMetadata.x + xOffset + var yy = this.subcircuitMetadata.y + yOffset + + ctx.strokeStyle = 'black' + ctx.lineWidth = correctWidth(3) + let a = 0, + b = 0, + c = 0, + d = 0, + e = 0, + f = 0, + g = 0 + + switch (this.inp.value) { + case 0: + a = b = c = d = e = f = 1 + break + case 1: + b = c = 1 + break + case 2: + a = b = g = e = d = 1 + break + case 3: + a = b = g = c = d = 1 + break + case 4: + f = g = b = c = 1 + break + case 5: + a = f = g = c = d = 1 + break + case 6: + a = f = g = e = c = d = 1 + break + case 7: + a = b = c = 1 + break + case 8: + a = b = c = d = e = g = f = 1 + break + case 9: + a = f = g = b = c = 1 + break + case 0xa: + a = f = b = c = g = e = 1 + break + case 0xb: + f = e = g = c = d = 1 + break + case 0xc: + a = f = e = d = 1 + break + case 0xd: + b = c = g = e = d = 1 + break + case 0xe: + a = f = g = e = d = 1 + break + case 0xf: + a = f = g = e = 1 + break + default: + } + this.subcircuitDrawSegment( + 10, + -20, + 10, + -38, + ['lightgrey', this.actualColor][b], + xx, + yy + ) + this.subcircuitDrawSegment( + 10, + -17, + 10, + 1, + ['lightgrey', this.actualColor][c], + xx, + yy + ) + this.subcircuitDrawSegment( + -10, + -20, + -10, + -38, + ['lightgrey', this.actualColor][f], + xx, + yy + ) + this.subcircuitDrawSegment( + -10, + -17, + -10, + 1, + ['lightgrey', this.actualColor][e], + xx, + yy + ) + this.subcircuitDrawSegment( + -8, + -38, + 8, + -38, + ['lightgrey', this.actualColor][a], + xx, + yy + ) + this.subcircuitDrawSegment( + -8, + -18, + 8, + -18, + ['lightgrey', this.actualColor][g], + xx, + yy + ) + this.subcircuitDrawSegment( + -8, + 1, + 8, + 1, + ['lightgrey', this.actualColor][d], + xx, + yy + ) + + ctx.beginPath() + ctx.strokeStyle = 'black' + ctx.lineWidth = correctWidth(1) + rect2(ctx, -15, -42, 33, 51, xx, yy, this.direction) + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected == this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = 'rgba(255, 255, 32,0.6)' + ctx.fill() + } + } + generateVerilog() { + return ` + always @ (*) + $display("HexDisplay:${this.verilogLabel}=%d", ${this.inp.verilogLabel});` + } +} + +/** + * @memberof HexDisplay + * Help Tip + * @type {string} + * @category modules + */ +HexDisplay.prototype.tooltipText = + 'Hex Display ToolTip: Inputs a 4 Bit Hex number and displays it.' + +/** + * @memberof HexDisplay + * Help URL + * @type {string} + * @category modules + */ +HexDisplay.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/3output?id=hexdisplay' +HexDisplay.prototype.objectType = 'HexDisplay' +HexDisplay.prototype.canShowInSubcircuit = true +HexDisplay.prototype.layoutProperties = { + rightDimensionX: 20, + leftDimensionX: 15, + upDimensionY: 42, + downDimensionY: 10, +} + +/** + * @memberof HexDisplay + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +HexDisplay.prototype.mutableProperties = { + color: { + name: 'Color: ', + type: 'text', + func: 'changeColor', + }, +} diff --git a/v0/src/simulator/src/modules/ImageAnnotation.js b/v0/src/simulator/src/modules/ImageAnnotation.js new file mode 100644 index 00000000..67ac4d8b --- /dev/null +++ b/v0/src/simulator/src/modules/ImageAnnotation.js @@ -0,0 +1,243 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect, fillText, drawImage } from '../canvasApi' +import { colors } from '../themer/themer' +import { promptFile, showMessage, getImageDimensions } from '../utils' +/** + * @class + * Image + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {number=} rows - number of rows + * @param {number=} cols - number of columns. + * @category modules + */ +export default class ImageAnnotation extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + rows = 15, + cols = 20, + imageUrl = '' + ) { + super(x, y, scope, 'RIGHT', 1) + this.directionFixed = true + this.fixedBitWidth = true + this.imageUrl = imageUrl + this.cols = cols || parseInt(prompt('Enter cols:'), 10) + this.rows = rows || parseInt(prompt('Enter rows:'), 10) + this.setSize() + this.loadImage() + } + + /** + * @memberof Image + * @param {number} size - new size of rows + */ + changeRowSize(size) { + if (size === undefined || size < 5 || size > 1000) return + if (this.rows === size) return + this.rows = parseInt(size, 10) + this.setSize() + return this + } + + /** + * @memberof Image + * @param {number} size - new size of columns + */ + changeColSize(size) { + if (size === undefined || size < 5 || size > 1000) return + if (this.cols === size) return + this.cols = parseInt(size, 10) + this.setSize() + return this + } + + /** + * @memberof Image + * listener function to change direction of Image + * @param {string} dir - new direction + */ + keyDown3(dir) { + if (dir === 'ArrowRight') { + this.changeColSize(this.cols + 2) + } + if (dir === 'ArrowLeft') { + this.changeColSize(this.cols - 2) + } + if (dir === 'ArrowDown') { + this.changeRowSize(this.rows + 2) + } + if (dir === 'ArrowUp') { + this.changeRowSize(this.rows - 2) + } + } + + /** + * @memberof Image + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.rows, this.cols, this.imageUrl], + } + return data + } + + /** + * @memberof Image + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + const xx = this.x + const yy = this.y + var w = this.elementWidth + var h = this.elementHeight + if (this.image && this.image.complete) { + drawImage(ctx, this.image, xx - w / 2, yy - h / 2, w, h) + } else { + ctx.beginPath() + ctx.strokeStyle = 'rgba(0,0,0,1)' + ctx.setLineDash([5 * globalScope.scale, 5 * globalScope.scale]) + ctx.lineWidth = correctWidth(1.5) + + rect(ctx, xx - w / 2, yy - h / 2, w, h) + ctx.stroke() + + if ( + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = 'rgba(255, 255, 32,0.1)' + ctx.fill() + } + + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = colors['text'] + fillText(ctx, 'Double Click to Insert Image', xx, yy, 10) + ctx.fill() + + ctx.setLineDash([]) + } + } + + /** + * Procedure if image is double clicked + **/ + dblclick() { + if (embed) return + this.uploadImage() + } + + async uploadImage() { + var file = await promptFile('image/*', false) + var apiUrl = 'https://api.imgur.com/3/image' + var apiKey = '9a33b3b370f1054' + var settings = { + crossDomain: true, + processData: false, + contentType: false, + type: 'POST', + url: apiUrl, + headers: { + Authorization: 'Client-ID ' + apiKey, + Accept: 'application/json', + }, + mimeType: 'multipart/form-data', + } + var formData = new FormData() + formData.append('image', file) + settings.data = formData + + // Response contains stringified JSON + // Image URL available at response.data.link + showMessage('Uploading Image') + var response = await $.ajax(settings) + showMessage('Image Uploaded') + this.imageUrl = JSON.parse(response).data.link + this.loadImage() + } + + async loadImage() { + if (!this.imageUrl) return + this.image = new Image() + this.image.crossOrigin = 'anonymous' + this.image.src = this.imageUrl + } + /** + * @memberof Image + * function to reset or (internally) set size + */ + setSize() { + this.elementWidth = this.cols * 10 + this.elementHeight = this.rows * 10 + this.upDimensionY = this.elementHeight / 2 + this.downDimensionY = this.elementHeight / 2 + this.leftDimensionX = this.elementWidth / 2 + this.rightDimensionX = this.elementWidth / 2 + } +} + +/** + * @memberof Image + * Help Tip + * @type {string} + * @category modules + */ +ImageAnnotation.prototype.tooltipText = + 'Image ToolTip: Embed an image in the circuit for annotation' +ImageAnnotation.prototype.propagationDelayFixed = true + +/** + * @memberof Image + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +ImageAnnotation.prototype.mutableProperties = { + cols: { + name: 'Columns', + type: 'number', + max: '1000', + min: '5', + func: 'changeColSize', + }, + rows: { + name: 'Rows', + type: 'number', + max: '1000', + min: '5', + func: 'changeRowSize', + }, +} +ImageAnnotation.prototype.objectType = 'ImageAnnotation' +ImageAnnotation.prototype.rectangleObject = false +ImageAnnotation.prototype.mutableProperties = { + imageUrl: { + name: 'Upload Image', + type: 'button', + func: 'uploadImage', + }, + cols: { + name: 'Columns', + type: 'number', + max: '1000', + min: '5', + func: 'changeColSize', + }, + rows: { + name: 'Rows', + type: 'number', + max: '1000', + min: '5', + func: 'changeRowSize', + }, +} diff --git a/v0/src/simulator/src/modules/Input.js b/v0/src/simulator/src/modules/Input.js new file mode 100644 index 00000000..d33c8627 --- /dev/null +++ b/v0/src/simulator/src/modules/Input.js @@ -0,0 +1,210 @@ +/* eslint-disable no-unused-expressions */ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, oppositeDirection, fillText } from '../canvasApi' +import { getNextPosition } from '../modules' +import { generateId } from '../utils' +/** + * @class + * Input + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @param {Object=} layoutProperties - x,y and id + * @category modules + */ +import { colors } from '../themer/themer' + +function bin2dec(binString) { + return parseInt(binString, 2) +} + +function dec2bin(dec, bitWidth = undefined) { + // only for positive nos + var bin = dec.toString(2) + if (bitWidth == undefined) return bin + return '0'.repeat(bitWidth - bin.length) + bin +} + +export default class Input extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 1, + layoutProperties + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Input'].push(this); + */ + if (layoutProperties) { + this.layoutProperties = layoutProperties + } else { + this.layoutProperties = {} + this.layoutProperties.x = 0 + this.layoutProperties.y = getNextPosition(0, scope) + this.layoutProperties.id = generateId() + } + + // Call base class constructor + this.state = 0 + this.orientationFixed = false + this.state = bin2dec(this.state) // in integer format + this.output1 = new Node(this.bitWidth * 10, 0, 1, this) + this.wasClicked = false + this.directionFixed = true + this.setWidth(this.bitWidth * 10) + this.rectangleObject = true // Trying to make use of base class draw + } + + /** + * @memberof Input + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + output1: findNode(this.output1), + }, + values: { + state: this.state, + }, + constructorParamaters: [ + this.direction, + this.bitWidth, + this.layoutProperties, + ], + } + return data + } + + /** + * @memberof Input + * resolve output values based on inputData + */ + resolve() { + this.output1.value = this.state + simulationArea.simulationQueue.add(this.output1) + } + + // Check if override is necessary!! + + /** + * @memberof Input + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + if (bitWidth < 1) return + const diffBitWidth = bitWidth - this.bitWidth + this.bitWidth = bitWidth // ||parseInt(prompt("Enter bitWidth"),10); + this.setWidth(this.bitWidth * 10) + this.state = 0 + this.output1.bitWidth = bitWidth + if (this.direction === 'RIGHT') { + this.x -= 10 * diffBitWidth + this.output1.x = 10 * this.bitWidth + this.output1.leftx = 10 * this.bitWidth + } else if (this.direction === 'LEFT') { + this.x += 10 * diffBitWidth + this.output1.x = -10 * this.bitWidth + this.output1.leftx = 10 * this.bitWidth + } + } + + /** + * @memberof Input + * listener function to set selected index + */ + click() { + // toggle + let pos = this.findPos() + if (pos === 0) pos = 1 // minor correction + if (pos < 1 || pos > this.bitWidth) return + this.state = ((this.state >>> 0) ^ (1 << (this.bitWidth - pos))) >>> 0 + } + + /** + * @memberof Input + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + const bin = dec2bin(this.state, this.bitWidth) + for (let k = 0; k < this.bitWidth; k++) { + fillText(ctx, bin[k], xx - 10 * this.bitWidth + 10 + k * 20, yy + 5) + } + ctx.fill() + } + + /** + * @memberof Input + * function to change direction of input + * @param {string} dir - new direction + */ + newDirection(dir) { + if (dir === this.direction) return + this.direction = dir + this.output1.refresh() + if (dir === 'RIGHT' || dir === 'LEFT') { + this.output1.leftx = 10 * this.bitWidth + this.output1.lefty = 0 + } else { + this.output1.leftx = 10 // 10*this.bitWidth; + this.output1.lefty = 0 + } + + this.output1.refresh() + this.labelDirection = oppositeDirection[this.direction] + } + + /** + * @memberof Input + * function to find position of mouse click + */ + findPos() { + return Math.round( + (simulationArea.mouseX - this.x + 10 * this.bitWidth) / 20.0 + ) + } +} + +/** + * @memberof Input + * Help Tip + * @type {string} + * @category modules + */ +Input.prototype.tooltipText = + 'Input ToolTip: Toggle the individual bits by clicking on them.' + +/** + * @memberof Input + * Help URL + * @type {string} + * @category modules + */ +Input.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/2input?id=input' + +/** + * @memberof Input + * @type {number} + * @category modules + */ +Input.prototype.propagationDelay = 0 +Input.prototype.objectType = 'Input' diff --git a/v0/src/simulator/src/modules/LSB.js b/v0/src/simulator/src/modules/LSB.js new file mode 100644 index 00000000..0f7e4e61 --- /dev/null +++ b/v0/src/simulator/src/modules/LSB.js @@ -0,0 +1,144 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode, dec2bin } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect, fillText } from '../canvasApi' +/** + * @class + * LSB + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class LSB extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['LSB'].push(this); + */ + this.leftDimensionX = 10 + this.rightDimensionX = 20 + this.setHeight(30) + this.directionFixed = true + this.bitWidth = bitWidth || parseInt(prompt('Enter bitWidth'), 10) + this.rectangleObject = false + // this.inputSize = 1 << this.bitWidth; + this.intputSize = this.bitWidth + + this.inp1 = new Node(-10, 0, 0, this, this.inputSize) + this.output1 = new Node(20, 0, 1, this, this.bitWidth) + this.enable = new Node(20, 20, 1, this, 1) + } + + /** + * @memberof LSB + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + inp1: findNode(this.inp1), + output1: findNode(this.output1), + enable: findNode(this.enable), + }, + constructorParamaters: [this.direction, this.bitWidth], + } + return data + } + + /** + * @memberof LSB + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + // this.inputSize = 1 << bitWidth + this.inputSize = bitWidth + this.inp1.bitWidth = this.inputSize + this.bitWidth = bitWidth + this.output1.bitWidth = bitWidth + } + + /** + * @memberof LSB + * resolve output values based on inputData + */ + resolve() { + const inp = dec2bin(this.inp1.value) + let out = 0 + for (let i = inp.length - 1; i >= 0; i--) { + if (inp[i] === '1') { + out = inp.length - 1 - i + break + } + } + this.output1.value = out + simulationArea.simulationQueue.add(this.output1) + if (inp != 0) { + this.enable.value = 1 + } else { + this.enable.value = 0 + } + simulationArea.simulationQueue.add(this.enable) + } + + /** + * @memberof LSB + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + rect(ctx, xx - 10, yy - 30, 30, 60) + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.fillStyle = 'black' + ctx.textAlign = 'center' + fillText(ctx, 'LSB', xx + 6, yy - 12, 10) + fillText(ctx, 'EN', xx + this.enable.x - 12, yy + this.enable.y + 3, 8) + ctx.fill() + + ctx.beginPath() + ctx.fillStyle = 'green' + ctx.textAlign = 'center' + if (this.output1.value !== undefined) { + fillText(ctx, this.output1.value, xx + 5, yy + 14, 13) + } + ctx.stroke() + ctx.fill() + } + generateVerilog() { + return `assign ${this.output1.verilogLabel} = (${this.enable.verilogLabel}!=0) ? ${this.inp1.verilogLabel}[0] : 0;` + } +} + +/** + * @memberof LSB + * Help Tip + * @type {string} + * @category modules + */ +LSB.prototype.tooltipText = + 'LSB ToolTip : The least significant bit or the low-order bit.' +LSB.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/5muxandplex?id=least-significant-bit-lsb-detector' +LSB.prototype.objectType = 'LSB' diff --git a/v0/src/simulator/src/modules/MSB.js b/v0/src/simulator/src/modules/MSB.js new file mode 100644 index 00000000..fbe14b2c --- /dev/null +++ b/v0/src/simulator/src/modules/MSB.js @@ -0,0 +1,141 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode, dec2bin } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect, fillText } from '../canvasApi' +/** + * @class + * MSB + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class MSB extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['MSB'].push(this); + */ + // this.setDimensions(20, 20); + this.leftDimensionX = 10 + this.rightDimensionX = 20 + this.setHeight(30) + this.directionFixed = true + this.bitWidth = bitWidth || parseInt(prompt('Enter bitWidth'), 10) + this.rectangleObject = false + // this.inputSize = 1 << this.bitWidth; + this.intputSize = this.bitWidth + + this.inp1 = new Node(-10, 0, 0, this, this.inputSize) + this.output1 = new Node(20, 0, 1, this, this.bitWidth) + this.enable = new Node(20, 20, 1, this, 1) + } + + /** + * @memberof MSB + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + inp1: findNode(this.inp1), + output1: findNode(this.output1), + enable: findNode(this.enable), + }, + constructorParamaters: [this.direction, this.bitWidth], + } + return data + } + + /** + * @memberof MSB + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + // this.inputSize = 1 << bitWidth + this.inputSize = bitWidth + this.inp1.bitWidth = this.inputSize + this.bitWidth = bitWidth + this.output1.bitWidth = bitWidth + } + + /** + * @memberof MSB + * resolve output values based on inputData + */ + resolve() { + const inp = this.inp1.value + this.output1.value = dec2bin(inp).length - 1 + simulationArea.simulationQueue.add(this.output1) + if (inp != 0) { + this.enable.value = 1 + } else { + this.enable.value = 0 + } + simulationArea.simulationQueue.add(this.enable) + } + + /** + * @memberof MSB + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + rect(ctx, xx - 10, yy - 30, 30, 60) + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.fillStyle = 'black' + ctx.textAlign = 'center' + fillText(ctx, 'MSB', xx + 6, yy - 12, 10) + fillText(ctx, 'EN', xx + this.enable.x - 12, yy + this.enable.y + 3, 8) + ctx.fill() + + ctx.beginPath() + ctx.fillStyle = 'green' + ctx.textAlign = 'center' + if (this.output1.value !== undefined) { + fillText(ctx, this.output1.value, xx + 5, yy + 14, 13) + } + ctx.stroke() + ctx.fill() + } + + generateVerilog() { + return `assign ${this.output1.verilogLabel} = (${ + this.enable.verilogLabel + }!=0) ? ${this.inp1.verilogLabel}[${this.inp1.bitWidth - 1}] : 0;` + } +} + +/** + * @memberof MSB + * Help Tip + * @type {string} + * @category modules + */ +MSB.prototype.tooltipText = + 'MSB ToolTip : The most significant bit or the high-order bit.' +MSB.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/5muxandplex?id=most-significant-bit-msb-detector' +MSB.prototype.objectType = 'MSB' diff --git a/v0/src/simulator/src/modules/Multiplexer.js b/v0/src/simulator/src/modules/Multiplexer.js new file mode 100644 index 00000000..638b9d01 --- /dev/null +++ b/v0/src/simulator/src/modules/Multiplexer.js @@ -0,0 +1,344 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * Multiplexer + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @param {number=} controlSignalSize - 1 by default + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Multiplexer extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 1, + controlSignalSize = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Multiplexer'].push(this); + */ + this.controlSignalSize = + controlSignalSize || + parseInt(prompt('Enter control signal bitWidth'), 10) + this.inputSize = 1 << this.controlSignalSize + this.xOff = 0 + this.yOff = 1 + if (this.controlSignalSize === 1) { + this.xOff = 10 + } + if (this.controlSignalSize <= 3) { + this.yOff = 2 + } + this.setDimensions(20 - this.xOff, this.yOff * 5 * this.inputSize) + this.rectangleObject = false + this.inp = [] + for (let i = 0; i < this.inputSize; i++) { + const a = new Node( + -20 + this.xOff, + +this.yOff * 10 * (i - this.inputSize / 2) + 10, + 0, + this + ) + this.inp.push(a) + } + this.output1 = new Node(20 - this.xOff, 0, 1, this) + this.controlSignalInput = new Node( + 0, + this.yOff * 10 * (this.inputSize / 2 - 1) + this.xOff + 10, + 0, + this, + this.controlSignalSize, + 'Control Signal' + ) + } + + /** + * @memberof Multiplexer + * function to change control signal of the element + */ + changeControlSignalSize(size) { + if (size === undefined || size < 1 || size > 32) return + if (this.controlSignalSize === size) return + const obj = new Multiplexer( + this.x, + this.y, + this.scope, + this.direction, + this.bitWidth, + size + ) + this.cleanDelete() + simulationArea.lastSelected = obj + return obj + } + + /** + * @memberof Multiplexer + * function to change bitwidth of the element + * @param {number} bitWidth - bitwidth + */ + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + for (let i = 0; i < this.inputSize; i++) { + this.inp[i].bitWidth = bitWidth + } + this.output1.bitWidth = bitWidth + } + + /** + * @memberof Multiplexer + * @type {boolean} + */ + isResolvable() { + if ( + this.controlSignalInput.value !== undefined && + this.inp[this.controlSignalInput.value].value !== undefined + ) + return true + return false + } + + /** + * @memberof Multiplexer + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.bitWidth, + this.controlSignalSize, + ], + nodes: { + inp: this.inp.map(findNode), + output1: findNode(this.output1), + controlSignalInput: findNode(this.controlSignalInput), + }, + } + return data + } + + /** + * @memberof Multiplexer + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + this.output1.value = this.inp[this.controlSignalInput.value].value + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof Multiplexer + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + + const xx = this.x + const yy = this.y + + ctx.beginPath() + moveTo( + ctx, + 0, + this.yOff * 10 * (this.inputSize / 2 - 1) + 10 + 0.5 * this.xOff, + xx, + yy, + this.direction + ) + lineTo( + ctx, + 0, + this.yOff * 5 * (this.inputSize - 1) + this.xOff, + xx, + yy, + this.direction + ) + ctx.stroke() + + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + ctx.strokeStyle = colors['stroke'] + + ctx.fillStyle = colors['fill'] + moveTo( + ctx, + -20 + this.xOff, + -this.yOff * 10 * (this.inputSize / 2), + xx, + yy, + this.direction + ) + lineTo( + ctx, + -20 + this.xOff, + 20 + this.yOff * 10 * (this.inputSize / 2 - 1), + xx, + yy, + this.direction + ) + lineTo( + ctx, + 20 - this.xOff, + +this.yOff * 10 * (this.inputSize / 2 - 1) + this.xOff, + xx, + yy, + this.direction + ) + lineTo( + ctx, + 20 - this.xOff, + -this.yOff * 10 * (this.inputSize / 2) - this.xOff + 20, + xx, + yy, + this.direction + ) + + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = colors['hover_select'] + } + ctx.fill() + ctx.stroke() + + ctx.beginPath() + // ctx.lineWidth = correctWidth(2); + ctx.fillStyle = 'black' + ctx.textAlign = 'center' + for (let i = 0; i < this.inputSize; i++) { + if (this.direction === 'RIGHT') + fillText( + ctx, + String(i), + xx + this.inp[i].x + 7, + yy + this.inp[i].y + 2, + 10 + ) + else if (this.direction === 'LEFT') + fillText( + ctx, + String(i), + xx + this.inp[i].x - 7, + yy + this.inp[i].y + 2, + 10 + ) + else if (this.direction === 'UP') + fillText( + ctx, + String(i), + xx + this.inp[i].x, + yy + this.inp[i].y - 4, + 10 + ) + else + fillText( + ctx, + String(i), + xx + this.inp[i].x, + yy + this.inp[i].y + 10, + 10 + ) + } + ctx.fill() + } + + verilogBaseType() { + return this.verilogName() + this.inp.length + } + + //this code to generate Verilog + generateVerilog() { + Multiplexer.selSizes.add(this.controlSignalSize) + return CircuitElement.prototype.generateVerilog.call(this) + } + + //generate the needed modules + static moduleVerilog() { + var output = '' + + for (var size of Multiplexer.selSizes) { + var numInput = 1 << size + var inpString = '' + for (var j = 0; j < numInput; j++) { + inpString += `in${j}, ` + } + output += `\nmodule Multiplexer${numInput}(out, ${inpString}sel);\n` + + output += ' parameter WIDTH = 1;\n' + output += ' output reg [WIDTH-1:0] out;\n' + + output += ' input [WIDTH-1:0] ' + for (var j = 0; j < numInput - 1; j++) { + output += `in${j}, ` + } + output += 'in' + (numInput - 1) + ';\n' + + output += ` input [${size - 1}:0] sel;\n` + output += ' \n' + + output += ' always @ (*)\n' + output += ' case (sel)\n' + for (var j = 0; j < numInput; j++) { + output += ` ${j} : out = in${j};\n` + } + output += ' endcase\n' + output += 'endmodule\n' + output += '\n' + } + + return output + } + //reset the sized before Verilog generation + static resetVerilog() { + Multiplexer.selSizes = new Set() + } +} + +/** + * @memberof Multiplexer + * Help Tip + * @type {string} + * @category modules + */ +Multiplexer.prototype.tooltipText = + 'Multiplexer ToolTip : Multiple inputs and a single line output.' +Multiplexer.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/5muxandplex?id=multiplexer' + +/** + * @memberof Multiplexer + * multable properties of element + * @type {JSON} + * @category modules + */ +Multiplexer.prototype.mutableProperties = { + controlSignalSize: { + name: 'Control Signal Size', + type: 'number', + max: '10', + min: '1', + func: 'changeControlSignalSize', + }, +} +Multiplexer.prototype.objectType = 'Multiplexer' diff --git a/v0/src/simulator/src/modules/NandGate.js b/v0/src/simulator/src/modules/NandGate.js new file mode 100644 index 00000000..1cf25e82 --- /dev/null +++ b/v0/src/simulator/src/modules/NandGate.js @@ -0,0 +1,169 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, drawCircle2, arc } from '../canvasApi' +import { changeInputSize } from '../modules' +import { gateGenerateVerilog } from '../utils' + +/** + * @class + * NandGate + * @extends CircuitElement + * @param {number} x - x coordinate of nand Gate. + * @param {number} y - y coordinate of nand Gate. + * @param {Scope=} scope - Cirucit on which nand gate is drawn + * @param {string=} dir - direction of nand Gate + * @param {number=} inputLength - number of input nodes + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class NandGate extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + inputLength = 2, + bitWidth = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['NandGate'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 20) + this.inp = [] + this.inputSize = inputLength + // variable inputLength , node creation + if (inputLength % 2 === 1) { + for (let i = 0; i < inputLength / 2 - 1; i++) { + const a = new Node(-10, -10 * (i + 1), 0, this) + this.inp.push(a) + } + let a = new Node(-10, 0, 0, this) + this.inp.push(a) + for (let i = inputLength / 2 + 1; i < inputLength; i++) { + a = new Node(-10, 10 * (i + 1 - inputLength / 2 - 1), 0, this) + this.inp.push(a) + } + } else { + for (let i = 0; i < inputLength / 2; i++) { + const a = new Node(-10, -10 * (i + 1), 0, this) + this.inp.push(a) + } + for (let i = inputLength / 2; i < inputLength; i++) { + const a = new Node(-10, 10 * (i + 1 - inputLength / 2), 0, this) + this.inp.push(a) + } + } + this.output1 = new Node(30, 0, 1, this) + } + + /** + * @memberof NandGate + * fn to create save Json Data of object + * @return {JSON} + */ + // fn to create save Json Data of object + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.inputSize, + this.bitWidth, + ], + nodes: { + inp: this.inp.map(findNode), + output1: findNode(this.output1), + }, + } + return data + } + + /** + * @memberof NandGate + * resolve output values based on inputData + */ + resolve() { + let result = this.inp[0].value || 0 + if (this.isResolvable() === false) { + return + } + for (let i = 1; i < this.inputSize; i++) + result &= this.inp[i].value || 0 + result = + ((~result >>> 0) << (32 - this.bitWidth)) >>> (32 - this.bitWidth) + this.output1.value = result + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof NandGate + * function to draw nand Gate + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.lineWidth = correctWidth(3) + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + const xx = this.x + const yy = this.y + moveTo(ctx, -10, -20, xx, yy, this.direction) + lineTo(ctx, 0, -20, xx, yy, this.direction) + arc(ctx, 0, 0, 20, -Math.PI / 2, Math.PI / 2, xx, yy, this.direction) + lineTo(ctx, -10, 20, xx, yy, this.direction) + lineTo(ctx, -10, -20, xx, yy, this.direction) + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + ctx.beginPath() + drawCircle2(ctx, 25, 0, 5, xx, yy, this.direction) + ctx.stroke() + } + + generateVerilog() { + return gateGenerateVerilog.call(this, '&', true) + } +} + +/** + * @memberof NandGate + * Help Tip + * @type {string} + * @category modules + */ +NandGate.prototype.tooltipText = + 'Nand Gate ToolTip : Combination of AND and NOT gates' + +/** + * @memberof NandGate + * @type {boolean} + * @category modules + */ +NandGate.prototype.alwaysResolve = true + +/** + * @memberof NandGate + * function to change input nodes of the gate + * @category modules + */ +NandGate.prototype.changeInputSize = changeInputSize + +/** + * @memberof NandGate + * @type {string} + * @category modules + */ +NandGate.prototype.verilogType = 'nand' +NandGate.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/4gates?id=nand-gate' +NandGate.prototype.objectType = 'NandGate' diff --git a/v0/src/simulator/src/modules/NorGate.js b/v0/src/simulator/src/modules/NorGate.js new file mode 100644 index 00000000..38572dd5 --- /dev/null +++ b/v0/src/simulator/src/modules/NorGate.js @@ -0,0 +1,183 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { gateGenerateVerilog } from '../utils' + +import { + correctWidth, + bezierCurveTo, + moveTo, + arc2, + drawCircle2, +} from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * NorGate + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} inputs - number of input nodes + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class NorGate extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + inputs = 2, + bitWidth = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['NorGate'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 20) + + this.inp = [] + this.inputSize = inputs + + if (inputs % 2 === 1) { + for (let i = 0; i < inputs / 2 - 1; i++) { + const a = new Node(-10, -10 * (i + 1), 0, this) + this.inp.push(a) + } + let a = new Node(-10, 0, 0, this) + this.inp.push(a) + for (let i = inputs / 2 + 1; i < inputs; i++) { + a = new Node(-10, 10 * (i + 1 - inputs / 2 - 1), 0, this) + this.inp.push(a) + } + } else { + for (let i = 0; i < inputs / 2; i++) { + const a = new Node(-10, -10 * (i + 1), 0, this) + this.inp.push(a) + } + for (let i = inputs / 2; i < inputs; i++) { + const a = new Node(-10, 10 * (i + 1 - inputs / 2), 0, this) + this.inp.push(a) + } + } + this.output1 = new Node(30, 0, 1, this) + } + + /** + * @memberof NorGate + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.inputSize, + this.bitWidth, + ], + nodes: { + inp: this.inp.map(findNode), + output1: findNode(this.output1), + }, + } + return data + } + + /** + * @memberof NorGate + * resolve output values based on inputData + */ + resolve() { + let result = this.inp[0].value || 0 + for (let i = 1; i < this.inputSize; i++) + result |= this.inp[i].value || 0 + result = + ((~result >>> 0) << (32 - this.bitWidth)) >>> (32 - this.bitWidth) + this.output1.value = result + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof NorGate + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(3) + + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.fillStyle = colors['fill'] + + moveTo(ctx, -10, -20, xx, yy, this.direction, true) + bezierCurveTo(0, -20, +15, -10, 20, 0, xx, yy, this.direction) + bezierCurveTo( + 0 + 15, + 0 + 10, + 0, + 0 + 20, + -10, + +20, + xx, + yy, + this.direction + ) + bezierCurveTo(0, 0, 0, 0, -10, -20, xx, yy, this.direction) + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + ctx.beginPath() + drawCircle2(ctx, 25, 0, 5, xx, yy, this.direction) + ctx.stroke() + // for debugging + } + + generateVerilog() { + return gateGenerateVerilog.call(this, '|', true) + } +} + +/** + * @memberof NorGate + * Help Tip + * @type {string} + * @category modules + */ +NorGate.prototype.tooltipText = + 'Nor Gate ToolTip : Combination of OR gate and NOT gate.' + +/** + * @memberof NorGate + * @type {boolean} + * @category modules + */ +NorGate.prototype.alwaysResolve = true + +/** + * @memberof SevenSegDisplay + * function to change input nodes of the element + * @category modules + */ +NorGate.prototype.changeInputSize = changeInputSize + +/** + * @memberof SevenSegDisplay + * @type {string} + * @category modules + */ +NorGate.prototype.verilogType = 'nor' +NorGate.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/4gates?id=nor-gate' +NorGate.prototype.objectType = 'NorGate' diff --git a/v0/src/simulator/src/modules/NotGate.js b/v0/src/simulator/src/modules/NotGate.js new file mode 100644 index 00000000..38ec3a05 --- /dev/null +++ b/v0/src/simulator/src/modules/NotGate.js @@ -0,0 +1,113 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, drawCircle2 } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * NotGate + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class NotGate extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['NotGate'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 15) + + this.inp1 = new Node(-10, 0, 0, this) + this.output1 = new Node(20, 0, 1, this) + } + + /** + * @memberof NotGate + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + output1: findNode(this.output1), + inp1: findNode(this.inp1), + }, + } + return data + } + + /** + * @memberof NotGate + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + this.output1.value = + ((~this.inp1.value >>> 0) << (32 - this.bitWidth)) >>> + (32 - this.bitWidth) + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof NotGate + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(3) + + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.fillStyle = colors['fill'] + moveTo(ctx, -10, -10, xx, yy, this.direction) + lineTo(ctx, 10, 0, xx, yy, this.direction) + lineTo(ctx, -10, 10, xx, yy, this.direction) + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + ctx.beginPath() + drawCircle2(ctx, 15, 0, 5, xx, yy, this.direction) + ctx.stroke() + } + + generateVerilog() { + return ( + 'assign ' + + this.output1.verilogLabel + + ' = ~' + + this.inp1.verilogLabel + + ';' + ) + } +} + +/** + * @memberof NotGate + * Help Tip + * @type {string} + * @category modules + */ +NotGate.prototype.tooltipText = + 'Not Gate Tooltip : Inverts the input digital signal.' +NotGate.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/4gates?id=not-gate' +NotGate.prototype.objectType = 'NotGate' +NotGate.prototype.verilogType = 'not' diff --git a/v0/src/simulator/src/modules/OrGate.js b/v0/src/simulator/src/modules/OrGate.js new file mode 100644 index 00000000..31b557cd --- /dev/null +++ b/v0/src/simulator/src/modules/OrGate.js @@ -0,0 +1,175 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, bezierCurveTo, moveTo, arc2 } from '../canvasApi' +import { changeInputSize } from '../modules' +import { gateGenerateVerilog } from '../utils' + +/** + * @class + * OrGate + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} inputs - number of input nodes + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class OrGate extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + inputs = 2, + bitWidth = 1 + ) { + // Calling base class constructor + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['OrGate'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 20) + // Inherit base class prototype + this.inp = [] + this.inputSize = inputs + if (inputs % 2 === 1) { + for (let i = Math.floor(inputs / 2) - 1; i >= 0; i--) { + const a = new Node(-10, -10 * (i + 1), 0, this) + this.inp.push(a) + } + let a = new Node(-10, 0, 0, this) + this.inp.push(a) + for (let i = 0; i < Math.floor(inputs / 2); i++) { + a = new Node(-10, 10 * (i + 1), 0, this) + this.inp.push(a) + } + } else { + for (let i = inputs / 2 - 1; i >= 0; i--) { + const a = new Node(-10, -10 * (i + 1), 0, this) + this.inp.push(a) + } + for (let i = 0; i < inputs / 2; i++) { + const a = new Node(-10, 10 * (i + 1), 0, this) + this.inp.push(a) + } + } + this.output1 = new Node(20, 0, 1, this) + } + + /** + * @memberof OrGate + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.inputSize, + this.bitWidth, + ], + + nodes: { + inp: this.inp.map(findNode), + output1: findNode(this.output1), + }, + } + return data + } + + /** + * @memberof OrGate + * resolve output values based on inputData + */ + resolve() { + let result = this.inp[0].value || 0 + if (this.isResolvable() === false) { + return + } + for (let i = 1; i < this.inputSize; i++) + result |= this.inp[i].value || 0 + this.output1.value = result >>> 0 + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof OrGate + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(3) + + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.fillStyle = colors['fill'] + + moveTo(ctx, -10, -20, xx, yy, this.direction, true) + bezierCurveTo(0, -20, +15, -10, 20, 0, xx, yy, this.direction) + bezierCurveTo( + 0 + 15, + 0 + 10, + 0, + 0 + 20, + -10, + +20, + xx, + yy, + this.direction + ) + bezierCurveTo(0, 0, 0, 0, -10, -20, xx, yy, this.direction) + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + } + + generateVerilog() { + return gateGenerateVerilog.call(this, '|') + } +} + +/** + * @memberof OrGate + * Help Tip + * @type {string} + * @category modules + */ +OrGate.prototype.tooltipText = + 'Or Gate Tooltip : Implements logical disjunction' + +/** + * @memberof OrGate + * function to change input nodes of the element + * @category modules + */ +OrGate.prototype.changeInputSize = changeInputSize + +/** + * @memberof SevenSegDisplay + * @type {boolean} + * @category modules + */ +OrGate.prototype.alwaysResolve = true + +/** + * @memberof SevenSegDisplay + * @type {string} + * @category modules + */ +OrGate.prototype.verilogType = 'or' +OrGate.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/4gates?id=or-gate' +OrGate.prototype.objectType = 'OrGate' diff --git a/v0/src/simulator/src/modules/Output.js b/v0/src/simulator/src/modules/Output.js new file mode 100644 index 00000000..23ef3975 --- /dev/null +++ b/v0/src/simulator/src/modules/Output.js @@ -0,0 +1,219 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, fillText, rect2, oppositeDirection } from '../canvasApi' +import { getNextPosition } from '../modules' +import { generateId } from '../utils' +import { colors } from '../themer/themer' + +function bin2dec(binString) { + return parseInt(binString, 2) +} + +function dec2bin(dec, bitWidth = undefined) { + // only for positive nos + var bin = dec.toString(2) + if (bitWidth == undefined) return bin + return '0'.repeat(bitWidth - bin.length) + bin +} + +/** + * @class + * Output + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} inputLength - number of input nodes + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +export default class Output extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'LEFT', + bitWidth = 1, + layoutProperties + ) { + // Calling base class constructor + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Output'].push(this); + */ + if (layoutProperties) { + this.layoutProperties = layoutProperties + } else { + this.layoutProperties = {} + this.layoutProperties.x = scope.layout.width + this.layoutProperties.y = getNextPosition(scope.layout.width, scope) + this.layoutProperties.id = generateId() + } + + this.rectangleObject = false + this.directionFixed = true + this.orientationFixed = false + this.setDimensions(this.bitWidth * 10, 10) + this.inp1 = new Node(this.bitWidth * 10, 0, 0, this) + } + + /** + * @memberof Output + * function to generate verilog for output + * @return {string} + */ + generateVerilog() { + return `assign ${this.label} = ${this.inp1.verilogLabel};` + } + + /** + * @memberof Output + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + inp1: findNode(this.inp1), + }, + constructorParamaters: [ + this.direction, + this.bitWidth, + this.layoutProperties, + ], + } + return data + } + + /** + * @memberof Output + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + if (bitWidth < 1) return + const diffBitWidth = bitWidth - this.bitWidth + this.state = undefined + this.inp1.bitWidth = bitWidth + this.bitWidth = bitWidth + this.setWidth(10 * this.bitWidth) + + if (this.direction === 'RIGHT') { + this.x -= 10 * diffBitWidth + this.inp1.x = 10 * this.bitWidth + this.inp1.leftx = 10 * this.bitWidth + } else if (this.direction === 'LEFT') { + this.x += 10 * diffBitWidth + this.inp1.x = -10 * this.bitWidth + this.inp1.leftx = 10 * this.bitWidth + } + } + + /** + * @memberof Output + * function to draw element + */ + customDraw() { + this.state = this.inp1.value + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = [colors['out_rect'], colors['stroke_alt']][ + +(this.inp1.value === undefined) + ] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + + rect2( + ctx, + -10 * this.bitWidth, + -10, + 20 * this.bitWidth, + 20, + xx, + yy, + 'RIGHT' + ) + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = colors['hover_select'] + } + + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.font = '20px Raleway' + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + let bin + if (this.state === undefined) { + bin = 'x'.repeat(this.bitWidth) + } else { + bin = dec2bin(this.state, this.bitWidth) + } + + for (let k = 0; k < this.bitWidth; k++) { + fillText(ctx, bin[k], xx - 10 * this.bitWidth + 10 + k * 20, yy + 5) + } + ctx.fill() + } + + /** + * @memberof Output + * function to change direction of Output + * @param {string} dir - new direction + */ + newDirection(dir) { + if (dir === this.direction) return + this.direction = dir + this.inp1.refresh() + if (dir === 'RIGHT' || dir === 'LEFT') { + this.inp1.leftx = 10 * this.bitWidth + this.inp1.lefty = 0 + } else { + this.inp1.leftx = 10 // 10*this.bitWidth; + this.inp1.lefty = 0 + } + + this.inp1.refresh() + this.labelDirection = oppositeDirection[this.direction] + } + + generateVerilog() { + return ( + 'assign ' + this.verilogLabel + ' = ' + this.inp1.verilogLabel + ';' + ) + } +} + +/** + * @memberof Output + * Help Tip + * @type {string} + * @category modules + */ +Output.prototype.tooltipText = + 'Output ToolTip: Simple output element showing output in binary.' + +/** + * @memberof Output + * Help URL + * @type {string} + * @category modules + */ +Output.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/3output?id=output' + +/** + * @memberof Output + * @type {number} + * @category modules + */ +Output.prototype.propagationDelay = 0 +Output.prototype.objectType = 'Output' diff --git a/v0/src/simulator/src/modules/Power.js b/v0/src/simulator/src/modules/Power.js new file mode 100644 index 00000000..87c419a5 --- /dev/null +++ b/v0/src/simulator/src/modules/Power.js @@ -0,0 +1,146 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, arc } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * Power + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Power extends CircuitElement { + constructor(x, y, scope = globalScope, bitWidth = 1) { + super(x, y, scope, 'RIGHT', bitWidth) + /* this is done in this.baseSetup() now + this.scope['Power'].push(this); + */ + this.directionFixed = true + this.rectangleObject = false + this.setDimensions(10, 10) + this.output1 = new Node(0, 10, 1, this) + } + + /** + * @memberof Power + * resolve output values based on inputData + */ + resolve() { + this.output1.value = ~0 >>> (32 - this.bitWidth) + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof Power + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + output1: findNode(this.output1), + }, + constructorParamaters: [this.bitWidth], + } + return data + } + + /** + * @memberof Power + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.strokeStyle = 'rgba(0,0,0,1)' + ctx.lineWidth = correctWidth(3) + ctx.fillStyle = colors['fill'] + moveTo(ctx, 0, -10, xx, yy, this.direction) + lineTo(ctx, -10, 0, xx, yy, this.direction) + lineTo(ctx, 10, 0, xx, yy, this.direction) + lineTo(ctx, 0, -10, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + moveTo(ctx, 0, 0, xx, yy, this.direction) + lineTo(ctx, 0, 10, xx, yy, this.direction) + ctx.stroke() + } + + generateVerilog() { + return `assign ${this.output1.verilogLabel} = ~${this.bitWidth}'b0;` + } +} + +/** + * @memberof Power + * Help Tip + * @type {string} + * @category modules + */ +Power.prototype.tooltipText = 'Power: All bits are High(1).' + +/** + * @memberof Power + * Help URL + * @type {string} + * @category modules + */ +Power.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/2input?id=power' + +/** + * @memberof Power + * @type {number} + * @category modules + */ +Power.prototype.propagationDelay = 0 + +function getNextPosition(x = 0, scope = globalScope) { + let possibleY = 20 + const done = {} + for (let i = 0; i < scope.Input.length; i++) { + if (scope.Input[i].layoutProperties.x === x) { + done[scope.Input[i].layoutProperties.y] = 1 + } + } + for (let i = 0; i < scope.Output.length; i++) { + if (scope.Output[i].layoutProperties.x === x) { + done[scope.Output[i].layoutProperties.y] = 1 + } + } + while (done[possibleY] || done[possibleY + 10] || done[possibleY - 10]) { + possibleY += 10 + } + const height = possibleY + 20 + if (height > scope.layout.height) { + const oldHeight = scope.layout.height + scope.layout.height = height + for (let i = 0; i < scope.Input.length; i++) { + if (scope.Input[i].layoutProperties.y === oldHeight) { + scope.Input[i].layoutProperties.y = scope.layout.height + } + } + for (let i = 0; i < scope.Output.length; i++) { + if (scope.Output[i].layoutProperties.y === oldHeight) { + scope.Output[i].layoutProperties.y = scope.layout.height + } + } + } + return possibleY +} +Power.prototype.objectType = 'Power' diff --git a/v0/src/simulator/src/modules/PriorityEncoder.js b/v0/src/simulator/src/modules/PriorityEncoder.js new file mode 100644 index 00000000..b74d7f90 --- /dev/null +++ b/v0/src/simulator/src/modules/PriorityEncoder.js @@ -0,0 +1,276 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode, dec2bin } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect, fillText } from '../canvasApi' +/** + * @class + * PriorityEncoder + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class PriorityEncoder extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['PriorityEncoder'].push(this); + */ + this.bitWidth = bitWidth || parseInt(prompt('Enter bitWidth'), 10) + this.inputSize = 1 << this.bitWidth + + this.yOff = 1 + if (this.bitWidth <= 3) { + this.yOff = 2 + } + + this.setDimensions(20, this.yOff * 5 * this.inputSize) + this.directionFixed = true + this.rectangleObject = false + + this.inp1 = [] + for (let i = 0; i < this.inputSize; i++) { + const a = new Node( + -10, + +this.yOff * 10 * (i - this.inputSize / 2) + 10, + 0, + this, + 1 + ) + this.inp1.push(a) + } + + this.output1 = [] + for (let i = 0; i < this.bitWidth; i++) { + const a = new Node( + 30, + +2 * 10 * (i - this.bitWidth / 2) + 10, + 1, + this, + 1 + ) + this.output1.push(a) + } + + this.enable = new Node( + 10, + 20 + this.inp1[this.inputSize - 1].y, + 1, + this, + 1 + ) + } + + /** + * @memberof PriorityEncoder + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + inp1: this.inp1.map(findNode), + output1: this.output1.map(findNode), + enable: findNode(this.enable), + }, + constructorParamaters: [this.direction, this.bitWidth], + } + return data + } + + /** + * @memberof PriorityEncoder + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + if (bitWidth === undefined || bitWidth < 1 || bitWidth > 32) return + if (this.bitWidth === bitWidth) return + + this.bitWidth = bitWidth + const obj = new PriorityEncoder( + this.x, + this.y, + this.scope, + this.direction, + this.bitWidth + ) + this.inputSize = 1 << bitWidth + + this.cleanDelete() + simulationArea.lastSelected = obj + return obj + } + + /** + * @memberof PriorityEncoder + * resolve output values based on inputData + */ + resolve() { + let out = 0 + let temp = 0 + for (let i = this.inputSize - 1; i >= 0; i--) { + if (this.inp1[i].value === 1) { + out = dec2bin(i) + break + } + } + temp = out + + if (out.length !== undefined) { + this.enable.value = 1 + } else { + this.enable.value = 0 + } + simulationArea.simulationQueue.add(this.enable) + + if (temp.length === undefined) { + temp = '0' + for (let i = 0; i < this.bitWidth - 1; i++) { + temp = `0${temp}` + } + } + + if (temp.length !== this.bitWidth) { + for (let i = temp.length; i < this.bitWidth; i++) { + temp = `0${temp}` + } + } + + for (let i = this.bitWidth - 1; i >= 0; i--) { + this.output1[this.bitWidth - 1 - i].value = Number(temp[i]) + simulationArea.simulationQueue.add( + this.output1[this.bitWidth - 1 - i] + ) + } + } + + /** + * @memberof PriorityEncoder + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + if (this.bitWidth <= 3) { + rect( + ctx, + xx - 10, + yy - 10 - this.yOff * 5 * this.inputSize, + 40, + 20 * (this.inputSize + 1) + ) + } else { + rect( + ctx, + xx - 10, + yy - 10 - this.yOff * 5 * this.inputSize, + 40, + 10 * (this.inputSize + 3) + ) + } + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.fillStyle = 'black' + ctx.textAlign = 'center' + for (let i = 0; i < this.inputSize; i++) { + fillText(ctx, String(i), xx, yy + this.inp1[i].y + 2, 10) + } + for (let i = 0; i < this.bitWidth; i++) { + fillText( + ctx, + String(i), + xx + this.output1[0].x - 10, + yy + this.output1[i].y + 2, + 10 + ) + } + fillText(ctx, 'EN', xx + this.enable.x, yy + this.enable.y - 5, 10) + ctx.fill() + } + + verilogBaseType() { + return this.verilogName() + this.inp1.length + } + + generateVerilog() { + PriorityEncoder.selSizes.add(this.bitWidth) + return CircuitElement.prototype.generateVerilog.call(this) + } + + static moduleVerilog() { + var output = '' + + for (var size of PriorityEncoder.selSizes) { + var numInput = 1 << size + output += '\n' + output += 'module PriorityEncoder' + numInput + output += '(sel, ze, ' + for (var j = 0; j < numInput - 1; j++) { + output += 'in' + j + ', ' + } + output += 'in' + (numInput - 1) + ');\n' + + output += ' output reg [' + (size - 1) + ':0] sel;\n' + output += ' output reg ze;\n' + + output += ' input ' + for (var j = 0; j < numInput - 1; j++) { + output += 'in' + j + ', ' + } + output += 'in' + (numInput - 1) + ';\n' + output += '\n' + + output += ' always @ (*) begin\n' + output += ' sel = 0;\n' + output += ' ze = 0;\n' + output += ' if (in' + (numInput - 1) + ')\n' + output += ' sel = ' + (numInput - 1) + ';\n' + for (var j = numInput - 2; j <= 0; j++) { + output += ' else if (in' + j + ')\n' + output += ' sel = ' + j + ';\n' + } + output += ' else\n' + output += ' ze = 1;\n' + output += ' end\n' + output += 'endmodule\n' + } + + return output + } + + //reset the sized before Verilog generation + static resetVerilog() { + PriorityEncoder.selSizes = new Set() + } +} + +/** + * @memberof PriorityEncoder + * Help Tip + * @type {string} + * @category modules + */ +PriorityEncoder.prototype.tooltipText = + 'Priority Encoder ToolTip : Compresses binary inputs into a smaller number of outputs.' +PriorityEncoder.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/5muxandplex?id=priority-encoder' +PriorityEncoder.prototype.objectType = 'PriorityEncoder' diff --git a/v0/src/simulator/src/modules/RGBLed.js b/v0/src/simulator/src/modules/RGBLed.js new file mode 100644 index 00000000..a1bcc659 --- /dev/null +++ b/v0/src/simulator/src/modules/RGBLed.js @@ -0,0 +1,177 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, arc, drawCircle2 } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * RGBLed + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @category modules + */ +import { colors } from '../themer/themer' + +export default class RGBLed extends CircuitElement { + constructor(x, y, scope = globalScope) { + // Calling base class constructor + super(x, y, scope, 'UP', 8) + /* this is done in this.baseSetup() now + this.scope['RGBLed'].push(this); + */ + this.rectangleObject = false + this.inp = [] + this.setDimensions(10, 10) + this.inp1 = new Node(-40, -10, 0, this, 8) + this.inp2 = new Node(-40, 0, 0, this, 8) + this.inp3 = new Node(-40, 10, 0, this, 8) + this.inp.push(this.inp1) + this.inp.push(this.inp2) + this.inp.push(this.inp3) + this.directionFixed = true + this.fixedBitWidth = true + } + + /** + * @memberof RGBLed + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + inp1: findNode(this.inp1), + inp2: findNode(this.inp2), + inp3: findNode(this.inp3), + }, + } + return data + } + + /** + * @memberof RGBLed + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + + const xx = this.x + const yy = this.y + + ctx.strokeStyle = 'green' + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + moveTo(ctx, -20, 0, xx, yy, this.direction) + lineTo(ctx, -40, 0, xx, yy, this.direction) + ctx.stroke() + + ctx.strokeStyle = 'red' + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + moveTo(ctx, -20, -10, xx, yy, this.direction) + lineTo(ctx, -40, -10, xx, yy, this.direction) + ctx.stroke() + + ctx.strokeStyle = 'blue' + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + moveTo(ctx, -20, 10, xx, yy, this.direction) + lineTo(ctx, -40, 10, xx, yy, this.direction) + ctx.stroke() + + const a = this.inp1.value + const b = this.inp2.value + const c = this.inp3.value + ctx.strokeStyle = '#d3d4d5' + ctx.fillStyle = [ + `rgba(${a}, ${b}, ${c}, 0.8)`, + 'rgba(227, 228, 229, 0.8)', + ][(a === undefined || b === undefined || c === undefined) + 0] + // ctx.fillStyle = ["rgba(200, 200, 200, 0.3)","rgba(227, 228, 229, 0.8)"][((a === undefined || b === undefined || c === undefined) || (a === 0 && b === 0 && c === 0)) + 0]; + ctx.lineWidth = correctWidth(1) + + ctx.beginPath() + + moveTo(ctx, -18, -11, xx, yy, this.direction) + lineTo(ctx, 0, -11, xx, yy, this.direction) + arc(ctx, 0, 0, 11, -Math.PI / 2, Math.PI / 2, xx, yy, this.direction) + lineTo(ctx, -18, 11, xx, yy, this.direction) + lineTo(ctx, -21, 15, xx, yy, this.direction) + arc( + ctx, + 0, + 0, + Math.sqrt(666), + Math.PI / 2 + Math.acos(15 / Math.sqrt(666)), + -Math.PI / 2 - Math.asin(21 / Math.sqrt(666)), + xx, + yy, + this.direction + ) + lineTo(ctx, -18, -11, xx, yy, this.direction) + ctx.stroke() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + } + + // Draws the element in the subcuircuit. Used in layout mode + subcircuitDraw(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + + var xx = this.subcircuitMetadata.x + xOffset + var yy = this.subcircuitMetadata.y + yOffset + var dimensionSize = 6 + + var a = this.inp1.value + var b = this.inp2.value + var c = this.inp3.value + ctx.strokeStyle = '#090a0a' + ctx.fillStyle = [ + 'rgba(' + a + ', ' + b + ', ' + c + ', 0.8)', + 'rgba(227, 228, 229, 0.8)', + ][(a === undefined || b === undefined || c === undefined) + 0] + ctx.lineWidth = correctWidth(1) + + ctx.beginPath() + drawCircle2(ctx, 0, 0, dimensionSize, xx, yy, this.direction) + ctx.stroke() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected == this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = 'rgba(255, 255, 32,0.8)' + ctx.fill() + } + generateVerilog() { + return ` + always @ (*) + $display("RGBLed:{${this.inp1.verilogLabel},${this.inp2.verilogLabel},${this.inp3.verilogLabel}} = {%d,%d,%d}", ${this.inp1.verilogLabel}, ${this.inp2.verilogLabel}, ${this.inp3.verilogLabel});` + } +} + +/** + * @memberof RGBLed + * Help Tip + * @type {string} + * @category modules + */ +RGBLed.prototype.tooltipText = + 'RGB Led ToolTip: RGB Led inputs 8 bit values for the colors RED, GREEN and BLUE.' + +/** + * @memberof RGBLed + * Help URL + * @type {string} + * @category modules + */ +RGBLed.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/3output?id=rgbled' +RGBLed.prototype.objectType = 'RGBLed' +RGBLed.prototype.canShowInSubcircuit = true diff --git a/v0/src/simulator/src/modules/RGBLedMatrix.js b/v0/src/simulator/src/modules/RGBLedMatrix.js new file mode 100644 index 00000000..00fe1757 --- /dev/null +++ b/v0/src/simulator/src/modules/RGBLedMatrix.js @@ -0,0 +1,383 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect2, rotate, lineTo, moveTo } from '../canvasApi' + +/** + * @class + * RGBLedMatrix + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {number=} rows - number of rows + * @param {number=} cols - number of columns. + * @category modules + */ +export default class RGBLedMatrix extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + { + rows = 8, + columns = 8, + ledSize = 2, + showGrid = true, + colors = [], + } = {} + ) { + super(x, y, scope, 'RIGHT', 8) + /* this is done in this.baseSetup() now + this.scope['RGBLedMatrix'].push(this); + */ + this.fixedBitWidth = true + this.directionFixed = true + this.rectangleObject = true + this.alwaysResolve = true + this.labelDirection = 'UP' + this.leftDimensionX = 0 + this.upDimensionY = 0 + + // These pins provide bulk-editing of the colors + this.rowEnableNodes = [] // 1-bit pin for each row, on the left side. + this.columnEnableNodes = [] // 1-bit pin for each column, on the bottom. + this.columnColorNodes = [] // 24-bit pin for each column, on the top. + + // These pins provide single-pixel editing; these are on the right side. + this.colorNode = new Node(0, -10, NODE_INPUT, this, 24, 'COLOR') + this.rowNode = new Node(0, 0, NODE_INPUT, this, 1, 'ROW') + this.columnNode = new Node(0, 10, NODE_INPUT, this, 1, 'COLUMN') + + this.colors = colors + this.showGrid = showGrid + this.changeSize(rows, columns, ledSize, false) + } + + toggleGrid() { + this.showGrid = !this.showGrid + } + + changeRows(rows) { + this.changeSize(rows, this.columns, this.ledSize, true) + } + + changeColumns(columns) { + this.changeSize(this.rows, columns, this.ledSize, true) + } + + changeLedSize(ledSize) { + this.changeSize(this.rows, this.columns, ledSize, true) + } + + changeSize(rows, columns, ledSize, move) { + rows = parseInt(rows, 10) + if (isNaN(rows) || rows < 0 || rows > this.maxRows) return + + columns = parseInt(columns, 10) + if (isNaN(columns) || columns < 0 || columns > this.maxColumns) return + + ledSize = parseInt(ledSize, 10) + if (isNaN(ledSize) || ledSize < 0 || ledSize > this.maxLedSize) return + + // The size of an individual LED, in canvas units. + var ledWidth = 10 * ledSize + var ledHeight = 10 * ledSize + + // The size of the LED matrix, in canvas units. + var gridWidth = ledWidth * columns + var gridHeight = ledHeight * rows + + // We need to position the element in the 10x10 grid. + // Depending on the size of the leds we need to add different paddings so position correctly. + var padding = ledSize % 2 ? 5 : 10 + + // The dimensions of the element, in canvas units. + var halfWidth = gridWidth / 2 + padding + var halfHeight = gridHeight / 2 + padding + + // Move the element in order to keep the position of the nodes stable so wires don't break. + if (move) { + this.x -= this.leftDimensionX - halfWidth + this.y -= this.upDimensionY - halfHeight + } + + // Update the dimensions of the element. + this.setDimensions(halfWidth, halfHeight) + + // Offset of the nodes in relation to the element's center. + var nodePadding = [10, 20, 20][ledSize - 1] + var nodeOffsetX = nodePadding - halfWidth + var nodeOffsetY = nodePadding - halfHeight + + // When the led size changes it is better to delete all nodes to break connected the wires. + // Otherwise, wires can end up connected in unexpected ways. + var resetAllNodes = ledSize != this.ledSize + + // Delete unused row-enable nodes, reposition remaining nodes and add new nodes. + this.rowEnableNodes + .splice(resetAllNodes ? 0 : rows) + .forEach((node) => node.delete()) + this.rowEnableNodes.forEach((node, i) => { + node.x = node.leftx = -halfWidth + node.y = node.lefty = i * ledHeight + nodeOffsetY + }) + while (this.rowEnableNodes.length < rows) { + this.rowEnableNodes.push( + new Node( + -halfWidth, + this.rowEnableNodes.length * ledHeight + nodeOffsetY, + NODE_INPUT, + this, + 1, + 'R' + this.rowEnableNodes.length + ) + ) + } + + // Delete unused column-enable nodes, reposition remaining nodes and add new nodes. + this.columnEnableNodes + .splice(resetAllNodes ? 0 : columns) + .forEach((node) => node.delete()) + this.columnEnableNodes.forEach((node, i) => { + node.x = node.leftx = i * ledWidth + nodeOffsetX + node.y = node.lefty = halfHeight + }) + while (this.columnEnableNodes.length < columns) { + this.columnEnableNodes.push( + new Node( + this.columnEnableNodes.length * ledWidth + nodeOffsetX, + halfHeight, + NODE_INPUT, + this, + 1, + 'C' + this.columnEnableNodes.length + ) + ) + } + + // Delete unused column color nodes, reposition remaining nodes and add new nodes. + this.columnColorNodes + .splice(resetAllNodes ? 0 : columns) + .forEach((node) => node.delete()) + this.columnColorNodes.forEach((node, i) => { + node.x = node.leftx = i * ledWidth + nodeOffsetX + node.y = node.lefty = -halfHeight + }) + while (this.columnColorNodes.length < columns) { + this.columnColorNodes.push( + new Node( + this.columnColorNodes.length * ledWidth + nodeOffsetX, + -halfHeight, + NODE_INPUT, + this, + 24, + 'CLR' + this.columnColorNodes.length + ) + ) + } + + // Delete unused color storage and add storage for new rows. + this.colors.splice(rows) + this.colors.forEach((c) => c.splice(columns)) + while (this.colors.length < rows) { + this.colors.push([]) + } + + // Reposition the single-pixel nodes + this.rowNode.bitWidth = Math.ceil(Math.log2(rows)) + this.rowNode.label = 'ROW (' + this.rowNode.bitWidth + ' bits)' + this.columnNode.bitWidth = Math.ceil(Math.log2(columns)) + this.columnNode.label = 'COLUMN (' + this.columnNode.bitWidth + ' bits)' + var singlePixelNodePadding = rows > 1 ? nodeOffsetY : nodeOffsetY - 10 + var singlePixelNodeDistance = rows <= 2 ? 10 : ledHeight + ;[this.colorNode, this.rowNode, this.columnNode].forEach((node, i) => { + node.x = node.leftx = halfWidth + node.y = node.lefty = + i * singlePixelNodeDistance + singlePixelNodePadding + }) + + // Store the new values + this.rows = rows + this.columns = columns + this.ledSize = ledSize + + return this + } + + customSave() { + // Save the size of the LED matrix. + // Unlike a read LED matrix, we also persist the color of each pixel. + // This allows circuit preview to show the colors at the time the simulation was saved. + return { + constructorParamaters: [ + { + rows: this.rows, + columns: this.columns, + ledSize: this.ledSize, + showGrid: this.showGrid, + colors: this.colors, + }, + ], + nodes: { + rowEnableNodes: this.rowEnableNodes.map(findNode), + columnEnableNodes: this.columnEnableNodes.map(findNode), + columnColorNodes: this.columnColorNodes.map(findNode), + colorNode: findNode(this.colorNode), + rowNode: findNode(this.rowNode), + columnNode: findNode(this.columnNode), + }, + } + } + + resolve() { + var colorValue = this.colorNode.value + var hasColorValue = colorValue != undefined + + var rows = this.rows + var columns = this.columns + var rowEnableNodes = this.rowEnableNodes + var columnEnableNodes = this.columnEnableNodes + var columnColorNodes = this.columnColorNodes + var colors = this.colors + + for (var row = 0; row < rows; row++) { + if (rowEnableNodes[row].value === 1) { + for (var column = 0; column < columns; column++) { + // Method 1: set pixel by rowEnable + columnColor pins + var columnColor = columnColorNodes[column].value + if (columnColor !== undefined) { + colors[row][column] = columnColor + } + + // Method 2: set pixel by rowEnable + columnEnable + color pins + if ( + hasColorValue && + columnEnableNodes[column].value === 1 + ) { + colors[row][column] = colorValue + } + } + } + } + + // Method 3: set pixel by write + pixel index + color pins. + var hasRowNodeValue = this.rowNode.value != undefined || rows == 1 + var hasColumnNodeValue = + this.columnNode.value != undefined || columns == 1 + if (hasColorValue && hasRowNodeValue && hasColumnNodeValue) { + var rowNodeValue = this.rowNode.value || 0 + var columnNodeValue = this.columnNode.value || 0 + if (rowNodeValue < rows && columnNodeValue < columns) { + colors[rowNodeValue][columnNodeValue] = colorValue + } + } + } + + customDraw() { + var ctx = simulationArea.context + var rows = this.rows + var columns = this.columns + var colors = this.colors + var xx = this.x + var yy = this.y + var dir = this.direction + var ledWidth = 10 * this.ledSize + var ledHeight = 10 * this.ledSize + var top = this.rowEnableNodes[0].y - ledHeight / 2 + var left = this.columnColorNodes[0].x - ledWidth / 2 + var width = this.columns * ledWidth + var height = this.rows * ledHeight + var bottom = top + height + var right = left + width + + var [w, h] = rotate( + ledWidth * globalScope.scale, + ledHeight * globalScope.scale, + dir + ) + var xoffset = Math.round(globalScope.ox + xx * globalScope.scale) + var yoffset = Math.round(globalScope.oy + yy * globalScope.scale) + for (var row = 0; row < rows; row++) { + for (var column = 0; column < columns; column++) { + var color = colors[row][column] || 0 + ctx.beginPath() + ctx.fillStyle = + 'rgb(' + + ((color & 0xff0000) >> 16) + + ',' + + ((color & 0xff00) >> 8) + + ',' + + (color & 0xff) + + ')' + let x1, y1 + ;[x1, y1] = rotate( + left + column * ledWidth, + top + row * ledHeight, + dir + ) + x1 = x1 * globalScope.scale + y1 = y1 * globalScope.scale + ctx.rect(xoffset + x1, yoffset + y1, w, h) + ctx.fill() + } + } + + if (this.showGrid) { + ctx.beginPath() + ctx.strokeStyle = '#323232' + ctx.lineWidth = correctWidth(1) + rect2(ctx, left, top, width, height, xx, yy, dir) + for (var x = left + ledWidth; x < right; x += ledWidth) { + moveTo(ctx, x, top, xx, yy, dir) + lineTo(ctx, x, bottom, xx, yy, dir) + } + for (var y = top + ledHeight; y < bottom; y += ledHeight) { + moveTo(ctx, left, y, xx, yy, dir) + lineTo(ctx, right, y, xx, yy, dir) + } + ctx.stroke() + } + } +} + +RGBLedMatrix.prototype.tooltipText = 'RGB Led Matrix' + +// Limit the size of the matrix otherwise the simulation starts to lag. +RGBLedMatrix.prototype.maxRows = 128 +RGBLedMatrix.prototype.maxColumns = 128 + +// Let the user choose between 3 sizes of LEDs: small, medium and large. +RGBLedMatrix.prototype.maxLedSize = 3 + +RGBLedMatrix.prototype.mutableProperties = { + rows: { + name: 'Rows', + type: 'number', + max: RGBLedMatrix.prototype.maxRows, + min: 1, + func: 'changeRows', + }, + columns: { + name: 'Columns', + type: 'number', + max: RGBLedMatrix.prototype.maxColumns, + min: 1, + func: 'changeColumns', + }, + ledSize: { + name: 'LED Size', + type: 'number', + max: RGBLedMatrix.prototype.maxLedSize, + min: 1, + func: 'changeLedSize', + }, + showGrid: { + name: 'Toggle Grid', + type: 'button', + max: RGBLedMatrix.prototype.maxLedSize, + min: 1, + func: 'toggleGrid', + }, +} +RGBLedMatrix.prototype.objectType = 'RGBLedMatrix' diff --git a/v0/src/simulator/src/modules/Random.js b/v0/src/simulator/src/modules/Random.js new file mode 100644 index 00000000..01c9427b --- /dev/null +++ b/v0/src/simulator/src/modules/Random.js @@ -0,0 +1,172 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { fillText, lineTo, moveTo, correctWidth, rect2 } from '../canvasApi' +/** + * @class + * Random + * Random is used to generate random value. + * It has 2 input node: + * clock and max random output value + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Random extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Random'].push(this); + */ + this.directionFixed = true + this.setDimensions(20, 20) + this.rectangleObject = true + this.currentRandomNo = 0 + this.clockInp = new Node(-20, +10, 0, this, 1, 'Clock') + this.maxValue = new Node(-20, -10, 0, this, this.bitWidth, 'MaxValue') + this.output = new Node(20, -10, 1, this, this.bitWidth, 'RandomValue') + this.prevClockState = 0 + this.wasClicked = false + } + + /** + * @memberof Random + * return true if clock is connected and if maxValue is set or unconnected. + */ + isResolvable() { + if ( + this.clockInp.value != undefined && + (this.maxValue.value != undefined || + this.maxValue.connections.length == 0) + ) { + return true + } + return false + } + + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.maxValue.bitWidth = bitWidth + this.output.bitWidth = bitWidth + } + + /** + * @memberof Random + * Edge triggered when the clock state changes a + * Random number is generated less then the maxValue. + */ + resolve() { + var maxValue = this.maxValue.connections.length + ? this.maxValue.value + 1 + : 2 << (this.bitWidth - 1) + if (this.clockInp.value != undefined) { + if (this.clockInp.value != this.prevClockState) { + if (this.clockInp.value == 1) { + this.currentRandomNo = Math.floor(Math.random() * maxValue) + } + this.prevClockState = this.clockInp.value + } + } + if (this.output.value != this.currentRandomNo) { + this.output.value = this.currentRandomNo + simulationArea.simulationQueue.add(this.output) + } + } + + customSave() { + var data = { + nodes: { + clockInp: findNode(this.clockInp), + maxValue: findNode(this.maxValue), + output: findNode(this.output), + }, + constructorParamaters: [this.direction, this.bitWidth], + } + return data + } + + customDraw() { + var ctx = simulationArea.context + // + ctx.fillStyle = colors['fill'] + ctx.strokeStyle = colors['stroke'] + ctx.beginPath() + var xx = this.x + var yy = this.y + ctx.font = '20px Raleway' + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + fillText(ctx, this.currentRandomNo.toString(10), this.x, this.y + 5) + ctx.fill() + ctx.beginPath() + moveTo(ctx, -20, 5, xx, yy, this.direction) + lineTo(ctx, -15, 10, xx, yy, this.direction) + lineTo(ctx, -20, 15, xx, yy, this.direction) + ctx.stroke() + } + + // Draws the element in the subcircuit. Used in layout mode + subcircuitDraw(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + var xx = this.subcircuitMetadata.x + xOffset + var yy = this.subcircuitMetadata.y + yOffset + + ctx.beginPath() + ctx.font = '20px Raleway' + ctx.fillStyle = 'green' + ctx.textAlign = 'center' + fillText(ctx, this.currentRandomNo.toString(16), xx + 10, yy + 17) + ctx.fill() + + ctx.beginPath() + ctx.lineWidth = correctWidth(1) + rect2(ctx, 0, 0, 20, 20, xx, yy, this.direction) + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected == this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = 'rgba(255, 255, 32,0.6)' + ctx.fill() + } + } + + static moduleVerilog() { + return ` + module Random(val, clk, max); + parameter WIDTH = 1; + output reg [WIDTH-1:0] val; + input clk; + input [WIDTH-1:0] max; + + always @ (posedge clk) + if (^max === 1'bX) + val = $urandom_range(0, {WIDTH{1'b1}}); + else + val = $urandom_range(0, max); + endmodule + ` + } +} + +Random.prototype.tooltipText = 'Random ToolTip : Random Selected.' + +Random.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/2input?id=random' + +Random.prototype.objectType = 'Random' + +Random.prototype.canShowInSubcircuit = true +Random.prototype.layoutProperties = { + rightDimensionX: 20, + leftDimensionX: 0, + upDimensionY: 0, + downDimensionY: 20, +} diff --git a/v0/src/simulator/src/modules/Rectangle.js b/v0/src/simulator/src/modules/Rectangle.js new file mode 100644 index 00000000..09bf240f --- /dev/null +++ b/v0/src/simulator/src/modules/Rectangle.js @@ -0,0 +1,159 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect } from '../canvasApi' +/** + * @class + * Rectangle + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {number=} rows - number of rows + * @param {number=} cols - number of columns. + * @category modules + */ +export default class Rectangle extends CircuitElement { + constructor(x, y, scope = globalScope, rows = 15, cols = 20) { + super(x, y, scope, 'RIGHT', 1) + /* this is done in this.baseSetup() now + this.scope['Rectangle'].push(this); + */ + this.directionFixed = true + this.fixedBitWidth = true + this.rectangleObject = false + this.cols = cols || parseInt(prompt('Enter cols:'), 10) + this.rows = rows || parseInt(prompt('Enter rows:'), 10) + this.setSize() + } + + /** + * @memberof Rectangle + * @param {number} size - new size of rows + */ + changeRowSize(size) { + if (size === undefined || size < 5 || size > 1000) return + if (this.rows === size) return + this.rows = parseInt(size, 10) + this.setSize() + return this + } + + /** + * @memberof Rectangle + * @param {number} size - new size of columns + */ + changeColSize(size) { + if (size === undefined || size < 5 || size > 1000) return + if (this.cols === size) return + this.cols = parseInt(size, 10) + this.setSize() + return this + } + + /** + * @memberof Rectangle + * listener function to change direction of rectangle + * @param {string} dir - new direction + */ + keyDown3(dir) { + if (dir === 'ArrowRight') { + this.changeColSize(this.cols + 2) + } + if (dir === 'ArrowLeft') { + this.changeColSize(this.cols - 2) + } + if (dir === 'ArrowDown') { + this.changeRowSize(this.rows + 2) + } + if (dir === 'ArrowUp') { + this.changeRowSize(this.rows - 2) + } + } + + /** + * @memberof Rectangle + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.rows, this.cols], + } + return data + } + + /** + * @memberof Rectangle + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = 'rgba(0,0,0,1)' + ctx.setLineDash([5 * globalScope.scale, 5 * globalScope.scale]) + ctx.lineWidth = correctWidth(1.5) + const xx = this.x + const yy = this.y + rect(ctx, xx, yy, this.elementWidth, this.elementHeight) + ctx.stroke() + + if ( + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = 'rgba(255, 255, 32,0.1)' + ctx.fill() + } + ctx.setLineDash([]) + } + + /** + * @memberof Rectangle + * function to reset or (internally) set size + */ + setSize() { + this.elementWidth = this.cols * 10 + this.elementHeight = this.rows * 10 + this.upDimensionY = 0 + this.leftDimensionX = 0 + this.rightDimensionX = this.elementWidth + this.downDimensionY = this.elementHeight + } +} + +/** + * @memberof Rectangle + * Help Tip + * @type {string} + * @category modules + */ +Rectangle.prototype.tooltipText = + 'Rectangle ToolTip : Used to Box the Circuit or area you want to highlight.' +Rectangle.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/7annotation?id=rectangle' +Rectangle.prototype.propagationDelayFixed = true + +/** + * @memberof Rectangle + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +Rectangle.prototype.mutableProperties = { + cols: { + name: 'Columns', + type: 'number', + max: '1000', + min: '5', + func: 'changeColSize', + }, + rows: { + name: 'Rows', + type: 'number', + max: '1000', + min: '5', + func: 'changeRowSize', + }, +} +Rectangle.prototype.objectType = 'Rectangle' diff --git a/v0/src/simulator/src/modules/SevenSegDisplay.js b/v0/src/simulator/src/modules/SevenSegDisplay.js new file mode 100644 index 00000000..eedd26f0 --- /dev/null +++ b/v0/src/simulator/src/modules/SevenSegDisplay.js @@ -0,0 +1,321 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { + colorToRGBA, + correctWidth, + lineTo, + moveTo, + rect, + rect2, + validColor, +} from '../canvasApi' + +/** + * @class + * SevenSegDisplay + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @category modules + */ +export default class SevenSegDisplay extends CircuitElement { + constructor(x, y, scope = globalScope, color = 'Red') { + super(x, y, scope, 'RIGHT', 1) + /* this is done in this.baseSetup() now + this.scope['SevenSegDisplay'].push(this); + */ + this.fixedBitWidth = true + this.directionFixed = true + this.setDimensions(30, 50) + + this.g = new Node(-20, -50, 0, this) + this.f = new Node(-10, -50, 0, this) + this.a = new Node(+10, -50, 0, this) + this.b = new Node(+20, -50, 0, this) + this.e = new Node(-20, +50, 0, this) + this.d = new Node(-10, +50, 0, this) + this.c = new Node(+10, +50, 0, this) + this.dot = new Node(+20, +50, 0, this) + this.direction = 'RIGHT' + this.color = color + this.actualColor = color + } + + /** + * @memberof SevenSegDisplay + * fn to change the color of SevenSegmentDisplay + * @return {JSON} + */ + changeColor(value) { + if (validColor(value)) { + if (value.trim() === '') { + this.color = 'Red' + this.actualColor = 'rgba(255, 0, 0, 1)' + } else { + this.color = value + const temp = colorToRGBA(value) + this.actualColor = `rgba(${temp[0]},${temp[1]},${temp[2]}, ${temp[3]})` + } + } + } + /** + * @memberof SevenSegDisplay + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.color], + nodes: { + g: findNode(this.g), + f: findNode(this.f), + a: findNode(this.a), + b: findNode(this.b), + d: findNode(this.d), + e: findNode(this.e), + c: findNode(this.c), + dot: findNode(this.dot), + }, + } + return data + } + + /** + * @memberof SevenSegDisplay + * helper function to create save Json Data of object + */ + customDrawSegment(x1, y1, x2, y2, color) { + if (color === undefined) color = 'lightgrey' + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = color + ctx.lineWidth = correctWidth(5) + const xx = this.x + const yy = this.y + moveTo(ctx, x1, y1, xx, yy, this.direction) + lineTo(ctx, x2, y2, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + } + + /** + * @memberof SevenSegDisplay + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + const xx = this.x + const yy = this.y + this.customDrawSegment( + 18, + -3, + 18, + -38, + ['lightgrey', this.actualColor][this.b.value] + ) + this.customDrawSegment( + 18, + 3, + 18, + 38, + ['lightgrey', this.actualColor][this.c.value] + ) + this.customDrawSegment( + -18, + -3, + -18, + -38, + ['lightgrey', this.actualColor][this.f.value] + ) + this.customDrawSegment( + -18, + 3, + -18, + 38, + ['lightgrey', this.actualColor][this.e.value] + ) + this.customDrawSegment( + -17, + -38, + 17, + -38, + ['lightgrey', this.actualColor][this.a.value] + ) + this.customDrawSegment( + -17, + 0, + 17, + 0, + ['lightgrey', this.actualColor][this.g.value] + ) + this.customDrawSegment( + -15, + 38, + 17, + 38, + ['lightgrey', this.actualColor][this.d.value] + ) + ctx.beginPath() + const dotColor = + ['lightgrey', this.actualColor][this.dot.value] || 'lightgrey' + ctx.strokeStyle = dotColor + rect(ctx, xx + 22, yy + 42, 2, 2) + ctx.stroke() + } + + subcircuitDrawSegment(x1, y1, x2, y2, color, xxSegment, yySegment) { + if (color == undefined) color = 'lightgrey' + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = color + ctx.lineWidth = correctWidth(3) + var xx = xxSegment + var yy = yySegment + moveTo(ctx, x1, y1, xx, yy, this.direction) + lineTo(ctx, x2, y2, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + } + + // Draws the element in the subcuircuit. Used in layout mode + subcircuitDraw(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + + var xx = this.subcircuitMetadata.x + xOffset + var yy = this.subcircuitMetadata.y + yOffset + + this.subcircuitDrawSegment( + 10, + -20, + 10, + -38, + ['lightgrey', this.actualColor][this.b.value], + xx, + yy + ) + this.subcircuitDrawSegment( + 10, + -17, + 10, + 1, + ['lightgrey', this.actualColor][this.c.value], + xx, + yy + ) + this.subcircuitDrawSegment( + -10, + -20, + -10, + -38, + ['lightgrey', this.actualColor][this.f.value], + xx, + yy + ) + this.subcircuitDrawSegment( + -10, + -17, + -10, + 1, + ['lightgrey', this.actualColor][this.e.value], + xx, + yy + ) + this.subcircuitDrawSegment( + -8, + -38, + 8, + -38, + ['lightgrey', this.actualColor][this.a.value], + xx, + yy + ) + this.subcircuitDrawSegment( + -8, + -18, + 8, + -18, + ['lightgrey', this.actualColor][this.g.value], + xx, + yy + ) + this.subcircuitDrawSegment( + -8, + 1, + 8, + 1, + ['lightgrey', this.actualColor][this.d.value], + xx, + yy + ) + + ctx.beginPath() + var dotColor = + ['lightgrey', this.actualColor][this.dot.value] || 'lightgrey' + ctx.strokeStyle = dotColor + rect(ctx, xx + 13, yy + 5, 1, 1) + ctx.stroke() + + ctx.beginPath() + ctx.strokeStyle = 'black' + ctx.lineWidth = correctWidth(1) + rect2(ctx, -15, -42, 33, 51, xx, yy, this.direction) + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected == this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = 'rgba(255, 255, 32,0.6)' + ctx.fill() + } + } + generateVerilog() { + return ` + always @ (*) + $display("SevenSegDisplay:${this.verilogLabel}.abcdefg. = %b%b%b%b%b%b%b%b}", + ${this.a.verilogLabel}, ${this.b.verilogLabel}, ${this.c.verilogLabel}, ${this.d.verilogLabel}, ${this.e.verilogLabel}, ${this.f.verilogLabel}, ${this.g.verilogLabel}, ${this.dot.verilogLabel});` + } +} + +/** + * @memberof SevenSegDisplay + * Help Tip + * @type {string} + * @category modules + */ +SevenSegDisplay.prototype.tooltipText = + 'Seven Display ToolTip: Consists of 7+1 single bit inputs.' + +/** + * @memberof SevenSegDisplay + * Help URL + * @type {string} + * @category modules + */ +SevenSegDisplay.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/3output?id=sevensegdisplay' +SevenSegDisplay.prototype.objectType = 'SevenSegDisplay' +SevenSegDisplay.prototype.canShowInSubcircuit = true +SevenSegDisplay.prototype.layoutProperties = { + rightDimensionX: 20, + leftDimensionX: 15, + upDimensionY: 42, + downDimensionY: 10, +} + +/** + * @memberof SevenSegDisplay + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +SevenSegDisplay.prototype.mutableProperties = { + color: { + name: 'Color: ', + type: 'text', + func: 'changeColor', + }, +} diff --git a/v0/src/simulator/src/modules/SixteenSegDisplay.js b/v0/src/simulator/src/modules/SixteenSegDisplay.js new file mode 100644 index 00000000..944ba443 --- /dev/null +++ b/v0/src/simulator/src/modules/SixteenSegDisplay.js @@ -0,0 +1,489 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { + colorToRGBA, + correctWidth, + lineTo, + moveTo, + rect, + rect2, + validColor, +} from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * SixteenSegDisplay + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @category modules + */ +export default class SixteenSegDisplay extends CircuitElement { + constructor(x, y, scope = globalScope, color = 'Red') { + super(x, y, scope, 'RIGHT', 16) + /* this is done in this.baseSetup() now + this.scope['SixteenSegDisplay'].push(this); + */ + this.fixedBitWidth = true + this.directionFixed = true + this.setDimensions(30, 50) + this.input1 = new Node(0, -50, 0, this, 16) + this.dot = new Node(0, 50, 0, this, 1) + this.direction = 'RIGHT' + this.color = color + this.actualColor = color + } + + /** + * @memberof SixteenSegDisplay + * fn to change the color of SixteenSegmentDisplay + * @return {JSON} + */ + changeColor(value) { + if (validColor(value)) { + if (value.trim() === '') { + this.color = 'Red' + this.actualColor = 'rgba(255, 0, 0, 1)' + } else { + this.color = value + const temp = colorToRGBA(value) + this.actualColor = `rgba(${temp[0]},${temp[1]},${temp[2]}, ${temp[3]})` + } + } + } + + /** + * @memberof SixteenSegDisplay + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.color], + nodes: { + input1: findNode(this.input1), + dot: findNode(this.dot), + }, + } + return data + } + + /** + * @memberof SixteenSegDisplay + * function to draw element + */ + customDrawSegment(x1, y1, x2, y2, color) { + if (color === undefined) color = 'lightgrey' + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = color + ctx.lineWidth = correctWidth(4) + const xx = this.x + const yy = this.y + moveTo(ctx, x1, y1, xx, yy, this.direction) + lineTo(ctx, x2, y2, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + } + + /** + * @memberof SixteenSegDisplay + * function to draw element + */ + customDrawSegmentSlant(x1, y1, x2, y2, color) { + if (color === undefined) color = 'lightgrey' + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = color + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + moveTo(ctx, x1, y1, xx, yy, this.direction) + lineTo(ctx, x2, y2, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + } + + /** + * @memberof SixteenSegDisplay + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + const xx = this.x + const yy = this.y + const color = ['lightgrey', this.actualColor] + const { value } = this.input1 + this.customDrawSegment( + -20, + -38, + 0, + -38, + ['lightgrey', this.actualColor][(value >> 15) & 1] + ) // a1 + this.customDrawSegment( + 20, + -38, + 0, + -38, + ['lightgrey', this.actualColor][(value >> 14) & 1] + ) // a2 + this.customDrawSegment( + 21.5, + -2, + 21.5, + -36, + ['lightgrey', this.actualColor][(value >> 13) & 1] + ) // b + this.customDrawSegment( + 21.5, + 2, + 21.5, + 36, + ['lightgrey', this.actualColor][(value >> 12) & 1] + ) // c + this.customDrawSegment( + -20, + 38, + 0, + 38, + ['lightgrey', this.actualColor][(value >> 11) & 1] + ) // d1 + this.customDrawSegment( + 20, + 38, + 0, + 38, + ['lightgrey', this.actualColor][(value >> 10) & 1] + ) // d2 + this.customDrawSegment( + -21.5, + 2, + -21.5, + 36, + ['lightgrey', this.actualColor][(value >> 9) & 1] + ) // e + this.customDrawSegment( + -21.5, + -36, + -21.5, + -2, + ['lightgrey', this.actualColor][(value >> 8) & 1] + ) // f + this.customDrawSegment( + -20, + 0, + 0, + 0, + ['lightgrey', this.actualColor][(value >> 7) & 1] + ) // g1 + this.customDrawSegment( + 20, + 0, + 0, + 0, + ['lightgrey', this.actualColor][(value >> 6) & 1] + ) // g2 + this.customDrawSegmentSlant( + 0, + 0, + -21, + -37, + ['lightgrey', this.actualColor][(value >> 5) & 1] + ) // h + this.customDrawSegment( + 0, + -2, + 0, + -36, + ['lightgrey', this.actualColor][(value >> 4) & 1] + ) // i + this.customDrawSegmentSlant( + 0, + 0, + 21, + -37, + ['lightgrey', this.actualColor][(value >> 3) & 1] + ) // j + this.customDrawSegmentSlant( + 0, + 0, + 21, + 37, + ['lightgrey', this.actualColor][(value >> 2) & 1] + ) // k + this.customDrawSegment( + 0, + 2, + 0, + 36, + ['lightgrey', this.actualColor][(value >> 1) & 1] + ) // l + this.customDrawSegmentSlant( + 0, + 0, + -21, + 37, + ['lightgrey', this.actualColor][(value >> 0) & 1] + ) // m + ctx.beginPath() + const dotColor = + ['lightgrey', this.actualColor][this.dot.value] || 'lightgrey' + ctx.strokeStyle = dotColor + rect(ctx, xx + 22, yy + 42, 2, 2) + ctx.stroke() + } + + subcircuitDrawSegment(x1, y1, x2, y2, color, xxSegment, yySegment) { + if (color == undefined) color = 'lightgrey' + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = color + ctx.lineWidth = correctWidth(3) + var xx = xxSegment + var yy = yySegment + moveTo(ctx, x1, y1, xx, yy, this.direction) + lineTo(ctx, x2, y2, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + } + + subcircuitDrawSegmentSlant(x1, y1, x2, y2, color, xxSegment, yySegment) { + if (color == undefined) color = 'lightgrey' + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = color + ctx.lineWidth = correctWidth(2) + var xx = xxSegment + var yy = yySegment + moveTo(ctx, x1, y1, xx, yy, this.direction) + lineTo(ctx, x2, y2, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + } + + // Draws the element in the subcircuit. Used in layout mode + subcircuitDraw(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + + var xx = this.subcircuitMetadata.x + xOffset + var yy = this.subcircuitMetadata.y + yOffset + + var color = ['lightgrey', this.actualColor] + var value = this.input1.value + + this.subcircuitDrawSegment( + -10, + -38, + 0, + -38, + ['lightgrey', this.actualColor][(value >> 15) & 1], + xx, + yy + ) //a1 + this.subcircuitDrawSegment( + 10, + -38, + 0, + -38, + ['lightgrey', this.actualColor][(value >> 14) & 1], + xx, + yy + ) //a2 + this.subcircuitDrawSegment( + 11.5, + -19, + 11.5, + -36, + ['lightgrey', this.actualColor][(value >> 13) & 1], + xx, + yy + ) //b + this.subcircuitDrawSegment( + 11.5, + 2, + 11.5, + -15, + ['lightgrey', this.actualColor][(value >> 12) & 1], + xx, + yy + ) //c + this.subcircuitDrawSegment( + -10, + 4, + 0, + 4, + ['lightgrey', this.actualColor][(value >> 11) & 1], + xx, + yy + ) //d1 + this.subcircuitDrawSegment( + 10, + 4, + 0, + 4, + ['lightgrey', this.actualColor][(value >> 10) & 1], + xx, + yy + ) //d2 + this.subcircuitDrawSegment( + -11.5, + 2, + -11.5, + -15, + ['lightgrey', this.actualColor][(value >> 9) & 1], + xx, + yy + ) //e + this.subcircuitDrawSegment( + -11.5, + -36, + -11.5, + -19, + ['lightgrey', this.actualColor][(value >> 8) & 1], + xx, + yy + ) //f + this.subcircuitDrawSegment( + -10, + -17, + 0, + -17, + ['lightgrey', this.actualColor][(value >> 7) & 1], + xx, + yy + ) //g1 + this.subcircuitDrawSegment( + 10, + -17, + 0, + -17, + ['lightgrey', this.actualColor][(value >> 6) & 1], + xx, + yy + ) //g2 + this.subcircuitDrawSegmentSlant( + 0, + -17, + -9, + -36, + ['lightgrey', this.actualColor][(value >> 5) & 1], + xx, + yy + ) //h + this.subcircuitDrawSegment( + 0, + -36, + 0, + -19, + ['lightgrey', this.actualColor][(value >> 4) & 1], + xx, + yy + ) //i + this.subcircuitDrawSegmentSlant( + 0, + -17, + 9, + -36, + ['lightgrey', this.actualColor][(value >> 3) & 1], + xx, + yy + ) //j + this.subcircuitDrawSegmentSlant( + 0, + -17, + 9, + 0, + ['lightgrey', this.actualColor][(value >> 2) & 1], + xx, + yy + ) //k + this.subcircuitDrawSegment( + 0, + -17, + 0, + 2, + ['lightgrey', this.actualColor][(value >> 1) & 1], + xx, + yy + ) //l + this.subcircuitDrawSegmentSlant( + 0, + -17, + -9, + 0, + ['lightgrey', this.actualColor][(value >> 0) & 1], + xx, + yy + ) //m + + ctx.beginPath() + var dotColor = + ['lightgrey', this.actualColor][this.dot.value] || 'lightgrey' + ctx.strokeStyle = dotColor + rect(ctx, xx + 13, yy + 5, 1, 1) + ctx.stroke() + + ctx.beginPath() + ctx.strokeStyle = 'black' + ctx.lineWidth = correctWidth(1) + rect2(ctx, -15, -42, 33, 51, xx, yy, this.direction) + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected == this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = 'rgba(255, 255, 32,0.6)' + ctx.fill() + } + } + generateVerilog() { + return ` + always @ (*) + $display("SixteenSegDisplay:{${this.input1.verilogLabel},${this.dot.verilogLabel}} = {%16b,%1b}", ${this.input1.verilogLabel}, ${this.dot.verilogLabel});` + } +} + +/** + * @memberof SixteenSegDisplay + * Help Tip + * @type {string} + * @category modules + */ +SixteenSegDisplay.prototype.tooltipText = + 'Sixteen Display ToolTip: Consists of 16+1 bit inputs.' + +/** + * @memberof SixteenSegDisplay + * Help URL + * @type {string} + * @category modules + */ +SixteenSegDisplay.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/3output?id=sixteensegdisplay' +SixteenSegDisplay.prototype.objectType = 'SixteenSegDisplay' +SixteenSegDisplay.prototype.canShowInSubcircuit = true +SixteenSegDisplay.prototype.layoutProperties = { + rightDimensionX: 20, + leftDimensionX: 15, + upDimensionY: 42, + downDimensionY: 10, +} + +/** + * @memberof SixteenSegDisplay + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +SixteenSegDisplay.prototype.mutableProperties = { + color: { + name: 'Color: ', + type: 'text', + func: 'changeColor', + }, +} diff --git a/v0/src/simulator/src/modules/Splitter.js b/v0/src/simulator/src/modules/Splitter.js new file mode 100644 index 00000000..ffcb296c --- /dev/null +++ b/v0/src/simulator/src/modules/Splitter.js @@ -0,0 +1,359 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText2 } from '../canvasApi' +import { colors } from '../themer/themer' + +function extractBits(num, start, end) { + return (num << (32 - end)) >>> (32 - (end - start + 1)) +} + +/** + * @class + * Splitter + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @param {number=} bitWidthSplit - number of input nodes + * @category modules + */ +export default class Splitter extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = undefined, + bitWidthSplit = undefined + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Splitter'].push(this); + */ + this.rectangleObject = false + + this.bitWidthSplit = + bitWidthSplit || + ( + prompt('Enter bitWidth Split') || + `${'1 '.repeat((this.bitWidth || 1) - 1)}1` + ) + .split(' ') + .filter((lambda) => lambda !== '') + .map((lambda) => parseInt(lambda, 10) || 1) + this.splitCount = this.bitWidthSplit.length + + this.setDimensions(10, (this.splitCount - 1) * 10 + 10) + this.yOffset = (this.splitCount / 2 - 1) * 20 + + this.inp1 = new Node(-10, 10 + this.yOffset, 0, this, this.bitWidth) + + this.outputs = [] + // this.prevOutValues=new Array(this.splitCount) + for (let i = 0; i < this.splitCount; i++) { + this.outputs.push( + new Node( + 20, + i * 20 - this.yOffset - 20, + 0, + this, + this.bitWidthSplit[i] + ) + ) + } + + this.prevInpValue = undefined + } + + /** + * @memberof Splitter + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.bitWidth, + this.bitWidthSplit, + ], + nodes: { + outputs: this.outputs.map(findNode), + inp1: findNode(this.inp1), + }, + } + return data + } + + /** + * @memberof Splitter + * fn to remove proporgation delay. + * @return {JSON} + */ + removePropagation() { + if (this.inp1.value === undefined) { + let i = 0 + for (i = 0; i < this.outputs.length; i++) { + // False Hit + if (this.outputs[i].value === undefined) return + } + for (i = 0; i < this.outputs.length; i++) { + if (this.outputs[i].value !== undefined) { + this.outputs[i].value = undefined + simulationArea.simulationQueue.add(this.outputs[i]) + } + } + } else if (this.inp1.value !== undefined) { + this.inp1.value = undefined + simulationArea.simulationQueue.add(this.inp1) + } + this.prevInpValue = undefined + } + + /** + * @memberof Splitter + * Checks if the element is resolvable + * @return {boolean} + */ + isResolvable() { + let resolvable = false + if (this.inp1.value !== this.prevInpValue) { + if (this.inp1.value !== undefined) return true + return false + } + let i + for (i = 0; i < this.splitCount; i++) { + if (this.outputs[i].value === undefined) break + } + if (i === this.splitCount) resolvable = true + return resolvable + } + + /** + * @memberof Splitter + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + if ( + this.inp1.value !== undefined && + this.inp1.value !== this.prevInpValue + ) { + let bitCount = 1 + for (let i = 0; i < this.splitCount; i++) { + const bitSplitValue = extractBits( + this.inp1.value, + bitCount, + bitCount + this.bitWidthSplit[i] - 1 + ) + if (this.outputs[i].value !== bitSplitValue) { + if (this.outputs[i].value !== bitSplitValue) { + this.outputs[i].value = bitSplitValue + simulationArea.simulationQueue.add(this.outputs[i]) + } + } + bitCount += this.bitWidthSplit[i] + } + } else { + let n = 0 + for (let i = this.splitCount - 1; i >= 0; i--) { + n <<= this.bitWidthSplit[i] + n += this.outputs[i].value + } + if (this.inp1.value !== n >>> 0) { + this.inp1.value = n >>> 0 + simulationArea.simulationQueue.add(this.inp1) + } + // else if (this.inp1.value !== n) { + // } + } + this.prevInpValue = this.inp1.value + } + + /** + * @memberof Splitter + * fn to reset values of splitter + */ + reset() { + this.prevInpValue = undefined + } + + /** + * @memberof Splitter + * fn to process verilog of the element + * @return {JSON} + */ + processVerilog() { + if ( + this.inp1.verilogLabel !== '' && + this.outputs[0].verilogLabel === '' + ) { + let bitCount = 0 + for (let i = 0; i < this.splitCount; i++) { + // let bitSplitValue = extractBits(this.inp1.value, bitCount, bitCount + this.bitWidthSplit[i] - 1); + if (this.bitWidthSplit[i] > 1) { + const label = `${this.inp1.verilogLabel}[ ${ + bitCount + this.bitWidthSplit[i] - 1 + }:${bitCount}]` + } else { + const label = `${this.inp1.verilogLabel}[${bitCount}]` + } + if (this.outputs[i].verilogLabel !== label) { + this.outputs[i].verilogLabel = label + this.scope.stack.push(this.outputs[i]) + } + bitCount += this.bitWidthSplit[i] + } + } else if ( + this.inp1.verilogLabel === '' && + this.outputs[0].verilogLabel !== '' + ) { + const label = `{${this.outputs + .map((x) => x.verilogLabel) + .join(',')}}` + if (this.inp1.verilogLabel !== label) { + this.inp1.verilogLabel = label + this.scope.stack.push(this.inp1) + } + } + } + + /** + * @memberof Splitter + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + // + ctx.strokeStyle = [colors['splitter'], 'brown'][ + ((this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this)) + 0 + ] + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + ctx.beginPath() + moveTo(ctx, -10, 10 + this.yOffset, xx, yy, this.direction) + lineTo(ctx, 0, 0 + this.yOffset, xx, yy, this.direction) + lineTo( + ctx, + 0, + -20 * (this.splitCount - 1) + this.yOffset, + xx, + yy, + this.direction + ) + let bitCount = 0 + for (let i = this.splitCount - 1; i >= 0; i--) { + moveTo(ctx, 0, -20 * i + this.yOffset, xx, yy, this.direction) + lineTo(ctx, 20, -20 * i + this.yOffset, xx, yy, this.direction) + } + ctx.stroke() + ctx.beginPath() + ctx.fillStyle = colors['text'] + for (let i = this.splitCount - 1; i >= 0; i--) { + var splitLabel + if (this.bitWidthSplit[this.splitCount - i - 1] == 1) + splitLabel = `${bitCount}` + else + splitLabel = `${bitCount}:${ + bitCount + this.bitWidthSplit[this.splitCount - i - 1] - 1 + }` + + fillText2( + ctx, + splitLabel, + 16, + -20 * i + this.yOffset + 10, + xx, + yy, + this.direction + ) + bitCount += this.bitWidthSplit[this.splitCount - i - 1] + } + ctx.fill() + } + + processVerilog() { + // Combiner + if (this.inp1.verilogLabel == '') { + this.isSplitter = false + this.inp1.verilogLabel = this.verilogLabel + '_cmb' + if ( + !this.scope.verilogWireList[this.bitWidth].contains( + this.inp1.verilogLabel + ) + ) + this.scope.verilogWireList[this.bitWidth].push( + this.inp1.verilogLabel + ) + this.scope.stack.push(this.inp1) + return + } + + // Splitter + this.isSplitter = true + for (var j = 0; j < this.outputs.length; j++) { + var bitCount = 0 + var inpLabel = this.inp1.verilogLabel + // Already Split Regex + var re = /^(.*)\[(\d*):(\d*)\]$/ + if (re.test(inpLabel)) { + var matches = inpLabel.match(re) + inpLabel = matches[1] + bitCount = parseInt(matches[3]) + } + for (var i = 0; i < this.splitCount; i++) { + if (this.bitWidthSplit[i] > 1) + var label = + inpLabel + + '[' + + (bitCount + this.bitWidthSplit[i] - 1) + + ':' + + bitCount + + ']' + else var label = inpLabel + '[' + bitCount + ']' + if (this.outputs[i].verilogLabel != label) { + this.outputs[i].verilogLabel = label + this.scope.stack.push(this.outputs[i]) + } + bitCount += this.bitWidthSplit[i] + } + } + } + //added to generate Splitter INPUTS + generateVerilog() { + var res = '' + if (!this.isSplitter) { + res += 'assign ' + this.inp1.verilogLabel + ' = {' + for (var i = this.outputs.length - 1; i > 0; i--) + res += this.outputs[i].verilogLabel + ',' + res += this.outputs[0].verilogLabel + '};' + } + return res + } +} + +/** + * @memberof Splitter + * Help Tip + * @type {string} + * @category modules + */ +Splitter.prototype.tooltipText = + 'Splitter ToolTip: Split multiBit Input into smaller bitwidths or vice versa.' + +/** + * @memberof Splitter + * Help URL + * @type {string} + * @category modules + */ +Splitter.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/8misc?id=splitter' +Splitter.prototype.objectType = 'Splitter' diff --git a/v0/src/simulator/src/modules/SquareRGBLed.js b/v0/src/simulator/src/modules/SquareRGBLed.js new file mode 100644 index 00000000..b93e0bb6 --- /dev/null +++ b/v0/src/simulator/src/modules/SquareRGBLed.js @@ -0,0 +1,215 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, rect2 } from '../canvasApi' + +/** + * @class + * SquareRGBLed + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} pinLength - pins per node. + * @category modules + */ +export default class SquareRGBLed extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'UP', pinLength = 1) { + super(x, y, scope, dir, 8) + /* this is done in this.baseSetup() now + this.scope['SquareRGBLed'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 15) + this.pinLength = pinLength === undefined ? 1 : pinLength + const nodeX = -10 - 10 * pinLength + this.inp1 = new Node(nodeX, -10, 0, this, 8, 'R') + this.inp2 = new Node(nodeX, 0, 0, this, 8, 'G') + this.inp3 = new Node(nodeX, 10, 0, this, 8, 'B') + this.inp = [this.inp1, this.inp2, this.inp3] + this.labelDirection = 'UP' + this.fixedBitWidth = true + + // eslint-disable-next-line no-shadow + this.changePinLength = function (pinLength) { + if (pinLength === undefined) return + pinLength = parseInt(pinLength, 10) + if (pinLength < 0 || pinLength > 1000) return + + // Calculate the new position of the LED, so the nodes will stay in the same place. + const diff = 10 * (pinLength - this.pinLength) + // eslint-disable-next-line no-nested-ternary + const diffX = + this.direction === 'LEFT' + ? -diff + : this.direction === 'RIGHT' + ? diff + : 0 + // eslint-disable-next-line no-nested-ternary + const diffY = + this.direction === 'UP' + ? -diff + : this.direction === 'DOWN' + ? diff + : 0 + + // Build a new LED with the new values; preserve label properties too. + const obj = new SquareRGBLed( + this.x + diffX, + this.y + diffY, + this.scope, + this.direction, + pinLength + ) + obj.label = this.label + obj.labelDirection = this.labelDirection + + this.cleanDelete() + simulationArea.lastSelected = obj + return obj + } + + this.mutableProperties = { + pinLength: { + name: 'Pin Length', + type: 'number', + max: '1000', + min: '0', + func: 'changePinLength', + }, + } + } + + /** + * @memberof SquareRGBLed + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.pinLength], + nodes: { + inp1: findNode(this.inp1), + inp2: findNode(this.inp2), + inp3: findNode(this.inp3), + }, + } + return data + } + + /** + * @memberof SquareRGBLed + * function to draw element + */ + customDraw() { + const ctx = simulationArea.context + const xx = this.x + const yy = this.y + const r = this.inp1.value + const g = this.inp2.value + const b = this.inp3.value + + const colors = ['rgb(174,20,20)', 'rgb(40,174,40)', 'rgb(0,100,255)'] + for (let i = 0; i < 3; i++) { + const x = -10 - 10 * this.pinLength + const y = i * 10 - 10 + ctx.lineWidth = correctWidth(3) + + // A gray line, which makes it easy on the eyes when the pin length is large + ctx.beginPath() + ctx.lineCap = 'butt' + ctx.strokeStyle = 'rgb(227, 228, 229)' + moveTo(ctx, -15, y, xx, yy, this.direction) + lineTo(ctx, x + 10, y, xx, yy, this.direction) + ctx.stroke() + + // A colored line, so people know which pin does what. + ctx.lineCap = 'round' + ctx.beginPath() + ctx.strokeStyle = colors[i] + moveTo(ctx, x + 10, y, xx, yy, this.direction) + lineTo(ctx, x, y, xx, yy, this.direction) + ctx.stroke() + } + + ctx.strokeStyle = '#d3d4d5' + ctx.fillStyle = + r === undefined && g === undefined && b === undefined + ? 'rgb(227, 228, 229)' + : `rgb(${r || 0}, ${g || 0}, ${b || 0})` + ctx.lineWidth = correctWidth(1) + ctx.beginPath() + rect2(ctx, -15, -15, 30, 30, xx, yy, this.direction) + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = 'rgba(255, 255, 32)' + } + + ctx.fill() + } + // Draws the element in the subcuircuit. Used in layout mode + subcircuitDraw(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + var xx = this.subcircuitMetadata.x + xOffset + var yy = this.subcircuitMetadata.y + yOffset + var r = this.inp1.value + var g = this.inp2.value + var b = this.inp3.value + + ctx.strokeStyle = '#d3d4d5' + ctx.fillStyle = + r === undefined && g === undefined && b === undefined + ? 'rgb(227, 228, 229)' + : 'rgb(' + (r || 0) + ', ' + (g || 0) + ', ' + (b || 0) + ')' + ctx.lineWidth = correctWidth(1) + ctx.beginPath() + rect2(ctx, 0, 0, 15, 15, xx, yy, this.direction) + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected == this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = 'rgba(255, 255, 32)' + } + + ctx.fill() + } + + generateVerilog() { + return this.generateVerilog.call(this) + } +} + +/** + * @memberof SquareRGBLed + * Help Tip + * @type {string} + * @category modules + */ +SquareRGBLed.prototype.tooltipText = + 'Square RGB Led ToolTip: RGB Led inputs 8 bit values for the colors RED, GREEN and BLUE.' + +/** + * @memberof SquareRGBLed + * Help URL + * @type {string} + * @category modules + */ +SquareRGBLed.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/3output?id=squarergbled' +SquareRGBLed.prototype.objectType = 'SquareRGBLed' +SquareRGBLed.prototype.canShowInSubcircuit = true +SquareRGBLed.prototype.layoutProperties = { + rightDimensionX: 15, + leftDimensionX: 0, + upDimensionY: 15, + downDimensionY: 0, +} diff --git a/v0/src/simulator/src/modules/Stepper.js b/v0/src/simulator/src/modules/Stepper.js new file mode 100644 index 00000000..c6cfbd3f --- /dev/null +++ b/v0/src/simulator/src/modules/Stepper.js @@ -0,0 +1,102 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { fillText } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * Stepper + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bitwidth of element + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Stepper extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 8) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Stepper'].push(this); + */ + this.setDimensions(20, 20) + + this.output1 = new Node(20, 0, 1, this, bitWidth) + this.state = 0 + } + + /** + * @memberof Stepper + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + var data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + output1: findNode(this.output1), + }, + values: { + state: this.state, + }, + } + return data + } + + /** + * @memberof Stepper + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.font = '20px Raleway' + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + fillText(ctx, this.state.toString(16), this.x, this.y + 5) + ctx.fill() + } + + /** + * @memberof Stepper + * resolve output values based on inputData + */ + resolve() { + this.state = Math.min(this.state, (1 << this.bitWidth) - 1) + this.output1.value = this.state + simulationArea.simulationQueue.add(this.output1) + } + + /** + * Listener function for increasing value of state + * @memberof Stepper + * @param {string} key - the key pressed + */ + keyDown2(key) { + if (this.state < 1 << this.bitWidth && (key === '+' || key === '=')) + this.state++ + if (this.state > 0 && (key === '_' || key === '-')) this.state-- + } +} + +/** + * @memberof Stepper + * Help Tip + * @type {string} + * @category modules + */ +Stepper.prototype.tooltipText = + 'Stepper ToolTip: Increase/Decrease value by selecting the stepper and using +/- keys.' + +/** + * @memberof Stepper + * Help URL + * @type {string} + * @category modules + */ +Stepper.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/2input?id=stepper' +Stepper.prototype.objectType = 'Stepper' diff --git a/v0/src/simulator/src/modules/Text.js b/v0/src/simulator/src/modules/Text.js new file mode 100644 index 00000000..7248c575 --- /dev/null +++ b/v0/src/simulator/src/modules/Text.js @@ -0,0 +1,208 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { rect2, fillText } from '../canvasApi' +/** + * @class + * Text + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} label - label of element + * @param {number=} fontSize - font size + * @category modules + */ +import { colors } from '../themer/themer' +import { copy, paste } from '../events' + +export default class Text extends CircuitElement { + constructor(x, y, scope = globalScope, label = '', fontSize = 14) { + super(x, y, scope, 'RIGHT', 1) + /* this is done in this.baseSetup() now + this.scope['Text'].push(this); + */ + // this.setDimensions(15, 15); + this.fixedBitWidth = true + this.directionFixed = true + this.labelDirectionFixed = true + this.setLabel(label) + this.setFontSize(fontSize) + } + + /** + * @memberof Text + * function for setting text inside the element + * @param {string=} str - the label + */ + setLabel(str = '') { + this.label = str + var ctx = simulationArea.context + ctx.font = `${this.fontSize}px Raleway` + this.leftDimensionX = 10 + this.rightDimensionX = ctx.measureText(this.label).width + 10 + this.setTextboxSize() + } + + /** + * @memberof Text + * function for setting font size inside the element + * @param {number=} str - the font size + */ + setFontSize(fontSize = 14) { + this.fontSize = fontSize + var ctx = simulationArea.context + ctx.font = `${this.fontSize}px Raleway` + this.setTextboxSize() + } + + setTextboxSize() { + this.leftDimensionX = 10 + var maxWidth = 0 + var labels = this.label.split('\n') + var ctx = simulationArea.context + labels.forEach( + (l) => (maxWidth = Math.max(maxWidth, ctx.measureText(l).width)) + ) + this.rightDimensionX = maxWidth + 10 + this.downDimensionY = labels.length * this.fontSize + } + + /** + * @memberof Text + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.label, this.fontSize], + } + return data + } + + /** + * @memberof Text + * Listener function for Text Box + * @param {string} key - the label + */ + keyDown(key) { + if (simulationArea.controlDown && (key === 'c' || key === 'C')) { + const textToPutOnClipboard = copy([this]) + navigator.clipboard.writeText(textToPutOnClipboard) + localStorage.setItem('clipboardData', textToPutOnClipboard) + } else if (simulationArea.controlDown && (key === 'v' || key === 'V')) { + paste(localStorage.getItem('clipboardData')) + } else if (key.length === 1) { + if (this.label === 'Enter Text Here') { + this.setLabel(key) + } else { + this.setLabel(this.label + key) + } + } else if (key === 'Backspace') { + if (this.label === 'Enter Text Here') { + this.setLabel('') + } else { + this.setLabel(this.label.slice(0, -1)) + } + } else if (key === 'Enter') { + if (this.label === 'Enter Text Here') { + this.setLabel('') + } else { + this.setLabel(this.label + '\n') + } + } + $('[name=setLabel]').val(this.label) + } + + /** + * @memberof Text + * Function for drawing text box + */ + draw() { + // + if (this.label.length === 0 && simulationArea.lastSelected !== this) + this.delete() + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = 1 + const xx = this.x + const yy = this.y + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.beginPath() + ctx.fillStyle = colors['fill'] + const magicDimension = this.fontSize - 14 + rect2( + ctx, + -this.leftDimensionX, + -this.upDimensionY - magicDimension, + this.leftDimensionX + this.rightDimensionX, + this.upDimensionY + this.downDimensionY + magicDimension, + this.x, + this.y, + 'RIGHT' + ) + ctx.fillStyle = 'rgba(255, 255, 32,0.1)' + ctx.fill() + ctx.stroke() + } + ctx.beginPath() + ctx.textAlign = 'left' + ctx.fillStyle = colors['text'] + var labels = this.label.split('\n') + for (var i = 0; i < labels.length; i++) { + fillText( + ctx, + labels[i], + xx, + yy + 5 + i * this.fontSize, + this.fontSize + ) + } + ctx.fill() + } +} + +/** + * @memberof Text + * Help Tip + * @type {string} + * @category modules + */ +Text.prototype.tooltipText = 'Text ToolTip: Use this to document your circuit.' + +/** + * @memberof Text + * Help URL + * @type {string} + * @category modules + */ +Text.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/7annotation?id=text' + +/** + * @memberof Text + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +Text.prototype.mutableProperties = { + fontSize: { + name: 'Font size: ', + type: 'number', + max: '84', + min: '14', + func: 'setFontSize', + }, + label: { + name: 'Text: ', + type: 'textarea', + func: 'setLabel', + }, +} +Text.prototype.disableLabel = true +Text.prototype.objectType = 'Text' +Text.prototype.propagationDelayFixed = true diff --git a/v0/src/simulator/src/modules/TriState.js b/v0/src/simulator/src/modules/TriState.js new file mode 100644 index 00000000..e4048fc9 --- /dev/null +++ b/v0/src/simulator/src/modules/TriState.js @@ -0,0 +1,129 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, arc } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * TriState + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class TriState extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['TriState'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 15) + + this.inp1 = new Node(-10, 0, 0, this) + this.output1 = new Node(20, 0, 1, this) + this.state = new Node(0, 0, 0, this, 1, 'Enable') + } + + // TriState.prototype.propagationDelay=10000; + + /** + * @memberof TriState + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + output1: findNode(this.output1), + inp1: findNode(this.inp1), + state: findNode(this.state), + }, + } + return data + } + + /** + * @memberof TriState + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.inp1.bitWidth = bitWidth + this.output1.bitWidth = bitWidth + this.bitWidth = bitWidth + } + + /** + * @memberof TriState + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + + if (this.state.value === 1) { + if (this.output1.value !== this.inp1.value) { + this.output1.value = this.inp1.value // >>>0)<<(32-this.bitWidth))>>>(32-this.bitWidth); + simulationArea.simulationQueue.add(this.output1) + } + simulationArea.contentionPending.clean(this) + } else if ( + this.output1.value !== undefined && + !simulationArea.contentionPending.contains(this) + ) { + this.output1.value = undefined + simulationArea.simulationQueue.add(this.output1) + } + simulationArea.contentionPending.clean(this) + } + + /** + * @memberof TriState + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.fillStyle = colors['fill'] + moveTo(ctx, -10, -15, xx, yy, this.direction) + lineTo(ctx, 20, 0, xx, yy, this.direction) + lineTo(ctx, -10, 15, xx, yy, this.direction) + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + } + + generateVerilog() { + return `assign ${this.output1.verilogLabel} = (${this.state.verilogLabel}!=0) ? ${this.inp1.verilogLabel} : ${this.inp1.bitWidth}'b?;` + } +} + +/** + * @memberof TriState + * Help Tip + * @type {string} + * @category modules + */ +TriState.prototype.tooltipText = + 'TriState ToolTip : Effectively removes the output from the circuit.' +TriState.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/8misc?id=tristate-buffer' +TriState.prototype.objectType = 'TriState' diff --git a/v0/src/simulator/src/modules/Tunnel.js b/v0/src/simulator/src/modules/Tunnel.js new file mode 100644 index 00000000..7e3f96c5 --- /dev/null +++ b/v0/src/simulator/src/modules/Tunnel.js @@ -0,0 +1,351 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect2, fillText } from '../canvasApi' +import plotArea from '../plotArea' +import { showError } from '../utils' +/** + * @class + * Tunnel + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @param {string=} identifier - number of input nodes + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Tunnel extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'LEFT', + bitWidth = 1, + identifier + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Tunnel'].push(this); + */ + this.rectangleObject = false + this.centerElement = true + this.xSize = 10 + this.plotValues = [] + this.inp1 = new Node(0, 0, 0, this) + this.checked = false // has this tunnel been checked by another paired tunnel + this.setIdentifier(identifier || 'T') + this.setBounds() + // if tunnels with this's identifier exist, then set the bitwidth to that of those tunnels + if (this.scope.tunnelList[this.identifier].length > 0) { + this.newBitWidth(this.scope.tunnelList[this.identifier][0].bitWidth) + } + } + + /** + * @memberof Tunnel + * function to change direction of Tunnel + * @param {string} dir - new direction + */ + newDirection(dir) { + if (this.direction === dir) return + this.direction = dir + this.setBounds() + } + + setBounds() { + let xRotate = 0 + let yRotate = 0 + if (this.direction === 'LEFT') { + xRotate = 0 + yRotate = 0 + } else if (this.direction === 'RIGHT') { + xRotate = 120 - this.xSize + yRotate = 0 + } else if (this.direction === 'UP') { + xRotate = 60 - this.xSize / 2 + yRotate = -20 + } else { + xRotate = 60 - this.xSize / 2 + yRotate = 20 + } + + this.leftDimensionX = Math.abs(-120 + xRotate + this.xSize) + this.upDimensionY = Math.abs(-20 + yRotate) + this.rightDimensionX = Math.abs(xRotate) + this.downDimensionY = Math.abs(20 + yRotate) + + // rect2(ctx, -120 + xRotate + this.xSize, -20 + yRotate, 120 - this.xSize, 40, xx, yy, "RIGHT"); + } + + /** + * @memberof Tunnel + * resolve output values based on inputData + */ + resolve() { + // Don't check for paired tunnels' value if already checked by another paired tunnel (O(n)) + if (this.checked) { + this.checked = false + return + } + // Check for bitwidth error since it bypasses node's resolve() function which usually checks bitwidths + for (const tunnel of this.scope.tunnelList[this.identifier]) { + if (tunnel.inp1.bitWidth !== this.inp1.bitWidth) { + this.inp1.highlighted = true + tunnel.inp1.highlighted = true + showError( + `BitWidth Error: ${this.inp1.bitWidth} and ${tunnel.inp1.bitWidth}` + ) + } + if (tunnel.inp1.value !== this.inp1.value) { + tunnel.inp1.value = this.inp1.value + simulationArea.simulationQueue.add(tunnel.inp1) + } + if (tunnel !== this) tunnel.checked = true + } + } + + /** + * @memberof Tunnel + * function to set tunnel value + * @param {Scope} scope - tunnel value + */ + updateScope(scope) { + this.scope = scope + this.inp1.updateScope(scope) + this.setIdentifier(this.identifier) + } + + /** + * @memberof Tunnel + * function to set plot value + */ + setPlotValue() { + return + const time = plotArea.stopWatch.ElapsedMilliseconds + if ( + this.plotValues.length && + this.plotValues[this.plotValues.length - 1][0] === time + ) { + this.plotValues.pop() + } + + if (this.plotValues.length === 0) { + this.plotValues.push([time, this.inp1.value]) + return + } + + if ( + this.plotValues[this.plotValues.length - 1][1] === this.inp1.value + ) { + return + } + this.plotValues.push([time, this.inp1.value]) + } + + /** + * @memberof Tunnel + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.bitWidth, + this.identifier, + ], + nodes: { + inp1: findNode(this.inp1), + }, + values: { + identifier: this.identifier, + }, + } + return data + } + + /** + * @memberof Tunnel + * function to set tunnel identifier value + * @param {string=} id - id so that every link is unique + */ + setIdentifier(id = '') { + if (id.length === 0) return + if (this.scope.tunnelList[this.identifier]) + this.scope.tunnelList[this.identifier].clean(this) + this.identifier = id + if (this.scope.tunnelList[this.identifier]) + this.scope.tunnelList[this.identifier].push(this) + else this.scope.tunnelList[this.identifier] = [this] + + // Change the bitwidth to be same as the other elements with this.identifier + if ( + this.scope.tunnelList[this.identifier] && + this.scope.tunnelList[this.identifier].length > 1 + ) { + this.bitWidth = this.inp1.bitWidth = + this.scope.tunnelList[this.identifier][0].bitWidth + } + + const len = this.identifier.length + if (len === 1) this.xSize = 40 + else if (len > 1 && len < 4) this.xSize = 20 + else this.xSize = 0 + this.setBounds() + } + + /** + * @memberof Tunnel + * delete the tunnel element + */ + delete() { + this.scope.Tunnel.clean(this) + this.scope.tunnelList[this.identifier].clean(this) + super.delete() + } + + /** + * @memberof Tunnel + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(1) + const xx = this.x + const yy = this.y + + let xRotate = 0 + let yRotate = 0 + if (this.direction === 'LEFT') { + xRotate = 0 + yRotate = 0 + } else if (this.direction === 'RIGHT') { + xRotate = 120 - this.xSize + yRotate = 0 + } else if (this.direction === 'UP') { + xRotate = 60 - this.xSize / 2 + yRotate = -20 + } else { + xRotate = 60 - this.xSize / 2 + yRotate = 20 + } + + rect2( + ctx, + -120 + xRotate + this.xSize, + -20 + yRotate, + 120 - this.xSize, + 40, + xx, + yy, + 'RIGHT' + ) + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = colors['hover_select'] + } + ctx.fill() + ctx.stroke() + + ctx.font = '14px Raleway' + this.xOff = ctx.measureText(this.identifier).width + ctx.beginPath() + rect2( + ctx, + -105 + xRotate + this.xSize, + -11 + yRotate, + this.xOff + 10, + 23, + xx, + yy, + 'RIGHT' + ) + ctx.fillStyle = '#eee' + ctx.strokeStyle = '#ccc' + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = 'black' + fillText( + ctx, + this.identifier, + xx - 100 + this.xOff / 2 + xRotate + this.xSize, + yy + 6 + yRotate, + 14 + ) + ctx.fill() + + ctx.beginPath() + ctx.font = '30px Raleway' + ctx.textAlign = 'center' + ctx.fillStyle = ['blue', 'red'][+(this.inp1.value === undefined)] + if (this.inp1.value !== undefined) { + fillText( + ctx, + this.inp1.value.toString(16), + xx - 23 + xRotate, + yy + 8 + yRotate, + 25 + ) + } else { + fillText(ctx, 'x', xx - 23 + xRotate, yy + 8 + yRotate, 25) + } + ctx.fill() + } + + /** + * Overridden from CircuitElement. Sets all paired tunnels' bitwidths for syncronization + * @param {number} bitWidth - bitwidth to set to + */ + newBitWidth(bitWidth) { + for (let tunnel of this.scope.tunnelList[this.identifier]) { + if (tunnel.fixedBitWidth) continue + if (tunnel.bitWidth === undefined) continue + if (tunnel.bitWidth < 1) continue + tunnel.bitWidth = bitWidth + for (let i = 0; i < tunnel.nodeList.length; i++) { + tunnel.nodeList[i].bitWidth = bitWidth + } + } + } +} + +/** + * @memberof Tunnel + * Help Tip + * @type {string} + * @category modules + */ +Tunnel.prototype.tooltipText = 'Tunnel ToolTip : Tunnel Selected.' +Tunnel.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/8misc?id=tunnel' + +Tunnel.prototype.overrideDirectionRotation = true + +/** + * @memberof Tunnel + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +Tunnel.prototype.mutableProperties = { + identifier: { + name: 'Debug Flag identifier', + type: 'text', + maxlength: '5', + func: 'setIdentifier', + }, +} +Tunnel.prototype.objectType = 'Tunnel' diff --git a/v0/src/simulator/src/modules/TwoComplement.js b/v0/src/simulator/src/modules/TwoComplement.js new file mode 100644 index 00000000..ace62ec7 --- /dev/null +++ b/v0/src/simulator/src/modules/TwoComplement.js @@ -0,0 +1,102 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, fillText, drawCircle2 } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * TwoComplement + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class TwoComplement extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['TwoComplement'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 15) + this.inp1 = new Node(-10, 0, 0, this, this.bitWidth, 'input stream') + this.output1 = new Node(20, 0, 1, this, this.bitWidth, "2's complement") + } + + /** + * @memberof TwoComplement + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + output1: findNode(this.output1), + inp1: findNode(this.inp1), + }, + } + return data + } + + /** + * @memberof TwoComplement + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + let output = + ((~this.inp1.value >>> 0) << (32 - this.bitWidth)) >>> + (32 - this.bitWidth) + output += 1 + this.output1.value = + (output << (32 - this.bitWidth)) >>> (32 - this.bitWidth) + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof TwoComplement + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.fillStyle = 'black' + fillText(ctx, "2'", xx, yy, 10) + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.beginPath() + drawCircle2(ctx, 5, 0, 15, xx, yy, this.direction) + ctx.stroke() + } + + generateVerilog() { + return `assign ${this.output1.verilogLabel} = ~${this.inp1.verilogLabel} + 1;` + } +} + +/** + * @memberof TwoComplement + * Help Tip + * @type {string} + * @category modules + */ +TwoComplement.prototype.tooltipText = + "Two's Complement Tooltip : Calculates the two's complement" +TwoComplement.prototype.objectType = 'TwoComplement' diff --git a/v0/src/simulator/src/modules/VariableLed.js b/v0/src/simulator/src/modules/VariableLed.js new file mode 100644 index 00000000..a32cb5aa --- /dev/null +++ b/v0/src/simulator/src/modules/VariableLed.js @@ -0,0 +1,205 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { + correctWidth, + lineTo, + moveTo, + arc, + drawCircle2, + colorToRGBA, + validColor, +} from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * VariableLed + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @category modules + */ +import { colors } from '../themer/themer' + +export default class VariableLed extends CircuitElement { + constructor(x, y, scope = globalScope, color = 'Red') { + // Calling base class constructor + + super(x, y, scope, 'UP', 8) + /* this is done in this.baseSetup() now + this.scope['VariableLed'].push(this); + */ + this.rectangleObject = false + this.setDimensions(10, 20) + this.inp1 = new Node(-40, 0, 0, this, 8) + this.directionFixed = true + this.fixedBitWidth = true + this.color = color + const temp = colorToRGBA(this.color) + this.actualColor = `rgba(${temp[0]},${temp[1]},${temp[2]},${0.8})` + } + + /** + * @memberof VariableLed + * fn to change the color of VariableLed + * @return {JSON} + */ + changeColor(value) { + if (validColor(value)) { + if (value.trim() === '') { + this.color = 'Red' + this.actualColor = 'rgba(255, 0, 0, 1)' + } else { + this.color = value + const temp = colorToRGBA(value) + this.actualColor = `rgba(${temp[0]},${temp[1]},${temp[2]}, ${temp[3]})` + } + } + } + + /** + * @memberof VariableLed + * fn to set the rgba value of the color + * @return {JSON} + */ + createRGBA(alpha = 1) { + const len = this.actualColor.length + const temp = this.actualColor + .split('') + .slice(5, len - 1) + .join('') + .split(',') + if (alpha.toString() === 'NaN') + return `rgba(${temp[0]}, ${temp[1]}, ${temp[2]}, 1)` + return `rgba(${temp[0]},${temp[1]},${temp[2]},${alpha})` + } + + /** + * @memberof VariableLed + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.color], + nodes: { + inp1: findNode(this.inp1), + }, + } + return data + } + + /** + * @memberof VariableLed + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + + const xx = this.x + const yy = this.y + + ctx.strokeStyle = '#353535' + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + moveTo(ctx, -20, 0, xx, yy, this.direction) + lineTo(ctx, -40, 0, xx, yy, this.direction) + ctx.stroke() + const c = this.inp1.value + const alpha = c / 255 + ctx.strokeStyle = '#090a0a' + ctx.fillStyle = [this.createRGBA(alpha), 'rgba(227, 228, 229, 0.8)'][ + (c === undefined || c === 0) + 0 + ] + ctx.lineWidth = correctWidth(1) + + ctx.beginPath() + + moveTo(ctx, -20, -9, xx, yy, this.direction) + lineTo(ctx, 0, -9, xx, yy, this.direction) + arc(ctx, 0, 0, 9, -Math.PI / 2, Math.PI / 2, xx, yy, this.direction) + lineTo(ctx, -20, 9, xx, yy, this.direction) + /* lineTo(ctx,-18,12,xx,yy,this.direction); + arc(ctx,0,0,Math.sqrt(468),((Math.PI/2) + Math.acos(12/Math.sqrt(468))),((-Math.PI/2) - Math.asin(18/Math.sqrt(468))),xx,yy,this.direction); + + */ + lineTo(ctx, -20, -9, xx, yy, this.direction) + ctx.stroke() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + } + + // Draws the element in the subcuircuit. Used in layout mode + subcircuitDraw(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + + var xx = this.subcircuitMetadata.x + xOffset + var yy = this.subcircuitMetadata.y + yOffset + + var c = this.inp1.value + var alpha = c / 255 + ctx.strokeStyle = '#090a0a' + ctx.fillStyle = [this.createRGBA(alpha), 'rgba(227, 228, 229, 0.8)'][ + (c === undefined || c == 0) + 0 + ] + ctx.lineWidth = correctWidth(1) + + ctx.beginPath() + drawCircle2(ctx, 0, 0, 6, xx, yy, this.direction) + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected == this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = 'rgba(255, 255, 32,0.8)' + ctx.fill() + } + + generateVerilog() { + return ` + always @ (*) + $display("VeriableLed:${this.inp1.verilogLabel}=%d", ${this.inp1.verilogLabel});` + } +} + +/** + * @memberof VariableLed + * Help Tip + * @type {string} + * @category modules + */ +VariableLed.prototype.tooltipText = + 'Variable Led ToolTip: Variable LED inputs an 8 bit value and glows with a proportional intensity.' + +/** + * @memberof VariableLed + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +VariableLed.prototype.mutableProperties = { + color: { + name: 'Color: ', + type: 'text', + func: 'changeColor', + }, +} + +/** + * @memberof VariableLed + * Help URL + * @type {string} + * @category modules + */ +VariableLed.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/3output?id=variableled' +VariableLed.prototype.objectType = 'VariableLed' +VariableLed.prototype.canShowInSubcircuit = true diff --git a/v0/src/simulator/src/modules/XnorGate.js b/v0/src/simulator/src/modules/XnorGate.js new file mode 100644 index 00000000..dd93e734 --- /dev/null +++ b/v0/src/simulator/src/modules/XnorGate.js @@ -0,0 +1,199 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { + correctWidth, + bezierCurveTo, + moveTo, + arc2, + drawCircle2, +} from '../canvasApi' +import { gateGenerateVerilog } from '../utils' + +import { changeInputSize } from '../modules' +/** + * @class + * XnorGate + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} inputLength - number of input nodes + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class XnorGate extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + inputs = 2, + bitWidth = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['XnorGate'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 20) + + this.inp = [] + this.inputSize = inputs + + if (inputs % 2 === 1) { + for (let i = 0; i < inputs / 2 - 1; i++) { + const a = new Node(-20, -10 * (i + 1), 0, this) + this.inp.push(a) + } + let a = new Node(-20, 0, 0, this) + this.inp.push(a) + for (let i = inputs / 2 + 1; i < inputs; i++) { + a = new Node(-20, 10 * (i + 1 - inputs / 2 - 1), 0, this) + this.inp.push(a) + } + } else { + for (let i = 0; i < inputs / 2; i++) { + const a = new Node(-20, -10 * (i + 1), 0, this) + this.inp.push(a) + } + for (let i = inputs / 2; i < inputs; i++) { + const a = new Node(-20, 10 * (i + 1 - inputs / 2), 0, this) + this.inp.push(a) + } + } + this.output1 = new Node(30, 0, 1, this) + } + + /** + * @memberof XnorGate + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.inputSize, + this.bitWidth, + ], + nodes: { + inp: this.inp.map(findNode), + output1: findNode(this.output1), + }, + } + return data + } + + /** + * @memberof XnorGate + * resolve output values based on inputData + */ + resolve() { + let result = this.inp[0].value || 0 + if (this.isResolvable() === false) { + return + } + for (let i = 1; i < this.inputSize; i++) + result ^= this.inp[i].value || 0 + result = + ((~result >>> 0) << (32 - this.bitWidth)) >>> (32 - this.bitWidth) + this.output1.value = result + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof XnorGate + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(3) + + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.fillStyle = colors['fill'] + moveTo(ctx, -10, -20, xx, yy, this.direction, true) + bezierCurveTo(0, -20, +15, -10, 20, 0, xx, yy, this.direction) + bezierCurveTo( + 0 + 15, + 0 + 10, + 0, + 0 + 20, + -10, + +20, + xx, + yy, + this.direction + ) + bezierCurveTo(0, 0, 0, 0, -10, -20, xx, yy, this.direction) + // arc(ctx, 0, 0, -20, (-Math.PI / 2), (Math.PI / 2), xx, yy, this.direction); + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + ctx.beginPath() + arc2( + ctx, + -35, + 0, + 25, + 1.7 * Math.PI, + 0.3 * Math.PI, + xx, + yy, + this.direction + ) + ctx.stroke() + ctx.beginPath() + drawCircle2(ctx, 25, 0, 5, xx, yy, this.direction) + ctx.stroke() + } + + generateVerilog() { + return gateGenerateVerilog.call(this, '^', true) + } +} + +/** + * @memberof XnorGate + * @type {boolean} + * @category modules + */ +XnorGate.prototype.alwaysResolve = true + +/** + * @memberof XnorGate + * Help Tip + * @type {string} + * @category modules + */ +XnorGate.prototype.tooltipText = + 'Xnor Gate ToolTip : Logical complement of the XOR gate' + +/** + * @memberof XnorGate + * function to change input nodes of the element + * @category modules + */ +XnorGate.prototype.changeInputSize = changeInputSize + +/** + * @memberof XnorGate + * @type {string} + * @category modules + */ +XnorGate.prototype.verilogType = 'xnor' +XnorGate.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/4gates?id=xnor-gate' +XnorGate.prototype.objectType = 'XnorGate' diff --git a/v0/src/simulator/src/modules/XorGate.js b/v0/src/simulator/src/modules/XorGate.js new file mode 100644 index 00000000..74c5b0d8 --- /dev/null +++ b/v0/src/simulator/src/modules/XorGate.js @@ -0,0 +1,187 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, bezierCurveTo, moveTo, arc2 } from '../canvasApi' +import { changeInputSize } from '../modules' +import { gateGenerateVerilog } from '../utils' + +/** + * @class + * XorGate + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} inputs - number of input nodes + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class XorGate extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + inputs = 2, + bitWidth = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['XorGate'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 20) + + this.inp = [] + this.inputSize = inputs + + if (inputs % 2 === 1) { + for (let i = 0; i < inputs / 2 - 1; i++) { + const a = new Node(-20, -10 * (i + 1), 0, this) + this.inp.push(a) + } + let a = new Node(-20, 0, 0, this) + this.inp.push(a) + for (let i = inputs / 2 + 1; i < inputs; i++) { + a = new Node(-20, 10 * (i + 1 - inputs / 2 - 1), 0, this) + this.inp.push(a) + } + } else { + for (let i = 0; i < inputs / 2; i++) { + const a = new Node(-20, -10 * (i + 1), 0, this) + this.inp.push(a) + } + for (let i = inputs / 2; i < inputs; i++) { + const a = new Node(-20, 10 * (i + 1 - inputs / 2), 0, this) + this.inp.push(a) + } + } + this.output1 = new Node(20, 0, 1, this) + } + + /** + * @memberof XorGate + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.inputSize, + this.bitWidth, + ], + nodes: { + inp: this.inp.map(findNode), + output1: findNode(this.output1), + }, + } + return data + } + + /** + * @memberof XorGate + * resolve output values based on inputData + */ + resolve() { + let result = this.inp[0].value || 0 + if (this.isResolvable() === false) { + return + } + for (let i = 1; i < this.inputSize; i++) + result ^= this.inp[i].value || 0 + + this.output1.value = result + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof XorGate + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(3) + + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.fillStyle = colors['fill'] + moveTo(ctx, -10, -20, xx, yy, this.direction, true) + bezierCurveTo(0, -20, +15, -10, 20, 0, xx, yy, this.direction) + bezierCurveTo( + 0 + 15, + 0 + 10, + 0, + 0 + 20, + -10, + +20, + xx, + yy, + this.direction + ) + bezierCurveTo(0, 0, 0, 0, -10, -20, xx, yy, this.direction) + // arc(ctx, 0, 0, -20, (-Math.PI / 2), (Math.PI / 2), xx, yy, this.direction); + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + ctx.beginPath() + arc2( + ctx, + -35, + 0, + 25, + 1.7 * Math.PI, + 0.3 * Math.PI, + xx, + yy, + this.direction + ) + ctx.stroke() + } + + generateVerilog() { + return gateGenerateVerilog.call(this, '^') + } +} + +/** + * @memberof XorGate + * Help Tip + * @type {string} + * @category modules + */ +XorGate.prototype.tooltipText = 'Xor Gate Tooltip : Implements an exclusive OR.' + +/** + * @memberof XorGate + * @type {boolean} + * @category modules + */ +XorGate.prototype.alwaysResolve = true + +/** + * @memberof XorGate + * function to change input nodes of the element + * @category modules + */ +XorGate.prototype.changeInputSize = changeInputSize + +/** + * @memberof XorGate + * @type {string} + * @category modules + */ +XorGate.prototype.verilogType = 'xor' +XorGate.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/4gates?id=xor-gate' +XorGate.prototype.objectType = 'XorGate' diff --git a/v0/src/simulator/src/modules/verilogDivider.js b/v0/src/simulator/src/modules/verilogDivider.js new file mode 100644 index 00000000..cd6acaf5 --- /dev/null +++ b/v0/src/simulator/src/modules/verilogDivider.js @@ -0,0 +1,127 @@ +/* eslint-disable no-bitwise */ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' + +/** + * @class + * verilogDivider + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. modules + * @category modules + */ +export default class verilogDivider extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 1, + outputBitWidth = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['verilogDivider'].push(this); + */ + this.setDimensions(20, 20) + this.outputBitWidth = outputBitWidth + this.inpA = new Node(-20, -10, 0, this, this.bitWidth, 'A') + this.inpB = new Node(-20, 0, 0, this, this.bitWidth, 'B') + this.quotient = new Node( + 20, + 0, + 1, + this, + this.outputBitWidth, + 'Quotient' + ) + this.remainder = new Node( + 20, + 0, + 1, + this, + this.outputBitWidth, + 'Remainder' + ) + } + + /** + * @memberof verilogDivider + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.bitWidth, + this.outputBitWidth, + ], + nodes: { + inpA: findNode(this.inpA), + inpB: findNode(this.inpB), + quotient: findNode(this.quotient), + remainder: findNode(this.remainder), + }, + } + return data + } + + /** + * @memberof verilogDivider + * Checks if the element is resolvable + * @return {boolean} + */ + isResolvable() { + return this.inpA.value !== undefined && this.inpB.value !== undefined + } + + /** + * @memberof verilogDivider + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.inpA.bitWidth = bitWidth + this.inpB.bitWidth = bitWidth + this.quotient.bitWidth = bitWidth + this.remainder.bitWidth = bitWidth + } + + /** + * @memberof verilogDivider + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + const quotient = this.inpA.value / this.inpB.value + const remainder = this.inpA.value % this.inpB.value + this.remainder.value = + (remainder << (32 - this.outputBitWidth)) >>> + (32 - this.outputBitWidth) + this.quotient.value = + (quotient << (32 - this.outputBitWidth)) >>> + (32 - this.outputBitWidth) + simulationArea.simulationQueue.add(this.quotient) + simulationArea.simulationQueue.add(this.remainder) + } +} + +/** + * @memberof verilogDivider + * Help Tip + * @type {string} + * @category modules + */ +verilogDivider.prototype.tooltipText = + 'verilogDivider ToolTip : Performs addition of numbers.' +verilogDivider.prototype.helplink = + 'https://docs.circuitverse.org/#/miscellaneous?id=verilogDivider' +verilogDivider.prototype.objectType = 'verilogDivider' diff --git a/v0/src/simulator/src/modules/verilogMultiplier.js b/v0/src/simulator/src/modules/verilogMultiplier.js new file mode 100644 index 00000000..d428c036 --- /dev/null +++ b/v0/src/simulator/src/modules/verilogMultiplier.js @@ -0,0 +1,106 @@ +/* eslint-disable no-bitwise */ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' + +/** + * @class + * verilogMultiplier + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. modules + * @category modules + */ +export default class verilogMultiplier extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 1, + outputBitWidth = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['verilogMultiplier'].push(this); + */ + this.setDimensions(20, 20) + this.outputBitWidth = outputBitWidth + this.inpA = new Node(-20, -10, 0, this, this.bitWidth, 'A') + this.inpB = new Node(-20, 0, 0, this, this.bitWidth, 'B') + this.product = new Node(20, 0, 1, this, this.outputBitWidth, 'Product') + } + + /** + * @memberof verilogMultiplier + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.bitWidth, + this.outputBitWidth, + ], + nodes: { + inpA: findNode(this.inpA), + inpB: findNode(this.inpB), + product: findNode(this.product), + }, + } + return data + } + + /** + * @memberof verilogMultiplier + * Checks if the element is resolvable + * @return {boolean} + */ + isResolvable() { + return this.inpA.value !== undefined && this.inpB.value !== undefined + } + + /** + * @memberof verilogMultiplier + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.inpA.bitWidth = bitWidth + this.inpB.bitWidth = bitWidth + this.product.bitWidth = bitWidth + } + + /** + * @memberof verilogMultiplier + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + const product = this.inpA.value * this.inpB.value + + this.product.value = + (product << (32 - this.outputBitWidth)) >>> + (32 - this.outputBitWidth) + simulationArea.simulationQueue.add(this.product) + } +} + +/** + * @memberof verilogMultiplier + * Help Tip + * @type {string} + * @category modules + */ +verilogMultiplier.prototype.tooltipText = + 'verilogMultiplier ToolTip : Performs addition of numbers.' +verilogMultiplier.prototype.helplink = + 'https://docs.circuitverse.org/#/miscellaneous?id=verilogMultiplier' +verilogMultiplier.prototype.objectType = 'verilogMultiplier' diff --git a/v0/src/simulator/src/modules/verilogPower.js b/v0/src/simulator/src/modules/verilogPower.js new file mode 100644 index 00000000..ded6fdc1 --- /dev/null +++ b/v0/src/simulator/src/modules/verilogPower.js @@ -0,0 +1,106 @@ +/* eslint-disable no-bitwise */ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' + +/** + * @class + * verilogPower + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. modules + * @category modules + */ +export default class verilogPower extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 1, + outputBitWidth = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['verilogPower'].push(this); + */ + this.setDimensions(20, 20) + this.outputBitWidth = outputBitWidth + this.inpA = new Node(-20, -10, 0, this, this.bitWidth, 'A') + this.inpB = new Node(-20, 0, 0, this, this.bitWidth, 'B') + this.answer = new Node(20, 0, 1, this, this.outputBitWidth, 'Answer') + } + + /** + * @memberof verilogPower + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.bitWidth, + this.outputBitWidth, + ], + nodes: { + inpA: findNode(this.inpA), + inpB: findNode(this.inpB), + answer: findNode(this.answer), + }, + } + return data + } + + /** + * @memberof verilogPower + * Checks if the element is resolvable + * @return {boolean} + */ + isResolvable() { + return this.inpA.value !== undefined && this.inpB.value !== undefined + } + + /** + * @memberof verilogPower + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.inpA.bitWidth = bitWidth + this.inpB.bitWidth = bitWidth + this.answer.bitWidth = bitWidth + } + + /** + * @memberof verilogPower + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + const answer = Math.pow(this.inpA.value, this.inpB.value) + + this.answer.value = + (answer << (32 - this.outputBitWidth)) >>> + (32 - this.outputBitWidth) + simulationArea.simulationQueue.add(this.answer) + } +} + +/** + * @memberof verilogPower + * Help Tip + * @type {string} + * @category modules + */ +verilogPower.prototype.tooltipText = + 'verilogPower ToolTip : Performs addition of numbers.' +verilogPower.prototype.helplink = + 'https://docs.circuitverse.org/#/miscellaneous?id=verilogPower' +verilogPower.prototype.objectType = 'verilogPower' diff --git a/v0/src/simulator/src/modules/verilogShiftLeft.js b/v0/src/simulator/src/modules/verilogShiftLeft.js new file mode 100644 index 00000000..65a61a4c --- /dev/null +++ b/v0/src/simulator/src/modules/verilogShiftLeft.js @@ -0,0 +1,108 @@ +/* eslint-disable no-bitwise */ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' + +/** + * @class + * verilogShiftLeft + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. modules + * @category modules + */ +export default class verilogShiftLeft extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 1, + outputBitWidth = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['verilogShiftLeft'].push(this); + */ + this.setDimensions(20, 20) + this.outputBitWidth = outputBitWidth + this.inp1 = new Node(-20, -10, 0, this, this.bitWidth, 'Input') + this.shiftInp = new Node(-20, 0, 0, this, this.bitWidth, 'ShiftInput') + this.output1 = new Node(20, 0, 1, this, this.outputBitWidth, 'Output') + } + + /** + * @memberof verilogShiftLeft + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.bitWidth, + this.outputBitWidth, + ], + nodes: { + inp1: findNode(this.inp1), + shiftInp: findNode(this.shiftInp), + output1: findNode(this.output1), + }, + } + return data + } + + /** + * @memberof verilogShiftLeft + * Checks if the element is resolvable + * @return {boolean} + */ + isResolvable() { + return ( + this.inp1.value !== undefined && this.shiftInp.value !== undefined + ) + } + + /** + * @memberof verilogShiftLeft + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.inp1.bitWidth = bitWidth + this.shiftInp.bitWidth = bitWidth + this.output1.bitWidth = bitWidth + } + + /** + * @memberof verilogShiftLeft + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + const output1 = this.inp1.value << this.shiftInp.value + + this.output1.value = + (output1 << (32 - this.outputBitWidth)) >>> + (32 - this.outputBitWidth) + simulationArea.simulationQueue.add(this.output1) + } +} + +/** + * @memberof verilogShiftLeft + * Help Tip + * @type {string} + * @category modules + */ +verilogShiftLeft.prototype.tooltipText = + 'verilogShiftLeft ToolTip : Performs addition of numbers.' +verilogShiftLeft.prototype.helplink = + 'https://docs.circuitverse.org/#/miscellaneous?id=verilogShiftLeft' +verilogShiftLeft.prototype.objectType = 'verilogShiftLeft' diff --git a/v0/src/simulator/src/modules/verilogShiftRight.js b/v0/src/simulator/src/modules/verilogShiftRight.js new file mode 100644 index 00000000..a37332fb --- /dev/null +++ b/v0/src/simulator/src/modules/verilogShiftRight.js @@ -0,0 +1,108 @@ +/* eslint-disable no-bitwise */ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' + +/** + * @class + * verilogShiftRight + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. modules + * @category modules + */ +export default class verilogShiftRight extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 1, + outputBitWidth = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['verilogShiftRight'].push(this); + */ + this.setDimensions(20, 20) + this.outputBitWidth = outputBitWidth + this.inp1 = new Node(-20, -10, 0, this, this.bitWidth, 'Input') + this.shiftInp = new Node(-20, 0, 0, this, this.bitWidth, 'ShiftInput') + this.output1 = new Node(20, 0, 1, this, this.outputBitWidth, 'Output') + } + + /** + * @memberof verilogShiftRight + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.bitWidth, + this.outputBitWidth, + ], + nodes: { + inp1: findNode(this.inp1), + shiftInp: findNode(this.shiftInp), + output1: findNode(this.output1), + }, + } + return data + } + + /** + * @memberof verilogShiftRight + * Checks if the element is resolvable + * @return {boolean} + */ + isResolvable() { + return ( + this.inp1.value !== undefined && this.shiftInp.value !== undefined + ) + } + + /** + * @memberof verilogShiftRight + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.inp1.bitWidth = bitWidth + this.shiftInp.bitWidth = bitWidth + this.output1.bitWidth = bitWidth + } + + /** + * @memberof verilogShiftRight + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + const output1 = this.inp1.value >> this.shiftInp.value + + this.output1.value = + (output1 << (32 - this.outputBitWidth)) >>> + (32 - this.outputBitWidth) + simulationArea.simulationQueue.add(this.output1) + } +} + +/** + * @memberof verilogShiftRight + * Help Tip + * @type {string} + * @category modules + */ +verilogShiftRight.prototype.tooltipText = + 'verilogShiftRight ToolTip : Performs addition of numbers.' +verilogShiftRight.prototype.helplink = + 'https://docs.circuitverse.org/#/miscellaneous?id=verilogShiftRight' +verilogShiftRight.prototype.objectType = 'verilogShiftRight' diff --git a/v0/src/simulator/src/node.js b/v0/src/simulator/src/node.js new file mode 100644 index 00000000..696a664b --- /dev/null +++ b/v0/src/simulator/src/node.js @@ -0,0 +1,1021 @@ +/* eslint-disable import/no-cycle */ +import { drawCircle, drawLine, arc } from './canvasApi' +import simulationArea from './simulationArea' +import { distance, showError } from './utils' +import { + renderCanvas, + scheduleUpdate, + wireToBeCheckedSet, + updateSimulationSet, + updateCanvasSet, + forceResetNodesSet, + canvasMessageData, +} from './engine' +import Wire from './wire' +// import { colors } from './themer/themer'; +import { colors } from './themer/themer' + +/** + * Constructs all the connections of Node node + * @param {Node} node - node to be constructed + * @param {JSON} data - the saved data which is used to load + * @category node + */ +export function constructNodeConnections(node, data) { + for (var i = 0; i < data.connections.length; i++) { + if ( + !node.connections.contains(node.scope.allNodes[data.connections[i]]) + ) + node.connect(node.scope.allNodes[data.connections[i]]) + } +} + +/** + * Fn to replace node by node @ index in global Node List - used when loading + * @param {Node} node - node to be replaced + * @param {number} index - index of node to be replaced + * @category node + */ +export function replace(node, index) { + if (index == -1) { + return node + } + var { scope } = node + var { parent } = node + parent.nodeList.clean(node) + node.delete() + node = scope.allNodes[index] + node.parent = parent + parent.nodeList.push(node) + node.updateRotation() + return node +} +function rotate(x1, y1, dir) { + if (dir == 'LEFT') { + return [-x1, y1] + } + if (dir == 'DOWN') { + return [y1, x1] + } + if (dir == 'UP') { + return [y1, -x1] + } + return [x1, y1] +} + +export function extractBits(num, start, end) { + return (num << (32 - end)) >>> (32 - (end - start + 1)) +} + +export function bin2dec(binString) { + return parseInt(binString, 2) +} + +export function dec2bin(dec, bitWidth = undefined) { + // only for positive nos + var bin = dec.toString(2) + if (bitWidth == undefined) return bin + return '0'.repeat(bitWidth - bin.length) + bin +} + +/** + * find Index of a node + * @param {Node} x - Node to be dound + * @category node + */ +export function findNode(x) { + return x.scope.allNodes.indexOf(x) +} + +/** + * function makes a node according to data providede + * @param {JSON} data - the data used to load a Project + * @param {Scope} scope - scope to which node has to be loaded + * @category node + */ +export function loadNode(data, scope) { + var n = new Node( + data.x, + data.y, + data.type, + scope.root, + data.bitWidth, + data.label + ) +} + +/** + * get Node in index x in scope and set parent + * @param {Node} x - the desired node + * @param {Scope} scope - the scope + * @param {CircuitElement} parent - The parent of node + * @category node + */ +function extractNode(x, scope, parent) { + var n = scope.allNodes[x] + n.parent = parent + return n +} + +// output node=1 +// input node=0 +// intermediate node =2 + +window.NODE_INPUT = 0 +window.NODE_OUTPUT = 1 +window.NODE_INTERMEDIATE = 2 +/** + * used to give id to a node. + * @type {number} + * @category node + */ +var uniqueIdCounter = 10 + +/** + * This class is responsible for all the Nodes.Nodes are connected using Wires + * Nodes are of 3 types; + * NODE_INPUT = 0; + * NODE_OUTPUT = 1; + * NODE_INTERMEDIATE = 2; + * Input and output nodes belong to some CircuitElement(it's parent) + * @param {number} x - x coord of Node + * @param {number} y - y coord of Node + * @param {number} type - type of node + * @param {CircuitElement} parent - parent element + * @param {?number} bitWidth - the bits of node in input and output nodes + * @param {string=} label - label for a node + * @category node + */ +export default class Node { + constructor(x, y, type, parent, bitWidth = undefined, label = '') { + // Should never raise, but just in case + if (isNaN(x) || isNaN(y)) { + this.delete() + showError('Fatal error occurred') + return + } + + forceResetNodesSet(true) + + this.objectType = 'Node' + this.subcircuitOverride = false + this.id = `node${uniqueIdCounter}` + uniqueIdCounter++ + this.parent = parent + if (type != 2 && this.parent.nodeList !== undefined) { + this.parent.nodeList.push(this) + } + + if (bitWidth == undefined) { + this.bitWidth = parent.bitWidth + } else { + this.bitWidth = bitWidth + } + this.label = label + this.prevx = undefined + this.prevy = undefined + this.leftx = x + this.lefty = y + this.x = x + this.y = y + + this.type = type + this.connections = new Array() + this.value = undefined + this.radius = 5 + this.clicked = false + this.hover = false + this.wasClicked = false + this.scope = this.parent.scope + /** + * @type {string} + * value of this.prev is + * 'a' : whenever a node is not being dragged this.prev is 'a' + * 'x' : when node is being dragged horizontally + * 'y' : when node is being dragged vertically + */ + this.prev = 'a' + this.count = 0 + this.highlighted = false + + // This fn is called during rotations and setup + this.refresh() + + if (this.type == 2) { + this.parent.scope.nodes.push(this) + } + + this.parent.scope.allNodes.push(this) + + this.queueProperties = { + inQueue: false, + time: undefined, + index: undefined, + } + } + + /** + * @param {string} - new label + * Function to set label + */ + setLabel(label) { + this.label = label // || ""; + } + + /** + * function to convert a node to intermediate node + */ + converToIntermediate() { + this.type = 2 + this.x = this.absX() + this.y = this.absY() + this.parent = this.scope.root + this.scope.nodes.push(this) + } + + /** + * Helper fuction to move a node. Sets up some variable which help in changing node. + */ + startDragging() { + this.oldx = this.x + this.oldy = this.y + } + + /** + * Helper fuction to move a node. + */ + drag() { + this.x = this.oldx + simulationArea.mouseX - simulationArea.mouseDownX + this.y = this.oldy + simulationArea.mouseY - simulationArea.mouseDownY + } + + /** + * Funciton for saving a node + */ + saveObject() { + if (this.type == 2) { + this.leftx = this.x + this.lefty = this.y + } + var data = { + x: this.leftx, + y: this.lefty, + type: this.type, + bitWidth: this.bitWidth, + label: this.label, + connections: [], + } + for (var i = 0; i < this.connections.length; i++) { + data.connections.push(findNode(this.connections[i])) + } + return data + } + + /** + * helper function to help rotating parent + */ + updateRotation() { + var x + var y + ;[x, y] = rotate(this.leftx, this.lefty, this.parent.direction) + this.x = x + this.y = y + } + + /** + * Refreshes a node after roation of parent + */ + refresh() { + this.updateRotation() + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].connections.clean(this) + } + this.connections = [] + } + + /** + * gives absolute x position of the node + */ + absX() { + return this.x + this.parent.x + } + + /** + * gives absolute y position of the node + */ + absY() { + return this.y + this.parent.y + } + + /** + * update the scope of a node + */ + updateScope(scope) { + this.scope = scope + if (this.type == 2) this.parent = scope.root + } + + /** + * return true if node is connected or not connected but false if undefined. + */ + isResolvable() { + return this.value != undefined + } + + /** + * function used to reset the nodes + */ + reset() { + this.value = undefined + this.highlighted = false + } + + /** + * function to connect two nodes. + */ + connect(n) { + if (n == this) return + if (n.connections.contains(this)) return + var w = new Wire(this, n, this.parent.scope) + this.connections.push(n) + n.connections.push(this) + + updateCanvasSet(true) + updateSimulationSet(true) + scheduleUpdate() + } + + /** + * connects but doesnt draw the wire between nodes + */ + connectWireLess(n) { + if (n == this) return + if (n.connections.contains(this)) return + this.connections.push(n) + n.connections.push(this) + + updateCanvasSet(true) + updateSimulationSet(true) + scheduleUpdate() + } + + /** + * disconnecting two nodes connected wirelessly + */ + disconnectWireLess(n) { + this.connections.clean(n) + n.connections.clean(this) + } + + /** + * function to resolve a node + */ + resolve() { + // Remove Propogation of values (TriState) + if (this.value == undefined) { + for (var i = 0; i < this.connections.length; i++) { + if (this.connections[i].value !== undefined) { + this.connections[i].value = undefined + simulationArea.simulationQueue.add(this.connections[i]) + } + } + + if (this.type == NODE_INPUT) { + if (this.parent.objectType == 'Splitter') { + this.parent.removePropagation() + } else if (this.parent.isResolvable()) { + simulationArea.simulationQueue.add(this.parent) + } else { + this.parent.removePropagation() + } + } + + if (this.type == NODE_OUTPUT && !this.subcircuitOverride) { + if ( + this.parent.isResolvable() && + !this.parent.queueProperties.inQueue + ) { + if (this.parent.objectType == 'TriState') { + if (this.parent.state.value) { + simulationArea.simulationQueue.add(this.parent) + } + } else { + simulationArea.simulationQueue.add(this.parent) + } + } + } + + return + } + + if (this.type == 0) { + if (this.parent.isResolvable()) { + simulationArea.simulationQueue.add(this.parent) + } + } + + for (var i = 0; i < this.connections.length; i++) { + const node = this.connections[i] + + if (node.value != this.value || node.bitWidth != this.bitWidth) { + if ( + node.type == 1 && + node.value != undefined && + node.parent.objectType != 'TriState' && + !(node.subcircuitOverride && node.scope != this.scope) && // Subcircuit Input Node Output Override + node.parent.objectType != 'SubCircuit' + ) { + // Subcircuit Output Node Override + this.highlighted = true + node.highlighted = true + var circuitName = node.scope.name + var circuitElementName = node.parent.objectType + showError( + `Contention Error: ${this.value} and ${node.value} at ${circuitElementName} in ${circuitName}` + ) + } else if (node.bitWidth == this.bitWidth || node.type == 2) { + if ( + node.parent.objectType == 'TriState' && + node.value != undefined && + node.type == 1 + ) { + if (node.parent.state.value) { + simulationArea.contentionPending.push(node.parent) + } + } + + node.bitWidth = this.bitWidth + node.value = this.value + simulationArea.simulationQueue.add(node) + } else { + this.highlighted = true + node.highlighted = true + showError( + `BitWidth Error: ${this.bitWidth} and ${node.bitWidth}` + ) + } + } + } + } + + /** + * this function checks if hover over the node + */ + checkHover() { + if (!simulationArea.mouseDown) { + if (simulationArea.hover == this) { + this.hover = this.isHover() + if (!this.hover) { + simulationArea.hover = undefined + this.showHover = false + } + } else if (!simulationArea.hover) { + this.hover = this.isHover() + if (this.hover) { + simulationArea.hover = this + } else { + this.showHover = false + } + } else { + this.hover = false + this.showHover = false + } + } + } + + /** + * this function draw a node + */ + draw() { + const ctx = simulationArea.context + // + const color = colors['color_wire_draw'] + if (this.clicked) { + if (this.prev == 'x') { + drawLine( + ctx, + this.absX(), + this.absY(), + simulationArea.mouseX, + this.absY(), + color, + 3 + ) + drawLine( + ctx, + simulationArea.mouseX, + this.absY(), + simulationArea.mouseX, + simulationArea.mouseY, + color, + 3 + ) + } else if (this.prev == 'y') { + drawLine( + ctx, + this.absX(), + this.absY(), + this.absX(), + simulationArea.mouseY, + color, + 3 + ) + drawLine( + ctx, + this.absX(), + simulationArea.mouseY, + simulationArea.mouseX, + simulationArea.mouseY, + color, + 3 + ) + } else if ( + Math.abs(this.x + this.parent.x - simulationArea.mouseX) > + Math.abs(this.y + this.parent.y - simulationArea.mouseY) + ) { + drawLine( + ctx, + this.absX(), + this.absY(), + simulationArea.mouseX, + this.absY(), + color, + 3 + ) + } else { + drawLine( + ctx, + this.absX(), + this.absY(), + this.absX(), + simulationArea.mouseY, + color, + 3 + ) + } + } + var colorNode = colors['stroke'] + const colorNodeConnect = colors['color_wire_con'] + const colorNodePow = colors['color_wire_pow'] + const colorNodeLose = colors['color_wire_lose'] + const colorNodeSelected = colors['node'] + + if (this.bitWidth == 1) + colorNode = [colorNodeConnect, colorNodePow][this.value] + if (this.value == undefined) colorNode = colorNodeLose + if (this.type == 2) this.checkHover() + if (this.type == 2) { + drawCircle(ctx, this.absX(), this.absY(), 3, colorNode) + } else { + drawCircle(ctx, this.absX(), this.absY(), 3, colorNodeSelected) + } + + if ( + this.highlighted || + simulationArea.lastSelected == this || + (this.isHover() && + !simulationArea.selected && + !simulationArea.shiftDown) || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.strokeStyle = colorNodeSelected + ctx.beginPath() + ctx.lineWidth = 3 + arc( + ctx, + this.x, + this.y, + 8, + 0, + Math.PI * 2, + this.parent.x, + this.parent.y, + 'RIGHT' + ) + ctx.closePath() + ctx.stroke() + } + + if (this.hover || simulationArea.lastSelected == this) { + if (this.showHover || simulationArea.lastSelected == this) { + canvasMessageData.x = this.absX() + canvasMessageData.y = this.absY() - 15 + if (this.type == 2) { + var v = 'X' + if (this.value !== undefined) { + v = this.value.toString(16) + } + if (this.label.length) { + canvasMessageData.string = `${this.label} : ${v}` + } else { + canvasMessageData.string = v + } + } else if (this.label.length) { + canvasMessageData.string = this.label + } + } else { + setTimeout(() => { + if (simulationArea.hover) + simulationArea.hover.showHover = true + updateCanvasSet(true) + renderCanvas(globalScope) + }, 400) + } + } + } + + /** + * checks if a node has been deleted + */ + checkDeleted() { + if (this.deleted) this.delete() + if (this.connections.length == 0 && this.type == 2) this.delete() + } + + /** + * used to update nodes if there is a event like click or hover on the node. + * many booleans are used to check if certain properties are to be updated. + */ + update() { + if (embed) return + + if (this == simulationArea.hover) simulationArea.hover = undefined + this.hover = this.isHover() + + if (!simulationArea.mouseDown) { + if (this.absX() != this.prevx || this.absY() != this.prevy) { + // Connect to any node + this.prevx = this.absX() + this.prevy = this.absY() + this.nodeConnect() + } + } + + if (this.hover) { + simulationArea.hover = this + } + + if ( + simulationArea.mouseDown && + ((this.hover && !simulationArea.selected) || + simulationArea.lastSelected == this) + ) { + simulationArea.selected = true + simulationArea.lastSelected = this + this.clicked = true + } else { + this.clicked = false + } + + if (!this.wasClicked && this.clicked) { + this.wasClicked = true + this.prev = 'a' + if (this.type == 2) { + if ( + !simulationArea.shiftDown && + simulationArea.multipleObjectSelections.contains(this) + ) { + for ( + var i = 0; + i < simulationArea.multipleObjectSelections.length; + i++ + ) { + simulationArea.multipleObjectSelections[ + i + ].startDragging() + } + } + + if (simulationArea.shiftDown) { + simulationArea.lastSelected = undefined + if ( + simulationArea.multipleObjectSelections.contains(this) + ) { + simulationArea.multipleObjectSelections.clean(this) + } else { + simulationArea.multipleObjectSelections.push(this) + } + } else { + simulationArea.lastSelected = this + } + } + } else if (this.wasClicked && this.clicked) { + if ( + !simulationArea.shiftDown && + simulationArea.multipleObjectSelections.contains(this) + ) { + for ( + var i = 0; + i < simulationArea.multipleObjectSelections.length; + i++ + ) { + simulationArea.multipleObjectSelections[i].drag() + } + } + if (this.type == 2) { + if ( + this.connections.length == 1 && + this.connections[0].absX() == simulationArea.mouseX && + this.absX() == simulationArea.mouseX + ) { + this.y = simulationArea.mouseY - this.parent.y + this.prev = 'a' + return + } + if ( + this.connections.length == 1 && + this.connections[0].absY() == simulationArea.mouseY && + this.absY() == simulationArea.mouseY + ) { + this.x = simulationArea.mouseX - this.parent.x + this.prev = 'a' + return + } + if ( + this.connections.length == 1 && + this.connections[0].absX() == this.absX() && + this.connections[0].absY() == this.absY() + ) { + this.connections[0].clicked = true + this.connections[0].wasClicked = true + simulationArea.lastSelected = this.connections[0] + this.delete() + return + } + } + + if ( + this.prev == 'a' && + distance( + simulationArea.mouseX, + simulationArea.mouseY, + this.absX(), + this.absY() + ) >= 10 + ) { + if ( + Math.abs(this.x + this.parent.x - simulationArea.mouseX) > + Math.abs(this.y + this.parent.y - simulationArea.mouseY) + ) { + this.prev = 'x' + } else { + this.prev = 'y' + } + } else if ( + this.prev == 'x' && + this.absY() == simulationArea.mouseY + ) { + this.prev = 'a' + } else if ( + this.prev == 'y' && + this.absX() == simulationArea.mouseX + ) { + this.prev = 'a' + } + } else if (this.wasClicked && !this.clicked) { + this.wasClicked = false + + if ( + simulationArea.mouseX == this.absX() && + simulationArea.mouseY == this.absY() + ) { + return // no new node situation + } + + var x1 + var y1 + var x2 + var y2 + var flag = 0 + var n1 + var n2 + + // (x,y) present node, (x1,y1) node 1 , (x2,y2) node 2 + // n1 - node 1, n2 - node 2 + // node 1 may or may not be there + // flag = 0 - node 2 only + // flag = 1 - node 1 and node 2 + x2 = simulationArea.mouseX + y2 = simulationArea.mouseY + const x = this.absX() + const y = this.absY() + + if (x != x2 && y != y2) { + // Rare Exception Cases + if ( + this.prev == 'a' && + distance( + simulationArea.mouseX, + simulationArea.mouseY, + this.absX(), + this.absY() + ) >= 10 + ) { + if ( + Math.abs( + this.x + this.parent.x - simulationArea.mouseX + ) > + Math.abs(this.y + this.parent.y - simulationArea.mouseY) + ) { + this.prev = 'x' + } else { + this.prev = 'y' + } + } + + flag = 1 + if (this.prev == 'x') { + x1 = x2 + y1 = y + } else if (this.prev == 'y') { + y1 = y2 + x1 = x + } + } + + if (flag == 1) { + for (var i = 0; i < this.parent.scope.allNodes.length; i++) { + if ( + x1 == this.parent.scope.allNodes[i].absX() && + y1 == this.parent.scope.allNodes[i].absY() + ) { + n1 = this.parent.scope.allNodes[i] + break + } + } + + if (n1 == undefined) { + n1 = new Node(x1, y1, 2, this.scope.root) + for (var i = 0; i < this.parent.scope.wires.length; i++) { + if (this.parent.scope.wires[i].checkConvergence(n1)) { + this.parent.scope.wires[i].converge(n1) + break + } + } + } + this.connect(n1) + } + + for (var i = 0; i < this.parent.scope.allNodes.length; i++) { + if ( + x2 == this.parent.scope.allNodes[i].absX() && + y2 == this.parent.scope.allNodes[i].absY() + ) { + n2 = this.parent.scope.allNodes[i] + break + } + } + + if (n2 == undefined) { + n2 = new Node(x2, y2, 2, this.scope.root) + for (var i = 0; i < this.parent.scope.wires.length; i++) { + if (this.parent.scope.wires[i].checkConvergence(n2)) { + this.parent.scope.wires[i].converge(n2) + break + } + } + } + if (flag == 0) this.connect(n2) + else n1.connect(n2) + if (simulationArea.lastSelected == this) + simulationArea.lastSelected = n2 + } + + if (this.type == 2 && simulationArea.mouseDown == false) { + if (this.connections.length == 2) { + if ( + this.connections[0].absX() == this.connections[1].absX() || + this.connections[0].absY() == this.connections[1].absY() + ) { + this.connections[0].connect(this.connections[1]) + this.delete() + } + } else if (this.connections.length == 0) this.delete() + } + } + + /** + * function delete a node + */ + delete() { + updateSimulationSet(true) + this.deleted = true + this.parent.scope.allNodes.clean(this) + this.parent.scope.nodes.clean(this) + + this.parent.scope.root.nodeList.clean(this) // Hope this works! - Can cause bugs + + if (simulationArea.lastSelected == this) + simulationArea.lastSelected = undefined + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].connections.clean(this) + this.connections[i].checkDeleted() + } + wireToBeCheckedSet(1) + forceResetNodesSet(true) + scheduleUpdate() + } + + isClicked() { + return ( + this.absX() == simulationArea.mouseX && + this.absY() == simulationArea.mouseY + ) + } + + isHover() { + return ( + this.absX() == simulationArea.mouseX && + this.absY() == simulationArea.mouseY + ) + } + + /** + * if input nodde: it resolves the parent + * else: it adds all the nodes onto the stack + * and they are processed to generate verilog + */ + nodeConnect() { + var x = this.absX() + var y = this.absY() + var n + + for (var i = 0; i < this.parent.scope.allNodes.length; i++) { + if ( + this != this.parent.scope.allNodes[i] && + x == this.parent.scope.allNodes[i].absX() && + y == this.parent.scope.allNodes[i].absY() + ) { + n = this.parent.scope.allNodes[i] + if (this.type == 2) { + for (var j = 0; j < this.connections.length; j++) { + n.connect(this.connections[j]) + } + this.delete() + } else { + this.connect(n) + } + + break + } + } + + if (n == undefined) { + for (var i = 0; i < this.parent.scope.wires.length; i++) { + if (this.parent.scope.wires[i].checkConvergence(this)) { + var n = this + if (this.type != 2) { + n = new Node( + this.absX(), + this.absY(), + 2, + this.scope.root + ) + this.connect(n) + } + this.parent.scope.wires[i].converge(n) + break + } + } + } + } + + processVerilog() { + if (this.type == NODE_INPUT) { + if (this.parent.isVerilogResolvable()) { + this.scope.stack.push(this.parent) + } + } + + for (var i = 0; i < this.connections.length; i++) { + if (this.connections[i].verilogLabel != this.verilogLabel) { + this.connections[i].verilogLabel = this.verilogLabel + this.scope.stack.push(this.connections[i]) + } + } + } +} + +/** + * delay in simulation of the node. + * @category node + */ +Node.prototype.propagationDelay = 0 + +/** + * backward comaptibilty? + * @category node + */ +Node.prototype.cleanDelete = Node.prototype.delete + +Node.prototype.processVerilog = function () { + if (this.type == NODE_INPUT) { + this.scope.stack.push(this.parent) + } + for (var i = 0; i < this.connections.length; i++) { + if (this.connections[i].verilogLabel != this.verilogLabel) { + this.connections[i].verilogLabel = this.verilogLabel + this.scope.stack.push(this.connections[i]) + } + } +} diff --git a/v0/src/simulator/src/plotArea.js b/v0/src/simulator/src/plotArea.js new file mode 100644 index 00000000..79bf2582 --- /dev/null +++ b/v0/src/simulator/src/plotArea.js @@ -0,0 +1,521 @@ +import simulationArea from './simulationArea' +import { convertors } from './utils' + +var DPR = window.devicePixelRatio || 1 + +// Helper function to scale to display +function sh(x) { + return x * DPR +} + +/** + * Spec Constants + * Size Spec Diagram - https://app.diagrams.net/#G1HFoesRvNyDap95sNJswTy3nH09emDriC + * NOTE: Since DPR is set on page load, changing of screen in runtime will not work well + * @TODO + * - Support for color themes + * - Replace constants with functions? - Can support Zoom in and Zoom out of canvas then + */ +var frameInterval = 100 // Refresh rate +var timeLineHeight = sh(20) +var padding = sh(2) +var plotHeight = sh(20) +var waveFormPadding = sh(5) +var waveFormHeight = plotHeight - 2 * waveFormPadding +var flagLabelWidth = sh(75) +var cycleWidth = sh(30) +var backgroundColor = 'black' +var foregroundColor = '#eee' +var textColor = 'black' +var waveFormColor = 'cyan' +var timeLineStartX = flagLabelWidth + padding + +// Helper functions for canvas + +function getFullHeight(flagCount) { + return timeLineHeight + (plotHeight + padding) * flagCount +} + +function getFlagStartY(flagIndex) { + return getFullHeight(flagIndex) + padding +} + +function getCycleStartX(cycleNumber) { + return timeLineStartX + (cycleNumber - plotArea.cycleOffset) * cycleWidth +} + +/** + * @type {Object} plotArea + * @category plotArea + */ +const plotArea = { + cycleOffset: 0, // Determines timeline offset + DPR: window.devicePixelRatio || 1, + canvas: document.getElementById('plotArea'), + cycleCount: 0, // Number of clock cycles passed + cycleTime: 0, // Time of last clock tick (in ms) + executionStartTime: 0, // Last time play() function ran in engine.js (in ms) + autoScroll: true, // if true, timeline will scroll to keep current time in display + width: 0, // canvas width + height: 0, // canvas height + unitUsed: 0, // Number of simulation units used by the engine + cycleUnit: 1000, // Number of simulation units per cycle + mouseDown: false, + mouseX: 0, // Current mouse position + mouseDownX: 0, // position of mouse when clicked + mouseDownTime: 0, // time when mouse clicked (in ms) + // Reset timeline to 0 and resume autoscroll + reset() { + this.cycleCount = 0 + this.cycleTime = new Date().getTime() + for (var i = 0; i < globalScope.Flag.length; i++) { + globalScope.Flag[i].plotValues = [ + [0, globalScope.Flag[i].inp1.value], + ] + globalScope.Flag[i].cachedIndex = 0 + } + this.unitUsed = 0 + this.resume() + this.resize() + }, + // Resume autoscroll + resume() { + this.autoScroll = true + }, + // pause autoscroll + pause() { + this.autoScroll = false + plotArea.scrollAcc = 0 + }, + // Called every time clock is ticked + nextCycle() { + this.cycleCount++ + this.cycleTime = new Date().getTime() + }, + // Called everytime play() function is execute in engine.js + setExecutionTime() { + this.executionStartTime = new Date().getTime() + }, + // Scale timeline up + zoomIn() { + cycleWidth += sh(2) + }, + // Scale timeline down + zoomOut() { + cycleWidth -= sh(2) + }, + // download as image + download() { + var img = this.canvas.toDataURL(`image/png`) + const anchor = document.createElement('a') + anchor.href = img + anchor.download = `waveform.png` + anchor.click() + }, + // update canvas size to use full screen + resize() { + var oldHeight = this.height + var oldWidth = this.width + this.width = document.getElementById('plot').clientWidth * this.DPR + this.height = getFullHeight(globalScope.Flag.length) + if (oldHeight == this.height && oldWidth == this.width) return + this.canvas.width = this.width + this.canvas.height = this.height + this.plot() + }, + // Setup function, called on page load + setup() { + this.canvas = document.getElementById('plotArea') + if (!embed) { + this.ctx = this.canvas.getContext('2d') + } + this.timeOutPlot = setInterval(() => { + plotArea.plot() + }, frameInterval) + this.reset() + }, + // Used to resolve analytical time in clock cycles + getPlotTime(timeUnit) { + var time = this.cycleCount // Current cycle count + time += timeUnit / this.cycleUnit // Add propagation delay + // For user interactions like buttons - calculate time since clock tick + var timePeriod = simulationArea.timePeriod + var executionDelay = this.executionStartTime - this.cycleTime + var delayFraction = executionDelay / timePeriod + // Add time since clock tick + time += delayFraction + return time + }, + // Auto calibrate clock simulation units based on usage + calibrate() { + var recommendedUnit = Math.max(20, Math.round(this.unitUsed * 3)) + this.cycleUnit = recommendedUnit + $('#timing-diagram-units').val(recommendedUnit) + this.reset() + }, + // Get current time in clock cycles + getCurrentTime() { + var time = this.cycleCount + var timePeriod = simulationArea.timePeriod + var delay = new Date().getTime() - this.cycleTime + var delayFraction = delay / timePeriod + time += delayFraction + return time + }, + update() { + this.resize() + var dangerColor = '#dc5656' + var normalColor = '#42b983' + this.unitUsed = Math.max( + this.unitUsed, + simulationArea.simulationQueue.time + ) + var unitUsed = this.unitUsed + var units = this.cycleUnit + var utilization = Math.round((unitUsed * 10000) / units) / 100 + $('#timing-diagram-log').html( + `Utilization: ${Math.round(unitUsed)} Units (${utilization}%)` + ) + if (utilization >= 90 || utilization <= 10) { + var recommendedUnit = Math.max(20, Math.round(unitUsed * 3)) + $('#timing-diagram-log').append( + ` Recommended Units: ${recommendedUnit}` + ) + $('#timing-diagram-log').css('background-color', dangerColor) + if (utilization >= 100) { + this.clear() + return + } + } else { + $('#timing-diagram-log').css('background-color', normalColor) + } + + var width = this.width + var endTime = this.getCurrentTime() + + if (this.autoScroll) { + // Formula used: + // (endTime - x) * cycleWidth = width - timeLineStartX; + // x = endTime - (width - timeLineStartX) / cycleWidth + this.cycleOffset = Math.max( + 0, + endTime - (width - timeLineStartX) / cycleWidth + ) + } else if (!plotArea.mouseDown) { + // Scroll + this.cycleOffset -= plotArea.scrollAcc + // Friction + plotArea.scrollAcc *= 0.95 + // No negative numbers allowed, so negative scroll to 0 + if (this.cycleOffset < 0) plotArea.scrollAcc = this.cycleOffset / 5 + // Set position to 0, to avoid infinite scrolling + if (Math.abs(this.cycleOffset) < 0.01) this.cycleOffset = 0 + } + }, + render() { + var { width, height } = this + this.canvas.height = height + this.canvas.width = width + var endTime = this.getCurrentTime() + // Reset canvas + this.clear() + var ctx = this.ctx + + // Background Color + ctx.fillStyle = backgroundColor + ctx.fillRect(0, 0, width, height) + + ctx.lineWidth = sh(1) + ctx.font = `${sh(15)}px Raleway` + ctx.textAlign = 'left' + + // Timeline + ctx.fillStyle = foregroundColor + ctx.fillRect(timeLineStartX, 0, this.canvas.width, timeLineHeight) + ctx.fillRect(0, 0, flagLabelWidth, timeLineHeight) + ctx.fillStyle = textColor + ctx.fillText('Time', sh(5), timeLineHeight * 0.7) + + // Timeline numbers + ctx.font = `${sh(9)}px Times New Roman` + ctx.strokeStyle = textColor + ctx.textAlign = 'center' + for ( + var i = Math.floor(plotArea.cycleOffset); + getCycleStartX(i) <= width; + i++ + ) { + var x = getCycleStartX(i) + // Large ticks + number + // @TODO - collapse number if it doesn't fit + if (x >= timeLineStartX) { + ctx.fillText(`${i}`, x, timeLineHeight - sh(15) / 2) + ctx.beginPath() + ctx.moveTo(x, timeLineHeight - sh(5)) + ctx.lineTo(x, timeLineHeight) + ctx.stroke() + } + // Small ticks + for (var j = 1; j < 5; j++) { + var x1 = x + Math.round((j * cycleWidth) / 5) + if (x1 >= timeLineStartX) { + ctx.beginPath() + ctx.moveTo(x1, timeLineHeight - sh(2)) + ctx.lineTo(x1, timeLineHeight) + ctx.stroke() + } + } + } + + // Flag Labels + ctx.textAlign = 'left' + for (var i = 0; i < globalScope.Flag.length; i++) { + var startHeight = getFlagStartY(i) + ctx.fillStyle = foregroundColor + ctx.fillRect(0, startHeight, flagLabelWidth, plotHeight) + ctx.fillStyle = textColor + ctx.fillText( + globalScope.Flag[i].identifier, + sh(5), + startHeight + plotHeight * 0.7 + ) + } + + // Waveform Status Flags + const WAVEFORM_NOT_STARTED = 0 + const WAVEFORM_STARTED = 1 + const WAVEFORM_OVER = 3 + + // Waveform + ctx.strokeStyle = waveFormColor + ctx.textAlign = 'center' + var endX = Math.min(getCycleStartX(endTime), width) + + for (var i = 0; i < globalScope.Flag.length; i++) { + var plotValues = globalScope.Flag[i].plotValues + var startHeight = getFlagStartY(i) + waveFormPadding + var yTop = startHeight + var yMid = startHeight + waveFormHeight / 2 + var yBottom = startHeight + waveFormHeight + var state = WAVEFORM_NOT_STARTED + var prevY + + // Find correct index to start plotting from + var j = 0 + // Using caching for optimal performance + if (globalScope.Flag[i].cachedIndex) { + j = globalScope.Flag[i].cachedIndex + } + // Move to beyond timeLineStartX + while ( + j + 1 < plotValues.length && + getCycleStartX(plotValues[j][0]) < timeLineStartX + ) { + j++ + } + // Move to just before timeLineStartX + while (j > 0 && getCycleStartX(plotValues[j][0]) > timeLineStartX) { + j-- + } + // Cache index + globalScope.Flag[i].cachedIndex = j + + // Plot + for (; j < plotValues.length; j++) { + var x = getCycleStartX(plotValues[j][0]) + + // Handle out of bound + if (x < timeLineStartX) { + if (j + 1 != plotValues.length) { + // Next one also is out of bound, so skip this one completely + var x1 = getCycleStartX(plotValues[j + 1][0]) + if (x1 < timeLineStartX) continue + } + x = timeLineStartX + } + + var value = plotValues[j][1] + if (value === undefined) { + if (state == WAVEFORM_STARTED) { + ctx.stroke() + } + state = WAVEFORM_NOT_STARTED + continue + } + if (globalScope.Flag[i].bitWidth == 1) { + if (x > endX) break + var y = value == 1 ? yTop : yBottom + if (state == WAVEFORM_NOT_STARTED) { + // Start new plot + state = WAVEFORM_STARTED + ctx.beginPath() + ctx.moveTo(x, y) + } else { + ctx.lineTo(x, prevY) + ctx.lineTo(x, y) + } + prevY = y + } else { + var endX + if (j + 1 == plotValues.length) { + endX = getCycleStartX(endTime) + } else { + endX = getCycleStartX(plotValues[j + 1][0]) + } + var smallOffset = waveFormHeight / 2 + ctx.beginPath() + ctx.moveTo(endX, yMid) + ctx.lineTo(endX - smallOffset, yTop) + ctx.lineTo(x + smallOffset, yTop) + ctx.lineTo(x, yMid) + ctx.lineTo(x + smallOffset, yBottom) + ctx.lineTo(endX - smallOffset, yBottom) + ctx.closePath() + ctx.stroke() + + // Text position + // Clamp start and end are within the screen + var x1 = Math.max(x, timeLineStartX) + var x2 = Math.min(endX, width) + var textPositionX = (x1 + x2) / 2 + + ctx.font = `${sh(9)}px Times New Roman` + ctx.fillStyle = 'white' + ctx.fillText( + convertors.dec2hex(value), + textPositionX, + yMid + sh(3) + ) + } + if (x > width) { + state = WAVEFORM_OVER + ctx.stroke() + break + } + } + if (state == WAVEFORM_STARTED) { + if (globalScope.Flag[i].bitWidth == 1) { + ctx.lineTo(endX, prevY) + } + ctx.stroke() + } + } + }, + // Driver function to render and update + plot() { + if (embed) return + if (globalScope.Flag.length === 0) { + this.canvas.width = 0 + this.canvas.height = 0 + return + } + + this.update() + this.render() + }, + clear() { + this.ctx.clearRect(0, 0, plotArea.canvas.width, plotArea.canvas.height) + }, +} +export default plotArea + +/** + * type {Object} timingDiagramButtonActions + * @category plotArea + * @description Actions for buttons in timing diagram + * @property {function} smallHeight - Decrease waveform height + * @property {function} largeHeight - Increase waveform height + */ + +const timingDiagramButtonActions = { + smallHeight() { + if (plotHeight >= sh(20)) { + plotHeight -= sh(5) + waveFormHeight = plotHeight - 2 * waveFormPadding + } + }, + largeHeight() { + if (plotHeight < sh(50)) { + plotHeight += sh(5) + waveFormHeight = plotHeight - 2 * waveFormPadding + } + }, +} + +export { timingDiagramButtonActions } + +export function setupTimingListeners() { + // $('.timing-diagram-smaller').on('click', () => { + // $('#plot').width(Math.max($('#plot').width() - 20, 560)) + // plotArea.resize() + // }) + // $('.timing-diagram-larger').on('click', () => { + // $('#plot').width($('#plot').width() + 20) + // plotArea.resize() + // }) + // $('.timing-diagram-small-height').on('click', () => { + // if (plotHeight >= sh(20)) { + // plotHeight -= sh(5) + // waveFormHeight = plotHeight - 2 * waveFormPadding + // } + // }) + // $('.timing-diagram-large-height').on('click', () => { + // if (plotHeight < sh(50)) { + // plotHeight += sh(5) + // waveFormHeight = plotHeight - 2 * waveFormPadding + // } + // }) + // $('.timing-diagram-reset').on('click', () => { + // plotArea.reset() + // }) + // $('.timing-diagram-calibrate').on('click', () => { + // plotArea.calibrate() + // }) + // $('.timing-diagram-resume').on('click', () => { + // plotArea.resume() + // }) + // $('.timing-diagram-pause').on('click', () => { + // plotArea.pause() + // }) + // $('.timing-diagram-download').on('click', () => { + // plotArea.download() + // }) + // $('.timing-diagram-zoom-in').on('click', () => { + // plotArea.zoomIn() + // }) + // $('.timing-diagram-zoom-out').on('click', () => { + // plotArea.zoomOut() + // }) + // $('#timing-diagram-units').on('change paste keyup', function () { + // var timeUnits = parseInt($(this).val(), 10) + // if (isNaN(timeUnits) || timeUnits < 1) return + // plotArea.cycleUnit = timeUnits + // }) + document.getElementById('plotArea').addEventListener('mousedown', (e) => { + var rect = plotArea.canvas.getBoundingClientRect() + var x = sh(e.clientX - rect.left) + plotArea.scrollAcc = 0 + plotArea.autoScroll = false + plotArea.mouseDown = true + plotArea.mouseX = x + plotArea.mouseDownX = x + plotArea.mouseDownTime = new Date().getTime() + }) + document.getElementById('plotArea').addEventListener('mouseup', (e) => { + plotArea.mouseDown = false + var time = new Date().getTime() - plotArea.mouseDownTime + var offset = (plotArea.mouseX - plotArea.mouseDownX) / cycleWidth + plotArea.scrollAcc = (offset * frameInterval) / time + }) + + document.getElementById('plotArea').addEventListener('mousemove', (e) => { + var rect = plotArea.canvas.getBoundingClientRect() + var x = sh(e.clientX - rect.left) + if (plotArea.mouseDown) { + plotArea.cycleOffset -= (x - plotArea.mouseX) / cycleWidth + plotArea.mouseX = x + } else { + plotArea.mouseDown = false + } + }) +} diff --git a/v0/src/simulator/src/quinMcCluskey.js b/v0/src/simulator/src/quinMcCluskey.js new file mode 100644 index 00000000..f15041db --- /dev/null +++ b/v0/src/simulator/src/quinMcCluskey.js @@ -0,0 +1,227 @@ +// Algorithm used for Combinational Analysis + +export default function BooleanMinimize( + numVarsArg, + minTermsArg, + dontCaresArg = [] +) { + var __result + + Object.defineProperties(this, { + minTerms: { + value: minTermsArg, + enumerable: false, + writable: false, + configurable: true, + }, + + dontCares: { + value: dontCaresArg, + enumerable: false, + writable: false, + configurable: true, + }, + + numVars: { + value: numVarsArg, + enumerable: false, + writable: false, + configurable: true, + }, + + result: { + enumerable: true, + configurable: true, + get: function () { + if (__result === undefined) { + __result = BooleanMinimize.prototype.solve.call(this) + } + + return __result + }, + set: function () { + throw new Error('result cannot be assigned a value') + }, + }, + }) +} + +BooleanMinimize.prototype.solve = function () { + function dec_to_binary_string(n) { + var str = n.toString(2) + + while (str.length != this.numVars) { + str = '0' + str + } + + return str + } + + function num_set_bits(s) { + var ans = 0 + for (let i = 0; i < s.length; ++i) if (s[i] === '1') ans++ + return ans + } + + function get_prime_implicants(allTerms) { + var table = [] + var primeImplicants = new Set() + var reduced + + while (1) { + for (let i = 0; i <= this.numVars; ++i) table[i] = new Set() + for (let i = 0; i < allTerms.length; ++i) + table[num_set_bits(allTerms[i])].add(allTerms[i]) + + allTerms = [] + reduced = new Set() + + for (let i = 0; i < table.length - 1; ++i) { + for (let str1 of table[i]) { + for (let str2 of table[i + 1]) { + let diff = -1 + + for (let j = 0; j < this.numVars; ++j) { + if (str1[j] != str2[j]) { + if (diff === -1) { + diff = j + } else { + diff = -1 + break + } + } + } + + if (diff !== -1) { + allTerms.push( + str1.slice(0, diff) + '-' + str1.slice(diff + 1) + ) + reduced.add(str1) + reduced.add(str2) + } + } + } + } + + for (let t of table) { + for (let str of t) { + if (!reduced.has(str)) primeImplicants.add(str) + } + } + + if (!reduced.size) break + } + + return primeImplicants + } + + function get_essential_prime_implicants(primeImplicants, minTerms) { + var table = [], + column + + function check_if_similar(minTerm, primeImplicant) { + for (let i = 0; i < primeImplicant.length; ++i) { + if ( + primeImplicant[i] !== '-' && + minTerm[i] !== primeImplicant[i] + ) + return false + } + + return true + } + + function get_complexity(terms) { + var complexity = terms.length + + for (let t of terms) { + for (let i = 0; i < t.length; ++i) { + if (t[i] !== '-') { + complexity++ + if (t[i] === '0') complexity++ + } + } + } + + return complexity + } + + function isSubset(sub, sup) { + for (let i of sub) { + if (!sup.has(i)) return false + } + + return true + } + + for (let m of minTerms) { + column = [] + + for (let i = 0; i < primeImplicants.length; ++i) { + if (check_if_similar(m, primeImplicants[i])) { + column.push(i) + } + } + + table.push(column) + } + + var possibleSets = [], + tempSets + + for (let i of table[0]) { + possibleSets.push(new Set([i])) + } + + for (let i = 1; i < table.length; ++i) { + tempSets = [] + for (let s of possibleSets) { + for (let p of table[i]) { + let x = new Set(s) + x.add(p) + let append = true + + for (let j = tempSets.length - 1; j >= 0; --j) { + if (isSubset(x, tempSets[j])) { + tempSets.splice(j, 1) + } else { + append = false + } + } + + if (append) { + tempSets.push(x) + } + } + + possibleSets = tempSets + } + } + + var essentialImplicants, + minComplexity = 1e9 + + for (let s of possibleSets) { + let p = [] + for (let i of s) { + p.push(primeImplicants[i]) + } + let comp = get_complexity(p) + if (comp < minComplexity) { + essentialImplicants = p + minComplexity = comp + } + } + + return essentialImplicants + } + + var minTerms = this.minTerms.map(dec_to_binary_string.bind(this)) + var dontCares = this.dontCares.map(dec_to_binary_string.bind(this)) + + return get_essential_prime_implicants.call( + this, + Array.from(get_prime_implicants.call(this, minTerms.concat(dontCares))), + minTerms + ) +} diff --git a/v0/src/simulator/src/restrictedElementDiv.js b/v0/src/simulator/src/restrictedElementDiv.js new file mode 100644 index 00000000..74e1aad5 --- /dev/null +++ b/v0/src/simulator/src/restrictedElementDiv.js @@ -0,0 +1,44 @@ +export function updateRestrictedElementsList() { + if (restrictedElements.length === 0) return + + const { restrictedCircuitElementsUsed } = globalScope + let restrictedStr = '' + + restrictedCircuitElementsUsed.forEach((element) => { + restrictedStr += `${element}, ` + }) + + if (restrictedStr === '') { + restrictedStr = 'None' + } else { + restrictedStr = restrictedStr.slice(0, -2) + } + + document.getElementById('restrictedElementsDiv--list').innerHTML = restrictedStr +} + +export function updateRestrictedElementsInScope(scope = globalScope) { + // Do nothing if no restricted elements + if (restrictedElements.length === 0) return + + const restrictedElementsUsed = [] + restrictedElements.forEach((element) => { + if (scope[element].length > 0) { + restrictedElementsUsed.push(element) + } + }) + + scope.restrictedCircuitElementsUsed = restrictedElementsUsed + updateRestrictedElementsList() +} + +export function showRestricted() { + document.getElementById('restrictedDiv').classList.remove('display--none') + // Show no help text for restricted elements + document.getElementById('Help').classList.remove('show') + document.getElementById('restrictedDiv').innerHTML = 'The element has been restricted by mentor. Usage might lead to deduction in marks' +} + +export function hideRestricted() { + document.getElementById('restrictedDiv').classList.add('display--none') +} diff --git a/v0/src/simulator/src/sequential.js b/v0/src/simulator/src/sequential.js new file mode 100644 index 00000000..bd1740de --- /dev/null +++ b/v0/src/simulator/src/sequential.js @@ -0,0 +1,25 @@ +import { scheduleUpdate, play, updateCanvasSet } from './engine' +import simulationArea from './simulationArea' + +/** + * a global function as a helper for simulationArea.changeClockEnable + * @category sequential + */ +export function changeClockEnable(val) { + simulationArea.clockEnabled = val +} + +/** + * WIP function defined and used + * @param {number} n + * @category sequential + */ +export function runTest(n = 10) { + var t = new Date().getTime() + for (var i = 0; i < n; i++) { + clockTick() + } + updateCanvasSet(true) + play() + scheduleUpdate() +} diff --git a/v0/src/simulator/src/sequential/Clock.js b/v0/src/simulator/src/sequential/Clock.js new file mode 100644 index 00000000..86e24955 --- /dev/null +++ b/v0/src/simulator/src/sequential/Clock.js @@ -0,0 +1,95 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo } from '../canvasApi' +import { colors } from '../themer/themer' +/** + * @class + * Clock + * Clock + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * @category sequential + */ +export default class Clock extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT') { + super(x, y, scope, dir, 1) + /* + this.scope['Clock'].push(this); + */ + this.fixedBitWidth = true + this.output1 = new Node(10, 0, 1, this, 1) + this.state = 0 + this.output1.value = this.state + this.wasClicked = false + this.interval = null + } + + customSave() { + var data = { + nodes: { + output1: findNode(this.output1), + }, + constructorParamaters: [this.direction], + } + return data + } + + resolve() { + this.output1.value = this.state + simulationArea.simulationQueue.add(this.output1) + } + + toggleState() { + // toggleState + this.state = (this.state + 1) % 2 + this.output1.value = this.state + } + + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(3) + var xx = this.x + var yy = this.y + + ctx.beginPath() + ctx.strokeStyle = [colors['color_wire_con'], colors['color_wire_pow']][ + this.state + ] + ctx.lineWidth = correctWidth(2) + if (this.state == 0) { + moveTo(ctx, -6, 0, xx, yy, 'RIGHT') + lineTo(ctx, -6, 5, xx, yy, 'RIGHT') + lineTo(ctx, 0, 5, xx, yy, 'RIGHT') + lineTo(ctx, 0, -5, xx, yy, 'RIGHT') + lineTo(ctx, 6, -5, xx, yy, 'RIGHT') + lineTo(ctx, 6, 0, xx, yy, 'RIGHT') + } else { + moveTo(ctx, -6, 0, xx, yy, 'RIGHT') + lineTo(ctx, -6, -5, xx, yy, 'RIGHT') + lineTo(ctx, 0, -5, xx, yy, 'RIGHT') + lineTo(ctx, 0, 5, xx, yy, 'RIGHT') + lineTo(ctx, 6, 5, xx, yy, 'RIGHT') + lineTo(ctx, 6, 0, xx, yy, 'RIGHT') + } + ctx.stroke() + } + + static verilogInstructions() { + return 'Clock - Use a single global clock\n' + } +} + +Clock.prototype.tooltipText = 'Clock' + +Clock.prototype.click = Clock.prototype.toggleState +Clock.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/6sequentialelements?id=clock' +Clock.prototype.objectType = 'Clock' +Clock.prototype.propagationDelay = 0 +Clock.prototype.propagationDelayFixed = true diff --git a/v0/src/simulator/src/sequential/DflipFlop.js b/v0/src/simulator/src/sequential/DflipFlop.js new file mode 100644 index 00000000..4543ba61 --- /dev/null +++ b/v0/src/simulator/src/sequential/DflipFlop.js @@ -0,0 +1,168 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText } from '../canvasApi' +import { colors } from '../themer/themer' +/** + * @class + * DflipFlop + * D flip flop has 5 input nodes: + * clock, data input, preset, reset ,enable. + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * @category sequential + */ +export default class DflipFlop extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* + this.scope['DflipFlop'].push(this); + */ + this.directionFixed = true + this.setDimensions(20, 20) + this.rectangleObject = true + this.clockInp = new Node(-20, +10, 0, this, 1, 'Clock') + this.dInp = new Node(-20, -10, 0, this, this.bitWidth, 'D') + this.qOutput = new Node(20, -10, 1, this, this.bitWidth, 'Q') + this.qInvOutput = new Node(20, 10, 1, this, this.bitWidth, 'Q Inverse') + this.reset = new Node(10, 20, 0, this, 1, 'Asynchronous Reset') + this.preset = new Node(0, 20, 0, this, this.bitWidth, 'Preset') + this.en = new Node(-10, 20, 0, this, 1, 'Enable') + this.masterState = 0 + this.slaveState = 0 + this.prevClockState = 0 + + this.wasClicked = false + } + + /** + * WIP always resolvable? + */ + isResolvable() { + return true + // if (this.reset.value == 1) return true; + // if (this.clockInp.value != undefined && this.dInp.value != undefined) return true; + // return false; + } + + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.dInp.bitWidth = bitWidth + this.qOutput.bitWidth = bitWidth + this.qInvOutput.bitWidth = bitWidth + this.preset.bitWidth = bitWidth + } + + /** + * @memberof DflipFlop + * On the leading edge of the clock signal (LOW-to-HIGH) the first stage, + * the “master” latches the input condition at D, while the output stage is deactivated. + * On the trailing edge of the clock signal (HIGH-to-LOW) the second “slave” stage is + * now activated, latching on to the output from the first master circuit. + * Then the output stage appears to be triggered on the negative edge of the clock pulse. + * This fuction sets the value for the node qOutput based on the previous state + * and input of the clock. We flip the bits to find qInvOutput + */ + resolve() { + if (this.reset.value == 1) { + this.masterState = this.slaveState = this.preset.value || 0 + } else if (this.en.value == 0) { + this.prevClockState = this.clockInp.value + } else if (this.en.value == 1 || this.en.connections.length == 0) { + // if(this.en.value==1) // Creating Infinite Loop, WHY ?? + if (this.clockInp.value == this.prevClockState) { + if (this.clockInp.value == 0 && this.dInp.value != undefined) { + this.masterState = this.dInp.value + } + } else if (this.clockInp.value != undefined) { + if (this.clockInp.value == 1) { + this.slaveState = this.masterState + } else if ( + this.clockInp.value == 0 && + this.dInp.value != undefined + ) { + this.masterState = this.dInp.value + } + this.prevClockState = this.clockInp.value + } + } + + if (this.qOutput.value != this.slaveState) { + this.qOutput.value = this.slaveState + this.qInvOutput.value = this.flipBits(this.slaveState) + simulationArea.simulationQueue.add(this.qOutput) + simulationArea.simulationQueue.add(this.qInvOutput) + } + } + + customSave() { + var data = { + nodes: { + clockInp: findNode(this.clockInp), + dInp: findNode(this.dInp), + qOutput: findNode(this.qOutput), + qInvOutput: findNode(this.qInvOutput), + reset: findNode(this.reset), + preset: findNode(this.preset), + en: findNode(this.en), + }, + constructorParamaters: [this.direction, this.bitWidth], + } + return data + } + + customDraw() { + var ctx = simulationArea.context + // + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.beginPath() + ctx.lineWidth = correctWidth(3) + var xx = this.x + var yy = this.y + // rect(ctx, xx - 20, yy - 20, 40, 40); + moveTo(ctx, -20, 5, xx, yy, this.direction) + lineTo(ctx, -15, 10, xx, yy, this.direction) + lineTo(ctx, -20, 15, xx, yy, this.direction) + // if ((this.b.hover&&!simulationArea.shiftDown)|| simulationArea.lastSelected == this || simulationArea.multipleObjectSelections.contains(this)) ctx.fillStyle = "rgba(255, 255, 32,0.8)";ctx.fill(); + ctx.stroke() + + ctx.beginPath() + ctx.font = '20px Raleway' + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + fillText(ctx, this.slaveState.toString(16), xx, yy + 5) + ctx.fill() + } + + static moduleVerilog() { + return ` +module DflipFlop(q, q_inv, clk, d, a_rst, pre, en); + parameter WIDTH = 1; + output reg [WIDTH-1:0] q, q_inv; + input clk, a_rst, pre, en; + input [WIDTH-1:0] d; + + always @ (posedge clk or posedge a_rst) + if (a_rst) begin + q <= 'b0; + q_inv <= 'b1; + end else if (en == 0) ; + else begin + q <= d; + q_inv <= ~d; + end +endmodule + ` + } +} + +DflipFlop.prototype.tooltipText = + 'D FlipFlop ToolTip : Introduces delay in timing circuit.' +DflipFlop.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/6sequentialelements?id=d-flip-flop' + +DflipFlop.prototype.objectType = 'DflipFlop' diff --git a/v0/src/simulator/src/sequential/Dlatch.js b/v0/src/simulator/src/sequential/Dlatch.js new file mode 100644 index 00000000..7532d3db --- /dev/null +++ b/v0/src/simulator/src/sequential/Dlatch.js @@ -0,0 +1,119 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText } from '../canvasApi' +/** + * @class + * Dlatch + * D latch has 2 input nodes: + * clock, data input. + * Difference between this and D - FlipFlop is + * that Flip flop must have a clock. + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * @category sequential + */ +import { colors } from '../themer/themer' +export default class Dlatch extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* + this.scope['Dlatch'].push(this); + */ + this.directionFixed = true + this.setDimensions(20, 20) + this.rectangleObject = true + this.clockInp = new Node(-20, +10, 0, this, 1, 'Clock') + this.dInp = new Node(-20, -10, 0, this, this.bitWidth, 'D') + this.qOutput = new Node(20, -10, 1, this, this.bitWidth, 'Q') + this.qInvOutput = new Node(20, 10, 1, this, this.bitWidth, 'Q Inverse') + // this.reset = new Node(10, 20, 0, this, 1, "Asynchronous Reset"); + // this.preset = new Node(0, 20, 0, this, this.bitWidth, "Preset"); + // this.en = new Node(-10, 20, 0, this, 1, "Enable"); + this.state = 0 + this.prevClockState = 0 + this.wasClicked = false + } + + /** + * Idea: shoould be D FF? + */ + isResolvable() { + if (this.clockInp.value != undefined && this.dInp.value != undefined) + return true + return false + } + + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.dInp.bitWidth = bitWidth + this.qOutput.bitWidth = bitWidth + this.qInvOutput.bitWidth = bitWidth + // this.preset.bitWidth = bitWidth; + } + + /** + * @memberof Dlatch + * when the clock input is high we update the state + * qOutput is set to the state + */ + resolve() { + if (this.clockInp.value == 1 && this.dInp.value != undefined) { + this.state = this.dInp.value + } + + if (this.qOutput.value != this.state) { + this.qOutput.value = this.state + this.qInvOutput.value = this.flipBits(this.state) + simulationArea.simulationQueue.add(this.qOutput) + simulationArea.simulationQueue.add(this.qInvOutput) + } + } + + customSave() { + var data = { + nodes: { + clockInp: findNode(this.clockInp), + dInp: findNode(this.dInp), + qOutput: findNode(this.qOutput), + qInvOutput: findNode(this.qInvOutput), + // reset: findNode(this.reset), + // preset: findNode(this.preset), + // en: findNode(this.en), + }, + constructorParamaters: [this.direction, this.bitWidth], + } + return data + } + + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.beginPath() + ctx.lineWidth = correctWidth(3) + var xx = this.x + var yy = this.y + // rect(ctx, xx - 20, yy - 20, 40, 40); + moveTo(ctx, -20, 5, xx, yy, this.direction) + lineTo(ctx, -15, 10, xx, yy, this.direction) + lineTo(ctx, -20, 15, xx, yy, this.direction) + // if ((this.b.hover&&!simulationArea.shiftDown)|| simulationArea.lastSelected == this || simulationArea.multipleObjectSelections.contains(this)) ctx.fillStyle = "rgba(255, 255, 32,0.8)";ctx.fill(); + ctx.stroke() + ctx.beginPath() + ctx.font = '20px Raleway' + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + fillText(ctx, this.state.toString(16), xx, yy + 5) + ctx.fill() + } +} + +Dlatch.prototype.tooltipText = 'D Latch : Single input Flip flop or D FlipFlop' +Dlatch.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/6sequentialelements?id=d-latch' + +Dlatch.prototype.objectType = 'Dlatch' diff --git a/v0/src/simulator/src/sequential/EEPROM.js b/v0/src/simulator/src/sequential/EEPROM.js new file mode 100644 index 00000000..3a3427b8 --- /dev/null +++ b/v0/src/simulator/src/sequential/EEPROM.js @@ -0,0 +1,104 @@ +import RAM from './RAM' +/** + * @class + * EEPROM Component. + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + + * + * This is basically a RAM component that persists its contents. + * + * We consider EEPROMs more 'expensive' than RAMs, so we arbitrarily limit + * the addressWith to a maximum of 10 bits (1024 addresses) with a default of 8-bit (256). + * + * In the EEPROM all addresses are initialized to zero. + * This way we serialize unused values as "0" instead of "null". + * + * These two techniques help keep reduce the size of saved projects. + * @category sequential + */ +export default class EEPROM extends RAM { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 8, + addressWidth = 8, + data = null + ) { + super(x, y, scope, dir, bitWidth, addressWidth) + /* + this.scope['EEPROM'].push(this); + */ + this.data = data || this.data + } + + clearData() { + super.clearData() + for (var i = 0; i < this.data.length; i++) + this.data[i] = this.data[i] || 0 + } + + customSave() { + var saveInfo = super.customSave(this) + + // Normalize this.data to use zeroes instead of null when serialized. + var { data } = this + + saveInfo.constructorParamaters.push(data) + return saveInfo + } + + //This is a EERAM without a clock - not normal + //reset is supported + static moduleVerilog() { + return ` + module EEPROM(dout, addr, din, we, dmp, rst); + parameter WIDTH = 8; + parameter ADDR = 10; + output [WIDTH-1:0] dout; + input [ADDR-1:0] addr; + input [WIDTH-1:0] din; + input we; + input dmp; + input rst; + reg [WIDTH-1:0] mem[2**ADDR-1:0]; + integer j; + + assign dout = mem[addr]; + + always @ (*) begin + if (!rst) + for (j=0; j < 2**ADDR-1; j=j+1) begin + mem[j] = 0; + end + if (!we) + mem[addr] = din; + dout = mem[addr]; + end + endmodule + ` + } +} + +EEPROM.prototype.tooltipText = + 'Electrically Erasable Programmable Read-Only Memory' +EEPROM.prototype.shortName = 'EEPROM' +EEPROM.prototype.maxAddressWidth = 10 +EEPROM.prototype.mutableProperties = { + addressWidth: { + name: 'Address Width', + type: 'number', + max: '10', + min: '1', + func: 'changeAddressWidth', + }, + dump: RAM.prototype.mutableProperties.dump, + load: RAM.prototype.mutableProperties.load, + reset: RAM.prototype.mutableProperties.reset, +} +EEPROM.prototype.objectType = 'EEPROM' diff --git a/v0/src/simulator/src/sequential/JKflipFlop.js b/v0/src/simulator/src/sequential/JKflipFlop.js new file mode 100644 index 00000000..c02eae3f --- /dev/null +++ b/v0/src/simulator/src/sequential/JKflipFlop.js @@ -0,0 +1,166 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText } from '../canvasApi' +/** + * @class + * JKflipFlop + * JK flip flop has 6 input nodes: + * clock, J input, K input, preset, reset ,enable. + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * @category sequential + */ +import { colors } from '../themer/themer' +export default class JKflipFlop extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT') { + super(x, y, scope, dir, 1) + /* + this.scope['JKflipFlop'].push(this); + */ + this.directionFixed = true + this.fixedBitWidth = true + this.setDimensions(20, 20) + this.rectangleObject = true + this.J = new Node(-20, -10, 0, this, 1, 'J') + this.K = new Node(-20, 0, 0, this, 1, 'K') + this.clockInp = new Node(-20, 10, 0, this, 1, 'Clock') + this.qOutput = new Node(20, -10, 1, this, 1, 'Q') + this.qInvOutput = new Node(20, 10, 1, this, 1, 'Q Inverse') + this.reset = new Node(10, 20, 0, this, 1, 'Asynchronous Reset') + this.preset = new Node(0, 20, 0, this, 1, 'Preset') + this.en = new Node(-10, 20, 0, this, 1, 'Enable') + this.state = 0 + this.slaveState = 0 + this.masterState = 0 + this.prevClockState = 0 + + // this.wasClicked = false; + } + + /** + * @memberof JKflipFlop + * if none of the predefined nodes have been deleted it isresolvable + */ + isResolvable() { + if (this.reset.value == 1) return true + if ( + this.clockInp.value != undefined && + this.J.value != undefined && + this.K.value != undefined + ) + return true + return false + } + + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.dInp.bitWidth = bitWidth + this.qOutput.bitWidth = bitWidth + this.qInvOutput.bitWidth = bitWidth + this.preset.bitWidth = bitWidth + } + + /** + * @memberof JKflipFlop + * Edge triggered master slave JK flip flop is resolved by + * setting the slaveState = masterState when there is an edge + * in the clock. masterState = this.J when no change in clock. + */ + resolve() { + if (this.reset.value == 1) { + this.masterState = this.slaveState = this.preset.value || 0 + } else if (this.en.value == 0) { + this.prevClockState = this.clockInp.value + } else if (this.en.value == 1 || this.en.connections.length == 0) { + if (this.clockInp.value == this.prevClockState) { + if ( + this.clockInp.value == 0 && + this.J.value != undefined && + this.K.value != undefined + ) { + if (this.J.value && this.K.value) { + this.masterState = 1 ^ this.slaveState + } else if (this.J.value ^ this.K.value) { + this.masterState = this.J.value + } + } + } else if (this.clockInp.value != undefined) { + if (this.clockInp.value == 1) { + this.slaveState = this.masterState + } else if ( + this.clockInp.value == 0 && + this.J.value != undefined && + this.K.value != undefined + ) { + if (this.J.value && this.K.value) { + this.masterState = 1 ^ this.slaveState + } else if (this.J.value ^ this.K.value) { + this.masterState = this.J.value + } + } + this.prevClockState = this.clockInp.value + } + } + + if (this.qOutput.value != this.slaveState) { + this.qOutput.value = this.slaveState + this.qInvOutput.value = this.flipBits(this.slaveState) + simulationArea.simulationQueue.add(this.qOutput) + simulationArea.simulationQueue.add(this.qInvOutput) + } + } + + customSave() { + var data = { + nodes: { + J: findNode(this.J), + K: findNode(this.K), + clockInp: findNode(this.clockInp), + qOutput: findNode(this.qOutput), + qInvOutput: findNode(this.qInvOutput), + reset: findNode(this.reset), + preset: findNode(this.preset), + en: findNode(this.en), + }, + constructorParamaters: [this.direction], + } + return data + } + + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.beginPath() + ctx.lineWidth = correctWidth(3) + var xx = this.x + var yy = this.y + + // rect(ctx, xx - 20, yy - 20, 40, 40); + moveTo(ctx, -20, 5, xx, yy, this.direction) + lineTo(ctx, -15, 10, xx, yy, this.direction) + lineTo(ctx, -20, 15, xx, yy, this.direction) + + // if ((this.b.hover&&!simulationArea.shiftDown)|| simulationArea.lastSelected == this || simulationArea.multipleObjectSelections.contains(this)) ctx.fillStyle = "rgba(255, 255, 32,0.8)";ctx.fill(); + ctx.stroke() + + ctx.beginPath() + ctx.font = '20px Raleway' + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + fillText(ctx, this.slaveState.toString(16), xx, yy + 5) + ctx.fill() + } +} + +JKflipFlop.prototype.tooltipText = + 'JK FlipFlop ToolTip : gated SR flip-flop with the addition of a clock input.' + +JKflipFlop.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/6sequentialelements?id=jk-flip-flop' + +JKflipFlop.prototype.objectType = 'JKflipFlop' diff --git a/v0/src/simulator/src/sequential/Keyboard.js b/v0/src/simulator/src/sequential/Keyboard.js new file mode 100644 index 00000000..ffeb7a9c --- /dev/null +++ b/v0/src/simulator/src/sequential/Keyboard.js @@ -0,0 +1,232 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText3 } from '../canvasApi' +/** + * @class + * Keyboard + * KeyBoard - We can give 3 inputs: clock, enable and available. + * An output of 7 bits is given out when clockInp = 1. + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * @category sequential + */ +import { colors } from '../themer/themer' +export default class Keyboard extends CircuitElement { + constructor(x, y, scope = globalScope, bufferSize = 32) { + super(x, y, scope, 'RIGHT', 1) + /* + this.scope['Keyboard'].push(this); + */ + this.directionFixed = true + this.fixedBitWidth = true + + this.bufferSize = bufferSize || parseInt(prompt('Enter buffer size:')) + this.elementWidth = Math.max(80, Math.ceil(this.bufferSize / 2) * 20) + this.elementHeight = 40 // Math.max(40,Math.ceil(this.rows*15/20)*20); + this.setWidth(this.elementWidth / 2) + this.setHeight(this.elementHeight / 2) + + this.clockInp = new Node( + -this.elementWidth / 2, + this.elementHeight / 2 - 10, + 0, + this, + 1, + 'Clock' + ) + this.asciiOutput = new Node( + 30, + this.elementHeight / 2, + 1, + this, + 7, + 'Ascii Output' + ) + this.available = new Node( + 10, + this.elementHeight / 2, + 1, + this, + 1, + 'Available' + ) + this.reset = new Node(-10, this.elementHeight / 2, 0, this, 1, 'Reset') + this.en = new Node(-30, this.elementHeight / 2, 0, this, 1, 'Enable') + this.prevClockState = 0 + this.buffer = '' + this.bufferOutValue = undefined + } + + /** + * @memberof Keyboard + * this funcion sets the size of maximum input that can + * be given to the keyboard at once before it starts sending data. + */ + changeBufferSize(size) { + if (size == undefined || size < 20 || size > 100) return + if (this.bufferSize == size) return + var obj = new Keyboard(this.x, this.y, this.scope, size) + this.delete() + simulationArea.lastSelected = obj + return obj + } + + /** + * @memberof Keyboard + * Adds the keyy pressed to the buffer + */ + keyDown(key) { + if (key.length != 1) return + this.buffer += key + if (this.buffer.length > this.bufferSize) { + this.buffer = this.buffer.slice(1) + } + } + + /** + * @memberof Keyboard + * not resolvable if enable = 0 or clock is undefined + */ + isResolvable() { + if (this.reset.value == 1) return true + if ( + this.en.value == 0 || + (this.en.connections.length && this.en.value == undefined) + ) + return false + else if (this.clockInp.value == undefined) return false + return true + } + + /** + * @memberof Keyboard + * Whenever clock is enabled (1) then one charecter + * from the buffer is converted to ascii and transmitted + * through the output nodes. + */ + resolve() { + if (this.reset.value == 1) { + this.buffer = '' + return + } + if (this.en.value == 0) { + return + } + + if (this.available.value != 0) { + this.available.value = 0 // this.bufferOutValue; + simulationArea.simulationQueue.add(this.available) + } + + if (this.clockInp.value == this.prevClockState) { + if (this.clockInp.value == 0) { + if (this.buffer.length) { + this.bufferOutValue = this.buffer[0].charCodeAt(0) + } else { + this.bufferOutValue = undefined + } + } + } else if (this.clockInp.value != undefined) { + if (this.clockInp.value == 1 && this.buffer.length) { + if (this.bufferOutValue == this.buffer[0].charCodeAt(0)) { + // WHY IS THIS REQUIRED ?? + this.buffer = this.buffer.slice(1) + } + } else if (this.buffer.length) { + this.bufferOutValue = this.buffer[0].charCodeAt(0) + } else { + this.bufferOutValue = undefined + } + this.prevClockState = this.clockInp.value + } + + if (this.asciiOutput.value != this.bufferOutValue) { + this.asciiOutput.value = this.bufferOutValue + simulationArea.simulationQueue.add(this.asciiOutput) + } + + if (this.bufferOutValue !== undefined && this.available.value != 1) { + this.available.value = 1 // this.bufferOutValue; + simulationArea.simulationQueue.add(this.available) + } + } + + customSave() { + var data = { + nodes: { + clockInp: findNode(this.clockInp), + asciiOutput: findNode(this.asciiOutput), + available: findNode(this.available), + reset: findNode(this.reset), + en: findNode(this.en), + }, + constructorParamaters: [this.bufferSize], + } + return data + } + + customDraw() { + var ctx = simulationArea.context + // + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.beginPath() + ctx.lineWidth = correctWidth(3) + var xx = this.x + var yy = this.y + moveTo( + ctx, + -this.elementWidth / 2, + this.elementHeight / 2 - 15, + xx, + yy, + this.direction + ) + lineTo( + ctx, + 5 - this.elementWidth / 2, + this.elementHeight / 2 - 10, + xx, + yy, + this.direction + ) + lineTo( + ctx, + -this.elementWidth / 2, + this.elementHeight / 2 - 5, + xx, + yy, + this.direction + ) + + ctx.stroke() + + ctx.beginPath() + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + var lineData = + this.buffer + ' '.repeat(this.bufferSize - this.buffer.length) + fillText3(ctx, lineData, 0, +5, xx, yy, 15, 'Courier New', 'center') + ctx.fill() + } +} + +Keyboard.prototype.tooltipText = 'Keyboard' +Keyboard.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/6sequentialelements?id=keyboard' + +Keyboard.prototype.mutableProperties = { + bufferSize: { + name: 'Buffer Size', + type: 'number', + max: '100', + min: '20', + func: 'changeBufferSize', + }, +} + +Keyboard.prototype.objectType = 'Keyboard' diff --git a/v0/src/simulator/src/sequential/RAM.js b/v0/src/simulator/src/sequential/RAM.js new file mode 100644 index 00000000..b406f921 --- /dev/null +++ b/v0/src/simulator/src/sequential/RAM.js @@ -0,0 +1,374 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, fillText2, fillText4, drawCircle2 } from '../canvasApi' +import { parseNumber, showMessage } from '../utils' +/** + * @class + * RAM Component. + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * + * Two settings are available: + * - addressWidth: 1 to 20, default=10. Controls the width of the address input. + * - bitWidth: 1 to 32, default=8. Controls the width of data pins. + * + * Amount of memory in the element is 2^addressWidth x bitWidth bits. + * Minimum RAM size is: 2^1 x 1 = 2 bits. + * Maximum RAM size is: 2^20 x 32 = 1M x 32 bits => 32 Mbits => 4MB. + * Maximum 8-bits size: 2^20 x 8 = 1M x 8 bits => 1MB. + * Default RAM size is: 2^10 x 8 = 1024 bytes => 1KB. + * + * RAMs are volatile therefore this component does not persist the memory contents. + * + * Changes to addressWidth and bitWidth also cause data to be lost. + * Think of these operations as being equivalent to taking a piece of RAM out of a + * circuit board and replacing it with another RAM of different size. + * + * The contents of the RAM can be reset to zero by setting the RESET pin 1 or + * or by selecting the component and pressing the "Reset" button in the properties window. + * + * The contents of the RAM can be dumped to the console by transitioning CORE DUMP pin to 1 + * or by selecting the component and pressing the "Core Dump" button in the properties window. + * Address spaces that have not been written will show up as `undefined` in the core dump. + * + * NOTE: The maximum address width of 20 is arbitrary. + * Larger values are possible, but in practice circuits won't need this much + * memory and keeping the value small helps avoid allocating too much memory on the browser. + * Internally we use a sparse array, so only the addresses that are written are actually + * allocated. Nevertheless, it is better to prevent large allocations from happening + * by keeping the max addressWidth small. If needed, we can increase the max. + * @category sequential + */ +import { colors } from '../themer/themer' +import { showError } from '../utils' +export default class RAM extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 8, + addressWidth = 10 + ) { + super(x, y, scope, dir, Math.min(Math.max(1, bitWidth), 32)) + /* + this.scope['RAM'].push(this); + */ + this.setDimensions(60, 40) + + this.directionFixed = true + this.labelDirection = 'UP' + + this.addressWidth = Math.min( + Math.max(1, addressWidth), + this.maxAddressWidth + ) + this.address = new Node( + -this.leftDimensionX, + -20, + 0, + this, + this.addressWidth, + 'ADDRESS' + ) + this.dataIn = new Node( + -this.leftDimensionX, + 0, + 0, + this, + this.bitWidth, + 'DATA IN' + ) + this.write = new Node(-this.leftDimensionX, 20, 0, this, 1, 'WRITE') + this.reset = new Node(0, this.downDimensionY, 0, this, 1, 'RESET') + this.coreDump = new Node( + -20, + this.downDimensionY, + 0, + this, + 1, + 'CORE DUMP' + ) + this.dataOut = new Node( + this.rightDimensionX, + 0, + 1, + this, + this.bitWidth, + 'DATA OUT' + ) + this.prevCoreDumpValue = undefined + + this.clearData() + } + + customSave() { + return { + // NOTE: data is not persisted since RAMs are volatile. + constructorParamaters: [ + this.direction, + this.bitWidth, + this.addressWidth, + ], + nodes: { + address: findNode(this.address), + dataIn: findNode(this.dataIn), + write: findNode(this.write), + reset: findNode(this.reset), + coreDump: findNode(this.coreDump), + dataOut: findNode(this.dataOut), + }, + } + } + + newBitWidth(value) { + value = parseInt(value) + if ( + !isNaN(value) && + this.bitWidth != value && + value >= 1 && + value <= 32 + ) { + this.bitWidth = value + this.dataIn.bitWidth = value + this.dataOut.bitWidth = value + this.clearData() + } + } + + changeAddressWidth(value) { + value = parseInt(value) + if ( + !isNaN(value) && + this.addressWidth != value && + value >= 1 && + value <= this.maxAddressWidth + ) { + this.addressWidth = value + this.address.bitWidth = value + this.clearData() + } + } + + clearData() { + this.data = new Array(Math.pow(2, this.addressWidth)) + this.tooltipText = `${this.memSizeString()} ${this.shortName}` + } + + isResolvable() { + return ( + this.address.value !== undefined || + this.reset.value !== undefined || + this.coreDump.value !== undefined + ) + } + + resolve() { + if (this.write.value == 1) { + this.data[this.address.value] = this.dataIn.value + } + + if (this.reset.value == 1) { + this.clearData() + } + + if ( + this.coreDump.value && + this.prevCoreDumpValue != this.coreDump.value + ) { + this.dump() + } + this.prevCoreDumpValue = this.coreDump.value + + this.dataOut.value = this.data[this.address.value] || 0 + simulationArea.simulationQueue.add(this.dataOut) + } + + customDraw() { + var ctx = simulationArea.context + // + var xx = this.x + var yy = this.y + + ctx.beginPath() + ctx.strokeStyle = 'gray' + ctx.fillStyle = this.write.value ? 'red' : 'lightgreen' + ctx.lineWidth = correctWidth(1) + drawCircle2(ctx, 50, -30, 3, xx, yy, this.direction) + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = 'black' + fillText4(ctx, this.memSizeString(), 0, -10, xx, yy, this.direction, 12) + fillText4(ctx, this.shortName, 0, 10, xx, yy, this.direction, 12) + fillText2( + ctx, + 'A', + this.address.x + 12, + this.address.y, + xx, + yy, + this.direction + ) + fillText2( + ctx, + 'DI', + this.dataIn.x + 12, + this.dataIn.y, + xx, + yy, + this.direction + ) + fillText2( + ctx, + 'W', + this.write.x + 12, + this.write.y, + xx, + yy, + this.direction + ) + fillText2( + ctx, + 'DO', + this.dataOut.x - 15, + this.dataOut.y, + xx, + yy, + this.direction + ) + ctx.fill() + } + + memSizeString() { + var mag = ['', 'K', 'M'] + var unit = + this.bitWidth == 8 + ? 'B' + : this.bitWidth == 1 + ? 'b' + : ` x ${this.bitWidth}b` + var v = Math.pow(2, this.addressWidth) + var m = 0 + while (v >= 1024 && m < mag.length - 1) { + v /= 1024 + m++ + } + return v + mag[m] + unit + } + + dump() { + var logLabel = console.group && this.label + if (logLabel) { + console.group(this.label) + } + + showMessage('Data dumped to developer Console') + + console.log(JSON.stringify(this.data)) + + if (logLabel) { + console.groupEnd() + } + } + + dblclick() { + this.promptData() + } + + promptData() { + var data = prompt( + 'Enter Data (separated by space, comma, tab or newline) (data can be in hex, binary, octal or decimal)' + ) + if (!data) { + showError('No data entered.') + return + } + var oldData = this.data + try { + var ramSize = 1 << this.addressWidth + var maxNumber = 1 << this.bitWidth + this.clearData() + + data = data.split(/[, \n\t]/) + data = data.filter((x) => x.length) + if (data.length > ramSize) { + throw `Capacity: ${ramSize}. But ${data.length} data cells found` + } + + for (var i = 0; i < data.length; i++) { + var dataCell = parseNumber(data[i]) + if (isNaN(dataCell)) + throw `Address ${i}: ${data[i]} is not a number` + if (dataCell < 0) throw `Address ${i}: ${data[i]} is negative` + if (dataCell >= maxNumber) + throw `Address ${i}: ${data[i]} is too large` + this.data[i] = dataCell + } + showMessage(`${data.length} data cells loaded`) + } catch (e) { + this.data = oldData + showError(e) + } + } + + //This is a RAM without a clock - not normal + //reset is not supported + static moduleVerilog() { + return ` + module RAM(dout, addr, din, we, dmp, rst); + parameter WIDTH = 8; + parameter ADDR = 10; + output [WIDTH-1:0] dout; + input [ADDR-1:0] addr; + input [WIDTH-1:0] din; + input we; + input dmp; + input rst; + reg [WIDTH-1:0] mem [2**ADDR-1:0]; + + assign dout = mem[addr]; + + always @ (*) begin + if (!we) + mem[addr] = din; + end + endmodule + ` + } +} + +RAM.prototype.tooltipText = 'Random Access Memory' +RAM.prototype.shortName = 'RAM' +RAM.prototype.maxAddressWidth = 20 +RAM.prototype.mutableProperties = { + addressWidth: { + name: 'Address Width', + type: 'number', + max: '20', + min: '1', + func: 'changeAddressWidth', + }, + dump: { + name: 'Core Dump', + type: 'button', + func: 'dump', + }, + load: { + name: 'Load Data', + type: 'button', + func: 'promptData', + }, + reset: { + name: 'Reset', + type: 'button', + func: 'clearData', + }, +} +RAM.prototype.objectType = 'RAM' diff --git a/v0/src/simulator/src/sequential/Rom.js b/v0/src/simulator/src/sequential/Rom.js new file mode 100644 index 00000000..69bb544b --- /dev/null +++ b/v0/src/simulator/src/sequential/Rom.js @@ -0,0 +1,314 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect2, fillText3 } from '../canvasApi' +/** + * @class + * Rom + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {Array=} data - bit width per node. + * @category sequential + */ +import { colors } from '../themer/themer' +export default class Rom extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + data = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + ) { + super(x, y, scope, 'RIGHT', 1) + /* + this.scope['Rom'].push(this); + */ + this.fixedBitWidth = true + this.directionFixed = true + this.rectangleObject = false + this.setDimensions(80, 50) + this.memAddr = new Node(-80, 0, 0, this, 4, 'Address') + this.en = new Node(0, 50, 0, this, 1, 'Enable') + this.dataOut = new Node(80, 0, 1, this, 8, 'DataOut') + this.data = + data || + prompt('Enter data') + .split(' ') + .map((lambda) => parseInt(lambda, 16)) + } + + /** + * @memberof Rom + * Checks if the element is resolvable + * @return {boolean} + */ + isResolvable() { + if ( + (this.en.value === 1 || this.en.connections.length === 0) && + this.memAddr.value !== undefined + ) + return true + return false + } + + /** + * @memberof Rom + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.data], + nodes: { + memAddr: findNode(this.memAddr), + dataOut: findNode(this.dataOut), + en: findNode(this.en), + }, + } + return data + } + + /** + * @memberof Rom + * function to find position of the index of part of rom selected. + * @return {number} + */ + findPos() { + const i = Math.floor((simulationArea.mouseX - this.x + 35) / 20) + const j = Math.floor((simulationArea.mouseY - this.y + 35) / 16) + if (i < 0 || j < 0 || i > 3 || j > 3) return undefined + return j * 4 + i + } + + /** + * @memberof Rom + * listener function to set selected index + * @return {number} + */ + click() { + // toggle + this.selectedIndex = this.findPos() + } + + /** + * @memberof Rom + * to take input in rom + * @return {number} + */ + keyDown(key) { + if (key === 'Backspace') this.delete() + if (this.selectedIndex === undefined) return + key = key.toLowerCase() + if (!~'1234567890abcdef'.indexOf(key)) return + + this.data[this.selectedIndex] = + (this.data[this.selectedIndex] * 16 + parseInt(key, 16)) % 256 + } + + /** + * @memberof Rom + * function to draw element + */ + customDraw() { + const ctx = simulationArea.context + const xx = this.x + const yy = this.y + const hoverIndex = this.findPos() + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + rect2( + ctx, + -this.leftDimensionX, + -this.upDimensionY, + this.leftDimensionX + this.rightDimensionX, + this.upDimensionY + this.downDimensionY, + this.x, + this.y, + [this.direction, 'RIGHT'][+this.directionFixed] + ) + if ( + hoverIndex === undefined && + ((!simulationArea.shiftDown && this.hover) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this)) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + ctx.strokeStyle = 'black' + ctx.fillStyle = '#fafafa' + ctx.lineWidth = correctWidth(1) + ctx.beginPath() + for (let i = 0; i < 16; i += 4) { + for (let j = i; j < i + 4; j++) { + rect2(ctx, (j % 4) * 20, i * 4, 20, 16, xx - 35, yy - 35) + } + } + ctx.fill() + ctx.stroke() + if (hoverIndex !== undefined) { + ctx.beginPath() + ctx.fillStyle = 'yellow' + rect2( + ctx, + (hoverIndex % 4) * 20, + Math.floor(hoverIndex / 4) * 16, + 20, + 16, + xx - 35, + yy - 35 + ) + ctx.fill() + ctx.stroke() + } + if (this.selectedIndex !== undefined) { + ctx.beginPath() + ctx.fillStyle = 'lightgreen' + rect2( + ctx, + (this.selectedIndex % 4) * 20, + Math.floor(this.selectedIndex / 4) * 16, + 20, + 16, + xx - 35, + yy - 35 + ) + ctx.fill() + ctx.stroke() + } + if (this.memAddr.value !== undefined) { + ctx.beginPath() + ctx.fillStyle = colors['input_text'] + rect2( + ctx, + (this.memAddr.value % 4) * 20, + Math.floor(this.memAddr.value / 4) * 16, + 20, + 16, + xx - 35, + yy - 35 + ) + ctx.fill() + ctx.stroke() + } + + ctx.beginPath() + ctx.fillStyle = 'Black' + fillText3(ctx, 'A', -65, 5, xx, yy, 16, 'Raleway', 'right') + fillText3(ctx, 'D', 75, 5, xx, yy, 16, 'Raleway', 'right') + fillText3(ctx, 'En', 5, 47, xx, yy, 16, 'Raleway', 'right') + ctx.fill() + + ctx.beginPath() + ctx.fillStyle = 'Black' + for (let i = 0; i < 16; i += 4) { + for (let j = i; j < i + 4; j++) { + let s = this.data[j].toString(16) + if (s.length < 2) s = `0${s}` + fillText3( + ctx, + s, + (j % 4) * 20, + i * 4, + xx - 35 + 10, + yy - 35 + 12, + 14, + 'Raleway', + 'center' + ) + } + } + ctx.fill() + + ctx.beginPath() + ctx.fillStyle = 'Black' + for (let i = 0; i < 16; i += 4) { + let s = i.toString(16) + if (s.length < 2) s = `0${s}` + fillText3( + ctx, + s, + 0, + i * 4, + xx - 40, + yy - 35 + 12, + 14, + 'Raleway', + 'right' + ) + } + ctx.fill() + } + + /** + * @memberof Rom + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + this.dataOut.value = this.data[this.memAddr.value] + simulationArea.simulationQueue.add(this.dataOut) + } + + verilogBaseType() { + return this.verilogName() + (Rom.selSizes.length - 1) + } + //this code to generate Verilog + generateVerilog() { + Rom.selSizes.push(this.data) + return CircuitElement.prototype.generateVerilog.call(this) + } + + //This code to determine what sizes are used to generate the needed modules + //generate the needed modules + static moduleVerilog() { + var output = '' + + for (var i = 0; i < Rom.selSizes.length; i++) { + output += ` + module Rom${i}(dout, addr, en); + parameter WIDTH = 8; + parameter ADDR = 4; + output reg [WIDTH-1:0] dout; + input [ADDR-1:0] addr; + input en; + + always @ (*) begin + if (en == 0) + dout = {WIDTH{1'bz}}; + else + case (addr) + ` + for (var j = 0; j < 1 << 4; j++) { + output += + ' ' + j + ' : dout = ' + Rom.selSizes[i][j] + ';\n' + } + + output += ` endcase + end + endmodule + ` + } + + return output + } + //reset the sized before Verilog generation + static resetVerilog() { + Rom.selSizes = [] + } +} + +/** + * @memberof Rom + * Help Tip + * @type {string} + * @category sequential + */ +Rom.prototype.tooltipText = 'Read-only memory' +Rom.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/6sequentialelements?id=rom' +Rom.prototype.objectType = 'Rom' diff --git a/v0/src/simulator/src/sequential/SRflipFlop.js b/v0/src/simulator/src/sequential/SRflipFlop.js new file mode 100644 index 00000000..af1a16ce --- /dev/null +++ b/v0/src/simulator/src/sequential/SRflipFlop.js @@ -0,0 +1,131 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, fillText } from '../canvasApi' +/** + * @class + * SRflipFlop + * SR flip flop has 6 input nodes: + * clock, S input, R input, preset, reset ,enable. + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * @category sequential + */ +import { colors } from '../themer/themer' +export default class SRflipFlop extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT') { + super(x, y, scope, dir, 1) + /* + this.scope['SRflipFlop'].push(this); + */ + this.directionFixed = true + this.fixedBitWidth = true + this.setDimensions(20, 20) + this.rectangleObject = true + this.R = new Node(-20, +10, 0, this, 1, 'R') + this.S = new Node(-20, -10, 0, this, 1, 'S') + this.qOutput = new Node(20, -10, 1, this, 1, 'Q') + this.qInvOutput = new Node(20, 10, 1, this, 1, 'Q Inverse') + this.reset = new Node(10, 20, 0, this, 1, 'Asynchronous Reset') + this.preset = new Node(0, 20, 0, this, 1, 'Preset') + this.en = new Node(-10, 20, 0, this, 1, 'Enable') + this.state = 0 + // this.slaveState = 0; + // this.prevClockState = 0; + // this.wasClicked = false; + } + + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.dInp.bitWidth = bitWidth + this.qOutput.bitWidth = bitWidth + this.qInvOutput.bitWidth = bitWidth + this.preset.bitWidth = bitWidth + } + + /** + * @memberof SRflipFlop + * always resolvable + */ + isResolvable() { + return true + if (this.reset.value == 1) return true + if (this.S.value != undefined && this.R.value != undefined) return true + return false + } + + /** + * @memberof SRflipFlop + * function to resolve SR flip flop if S != R we can + * set this.state to value S. + */ + resolve() { + if (this.reset.value == 1) { + this.state = this.preset.value || 0 + } else if ( + (this.en.value == 1 || this.en.connections == 0) && + this.S.value ^ this.R.value + ) { + this.state = this.S.value + } + + if (this.qOutput.value != this.state) { + this.qOutput.value = this.state + this.qInvOutput.value = this.flipBits(this.state) + simulationArea.simulationQueue.add(this.qOutput) + simulationArea.simulationQueue.add(this.qInvOutput) + } + } + + customSave() { + var data = { + nodes: { + S: findNode(this.S), + R: findNode(this.R), + qOutput: findNode(this.qOutput), + qInvOutput: findNode(this.qInvOutput), + reset: findNode(this.reset), + preset: findNode(this.preset), + en: findNode(this.en), + }, + constructorParamaters: [this.direction], + } + return data + } + + customDraw() { + var ctx = simulationArea.context + // + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.beginPath() + ctx.lineWidth = correctWidth(3) + var xx = this.x + var yy = this.y + + // rect(ctx, xx - 20, yy - 20, 40, 40); + // moveTo(ctx, -20, 5, xx, yy, this.direction); + // lineTo(ctx, -15, 10, xx, yy, this.direction); + // lineTo(ctx, -20, 15, xx, yy, this.direction); + + // if ((this.b.hover&&!simulationArea.shiftDown)|| simulationArea.lastSelected == this || simulationArea.multipleObjectSelections.contains(this)) ctx.fillStyle = "rgba(255, 255, 32,0.8)";ctx.fill(); + ctx.stroke() + + ctx.beginPath() + ctx.font = '20px Raleway' + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + fillText(ctx, this.state.toString(16), xx, yy + 5) + ctx.fill() + } +} + +SRflipFlop.prototype.tooltipText = 'SR FlipFlop ToolTip : SR FlipFlop Selected.' + +SRflipFlop.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/6sequentialelements?id=sr-flip-flop' + +SRflipFlop.prototype.objectType = 'SRflipFlop' diff --git a/v0/src/simulator/src/sequential/TTY.js b/v0/src/simulator/src/sequential/TTY.js new file mode 100644 index 00000000..d0c89461 --- /dev/null +++ b/v0/src/simulator/src/sequential/TTY.js @@ -0,0 +1,250 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText3 } from '../canvasApi' +import { colors } from '../themer/themer' + +/** + * @class + * TTY + * TypeWriter - We can give 4 inputs: + * clock and input of 7 bits are main input required + * on the edge change the data is added onto the display + * screen of the typewriter + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * @category sequential + */ +export default class TTY extends CircuitElement { + constructor(x, y, scope = globalScope, rows = 3, cols = 32) { + super(x, y, scope, 'RIGHT', 1) + /* + this.scope['TTY'].push(this); + */ + this.directionFixed = true + this.fixedBitWidth = true + this.cols = cols || parseInt(prompt('Enter cols:')) + this.rows = rows || parseInt(prompt('Enter rows:')) + + this.elementWidth = Math.max(40, Math.ceil(this.cols / 2) * 20) + this.elementHeight = Math.max(40, Math.ceil((this.rows * 15) / 20) * 20) + this.setWidth(this.elementWidth / 2) + this.setHeight(this.elementHeight / 2) + // this.element = new Element(x, y, "TTY",this.elementWidth/2, this,this.elementHeight/2); + + this.clockInp = new Node( + -this.elementWidth / 2, + this.elementHeight / 2 - 10, + 0, + this, + 1, + 'Clock' + ) + this.asciiInp = new Node( + -this.elementWidth / 2, + this.elementHeight / 2 - 30, + 0, + this, + 7, + 'Ascii Input' + ) + // this.qOutput = new Node(20, -10, 1, this); + this.reset = new Node( + 30 - this.elementWidth / 2, + this.elementHeight / 2, + 0, + this, + 1, + 'Reset' + ) + this.en = new Node( + 10 - this.elementWidth / 2, + this.elementHeight / 2, + 0, + this, + 1, + 'Enable' + ) + // this.masterState = 0; + // this.slaveState = 0; + this.prevClockState = 0 + + this.data = '' + this.buffer = '' + } + + /** + * @memberof TTY + * this funciton is used to change the size of the screen + */ + changeRowSize(size) { + if (size == undefined || size < 1 || size > 10) return + if (this.rows == size) return + var obj = new TTY(this.x, this.y, this.scope, size, this.cols) + this.delete() + simulationArea.lastSelected = obj + return obj + } + + /** + * @memberof TTY + * this funciton is used to change the size of the screen + */ + changeColSize(size) { + if (size == undefined || size < 20 || size > 100) return + if (this.cols == size) return + var obj = new TTY(this.x, this.y, this.scope, this.rows, size) + this.delete() + simulationArea.lastSelected = obj + return obj + } + + /** + * @memberof TTY + * if no input or enable key is set to 0 returns false + */ + isResolvable() { + if (this.reset.value == 1) return true + if ( + this.en.value == 0 || + (this.en.connections.length && this.en.value == undefined) + ) + return false + else if (this.clockInp.value == undefined) return false + else if (this.asciiInp.value == undefined) return false + return true + } + + /** + * @memberof TTY + * To resolve the Typewriter clock and input of 7 bits are + * used to get the ascii and then on the edge change the + * data is added onto the display screen of the typewriter. + */ + resolve() { + if (this.reset.value == 1) { + this.data = '' + return + } + if (this.en.value == 0) { + this.buffer = '' + return + } + + if (this.clockInp.value == this.prevClockState) { + if (this.clockInp.value == 0) { + this.buffer = String.fromCharCode(this.asciiInp.value) + } + } else if (this.clockInp.value != undefined) { + if (this.clockInp.value == 1) { + this.data += this.buffer + if (this.data.length > this.cols * this.rows) { + this.data = this.data.slice(1) + } + } else if (this.clockInp.value == 0) { + this.buffer = String.fromCharCode(this.asciiInp.value) + } + this.prevClockState = this.clockInp.value + } + } + + customSave() { + var data = { + nodes: { + clockInp: findNode(this.clockInp), + asciiInp: findNode(this.asciiInp), + reset: findNode(this.reset), + en: findNode(this.en), + }, + constructorParamaters: [this.rows, this.cols], + } + return data + } + + customDraw() { + var ctx = simulationArea.context + // + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.beginPath() + ctx.lineWidth = correctWidth(3) + var xx = this.x + var yy = this.y + // rect(ctx, xx - this.elementWidth/2, yy - this.elementHeight/2, this.elementWidth, this.elementHeight); + + moveTo( + ctx, + -this.elementWidth / 2, + this.elementHeight / 2 - 15, + xx, + yy, + this.direction + ) + lineTo( + ctx, + 5 - this.elementWidth / 2, + this.elementHeight / 2 - 10, + xx, + yy, + this.direction + ) + lineTo( + ctx, + -this.elementWidth / 2, + this.elementHeight / 2 - 5, + xx, + yy, + this.direction + ) + + // if ((this.b.hover&&!simulationArea.shiftDown)|| simulationArea.lastSelected == this || simulationArea.multipleObjectSelections.contains(this)) + // ctx.fillStyle = "rgba(255, 255, 32,0.8)"; + ctx.stroke() + + ctx.beginPath() + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + var startY = -7.5 * this.rows + 3 + for (var i = 0; i < this.data.length; i += this.cols) { + var lineData = this.data.slice(i, i + this.cols) + lineData += ' '.repeat(this.cols - lineData.length) + fillText3( + ctx, + lineData, + 0, + startY + (i / this.cols) * 15 + 9, + xx, + yy, + 15, + 'Courier New', + 'center' + ) + } + ctx.fill() + } +} + +TTY.prototype.tooltipText = 'TTY ToolTip : Tele typewriter selected.' +TTY.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/6sequentialelements?id=tty' + +TTY.prototype.mutableProperties = { + cols: { + name: 'Columns', + type: 'number', + max: '100', + min: '20', + func: 'changeColSize', + }, + rows: { + name: 'Rows', + type: 'number', + max: '10', + min: '1', + func: 'changeRowSize', + }, +} + +TTY.prototype.objectType = 'TTY' diff --git a/v0/src/simulator/src/sequential/TflipFlop.js b/v0/src/simulator/src/sequential/TflipFlop.js new file mode 100644 index 00000000..cedb9f6b --- /dev/null +++ b/v0/src/simulator/src/sequential/TflipFlop.js @@ -0,0 +1,179 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText } from '../canvasApi' +import { colors } from '../themer/themer' + +/** + * @class + * TflipFlop + * T flip flop has 5 input nodes: + * clock, data input, preset, reset ,enable. + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * @category sequential + */ +export default class TflipFlop extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT') { + super(x, y, scope, dir, 1) + /* + this.scope['TflipFlop'].push(this); + */ + this.directionFixed = true + this.fixedBitWidth = true + this.setDimensions(20, 20) + this.rectangleObject = true + this.clockInp = new Node(-20, +10, 0, this, 1, 'Clock') + this.dInp = new Node(-20, -10, 0, this, this.bitWidth, 'T') + this.qOutput = new Node(20, -10, 1, this, this.bitWidth, 'Q') + this.qInvOutput = new Node(20, 10, 1, this, this.bitWidth, 'Q Inverse') + this.reset = new Node(10, 20, 0, this, 1, 'Asynchronous Reset') + this.preset = new Node(0, 20, 0, this, this.bitWidth, 'Preset') + this.en = new Node(-10, 20, 0, this, 1, 'Enable') + this.masterState = 0 + this.slaveState = 0 + this.prevClockState = 0 + + // this.wasClicked = false; + } + + /** + * @memberof TflipFlop + * returns true if clock is defined + */ + isResolvable() { + if (this.reset.value == 1) return true + if (this.clockInp.value != undefined && this.dInp.value != undefined) + return true + return false + } + + /** + * @memberof TflipFlop + * @param {number} bitWidth - the new bitwidth + */ + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.dInp.bitWidth = bitWidth + this.qOutput.bitWidth = bitWidth + this.qInvOutput.bitWidth = bitWidth + this.preset.bitWidth = bitWidth + } + + /** + * @memberof TflipFlop + * On the leading edge of the clock signal (LOW-to-HIGH) the first stage, + * the “master” latches the input condition at D, while the output stage is deactivated. + * On the trailing edge of the clock signal (HIGH-to-LOW) the second “slave” stage is + * now activated, latching on to the output from the first master circuit. + * This fuction sets the value for the node qOutput based on + * the previous state and input of the clock by taking xor. + * We flip the bits to find qInvOutput + */ + resolve() { + if (this.reset.value == 1) { + // if reset bit is set + this.masterState = this.slaveState = this.preset.value || 0 + } else if (this.en.value == 0) { + // if enabled bit is 0 + this.prevClockState = this.clockInp.value + } else if (this.en.value == 1 || this.en.connections.length == 0) { + // if enabled bit is 1 or not connected to anything. + if (this.clockInp.value == this.prevClockState) { + if (this.clockInp.value == 0 && this.dInp.value != undefined) { + // value is xor of + this.masterState = this.dInp.value ^ this.slaveState + } + } else if (this.clockInp.value != undefined) { + if (this.clockInp.value == 1) { + this.slaveState = this.masterState + } else if ( + this.clockInp.value == 0 && + this.dInp.value != undefined + ) { + this.masterState = this.dInp.value ^ this.slaveState + } + this.prevClockState = this.clockInp.value + } + } + + if (this.qOutput.value != this.slaveState) { + this.qOutput.value = this.slaveState + this.qInvOutput.value = this.flipBits(this.slaveState) + simulationArea.simulationQueue.add(this.qOutput) + simulationArea.simulationQueue.add(this.qInvOutput) + } + } + + customSave() { + var data = { + nodes: { + clockInp: findNode(this.clockInp), + dInp: findNode(this.dInp), + qOutput: findNode(this.qOutput), + qInvOutput: findNode(this.qInvOutput), + reset: findNode(this.reset), + preset: findNode(this.preset), + en: findNode(this.en), + }, + constructorParamaters: [this.direction, this.bitWidth], + } + return data + } + + customDraw() { + var ctx = simulationArea.context + // + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.beginPath() + ctx.lineWidth = correctWidth(3) + var xx = this.x + var yy = this.y + // rect(ctx, xx - 20, yy - 20, 40, 40); + moveTo(ctx, -20, 5, xx, yy, this.direction) + lineTo(ctx, -15, 10, xx, yy, this.direction) + lineTo(ctx, -20, 15, xx, yy, this.direction) + + // if ((this.b.hover&&!simulationArea.shiftDown)|| simulationArea.lastSelected == this || simulationArea.multipleObjectSelections.contains(this)) ctx.fillStyle = "rgba(255, 255, 32,0.8)";ctx.fill(); + ctx.stroke() + ctx.beginPath() + ctx.font = '20px Raleway' + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + fillText(ctx, this.slaveState.toString(16), xx, yy + 5) + ctx.fill() + } + + static moduleVerilog() { + return ` + module TflipFlop(q, q_inv, clk, t, a_rst, pre, en); + parameter WIDTH = 1; + output reg [WIDTH-1:0] q, q_inv; + input clk, a_rst, pre, en; + input [WIDTH-1:0] t; + + always @ (posedge clk or posedge a_rst) + if (a_rst) begin + q <= 'b0; + q_inv <= 'b1; + end else if (en == 0) ; + else if (t) begin + q <= q ^ t; + q_inv <= ~q ^ t; + end + endmodule + ` + } +} + +TflipFlop.prototype.tooltipText = + 'T FlipFlop ToolTip : Changes state / Toggles whenever the clock input is strobed.' + +TflipFlop.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/6sequentialelements?id=t-flip-flop' + +TflipFlop.prototype.objectType = 'TflipFlop' diff --git a/v0/src/simulator/src/sequential/verilogRAM.js b/v0/src/simulator/src/sequential/verilogRAM.js new file mode 100644 index 00000000..d1e9c71d --- /dev/null +++ b/v0/src/simulator/src/sequential/verilogRAM.js @@ -0,0 +1,577 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, fillText2, fillText4, drawCircle2 } from '../canvasApi' +/** + * @class + * verilogRAM Component. + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * + * Two settings are available: + * - addressWidth: 1 to 20, default=10. Controls the width of the address input. + * - bitWidth: 1 to 32, default=8. Controls the width of data pins. + * + * Amount of memory in the element is 2^addressWidth x bitWidth bits. + * Minimum verilogRAM size is: 2^1 x 1 = 2 bits. + * Maximum verilogRAM size is: 2^20 x 32 = 1M x 32 bits => 32 Mbits => 4MB. + * Maximum 8-bits size: 2^20 x 8 = 1M x 8 bits => 1MB. + * Default verilogRAM size is: 2^10 x 8 = 1024 bytes => 1KB. + * + * verilogRAMs are volatile therefore this component does not persist the memory contents. + * + * Changes to addressWidth and bitWidth also cause data to be lost. + * Think of these operations as being equivalent to taking a piece of verilogRAM out of a + * circuit board and replacing it with another verilogRAM of different size. + * + * The contents of the verilogRAM can be reset to zero by setting the RESET pin 1 or + * or by selecting the component and pressing the "Reset" button in the properties window. + * + * The contents of the verilogRAM can be dumped to the console by transitioning CORE DUMP pin to 1 + * or by selecting the component and pressing the "Core Dump" button in the properties window. + * Address spaces that have not been written will show up as `undefined` in the core dump. + * + * NOTE: The maximum address width of 20 is arbitrary. + * Larger values are possible, but in practice circuits won't need this much + * memory and keeping the value small helps avoid allocating too much memory on the browser. + * Internally we use a sparse array, so only the addresses that are written are actually + * allocated. Nevertheless, it is better to prevent large allocations from happening + * by keeping the max addressWidth small. If needed, we can increase the max. + * @category sequential + */ +import { colors } from '../themer/themer' + +function customResolve( + clockInp, + dInp, + qOutput, + en, + masterState, + slaveState, + prevClockState, + clock_polarity, + enable_polarity, + numIterations +) { + for (var i = 0; i < numIterations; i++) { + if (clock_polarity[i] != undefined) { + clock_polarity[i] == true ? 1 : 0 + } + + if (enable_polarity[i] != undefined) { + enable_polarity[i] == true ? 1 : 0 + } + + if (clock_polarity[i] == undefined && enable_polarity[i] == undefined) { + if (dInp[i].value != undefined) { + qOutput[i].value = dInp[i].value + simulationArea.simulationQueue.add(qOutput[i]) + } + } else if ( + clock_polarity[i] == undefined && + enable_polarity[i] != undefined + ) { + if ( + (en_value[i] == undefined || + en[i].value == enable_polarity[i]) && + dInp[i].value != undefined + ) { + qOutput[i].value = dInp[i].value + simulationArea.simulationQueue.add(qOutput[i]) + } + } else if ( + clock_polarity[i] != undefined && + enable_polarity[i] == undefined + ) { + if (clockInp[i].value == prevClockState[i]) { + if (clockInp[i].value == 0 && dInp[i].value != undefined) { + masterState[i] = dInp[i].value + } + } else if (clockInp[i].value != undefined) { + if (clockInp[i].value == 1) { + slaveState[i] = masterState[i] + } else if ( + clockInp[i].value == 0 && + dInp[i].value != undefined + ) { + masterState[i] = dInp[i].value + } + prevClockState[i] = clockInp[i].value + } + + if (qOutput[i].value != slaveState[i]) { + qOutput[i].value = slaveState[i] + simulationArea.simulationQueue.add(qOutput[i]) + } + } else { + if (en[i].value == 0) { + prevClockState[i] = clockInp[i].value + } else if (en[i].value == 1 || en[i].connections.length == 0) { + // if(en.value==1) // Creating Infinite Loop, WHY ?? + if (clockInp[i].value == prevClockState[i]) { + if (clockInp[i].value == 0 && dInp[i].value != undefined) { + masterState[i] = dInp[i].value + } + } else if (clockInp[i].value != undefined) { + if (clockInp[i].value == 1) { + slaveState[i] = masterState[i] + } else if ( + clockInp[i].value == 0 && + dInp[i].value != undefined + ) { + masterState[i] = dInp[i].value + } + prevClockState[i] = clockInp[i].value + } + } + + if (qOutput[i].value != slaveState[i]) { + qOutput[i].value = slaveState[i] + simulationArea.simulationQueue.add(qOutput[i]) + } + } + } +} + +export default class verilogRAM extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 8, + addressWidth = 10, + memData, + words, + numRead, + numWrite, + rdports, + wrports + ) { + super(x, y, scope, dir, Math.min(Math.max(1, bitWidth), 32)) + /* + this.scope['verilogRAM'].push(this); + */ + this.setDimensions(60, 40) + + this.directionFixed = true + this.labelDirection = 'UP' + + this.addressWidth = Math.min( + Math.max(1, addressWidth), + this.maxAddressWidth + ) + + this.readAddress = [] + for (var i = 0; i < numRead; i++) { + this.readAddress.push( + new Node( + -this.leftDimensionX, + -20, + 0, + this, + this.addressWidth, + 'READ_ADDRESS' + i.toString() + ) + ) + } + + this.writeAddress = [] + for (var i = 0; i < numWrite; i++) { + this.writeAddress.push( + new Node( + -this.leftDimensionX, + -20, + 0, + this, + this.addressWidth, + 'WRITE_ADDRESS' + i.toString() + ) + ) + } + + this.writeDataIn = [] + this.writeEnable = [] + + this.writeDffClock = [] + this.writeDffDInp = [] + this.writeDffQOutput = [] + this.writeDffEn = [] + this.writeDffMasterState = [] + this.writeDffSlaveState = [] + this.writeDffprevClockState = [] + this.writeDffClockPolarity = [] + this.writeDffEnPolarity = [] + + for (var i = 0; i < numWrite; i++) { + var currWriteData = new Node( + -this.leftDimensionX, + 0, + 0, + this, + this.bitWidth, + 'DATA IN' + i.toString() + ) + + var clockInp = new Node(-20, +10, 0, this, 1, 'Clock') + var dInp = new Node(-20, -10, 0, this, this.bitWidth, 'D') + var qOutput = new Node(20, -10, 1, this, this.bitWidth, 'Q') + var en = new Node(-10, 20, 0, this, 1, 'Enable') + var masterState = 0 + var slaveState = 0 + var prevClockState = 0 + var clockPolarity = wrports[i]['clock_polarity'] + var enPolarity = wrports[i]['enable_polarity'] + + if (enPolarity == undefined) { + enPolarity = true + } + + currWriteData.connect(dInp) + + this.writeDffClock.push(clockInp) + this.writeDffDInp.push(dInp) + this.writeDffQOutput.push(qOutput) + this.writeDffEn.push(en) + this.writeDffMasterState.push(masterState) + this.writeDffSlaveState.push(slaveState) + this.writeDffprevClockState.push(prevClockState) + this.writeDffClockPolarity.push(clockPolarity) + this.writeDffEnPolarity.push(enPolarity) + + this.writeDataIn.push(currWriteData) + this.writeEnable.push( + new Node( + -this.leftDimensionX, + 20, + 0, + this, + 1, + 'WRITE_ENABLE' + i.toString() + ) + ) + } + + this.reset = new Node(0, this.downDimensionY, 0, this, 1, 'RESET') + this.coreDump = new Node( + -20, + this.downDimensionY, + 0, + this, + 1, + 'CORE DUMP' + ) + this.dataOut = [] + + this.readDffClock = [] + this.readDffDInp = [] + this.readDffQOutput = [] + this.readDffEn = [] + this.readDffMasterState = [] + this.readDffSlaveState = [] + this.readDffprevClockState = [] + this.readDffClockPolarity = [] + this.readDffEnPolarity = [] + + for (var i = 0; i < numRead; i++) { + var currReadOut = new Node( + this.rightDimensionX, + 0, + 1, + this, + this.bitWidth, + 'DATA OUT' + i.toString() + ) + + var clockInp = new Node(-20, +10, 0, this, 1, 'Clock') + var dInp = new Node(-20, -10, 0, this, this.bitWidth, 'D') + var qOutput = new Node(20, -10, 1, this, this.bitWidth, 'Q') + var en = new Node(-10, 20, 0, this, 1, 'Enable') + var masterState = 0 + var slaveState = 0 + var prevClockState = 0 + var clockPolarity = rdports[i]['clock_polarity'] + var enPolarity = rdports[i]['enable_polarity'] + + this.readDffClock.push(clockInp) + this.readDffDInp.push(dInp) + this.readDffQOutput.push(qOutput) + this.readDffEn.push(en) + this.readDffMasterState.push(masterState) + this.readDffSlaveState.push(slaveState) + this.readDffprevClockState.push(prevClockState) + this.readDffClockPolarity.push(clockPolarity) + this.readDffEnPolarity.push(enPolarity) + + currReadOut.connect(dInp) + + this.dataOut.push(currReadOut) + } + + this.prevCoreDumpValue = undefined + this.words = words + this.numRead = numRead + this.numWrite = numWrite + this.memData = memData + this.rdports = rdports + this.wrports = wrports + this.clearData() + this.fillData(memData) + } + + fillData(memData) { + for (var i = 0; i < this.words; i++) { + this.data[i] = 0 + } + var len = memData.length + var dataIndex = 0 + for (var i = 0; i < len; i++) { + if (Number.isInteger(memData[i])) { + var data = memData[i + 1] + + if (data.startsWith('x')) { + dataIndex += memData[i] + continue + } + + var dataValue = 0 + var power2 = 1 + + for (var j = this.bitWidth - 1; j >= 0; j--) { + if (data[j] == '1') { + dataValue += power2 + } + power2 *= 2 + } + + for (var j = 0; j < memData[i]; j++) { + this.data[dataIndex++] = dataValue + } + i++ + } else { + var data = memData[i] + + if (data.startsWith('x')) { + dataIndex++ + continue + } + + var dataValue = 0 + var power2 = 1 + + for (var j = this.bitWidth - 1; j >= 0; j--) { + if (data[j] == '1') { + dataValue += power2 + } + power2 *= 2 + } + + this.data[dataIndex++] = dataValue + } + } + } + + customSave() { + this.dataOut.map(findNode) + const data = { + // NOTE: data is not persisted since verilogRAMs are volatile. + constructorParamaters: [ + this.direction, + this.bitWidth, + this.addressWidth, + this.memData, + this.words, + this.numRead, + this.numWrite, + this.rdports, + this.wrports, + ], + + nodes: { + readAddress: this.readAddress.map(findNode), + writeAddress: this.writeAddress.map(findNode), + writeDataIn: this.writeDataIn.map(findNode), + writeEnable: this.writeEnable.map(findNode), + dataOut: this.dataOut.map(findNode), + reset: findNode(this.reset), + coreDump: findNode(this.coreDump), + readDffClock: this.readDffClock.map(findNode), + readDffDInp: this.readDffDInp.map(findNode), + readDffQOutput: this.readDffQOutput.map(findNode), + readDffEn: this.readDffEn.map(findNode), + writeDffClock: this.writeDffClock.map(findNode), + writeDffDInp: this.writeDffDInp.map(findNode), + writeDffQOutput: this.writeDffQOutput.map(findNode), + writeDffEn: this.writeDffEn.map(findNode), + }, + } + + return data + } + + newBitWidth(value) { + // value = parseInt(value); + // if (!isNaN(value) && this.bitWidth != value && value >= 1 && value <= 32) { + // this.bitWidth = value; + // this.dataIn.bitWidth = value; + // this.dataOut.bitWidth = value; + // this.clearData(); + // } + } + + changeAddressWidth(value) { + // value = parseInt(value); + // if (!isNaN(value) && this.addressWidth != value && value >= 1 && value <= this.maxAddressWidth) { + // this.addressWidth = value; + // this.address.bitWidth = value; + // this.clearData(); + // } + } + + clearData() { + this.data = new Array(this.words) + this.tooltipText = `${this.memSizeString()} ${this.shortName}` + } + + isResolvable() { + for (var i = 0; i < this.numRead; i++) { + if (this.readAddress[i] != undefined) return true + } + return this.reset.value != undefined || this.coreDump.value != undefined + } + + resolve() { + // resolve write + + customResolve( + this.writeDffClock, + this.writeDffDInp, + this.writeDffQOutput, + this.writeDffEn, + this.writeDffMasterState, + this.writeDffSlaveState, + this.writeDffprevClockState, + this.writeDffClockPolarity, + this.writeDffEnPolarity, + this.numWrite + ) + + for (var i = 0; i < this.numWrite; i++) { + if (this.writeEnable[i].value == 1) { + this.data[this.writeAddress[i].value] = + this.writeDffQOutput[i].value + } + } + + if (this.reset.value == 1) { + this.clearData() + } + + if ( + this.coreDump.value && + this.prevCoreDumpValue != this.coreDump.value + ) { + this.dump() + } + this.prevCoreDumpValue = this.coreDump.value + + for (var i = 0; i < this.numRead; i++) { + this.dataOut[i].value = this.data[this.readAddress[i].value] || 0 + simulationArea.simulationQueue.add(this.dataOut[i]) + } + + customResolve( + this.readDffClock, + this.readDffDInp, + this.readDffQOutput, + this.readDffEn, + this.readDffMasterState, + this.readDffSlaveState, + this.readDffprevClockState, + this.readDffClockPolarity, + this.readDffEnPolarity, + this.numRead + ) + } + + customDraw() { + // var ctx = simulationArea.context; + // // + // var xx = this.x; + // var yy = this.y; + // ctx.beginPath(); + // ctx.strokeStyle = 'gray'; + // ctx.fillStyle = this.write.value ? 'red' : 'lightgreen'; + // ctx.lineWidth = correctWidth(1); + // drawCircle2(ctx, 50, -30, 3, xx, yy, this.direction); + // ctx.fill(); + // ctx.stroke(); + // ctx.beginPath(); + // ctx.textAlign = 'center'; + // ctx.fillStyle = 'black'; + // fillText4(ctx, this.memSizeString(), 0, -10, xx, yy, this.direction, 12); + // fillText4(ctx, this.shortName, 0, 10, xx, yy, this.direction, 12); + // fillText2(ctx, 'A', this.address.x + 12, this.address.y, xx, yy, this.direction); + // fillText2(ctx, 'DI', this.dataIn.x + 12, this.dataIn.y, xx, yy, this.direction); + // fillText2(ctx, 'W', this.write.x + 12, this.write.y, xx, yy, this.direction); + // fillText2(ctx, 'DO', this.dataOut.x - 15, this.dataOut.y, xx, yy, this.direction); + // ctx.fill(); + } + + memSizeString() { + var mag = ['', 'K', 'M'] + var unit = + this.bitWidth == 8 + ? 'B' + : this.bitWidth == 1 + ? 'b' + : ` x ${this.bitWidth}b` + var v = Math.pow(2, this.addressWidth) + var m = 0 + while (v >= 1024 && m < mag.length - 1) { + v /= 1024 + m++ + } + return v + mag[m] + unit + } + + dump() { + var logLabel = console.group && this.label + if (logLabel) { + console.group(this.label) + } + + console.log(this.data) + + if (logLabel) { + console.groupEnd() + } + } +} + +verilogRAM.prototype.tooltipText = 'Random Access Memory' +verilogRAM.prototype.shortName = 'verilogRAM' +verilogRAM.prototype.maxAddressWidth = 20 +verilogRAM.prototype.mutableProperties = { + addressWidth: { + name: 'Address Width', + type: 'number', + max: '20', + min: '1', + func: 'changeAddressWidth', + }, + dump: { + name: 'Core Dump', + type: 'button', + func: 'dump', + }, + reset: { + name: 'Reset', + type: 'button', + func: 'clearData', + }, +} +verilogRAM.prototype.objectType = 'verilogRAM' diff --git a/v0/src/simulator/src/setup.js b/v0/src/simulator/src/setup.js new file mode 100644 index 00000000..6992115c --- /dev/null +++ b/v0/src/simulator/src/setup.js @@ -0,0 +1,211 @@ +/* eslint-disable import/no-cycle */ +/* eslint-disable no-restricted-syntax */ +/* eslint-disable guard-for-in */ + +import { Tooltip } from 'bootstrap' +import metadata from './metadata.json' +import { generateId, showMessage } from './utils' +import backgroundArea from './backgroundArea' +import plotArea from './plotArea' +import simulationArea from './simulationArea' +import { dots } from './canvasApi' +import { update, updateSimulationSet, updateCanvasSet } from './engine' +import { setupUI } from './ux' +import startMainListeners from './listeners' +// import startEmbedListeners from './embedListeners' +import './embed' +import { newCircuit, scopeList } from './circuit' +import load from './data/load' +import save from './data/save' +import { showTourGuide } from './tutorials' +import setupModules from './moduleSetup' +import 'codemirror/lib/codemirror.css' +import 'codemirror/addon/hint/show-hint.css' +import 'codemirror/mode/javascript/javascript' // verilog.js from codemirror is not working because array prototype is changed. +import 'codemirror/addon/edit/closebrackets' +import 'codemirror/addon/hint/anyword-hint' +import 'codemirror/addon/hint/show-hint' +import { setupCodeMirrorEnvironment } from './Verilog2CV' +// import { keyBinder } from '#/components/DialogBox/CustomShortcut.vue' +import '../vendor/jquery-ui.min.css' +import '../vendor/jquery-ui.min' +import { confirmSingleOption } from '#/components/helpers/confirmComponent/ConfirmComponent.vue' +import { getToken } from '#/pages/simulatorHandler.vue' + +/** + * to resize window and setup things it + * sets up new width for the canvas variables. + * Also redraws the grid. + * @category setup + */ +export function resetup() { + DPR = window.devicePixelRatio || 1 + if (lightMode) { + DPR = 1 + } + width = document.getElementById('simulationArea').clientWidth * DPR + if (!embed) { + height = + (document.body.clientHeight - + document.getElementById('toolbar').clientHeight) * + DPR + } else { + height = document.getElementById('simulation').clientHeight * DPR + } + // setup simulationArea and backgroundArea variables used to make changes to canvas. + backgroundArea.setup() + simulationArea.setup() + // redraw grid + dots() + document.getElementById('backgroundArea').style.height = + height / DPR + 100 + 'px' + document.getElementById('backgroundArea').style.width = + width / DPR + 100 + 'px' + document.getElementById('canvasArea').style.height = height / DPR + 'px' + simulationArea.canvas.width = width + simulationArea.canvas.height = height + backgroundArea.canvas.width = width + 100 * DPR + backgroundArea.canvas.height = height + 100 * DPR + if (!embed) { + plotArea.setup() + } + updateCanvasSet(true) + update() // INEFFICIENT, needs to be deprecated + simulationArea.prevScale = 0 + dots() +} + +window.onresize = resetup // listener +window.onorientationchange = resetup // listener + +// for mobiles +window.addEventListener('orientationchange', resetup) // listener + +/** + * function to setup environment variables like projectId and DPR + * @category setup + */ +function setupEnvironment() { + setupModules() + const projectId = generateId() + window.projectId = projectId + updateSimulationSet(true) + // const DPR = window.devicePixelRatio || 1 // unused variable + newCircuit('Main') + window.data = {} + resetup() + setupCodeMirrorEnvironment() +} + +/** + * It initializes some useful array which are helpful + * while simulating, saving and loading project. + * It also draws icons in the sidebar + * @category setup + */ +function setupElementLists() { + // $('#menu').empty() + + window.circuitElementList = metadata.circuitElementList + window.annotationList = metadata.annotationList + window.inputList = metadata.inputList + window.subCircuitInputList = metadata.subCircuitInputList + window.moduleList = [...circuitElementList, ...annotationList] + window.updateOrder = [ + 'wires', + ...circuitElementList, + 'nodes', + ...annotationList, + ] // Order of update + window.renderOrder = [...moduleList.slice().reverse(), 'wires', 'allNodes'] // Order of render +} + +/** + * Fetches project data from API and loads it into the simulator. + * @param {number} projectId The ID of the project to fetch data for + * @category setup + */ +async function fetchProjectData(projectId) { + try { + const response = await fetch( + `/api/v1/projects/${projectId}/circuit_data`, + { + method: 'GET', + headers: { + Accept: 'application/json', + Authorization: `Token ${getToken('cvt')}`, + }, + } + ) + if (response.ok) { + const data = await response.json() + await load(data) + await simulationArea.changeClockTime(data.timePeriod || 500) + $('.loadingIcon').fadeOut() + } else { + throw new Error('API call failed') + } + } catch (error) { + console.error(error) + confirmSingleOption('Error: Could not load.') + $('.loadingIcon').fadeOut() + } +} + +/** + * Load project data immediately when available. + * Improvement to eliminate delay caused by setTimeout in previous implementation revert if issues arise. + * @category setup + */ +async function loadProjectData() { + window.logixProjectId = window.logixProjectId ?? 0 + if (window.logixProjectId !== 0) { + $('.loadingIcon').fadeIn() + await fetchProjectData(window.logixProjectId) + } else if (localStorage.getItem('recover_login') && window.isUserLoggedIn) { + // Restore unsaved data and save + const data = JSON.parse(localStorage.getItem('recover_login')) + await load(data) + localStorage.removeItem('recover') + localStorage.removeItem('recover_login') + await save() + } else if (localStorage.getItem('recover')) { + // Restore unsaved data which didn't get saved due to error + showMessage( + "We have detected that you did not save your last work. Don't worry we have recovered them. Access them using Project->Recover" + ) + } +} + +/** + * Show tour guide if it hasn't been completed yet. + * The tour is shown after a delay of 2 seconds. + * @category setup + */ +function showTour() { + if (!localStorage.tutorials_tour_done && !embed) { + setTimeout(() => { + showTourGuide() + }, 2000) + } +} + +/** + * The first function to be called to setup the whole simulator. + * This function sets up the simulator environment, the UI, the listeners, + * loads the project data, and shows the tour guide. + * @category setup + */ +export function setup() { + // let embed = false + // const startListeners = embed ? startEmbedListeners : startMainListeners + setupElementLists() + setupEnvironment() + if (!embed) { + setupUI() + startMainListeners() + } + // startListeners() + loadProjectData() + showTour() +} diff --git a/v0/src/simulator/src/simulationArea.js b/v0/src/simulator/src/simulationArea.js new file mode 100644 index 00000000..3784988a --- /dev/null +++ b/v0/src/simulator/src/simulationArea.js @@ -0,0 +1,99 @@ +/* eslint-disable import/no-cycle */ +import EventQueue from './eventQueue' +import { clockTick } from './utils' + +/** + * simulation environment object - holds simulation canvas + * @type {Object} simulationArea + * @property {HTMLCanvasElement} canvas + * @property {boolean} selected + * @property {boolean} hover + * @property {number} clockState + * @property {boolean} clockEnabled + * @property {undefined} lastSelected + * @property {Array} stack + * @property {number} prevScale + * @property {number} oldx + * @property {number} oldy + * @property {Array} objectList + * @property {number} maxHeight + * @property {number} maxWidth + * @property {number} minHeight + * @property {number} minWidth + * @property {Array} multipleObjectSelections + * @property {Array} copyList - List of selected elements + * @property {boolean} shiftDown - shift down or not + * @property {boolean} controlDown - contol down or not + * @property {number} timePeriod - time period + * @property {number} mouseX - mouse x + * @property {number} mouseY - mouse y + * @property {number} mouseDownX - mouse click x + * @property {number} mouseDownY - mouse click y + * @property {Array} simulationQueue - simulation queue + * @property {number} clickCount - number of clicks + * @property {string} lock - locked or unlocked + * @property {function} timer - timer + * @property {function} setup - to setup the simulaton area + * @property {function} changeClockTime - change clock time + * @property {function} clear - clear the simulation area + * @category simulationArea + */ +const simulationArea = { + canvas: document.getElementById('simulationArea'), + selected: false, + hover: false, + clockState: 0, + clockEnabled: true, + lastSelected: undefined, + stack: [], + prevScale: 0, + oldx: 0, + oldy: 0, + objectList: [], + maxHeight: 0, + maxWidth: 0, + minHeight: 0, + minWidth: 0, + multipleObjectSelections: [], + copyList: [], + shiftDown: false, + controlDown: false, + timePeriod: 500, + mouseX: 0, + mouseY: 0, + mouseDownX: 0, + mouseDownY: 0, + simulationQueue: undefined, + multiAddElement: false, + + clickCount: 0, // double click + lock: 'unlocked', + timer() { + ckickTimer = setTimeout(() => { + simulationArea.clickCount = 0 + }, 600) + }, + + setup() { + this.canvas = document.getElementById('simulationArea') + this.canvas.width = width + this.canvas.height = height + this.simulationQueue = new EventQueue(10000) + this.context = this.canvas.getContext('2d') + simulationArea.changeClockTime(simulationArea.timePeriod) + this.mouseDown = false + }, + changeClockTime(t) { + if (t < 50) return + clearInterval(simulationArea.ClockInterval) + t = t || prompt('Enter Time Period:') + simulationArea.timePeriod = t + simulationArea.ClockInterval = setInterval(clockTick, t) + }, + clear() { + if (!this.context) return + this.context.clearRect(0, 0, this.canvas.width, this.canvas.height) + }, +} +export const { changeClockTime } = simulationArea +export default simulationArea diff --git a/v0/src/simulator/src/subcircuit.js b/v0/src/simulator/src/subcircuit.js new file mode 100644 index 00000000..85fdc53e --- /dev/null +++ b/v0/src/simulator/src/subcircuit.js @@ -0,0 +1,747 @@ +/* eslint-disable import/no-cycle */ +import Scope, { scopeList, switchCircuit } from './circuit' +import CircuitElement from './circuitElement' +import simulationArea from './simulationArea' +import { scheduleBackup, checkIfBackup } from './data/backupCircuit' +import { + scheduleUpdate, + updateSimulationSet, + updateCanvasSet, + updateSubcircuitSet, + forceResetNodesSet, +} from './engine' +import { loadScope } from './data/load' +import { showError } from './utils' + +import Node, { findNode } from './node' +import { fillText, correctWidth, rect2 } from './canvasApi' +import { colors } from './themer/themer' +import { layoutModeGet } from './layoutMode' +import { verilogModeGet } from './Verilog2CV' +import { sanitizeLabel } from './verilogHelpers' +import { SimulatorStore } from '#/store/SimulatorStore/SimulatorStore' +/** + * Function to load a subcicuit + * @category subcircuit + */ +export function loadSubCircuit(savedData, scope) { + new SubCircuit(savedData.x, savedData.y, scope, savedData.id, savedData) +} + +/** + * Prompt to create subcircuit, shows list of circuits which dont depend on the current circuit + * @param {Scope=} scope + * @category subcircuit + */ +export function createSubCircuitPrompt(scope = globalScope) { + if (verilogModeGet() || layoutModeGet()) { + showError('Subcircuit cannot be inserted in this mode') + return + } + const simulatorStore = SimulatorStore() + simulatorStore.dialogBox.insertsubcircuit_dialog = true + /* + $('#insertSubcircuitDialog').empty() + let flag = true + for (id in scopeList) { + if ( + !scopeList[id].checkDependency(scope.id) && + scopeList[id].isVisible() + ) { + flag = false + $('#insertSubcircuitDialog').append( + `` + ) + } + } + if (flag) + $('#insertSubcircuitDialog').append( + "

Looks like there are no other circuits which doesn't have this circuit as a dependency. Create a new one!

" + ) + $('#insertSubcircuitDialog').dialog({ + resizable: false, + maxHeight: 800, + width: 450, + maxWidth: 800, + minWidth: 250, + buttons: !flag + ? [ + { + text: 'Insert SubCircuit', + click() { + if (!$('input[name=subCircuitId]:checked').val()) + return + simulationArea.lastSelected = new SubCircuit( + undefined, + undefined, + globalScope, + $('input[name=subCircuitId]:checked').val() + ) + $(this).dialog('close') + }, + }, + ] + : [], + }) + */ +} + +/** + * @class + * @extends CircuitElement + * @param {number} x - x coord of subcircuit + * @param {number} y - y coord of subcircuit + * @param {Scope=} scope - the circuit in which subcircuit has been added + * @param {string} id - the id of the subcircuit scope + * @param {JSON} savedData - the saved data + * @category subcircuit + */ +export default class SubCircuit extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + id = undefined, + savedData = undefined + ) { + super(x, y, scope, 'RIGHT', 1) // super call + this.objectType = 'SubCircuit' + this.scope.SubCircuit.push(this) + this.id = id || prompt('Enter Id: ') + this.directionFixed = true + this.fixedBitWidth = true + this.savedData = savedData + this.inputNodes = [] + this.outputNodes = [] + this.localScope = new Scope() + this.preventCircuitSwitch = false // prevents from switching circuit if double clicking element + this.rectangleObject = false + + var subcircuitScope = scopeList[this.id] // Scope of the subcircuit + // Error handing + if (subcircuitScope == undefined) { + // if no such scope for subcircuit exists + showError( + `SubCircuit : ${ + (savedData && savedData.title) || this.id + } Not found` + ) + } else if (!checkIfBackup(subcircuitScope)) { + // if there is no input/output nodes there will be no backup + showError( + `SubCircuit : ${ + (savedData && savedData.title) || subcircuitScope.name + } is an empty circuit` + ) + } else if (subcircuitScope.checkDependency(scope.id)) { + // check for cyclic dependency + showError('Cyclic Circuit Error') + } + // Error handling, cleanup + if ( + subcircuitScope == undefined || + subcircuitScope.checkDependency(scope.id) + ) { + if (savedData) { + for (var i = 0; i < savedData.inputNodes.length; i++) { + scope.allNodes[savedData.inputNodes[i]].deleted = true + } + for (var i = 0; i < savedData.outputNodes.length; i++) { + scope.allNodes[savedData.outputNodes[i]].deleted = true + } + } + return + } + + if (this.savedData != undefined) { + updateSubcircuitSet(true) + scheduleUpdate() + this.version = this.savedData.version || '1.0' + + this.id = this.savedData.id + this.label = this.savedData.label || '' + this.labelDirection = this.savedData.labelDirection || 'RIGHT' + for (var i = 0; i < this.savedData.inputNodes.length; i++) { + this.inputNodes.push( + this.scope.allNodes[this.savedData.inputNodes[i]] + ) + this.inputNodes[i].parent = this + this.inputNodes[i].layout_id = + subcircuitScope.Input[i]?.layoutProperties.id + } + for (var i = 0; i < this.savedData.outputNodes.length; i++) { + this.outputNodes.push( + this.scope.allNodes[this.savedData.outputNodes[i]] + ) + this.outputNodes[i].parent = this + this.outputNodes[i].layout_id = + subcircuitScope.Output[i]?.layoutProperties.id + } + if (this.version == '1.0') { + // For backward compatibility + this.version = '2.0' + this.x -= subcircuitScope.layout.width / 2 + this.y -= subcircuitScope.layout.height / 2 + for (var i = 0; i < this.inputNodes.length; i++) { + this.inputNodes[i].x = + subcircuitScope.Input[i].layoutProperties.x + this.inputNodes[i].y = + subcircuitScope.Input[i].layoutProperties.y + this.inputNodes[i].leftx = this.inputNodes[i].x + this.inputNodes[i].lefty = this.inputNodes[i].y + } + for (var i = 0; i < this.outputNodes.length; i++) { + this.outputNodes[i].x = + subcircuitScope.Output[i].layoutProperties.x + this.outputNodes[i].y = + subcircuitScope.Output[i].layoutProperties.y + this.outputNodes[i].leftx = this.outputNodes[i].x + this.outputNodes[i].lefty = this.outputNodes[i].y + } + } + + if (this.version == '2.0') { + this.leftDimensionX = 0 + this.upDimensionY = 0 + this.rightDimensionX = subcircuitScope.layout.width + this.downDimensionY = subcircuitScope.layout.height + } + + this.nodeList.extend(this.inputNodes) + this.nodeList.extend(this.outputNodes) + } else { + this.version = '2.0' + } + + this.data = JSON.parse(scheduleBackup(subcircuitScope)) + this.buildCircuit() // load the localScope for the subcircuit + this.makeConnections() // which will be wireless + } + + /** + * actually make all connection but are invisible so + * it seems like the simulation is happening in other + * Scope but it actually is not. + */ + makeConnections() { + for (let i = 0; i < this.inputNodes.length; i++) { + this.localScope.Input[i]?.output1.connectWireLess( + this.inputNodes[i] + ) + this.localScope.Input[i].output1.subcircuitOverride = true + } + + for (let i = 0; i < this.outputNodes.length; i++) { + this.localScope.Output[i]?.inp1.connectWireLess(this.outputNodes[i]) + this.outputNodes[i].subcircuitOverride = true + } + } + + /** + * Function to remove wireless connections + */ + removeConnections() { + for (let i = 0; i < this.inputNodes.length; i++) { + this.localScope.Input[i]?.output1.disconnectWireLess( + this.inputNodes[i] + ) + } + + for (let i = 0; i < this.outputNodes.length; i++) { + this.localScope.Output[i]?.inp1.disconnectWireLess( + this.outputNodes[i] + ) + } + } + + /** + * loads the subcircuit and draws all the nodes + */ + buildCircuit() { + var subcircuitScope = scopeList[this.id] + loadScope(this.localScope, this.data) + this.localScope.name = this.data.name + this.lastUpdated = this.localScope.timeStamp + updateSimulationSet(true) + updateCanvasSet(true) + + if (this.savedData == undefined) { + this.leftDimensionX = 0 + this.upDimensionY = 0 + this.rightDimensionX = subcircuitScope.layout.width + this.downDimensionY = subcircuitScope.layout.height + for (var i = 0; i < subcircuitScope.Output.length; i++) { + var a = new Node( + subcircuitScope.Output[i].layoutProperties.x, + subcircuitScope.Output[i].layoutProperties.y, + 1, + this, + subcircuitScope.Output[i].bitWidth + ) + a.layout_id = subcircuitScope.Output[i].layoutProperties.id + this.outputNodes.push(a) + } + for (var i = 0; i < subcircuitScope.Input.length; i++) { + var a = new Node( + subcircuitScope.Input[i].layoutProperties.x, + subcircuitScope.Input[i].layoutProperties.y, + 0, + this, + subcircuitScope.Input[i].bitWidth + ) + a.layout_id = subcircuitScope.Input[i].layoutProperties.id + this.inputNodes.push(a) + } + } + } + + // Needs to be deprecated, removed + reBuild() { + // new SubCircuit(x = this.x, y = this.y, scope = this.scope, this.id); + // this.scope.backups = []; // Because all previous states are invalid now + // this.delete(); + // showMessage('Subcircuit: ' + subcircuitScope.name + ' has been reloaded.'); + } + + /** + * rebuilds the subcircuit if any change to localscope is made + */ + reBuildCircuit() { + this.data = JSON.parse(scheduleBackup(scopeList[this.id])) + this.localScope = new Scope(data.name) + loadScope(this.localScope, this.data) + this.lastUpdated = this.localScope.timeStamp + this.scope.timeStamp = this.localScope.timeStamp + } + + reset() { + this.removeConnections() + + var subcircuitScope = scopeList[this.id] + + for (var i = 0; i < subcircuitScope.SubCircuit.length; i++) { + subcircuitScope.SubCircuit[i].reset() + } + + // No Inputs or Outputs + let emptyCircuit = + subcircuitScope.Input.length == 0 && + subcircuitScope.Output.length == 0 + // No LayoutElements + for (let element of circuitElementList) { + if ( + subcircuitScope[element].length > 0 && + subcircuitScope[element][0].canShowInSubcircuit + ) { + emptyCircuit = false + break + } + } + + if (emptyCircuit) { + showError( + `SubCircuit : ${subcircuitScope.name} is an empty circuit` + ) + } + + subcircuitScope.layout.height = subcircuitScope.layout.height + subcircuitScope.layout.width = subcircuitScope.layout.width + this.leftDimensionX = 0 + this.upDimensionY = 0 + this.rightDimensionX = subcircuitScope.layout.width + this.downDimensionY = subcircuitScope.layout.height + + var temp_map_inp = {} + for (var i = 0; i < subcircuitScope.Input.length; i++) { + temp_map_inp[subcircuitScope.Input[i].layoutProperties.id] = [ + subcircuitScope.Input[i], + undefined, + ] + } + for (var i = 0; i < this.inputNodes.length; i++) { + if (temp_map_inp.hasOwnProperty(this.inputNodes[i].layout_id)) { + temp_map_inp[this.inputNodes[i].layout_id][1] = + this.inputNodes[i] + } else { + this.scope.backups = [] + this.inputNodes[i].delete() + this.nodeList.clean(this.inputNodes[i]) + } + } + + for (id in temp_map_inp) { + if (temp_map_inp[id][1]) { + if ( + temp_map_inp[id][0].layoutProperties.x == + temp_map_inp[id][1].x && + temp_map_inp[id][0].layoutProperties.y == + temp_map_inp[id][1].y + ) { + temp_map_inp[id][1].bitWidth = temp_map_inp[id][0].bitWidth + } else { + this.scope.backups = [] + temp_map_inp[id][1].delete() + this.nodeList.clean(temp_map_inp[id][1]) + temp_map_inp[id][1] = new Node( + temp_map_inp[id][0].layoutProperties.x, + temp_map_inp[id][0].layoutProperties.y, + 0, + this, + temp_map_inp[id][0].bitWidth + ) + temp_map_inp[id][1].layout_id = id + } + } + } + + this.inputNodes = [] + for (var i = 0; i < subcircuitScope.Input.length; i++) { + var input = + temp_map_inp[subcircuitScope.Input[i].layoutProperties.id][0] + if (temp_map_inp[input.layoutProperties.id][1]) { + this.inputNodes.push(temp_map_inp[input.layoutProperties.id][1]) + } else { + var a = new Node( + input.layoutProperties.x, + input.layoutProperties.y, + 0, + this, + input.bitWidth + ) + a.layout_id = input.layoutProperties.id + this.inputNodes.push(a) + } + } + + var temp_map_out = {} + for (var i = 0; i < subcircuitScope.Output.length; i++) { + temp_map_out[subcircuitScope.Output[i].layoutProperties.id] = [ + subcircuitScope.Output[i], + undefined, + ] + } + for (var i = 0; i < this.outputNodes.length; i++) { + if (temp_map_out.hasOwnProperty(this.outputNodes[i].layout_id)) { + temp_map_out[this.outputNodes[i].layout_id][1] = + this.outputNodes[i] + } else { + this.outputNodes[i].delete() + this.nodeList.clean(this.outputNodes[i]) + } + } + + for (id in temp_map_out) { + if (temp_map_out[id][1]) { + if ( + temp_map_out[id][0].layoutProperties.x == + temp_map_out[id][1].x && + temp_map_out[id][0].layoutProperties.y == + temp_map_out[id][1].y + ) { + temp_map_out[id][1].bitWidth = temp_map_out[id][0].bitWidth + } else { + temp_map_out[id][1].delete() + this.nodeList.clean(temp_map_out[id][1]) + temp_map_out[id][1] = new Node( + temp_map_out[id][0].layoutProperties.x, + temp_map_out[id][0].layoutProperties.y, + 1, + this, + temp_map_out[id][0].bitWidth + ) + temp_map_out[id][1].layout_id = id + } + } + } + + this.outputNodes = [] + for (var i = 0; i < subcircuitScope.Output.length; i++) { + var output = + temp_map_out[subcircuitScope.Output[i].layoutProperties.id][0] + if (temp_map_out[output.layoutProperties.id][1]) { + this.outputNodes.push( + temp_map_out[output.layoutProperties.id][1] + ) + } else { + var a = new Node( + output.layoutProperties.x, + output.layoutProperties.y, + 1, + this, + output.bitWidth + ) + a.layout_id = output.layoutProperties.id + this.outputNodes.push(a) + } + } + + if (subcircuitScope.timeStamp > this.lastUpdated) { + this.reBuildCircuit() + } + + // Should this be done here or only when this.reBuildCircuit() is called? + { + this.localScope.reset() + updateSimulationSet(true) + forceResetNodesSet(true) + } + + this.makeConnections() + } + + /** + * Procedure after a element is clicked inside a subcircuit + **/ + click() { + var elementClicked = this.getElementHover() + if (elementClicked) { + this.lastClickedElement = elementClicked + elementClicked.wasClicked = true + } + } + + getElementHover() { + var rX = this.layoutProperties.rightDimensionX + var lX = this.layoutProperties.leftDimensionX + var uY = this.layoutProperties.upDimensionY + var dY = this.layoutProperties.downDimensionY + + for (let el of circuitElementList) { + if (this.localScope[el].length === 0) continue + if (!this.localScope[el][0].canShowInSubcircuit) continue + for (let i = 0; i < this.localScope[el].length; i++) { + var obj = this.localScope[el][i] + if ( + obj.subcircuitMetadata.showInSubcircuit && + obj.isSubcircuitHover(this.x, this.y) + ) { + return obj + } + } + } + } + + /** + * Sets the elements' wasClicked property in the subcircuit to false + **/ + releaseClick() { + if (this.lastClickedElement !== undefined) { + this.lastClickedElement.wasClicked = false + this.lastClickedElement = undefined + } + } + + /** + * adds all local scope inputs to the global scope simulation queue + */ + addInputs() { + for (let i = 0; i < subCircuitInputList.length; i++) { + for ( + let j = 0; + j < this.localScope[subCircuitInputList[i]].length; + j++ + ) { + simulationArea.simulationQueue.add( + this.localScope[subCircuitInputList[i]][j], + 0 + ) + } + } + for (let j = 0; j < this.localScope.SubCircuit.length; j++) { + this.localScope.SubCircuit[j].addInputs() + } + } + + /** + * Procedure if any element is double clicked inside a subcircuit + **/ + dblclick() { + if (this.elementHover) return + switchCircuit(this.id) + } + + /** + * Returns a javascript object of subcircuit data. + * Does not include data of subcircuit elements apart from Input and Output (that is a part of element.subcircuitMetadata) + **/ + saveObject() { + var data = { + x: this.x, + y: this.y, + id: this.id, + label: this.label, + labelDirection: this.labelDirection, + inputNodes: this.inputNodes.map(findNode), + outputNodes: this.outputNodes.map(findNode), + version: this.version, + } + return data + } + + /** + * By design, subcircuit element's input and output nodes are wirelessly + * connected to the localscope (clone of the scope of the subcircuit's + * circuit). So it is almost like the actual circuit is copied in the + * location of the subcircuit element. Therefore no resolve needed. + */ + isResolvable() { + return false + } + + /** + * If element not resolvable (always in subcircuits), removePropagation + * is called on it. + */ + removePropagation() { + // Leave this to the scope of the subcircuit. Do nothing. + } + + verilogName() { + return sanitizeLabel(scopeList[this.id].name) + } + /** + * determines where to show label + */ + determine_label(x, y) { + if (x == 0) return ['left', 5, 5] + if (x == scopeList[this.id].layout.width) return ['right', -5, 5] + if (y == 0) return ['center', 0, 13] + return ['center', 0, -6] + } + + checkHover() { + super.checkHover() + if (this.elementHover) { + this.elementHover.hover = false + this.elementHover = undefined + simulationArea.hover = undefined + } + var elementHover = this.getElementHover() + if (elementHover) { + elementHover.hover = true + this.elementHover = elementHover + this.hover = false + simulationArea.hover = elementHover + } + } + + /** + * Draws the subcircuit (and contained elements) on the screen when the subcircuit is included + in another circuit + **/ + customDraw() { + var subcircuitScope = scopeList[this.id] + + var ctx = simulationArea.context + + ctx.lineWidth = globalScope.scale * 3 + ctx.strokeStyle = colors['stroke'] // ("rgba(0,0,0,1)"); + ctx.fillStyle = colors['fill'] + var xx = this.x + var yy = this.y + + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + rect2( + ctx, + -this.leftDimensionX, + -this.upDimensionY, + this.leftDimensionX + this.rightDimensionX, + this.upDimensionY + this.downDimensionY, + this.x, + this.y, + [this.direction, 'RIGHT'][+this.directionFixed] + ) + if (!this.elementHover) { + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + } + ctx.fill() + ctx.stroke() + + ctx.beginPath() + + ctx.textAlign = 'center' + ctx.fillStyle = 'black' + if (this.version == '1.0') { + fillText( + ctx, + subcircuitScope.name, + xx, + yy - subcircuitScope.layout.height / 2 + 13, + 11 + ) + } else if (this.version == '2.0') { + if (subcircuitScope.layout.titleEnabled) { + fillText( + ctx, + subcircuitScope.name, + subcircuitScope.layout.title_x + xx, + yy + subcircuitScope.layout.title_y, + 11 + ) + } + } else { + } + + for (var i = 0; i < subcircuitScope.Input.length; i++) { + if (!subcircuitScope.Input[i].label) continue + var info = this.determine_label( + this.inputNodes[i].x, + this.inputNodes[i].y + ) + ctx.textAlign = info[0] + fillText( + ctx, + subcircuitScope.Input[i].label, + this.inputNodes[i].x + info[1] + xx, + yy + this.inputNodes[i].y + info[2], + 12 + ) + } + + for (var i = 0; i < subcircuitScope.Output.length; i++) { + if (!subcircuitScope.Output[i].label) continue + var info = this.determine_label( + this.outputNodes[i].x, + this.outputNodes[i].y + ) + ctx.textAlign = info[0] + fillText( + ctx, + subcircuitScope.Output[i].label, + this.outputNodes[i].x + info[1] + xx, + yy + this.outputNodes[i].y + info[2], + 12 + ) + } + ctx.fill() + for (let i = 0; i < this.outputNodes.length; i++) { + this.outputNodes[i].draw() + } + for (let i = 0; i < this.inputNodes.length; i++) { + this.inputNodes[i].draw() + } + + // draw subcircuitElements + for (let el of circuitElementList) { + if (this.localScope[el].length === 0) continue + if (!this.localScope[el][0].canShowInSubcircuit) continue + for (let i = 0; i < this.localScope[el].length; i++) { + if ( + this.localScope[el][i].subcircuitMetadata.showInSubcircuit + ) { + this.localScope[el][i].drawLayoutMode(this.x, this.y) + } + } + } + } +} +SubCircuit.prototype.centerElement = true // To center subcircuit when new +SubCircuit.prototype.propagationDelayFixed = true diff --git a/v0/src/simulator/src/testCreator.js b/v0/src/simulator/src/testCreator.js new file mode 100644 index 00000000..4a1708c2 --- /dev/null +++ b/v0/src/simulator/src/testCreator.js @@ -0,0 +1,780 @@ +/* + This file contains all javascript related to the test creator UI + at /testbench +*/ + +import _ from '../vendor/table2csv' + +const CREATORMODE = { + NORMAL: 0, + SIMULATOR_POPUP: 1, +} + +var testMode = 'comb' +var groupIndex = 0 +var inputCount = 0 +var nextInputIndex = 0 +var outputCount = 0 +var nextOutputIndex = 0 +var cases = [0] +var creatorMode = CREATORMODE.NORMAL +var circuitScopeID + +function dataReset() { + groupIndex = -1 + cases = [0] +} + +/** + * Onload, check if it is opened in a popup. + * Check if test is being edited, or created + */ +window.onload = () => { + const query = new URLSearchParams(window.location.search) + if (query.has('popUp')) { + if (query.get('popUp') == 'true') { + creatorMode = CREATORMODE.SIMULATOR_POPUP + $('.right-button-group').append( + '' + ) + } + } + if (query.has('data')) { + $('#tb-creator-head').html('Edit Test') + circuitScopeID = query.get('scopeID') + loadData(query.get('data')) + return + } + + if (query.has('result')) { + $('#tb-creator-head').html('Test Result') + loadResult(query.get('result')) + readOnlyUI() + return + } + + circuitScopeID = query.get('scopeID') + addInput() + addOutput() + makeSortable() +} + +/* Change UI testMode between Combinational(comb) and Sequential(seq) */ +function changeTestMode(m) { + if (testMode === m) return false + dataReset() + testMode = m + $('#combSelect').removeClass('tab-selected') + $('#seqSelect').removeClass('tab-selected') + $('#tb-new-group').css('visibility', m === 'seq' ? 'visible' : 'hidden') + $(`#${m}Select`).addClass('tab-selected') + $('#dataGroup').empty() + + return true +} + +/* Adds case to a group */ +function addCase(grp) { + const currentGroupTable = $(`#data-table-${grp + 1}`) + + let s = + '
\n' + for (let i = 0; i < inputCount + outputCount; i++) + s += '0' + s += '' + + // Sortable hack + currentGroupTable.find('tbody').remove() + currentGroupTable.append(s) +} + +/* Deletes case from a group */ +function deleteCase(element) { + const row = element.parent().parent() + const grp = Number(row.parent().attr('id').split('-').pop()) + + row.remove() +} + +/* Adds group with default name 'Group N' or name supplied in @param groupName */ +/* Used without params by UI, used with params by loadData() */ +function addGroup( + groupName = `${testMode === 'comb' ? 'Group' : 'Set'} ${groupIndex + 2}` +) { + $('.plus-button').removeClass('latest-button') + groupIndex++ + + const s = ` +
+

${escapeHtml(groupName)}

+
Click + to add tests to the ${ + testMode === 'comb' ? 'group' : 'set' + }
+ + +
+ +
+ ` + cases[groupIndex] = 0 + $('#dataGroup').append(s) + + makeSortable() +} + +/* Deletes a group */ +function deleteGroup(element) { + const groupDiv = element.parent() + const grp = Number(groupDiv.attr('id').split('-').pop()) + groupDiv.remove() +} + +/* Adds input with default value 0 or values supplied in @param inputData */ +/* Used without params for UI, used with params by loadData() */ +function addInput( + label = `inp${nextInputIndex + 1}`, + bitwidth = 1, + inputData = [] +) { + nextInputIndex++ + inputCount++ + // Change head table contents + const sHead = `${escapeHtml( + label + )}
` + const sData = `${escapeHtml( + bitwidth.toString() + )}` + $('#testBenchTable') + .find('tr') + .eq(1) + .find('th') + .eq(inputCount - 1) + .after(sHead) + $('#testBenchTable') + .find('tr') + .eq(2) + .find('td') + .eq(inputCount - 1) + .after(sData) + $('#tb-inputs-head').attr('colspan', inputCount) + + // Change data tables' contents + $('#dataGroup') + .find('table') + .each(function (group_i) { + $(this) + .find('tr') + .each(function (case_i) { + const s = `${ + inputData.length + ? escapeHtml(inputData[group_i][case_i]) + : 0 + }` + $(this) + .find('td') + .eq(inputCount - 1) + .after(s) + }) + }) +} + +/* Adds output with default value 0 or values supplied in @param outputData */ +/* Used without params for UI, used with params by loadData() */ +/* Used with resultData and result=true for setting result */ +function addOutput( + label = `out${nextOutputIndex + 1}`, + bitwidth = 1, + outputData = [], + result = false, + resultData = [] +) { + nextOutputIndex++ + outputCount++ + // Change head table contents + let sHead = `${escapeHtml( + label + )} ` + let sData = `${escapeHtml( + bitwidth.toString() + )}` + + // If result then set colspan to 2 + if (result) { + sHead = `${escapeHtml( + label + )} ` + sData = `${escapeHtml( + bitwidth.toString() + )}` + } + + $('#testBenchTable') + .find('tr') + .eq(1) + .find('th') + .eq(inputCount + outputCount - 1) + .after(sHead) + $('#testBenchTable') + .find('tr') + .eq(2) + .find('td') + .eq(inputCount + outputCount - 1) + .after(sData) + // If not result then colspan is outputCount + $('#tb-outputs-head').attr('colspan', outputCount) + // else it's 2*outputCount + if (result) { + $('#tb-outputs-head').attr('colspan', 2 * outputCount) + } + + // Change data tables' contents + + // If not result just add the outputs + if (!result) { + $('#dataGroup') + .find('table') + .each(function (group_i) { + $(this) + .find('tr') + .each(function (case_i) { + const s = `${ + outputData.length + ? escapeHtml(outputData[group_i][case_i]) + : 0 + }` + $(this) + .find('td') + .eq(inputCount + outputCount - 1) + .after(s) + }) + }) + + // If result then add results besides the outputs + // Hacky + } else { + $('#dataGroup') + .find('table') + .each(function (group_i) { + $(this) + .find('tr') + .each(function (case_i) { + // Add the outputs (expected values) + const outputCellData = `${escapeHtml( + outputData[group_i][case_i] + )}` + $(this) + .find('td') + .eq(inputCount + 2 * (outputCount - 1)) + .after(outputCellData) + + // Add the actual values + const resultColor = + resultData[group_i][case_i] === + outputData[group_i][case_i] + ? 'green' + : 'red' + const resultCellData = `${escapeHtml( + resultData[group_i][case_i] + )}` + $(this) + .find('td') + .eq(inputCount + 2 * outputCount - 1) + .after(resultCellData) + }) + }) + } +} + +/* Deletes input unless there's only one input */ +function deleteInput(element) { + if (inputCount === 1) return + const columnIndex = element.parent().eq(0).index() + + $('#testBenchTable tr, .data-group tr') + .slice(1) + .each(function () { + $(this).find('td, th').eq(columnIndex).remove() + }) + + inputCount-- + $('#tb-inputs-head').attr('colspan', inputCount) +} + +/* Deletes output unless there's only one output */ +function deleteOutput(element) { + if (outputCount === 1) return + const columnIndex = element.parent().eq(0).index() + + $('#testBenchTable tr, .data-group tr') + .slice(1) + .each(function () { + $(this).find('td, th').eq(columnIndex).remove() + }) + + outputCount-- + $('#tb-outputs-head').attr('colspan', outputCount) +} + +/* Returns input/output(keys) and their bitwidths(values) */ +/* Called by getData() */ +function getBitWidths() { + const bitwidths = {} + $('#testBenchTable') + .find('tr') + .eq(1) + .find('th') + .slice(1) + .each(function (index) { + const inp = $(this).text() + const bw = $('#testBenchTable') + .find('tr') + .eq(2) + .find('td') + .slice(1) + .eq(index) + .html() + bitwidths[inp] = Number(bw) + }) + return bitwidths +} + +/* Returns data for all the groups for all inputs and outputs */ +/* Called by parse() */ +function getData() { + const bitwidths = getBitWidths() + const groups = [] + const groupCount = $('#dataGroup').children().length + for (let group_i = 0; group_i < groupCount; group_i++) { + const group = {} + group.label = getGroupTitle(group_i) + group.inputs = [] + group.outputs = [] + + const group_table = $(`#data-table-${group_i + 1}`) + group.n = group_table.find('tr').length + + // Push all the inputs in the group + for (let inp_i = 0; inp_i < inputCount; inp_i++) { + const label = Object.keys(bitwidths)[inp_i] + const input = { + label: label.slice(0, label.length - 1), + bitWidth: bitwidths[label], + values: [], + } + group_table.find('tr').each(function () { + input.values.push($(this).find('td').slice(1).eq(inp_i).html()) + }) + + group.inputs.push(input) + } + + // Push all the outputs in the group + for (let out_i = 0; out_i < outputCount; out_i++) { + const label = Object.keys(bitwidths)[inputCount + out_i] + const output = { + label: label.slice(0, label.length - 1), + bitWidth: bitwidths[label], + values: [], + } + group_table.find('tr').each(function () { + output.values.push( + $(this) + .find('td') + .slice(1) + .eq(inputCount + out_i) + .html() + ) + }) + + group.outputs.push(output) + } + + groups.push(group) + } + + return groups +} + +function getTestTitle() { + return $('#test-title-label').text() +} + +function getGroupTitle(group_i) { + return $(`#data-group-title-${group_i + 1}`).text() +} + +/* Parse UI table into Javascript Object */ +function parse() { + const data = {} + const tableData = getData() + data.type = testMode + data.title = getTestTitle() + data.groups = tableData + return data +} + +/* Export test data as a CSV file */ +function exportAsCSV() { + let csvData = '' + csvData += 'Title,Test Type,Input Count,Output Count\n' + csvData += `${getTestTitle()},${testMode},${inputCount},${outputCount}\n\n\n` + csvData += $('table').eq(0).table2CSV() + csvData += '\n\n' + $('table') + .slice(1) + .each(function (group_i) { + csvData += getGroupTitle(group_i) + csvData += '\n' + csvData += $(this).table2CSV() + csvData += '\n\n' + }) + + download(`${getTestTitle()}.csv`, csvData) + return csvData +} + +/* + Imports data from CSV and loads into the table + To achieve this, first converts to JSON then uses request param to load json to table +*/ +function importFromCSV() { + const file = $('#csvFileInput').prop('files')[0] + const reader = new FileReader() + + // If circuitScopeID exists, ie. if popup opened from testbench, then use that to redirect + const query = new URLSearchParams(window.location.search) + // Preserve popup status while redirecting + const isPopup = query.get('popUp') || false + + // When the file is read, redirect to the data location + reader.onload = () => { + const csvContent = reader.result + const jsonData = csv2json(csvContent, 1, 1) + + window.location = `/testbench?scopeID=${ + circuitScopeID || '' + }&data=${jsonData}&popUp=${isPopup}` + } + + reader.readAsText(file) +} + +// Clicks the hidden upload file button, entrypoint into importFromCSV() +// The hidden button in-turn calls importFromCSV() +function clickUpload() { + $('#csvFileInput').click() +} + +/* Converts CSV to JSON to be loaded into the table */ +function csv2json(csvFileData) { + const stripQuotes = (str) => str.replaceAll('"', '') + + /* Extracts bitwidths from the csv data */ + const getBitWidthsCSV = (csvDataBW) => { + const testMetadata = csvDataBW.split('\n\n')[0].split('\n') + const labels = testMetadata[1] + .split(',') + .slice(1) + .map((label) => stripQuotes(label)) + const bitWidths = testMetadata[2] + .split(',') + .slice(1) + .map((bw) => Number(stripQuotes(bw))) + + return { labels, bitWidths } + } + + const csvMetadata = csvFileData.split('\n\n\n')[0].split('\n')[1].split(',') + const csvData = csvFileData.split('\n\n\n')[1] + const jsonData = {} + + jsonData.title = csvMetadata[0] + jsonData.type = csvMetadata[1] + const inputCountCSV = Number(csvMetadata[2]) + const outputCountCSV = Number(csvMetadata[3]) + + jsonData.groups = [] + const { labels, bitWidths } = getBitWidthsCSV(csvData) + + const groups = csvData.split('\n\n').slice(1) + for (let group_i = 0; group_i < groups.length - 1; group_i++) { + const rows = groups[group_i].split('\n') + jsonData.groups[group_i] = { + label: rows[0], + n: rows.length - 1, + inputs: [], + outputs: [], + } + + // Parse Inputs + for (let input_i = 0; input_i < inputCountCSV; input_i++) { + const thisInput = { + label: labels[input_i], + bitWidth: bitWidths[input_i], + values: [], + } + for (let case_i = 1; case_i < rows.length; case_i++) + thisInput.values.push( + stripQuotes(rows[case_i].split(',')[input_i + 1]) + ) + + jsonData.groups[group_i].inputs.push(thisInput) + } + + // Parse Outputs + for ( + let output_i = inputCountCSV; + output_i < inputCountCSV + outputCountCSV; + output_i++ + ) { + const thisOutput = { + label: labels[output_i], + bitWidth: bitWidths[output_i], + values: [], + } + for (let case_i = 1; case_i < rows.length; case_i++) { + thisOutput.values.push( + stripQuotes(rows[case_i].split(',')[output_i + 1]) + ) + } + + jsonData.groups[group_i].outputs.push(thisOutput) + } + } + + return JSON.stringify(jsonData) +} + +/* Helper function to download generated file */ +function download(filename, text) { + var element = document.createElement('a') + element.setAttribute( + 'href', + `data:text/plain;charset=utf-8,${encodeURIComponent(text)}` + ) + element.setAttribute('download', filename) + + element.style.display = 'none' + document.body.appendChild(element) + + element.click() + + document.body.removeChild(element) +} + +/** + * Called when Save is clicked. If opened in popup, sends message to parent window + * to attach test to the testbench. + */ +function saveData() { + const testData = parse() + + if (creatorMode === CREATORMODE.SIMULATOR_POPUP) { + const postData = { scopeID: circuitScopeID, testData } + window.opener.postMessage( + { type: 'testData', data: JSON.stringify(postData) }, + '*' + ) + window.close() + } +} + +/* Loads data from JSON string into the table */ +function loadData(dataJSON) { + const data = JSON.parse(dataJSON) + if (data.title) $('#test-title-label').text(data.title) + changeTestMode() + changeTestMode(data.type) + for (let group_i = 0; group_i < data.groups.length; group_i++) { + const group = data.groups[group_i] + addGroup(group.label) + for (let case_i = 0; case_i < group.inputs[0].values.length; case_i++) { + addCase(group_i) + } + } + + // Add input values + for (let input_i = 0; input_i < data.groups[0].inputs.length; input_i++) { + const input = data.groups[0].inputs[input_i] + const values = data.groups.map((group) => group.inputs[input_i].values) + + addInput(input.label, input.bitWidth, values) + } + + // Add output values + for ( + let output_i = 0; + output_i < data.groups[0].outputs.length; + output_i++ + ) { + const output = data.groups[0].outputs[output_i] + const values = data.groups.map( + (group) => group.outputs[output_i].values + ) + + addOutput(output.label, output.bitWidth, values) + } +} + +/** + * Loads result from JSON string into the testbench creator UI + */ +function loadResult(dataJSON) { + const data = JSON.parse(dataJSON) + if (data.title) $('#test-title-label').text(data.title) + changeTestMode() + changeTestMode(data.type) + for (let group_i = 0; group_i < data.groups.length; group_i++) { + const group = data.groups[group_i] + addGroup(group.label) + for (let case_i = 0; case_i < group.inputs[0].values.length; case_i++) { + addCase(group_i) + } + } + + // Add input values + for (let input_i = 0; input_i < data.groups[0].inputs.length; input_i++) { + const input = data.groups[0].inputs[input_i] + const values = data.groups.map((group) => group.inputs[input_i].values) + + addInput(input.label, input.bitWidth, values) + } + + // Add output values + for ( + let output_i = 0; + output_i < data.groups[0].outputs.length; + output_i++ + ) { + const output = data.groups[0].outputs[output_i] + const values = data.groups.map( + (group) => group.outputs[output_i].values + ) + const results = data.groups.map( + (group) => group.outputs[output_i].results + ) + const expectedOutputs = [] + const actualOutputs = [] + + for (let group_i = 0; group_i < values.length; group_i++) { + const groupExpectedOuts = [] + const groupActualOuts = [] + for (let val_i = 0; val_i < values[group_i].length; val_i++) { + groupExpectedOuts.push(values[group_i][val_i]) + groupActualOuts.push(results[group_i][val_i]) + } + + expectedOutputs.push(groupExpectedOuts) + actualOutputs.push(groupActualOuts) + } + addOutput( + `${output.label}`, + output.bitWidth, + expectedOutputs, + true, + actualOutputs + ) + } +} + +/** + * Makes the UI read only for displaying results + */ +function readOnlyUI() { + makeContentUneditable() + makeUnsortable() + $('.lower-button, .table-button, .tb-minus').hide() + $('.tablink').attr('disabled', 'disabled') + $('.tablink').removeClass('tablink-no-override') + $('.data-group-info').text('') +} + +function makeContentUneditable() { + $('body') + .find('td, th, span, h3, div') + .each(function () { + $(this).attr('contenteditable', 'false') + }) +} + +function makeSortable() { + const helper = function (e, ui) { + const helperE = ui.clone() + helperE.children().each(function (child_i) { + $(this).width(ui.children().eq(child_i).width()) + }) + + return helperE + } + + function makePlaceholder(e, ui) { + ui.placeholder.children().each(function () { + $(this).css('border', '0px') + }) + } + + /* + Sortable hack: To allow sorting inside empty tables, the tables should have some height. + But it is not possible to give tables height without having rows, so we add a tbody. + tbody gives the table height but messes up all the other things. So we only keep tbody + if the table has no rows, and once table gets rows, we remove that tbody + */ + function removeTbody(e, ui) { + $(e.target).find('tbody').remove() + } + + function createTbody(e, ui) { + if ($(e.target).find('tr, tbody').length === 0) { + $(e.target).append('') + } + } + + $('.data-group table').sortable({ + handle: '.tb-handle', + helper, + start: makePlaceholder, + placeholder: 'clone', + connectWith: 'table', + receive: removeTbody, // For sortable hack + remove: createTbody, // For sortable hack + items: 'tr', + revert: 50, + scroll: false, + }) +} + +function makeUnsortable() { + $('.data-group table').sortable({ disabled: true }) +} + +function escapeHtml(unsafe) { + return unsafe + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, ''') +} + +// Making HTML called functions global + +window.addGroup = addGroup +window.deleteGroup = deleteGroup +window.addCase = addCase +window.deleteCase = deleteCase +window.addInput = addInput +window.deleteInput = deleteInput +window.addOutput = addOutput +window.deleteOutput = deleteOutput +window.parse = parse +window.saveData = saveData +window.changeTestMode = changeTestMode +window.exportAsCSV = exportAsCSV +window.importFromCSV = importFromCSV +window.csv2json = csv2json +window.clickUpload = clickUpload diff --git a/v0/src/simulator/src/testbench.js b/v0/src/simulator/src/testbench.js new file mode 100644 index 00000000..d6f8a070 --- /dev/null +++ b/v0/src/simulator/src/testbench.js @@ -0,0 +1,1140 @@ +/** + * This file contains all functions related the the testbench + * Contains the the testbench engine and UI modules + */ + +import { scheduleBackup } from './data/backupCircuit' +import { changeClockEnable } from './sequential' +import { play } from './engine' +import Scope from './circuit' +import { showMessage, escapeHtml } from './utils' +import { confirmOption } from '#/components/helpers/confirmComponent/ConfirmComponent.vue' + +/** + * @typedef {number} RunContext + */ +const CONTEXT = { + CONTEXT_SIMULATOR: 0, + CONTEXT_ASSIGNMENTS: 1, +} + +const VALIDATION_ERRORS = { + NOTPRESENT: 0, // Element is not present in the circuit + WRONGBITWIDTH: 1, // Element is present but has incorrect bitwidth + DUPLICATE_ID_DATA: 2, // Duplicate identifiers in test data + DUPLICATE_ID_SCOPE: 3, // Duplicate identifiers in scope + NO_RST: 4, // Sequential circuit but no reset(RST) in scope +} + +const TESTBENCH_CREATOR_PATH = '/testbench' + +// Do we have any other function to do this? +// Utility function. Converts decimal number to binary string +function dec2bin(dec, bitWidth = undefined) { + if (dec === undefined) return 'X' + const bin = (dec >>> 0).toString(2) + if (!bitWidth) return bin + + return '0'.repeat(bitWidth - bin.length) + bin +} + +/** + * Class to store all data related to the testbench and functions to use it + * @param {Object} data - Javascript object of the test data + * @param {number=} currentGroup - Current group index in the test + * @param {number=} currentCase - Current case index in the group + */ +export class TestbenchData { + constructor(data, currentGroup = 0, currentCase = 0) { + this.currentCase = currentCase + this.currentGroup = currentGroup + this.testData = data + } + + /** + * Checks whether given case-group pair exists in the test + */ + isCaseValid() { + if ( + this.currentGroup >= this.data.groups.length || + this.currentGroup < 0 + ) + return false + const caseCount = + this.testData.groups[this.currentGroup].inputs[0].values.length + if (this.currentCase >= caseCount || this.currentCase < 0) return false + + return true + } + + /** + * Validate and set case and group in the test + * @param {number} groupIndex - Group index to set + * @param {number} caseIndex - Case index to set + */ + setCase(groupIndex, caseIndex) { + const newCase = new TestbenchData(this.testData, groupIndex, caseIndex) + if (newCase.isCaseValid()) { + this.currentGroup = groupIndex + this.currentCase = caseIndex + return true + } + + return false + } + + /** + * Validate and go to the next group. + * Skips over empty groups + */ + groupNext() { + const newCase = new TestbenchData(this.testData, this.currentGroup, 0) + const groupCount = newCase.testData.groups.length + let caseCount = + newCase.testData.groups[newCase.currentGroup].inputs[0].values + .length + + while (caseCount === 0 || this.currentGroup === newCase.currentGroup) { + newCase.currentGroup++ + if (newCase.currentGroup >= groupCount) return false + caseCount = + newCase.testData.groups[newCase.currentGroup].inputs[0].values + .length + } + + this.currentGroup = newCase.currentGroup + this.currentCase = newCase.currentCase + return true + } + + /** + * Validate and go to the previous group. + * Skips over empty groups + */ + groupPrev() { + const newCase = new TestbenchData(this.testData, this.currentGroup, 0) + const groupCount = newCase.testData.groups.length + let caseCount = + newCase.testData.groups[newCase.currentGroup].inputs[0].values + .length + + while (caseCount === 0 || this.currentGroup === newCase.currentGroup) { + newCase.currentGroup-- + if (newCase.currentGroup < 0) return false + caseCount = + newCase.testData.groups[newCase.currentGroup].inputs[0].values + .length + } + + this.currentGroup = newCase.currentGroup + this.currentCase = newCase.currentCase + return true + } + + /** + * Validate and go to the next case + */ + caseNext() { + const caseCount = + this.testData.groups[this.currentGroup].inputs[0].values.length + if (this.currentCase >= caseCount - 1) return this.groupNext() + this.currentCase++ + return true + } + + /** + * Validate and go to the previous case + */ + casePrev() { + if (this.currentCase <= 0) { + if (!this.groupPrev()) return false + const caseCount = + this.testData.groups[this.currentGroup].inputs[0].values.length + this.currentCase = caseCount - 1 + return true + } + + this.currentCase-- + return true + } + + /** + * Finds and switches to the first non empty group to start the test from + */ + goToFirstValidGroup() { + const newCase = new TestbenchData(this.testData, 0, 0) + const caseCount = + newCase.testData.groups[this.currentGroup].inputs[0].values.length + + // If the first group is not empty, do nothing + if (caseCount > 0) return true + + // Otherwise go next until non empty group + const validExists = newCase.groupNext() + + // If all groups empty return false + if (!validExists) return false + + // else set case to the non empty group + this.currentGroup = newCase.currentGroup + this.currentCase = newCase.currentCase + return true + } +} + +/** + * UI Function + * Create prompt for the testbench UI when creator is opened + */ +function creatorOpenPrompt(creatorWindow) { + scheduleBackup() + const windowSVG = ` + + + + + ` + + const s = ` +
+
+ ${windowSVG} +
+

A browser pop-up is opened to create the test

+

Please save the test to open it here

+
+ ` + + $('#setTestbenchData').dialog({ + resizable: false, + width: 'auto', + buttons: [ + { + text: 'Close Pop-Up', + click() { + $(this).dialog('close') + creatorWindow.close() + }, + }, + ], + }) + + $('#setTestbenchData').empty() + $('#setTestbenchData').append(s) +} + +/** + * Interface function to run testbench. Called by testbench prompt on simulator or assignments + * @param {Object} data - Object containing Test Data + * @param {RunContext=} runContext - Whether simulator or Assignment called this function + * @param {Scope=} scope - the circuit + */ +export function runTestBench( + data, + scope = globalScope, + runContext = CONTEXT.CONTEXT_SIMULATOR +) { + const isValid = validate(data, scope) + if (!isValid.ok) { + showMessage( + 'Testbench: Some elements missing from circuit. Click Validate to know more' + ) + } + + if (runContext === CONTEXT.CONTEXT_SIMULATOR) { + const tempTestbenchData = new TestbenchData(data) + if (!tempTestbenchData.goToFirstValidGroup()) { + showMessage('Testbench: The test is empty') + return + } + + globalScope.testbenchData = tempTestbenchData + + updateTestbenchUI() + return + } + + if (runContext === CONTEXT.CONTEXT_ASSIGNMENTS) { + // Not implemented + } +} + +/** + * Updates the TestBench UI on the simulator with the current test attached + * If no test is attached then shows the 'No test attached' screen + * Called by runTestBench() when test is set, also called by UX/setupPanelListeners() + * whenever ux change requires this UI to update(such as clicking on a different circuit or + * loading a saved circuit) + */ +export function updateTestbenchUI() { + // Remove all listeners from buttons + $('.tb-dialog-button').off('click') + $('.tb-case-button').off('click') + + setupTestbenchUI() + if (globalScope.testbenchData != undefined) { + const { testbenchData } = globalScope + + // Initialize the UI + setUITableHeaders(testbenchData) + + // Add listeners to buttons + $('.tb-case-button#prev-case-btn').on( + 'click', + buttonListenerFunctions.previousCaseButton + ) + $('.tb-case-button#next-case-btn').on( + 'click', + buttonListenerFunctions.nextCaseButton + ) + $('.tb-case-button#prev-group-btn').on( + 'click', + buttonListenerFunctions.previousGroupButton + ) + $('.tb-case-button#next-group-btn').on( + 'click', + buttonListenerFunctions.nextGroupButton + ) + $('.tb-dialog-button#change-test-btn').on( + 'click', + buttonListenerFunctions.changeTestButton + ) + $('.tb-dialog-button#runall-btn').on( + 'click', + buttonListenerFunctions.runAllButton + ) + $('.tb-dialog-button#edit-test-btn').on( + 'click', + buttonListenerFunctions.editTestButton + ) + $('.tb-dialog-button#validate-btn').on( + 'click', + buttonListenerFunctions.validateButton + ) + $('.tb-dialog-button#remove-test-btn').on( + 'click', + buttonListenerFunctions.removeTestButton + ) + } + + // Add listener to attach test button + $('.tb-dialog-button#attach-test-btn').on( + 'click', + buttonListenerFunctions.attachTestButton + ) +} + +/** + * Defines all the functions called as event listeners for buttons on the UI + */ +const buttonListenerFunctions = { + previousCaseButton: () => { + const isValid = validate( + globalScope.testbenchData.testData, + globalScope + ) + if (!isValid.ok) { + showMessage( + 'Testbench: Some elements missing from circuit. Click Validate to know more' + ) + return + } + globalScope.testbenchData.casePrev() + buttonListenerFunctions.computeCase() + }, + + nextCaseButton: () => { + const isValid = validate( + globalScope.testbenchData.testData, + globalScope + ) + if (!isValid.ok) { + showMessage( + 'Testbench: Some elements missing from circuit. Click Validate to know more' + ) + return + } + globalScope.testbenchData.caseNext() + buttonListenerFunctions.computeCase() + }, + + previousGroupButton: () => { + const isValid = validate( + globalScope.testbenchData.testData, + globalScope + ) + if (!isValid.ok) { + showMessage( + 'Testbench: Some elements missing from circuit. Click Validate to know more' + ) + return + } + globalScope.testbenchData.groupPrev() + buttonListenerFunctions.computeCase() + }, + + nextGroupButton: () => { + const isValid = validate( + globalScope.testbenchData.testData, + globalScope + ) + if (!isValid.ok) { + showMessage( + 'Testbench: Some elements missing from circuit. Click Validate to know more' + ) + return + } + globalScope.testbenchData.groupNext() + buttonListenerFunctions.computeCase() + }, + + changeTestButton: () => { + openCreator('create') + }, + + runAllButton: () => { + const isValid = validate( + globalScope.testbenchData.testData, + globalScope + ) + if (!isValid.ok) { + showMessage( + 'Testbench: Some elements missing from circuit. Click Validate to know more' + ) + return + } + const results = runAll(globalScope.testbenchData.testData, globalScope) + const { passed } = results.summary + const { total } = results.summary + const resultString = JSON.stringify(results.detailed) + $('#runall-summary').text(`${passed} out of ${total}`) + $('#runall-detailed-link').on('click', () => { + openCreator('result', resultString) + }) + $('.testbench-runall-label').css('display', 'table-cell') + $('.testbench-runall-label').delay(5000).fadeOut('slow') + }, + + editTestButton: () => { + const editDataString = JSON.stringify( + globalScope.testbenchData.testData + ) + openCreator('edit', editDataString) + }, + + validateButton: () => { + const isValid = validate( + globalScope.testbenchData.testData, + globalScope + ) + showValidationUI(isValid) + }, + + removeTestButton: async () => { + if ( + await confirmOption( + 'Are you sure you want to remove the test from the circuit?' + ) + ) { + globalScope.testbenchData = undefined + setupTestbenchUI() + } + }, + + attachTestButton: () => { + openCreator('create') + }, + + rerunTestButton: () => { + buttonListenerFunctions.computeCase() + }, + + computeCase: () => { + setUICurrentCase(globalScope.testbenchData) + const result = runSingleTest(globalScope.testbenchData, globalScope) + setUIResult(globalScope.testbenchData, result) + }, +} + +/** + * UI Function + * Checks whether test is attached to the scope and switches UI accordingly + */ +export function setupTestbenchUI() { + // Don't change UI if UI is minimized (because hide() and show() are recursive) + if ($('.testbench-manual-panel .minimize').css('display') === 'none') return + + if (globalScope.testbenchData === undefined) { + $('.tb-test-not-null').hide() + $('.tb-test-null').show() + return + } + + $('.tb-test-null').hide() + $('.tb-test-not-null').show() +} + +/** + * Run all the tests automatically. Called by runTestBench() + * @param {Object} data - Object containing Test Data + * @param {Scope=} scope - the circuit + */ +export function runAll(data, scope = globalScope) { + // Stop the clocks + // TestBench will now take over clock toggling + changeClockEnable(false) + + const { inputs, outputs, reset } = bindIO(data, scope) + let totalCases = 0 + let passedCases = 0 + + data.groups.forEach((group) => { + // for (const output of group.outputs) output.results = []; + group.outputs.forEach((output) => (output.results = [])) + for (let case_i = 0; case_i < group.n; case_i++) { + totalCases++ + // Set and propagate the inputs + setInputValues(inputs, group, case_i, scope) + // If sequential, trigger clock now + if (data.type === 'seq') tickClock(scope) + // Get output values + const caseResult = getOutputValues(data, outputs) + // Put the results in the data + + let casePassed = true // Tracks if current case passed or failed + + caseResult.forEach((_, outName) => { + // TODO: find() is not the best idea because of O(n) + const output = group.outputs.find( + (dataOutput) => dataOutput.label === outName + ) + output.results.push(caseResult.get(outName)) + + if (output.values[case_i] !== caseResult.get(outName)) + casePassed = false + }) + + // If current case passed, then increment passedCases + if (casePassed) passedCases++ + } + + // If sequential, trigger reset at the end of group (set) + if (data.type === 'seq') triggerReset(reset) + }) + + // Tests done, restart the clocks + changeClockEnable(true) + + // Return results + const results = {} + results.detailed = data + results.summary = { passed: passedCases, total: totalCases } + return results +} + +/** + * Runs single test + * @param {Object} data - Object containing Test Data + * @param {number} groupIndex - Index of the group to be tested + * @param {number} caseIndex - Index of the case inside the group + * @param {Scope} scope - The circuit + */ +function runSingleTest(testbenchData, scope) { + const data = testbenchData.testData + + let result + if (data.type === 'comb') { + result = runSingleCombinational(testbenchData, scope) + } else if (data.type === 'seq') { + result = runSingleSequential(testbenchData, scope) + } + + return result +} + +/** + * Runs single combinational test + * @param {Object} data - Object containing Test Data + * @param {number} groupIndex - Index of the group to be tested + * @param {number} caseIndex - Index of the case inside the group + * @param {Scope} scope - The circuit + */ +function runSingleCombinational(testbenchData, scope) { + const data = testbenchData.testData + const groupIndex = testbenchData.currentGroup + const caseIndex = testbenchData.currentCase + + const { inputs, outputs } = bindIO(data, scope) + const group = data.groups[groupIndex] + + // Stop the clocks + changeClockEnable(false) + + // Set input values according to the test + setInputValues(inputs, group, caseIndex, scope) + // Check output values + const result = getOutputValues(data, outputs) + // Restart the clocks + changeClockEnable(true) + return result +} + +/** + * Runs single sequential test and all tests above it in the group + * Used in MANUAL mode + * @param {Object} data - Object containing Test Data + * @param {number} groupIndex - Index of the group to be tested + * @param {number} caseIndex - Index of the case inside the group + * @param {Scope} scope - The circuit + */ +function runSingleSequential(testbenchData, scope) { + const data = testbenchData.testData + const groupIndex = testbenchData.currentGroup + const caseIndex = testbenchData.currentCase + + const { inputs, outputs, reset } = bindIO(data, scope) + const group = data.groups[groupIndex] + + // Stop the clocks + changeClockEnable(false) + + // Trigger reset + triggerReset(reset, scope) + + // Run the test and tests above in the same group + for (let case_i = 0; case_i <= caseIndex; case_i++) { + setInputValues(inputs, group, case_i, scope) + tickClock(scope) + } + + const result = getOutputValues(data, outputs) + + // Restart the clocks + changeClockEnable(true) + + return result +} + +/** + * Set and propogate the input values according to the testcase. + * Called by runSingle() and runAll() + * @param {Object} inputs - Object with keys as input names and values as inputs + * @param {Object} group - Test group + * @param {number} caseIndex - Index of the case in the group + * @param {Scope} scope - the circuit + */ +function setInputValues(inputs, group, caseIndex, scope) { + group.inputs.forEach((input) => { + inputs[input.label].state = parseInt(input.values[caseIndex], 2) + }) + + // Propagate inputs + play(scope) +} + +/** + * Gets Output values as a Map with keys as output name and value as output state + * @param {Object} outputs - Object with keys as output names and values as outputs + */ +function getOutputValues(data, outputs) { + const values = new Map() + + data.groups[0].outputs.forEach((dataOutput) => { + // Using node value because output state only changes on rendering + const resultValue = outputs[dataOutput.label].nodeList[0].value + const resultBW = outputs[dataOutput.label].nodeList[0].bitWidth + values.set(dataOutput.label, dec2bin(resultValue, resultBW)) + }) + + return values +} + +/** + * UI Function + * Shows validation UI + * @param {Object} validationErrors - Object with errors returned by validate() + */ +function showValidationUI(validationErrors) { + const checkSVG = ` + + + + ` + + let s = ` +
+
+ ${checkSVG} +
+ All good. No validation errors +
+ ` + + if (!validationErrors.ok) { + s = ` +
+

Please fix these errors to run tests

+ + + + + + ` + + validationErrors.invalids.forEach((vError) => { + s += ` + + + + + ` + }) + + s += '
IdentifierError
${vError.identifier}${vError.message}
' + } + + $('#testbenchValidate').dialog({ + resizable: false, + width: 'auto', + buttons: [ + { + text: 'Ok', + click() { + $(this).dialog('close') + }, + }, + { + text: 'Auto Fix', + click() { + const fixes = validationAutoFix(validationErrors) + showMessage(`Testbench: Auto fixed ${fixes} errors`) + $(this).dialog('close') + }, + }, + ], + }) + + $('#testbenchValidate').empty() + $('#testbenchValidate').append(s) +} + +/** + * Validate if all inputs and output elements are present with correct bitwidths + * @param {Object} data - Object containing Test Data + * @param {Scope} scope - the circuit + */ +function validate(data, scope) { + let invalids = [] + + // Check for duplicate identifiers + if (!checkDistinctIdentifiersData(data)) { + invalids.push({ + type: VALIDATION_ERRORS.DUPLICATE_ID_DATA, + identifier: '-', + message: 'Duplicate identifiers in test data', + }) + } + + if (!checkDistinctIdentifiersScope(scope)) { + invalids.push({ + type: VALIDATION_ERRORS.DUPLICATE_ID_SCOPE, + identifier: '-', + message: 'Duplicate identifiers in circuit', + }) + } + + // Don't do further checks if duplicates + if (invalids.length > 0) return { ok: false, invalids } + + // Validate inputs and outputs + const inputsValid = validateInputs(data, scope) + const outputsValid = validateOutputs(data, scope) + + invalids = inputsValid.ok ? invalids : invalids.concat(inputsValid.invalids) + invalids = outputsValid.ok + ? invalids + : invalids.concat(outputsValid.invalids) + + // Validate presence of reset if test is sequential + if (data.type === 'seq') { + const resetPresent = scope.Input.some( + (simulatorReset) => + simulatorReset.label === 'RST' && + simulatorReset.bitWidth === 1 && + simulatorReset.objectType === 'Input' + ) + + if (!resetPresent) { + invalids.push({ + type: VALIDATION_ERRORS.NO_RST, + identifier: 'RST', + message: 'Reset(RST) not present in circuit', + }) + } + } + + if (invalids.length > 0) return { ok: false, invalids } + return { ok: true } +} + +/** + * Autofix whatever is possible in validation errors. + * returns number of autofixed errors + * @param {Object} validationErrors - Object with errors returned by validate() + */ +function validationAutoFix(validationErrors) { + // Currently only autofixes bitwidths + let fixedErrors = 0 + // Return if no errors + if (validationErrors.ok) return fixedErrors + + const bitwidthErrors = validationErrors.invalids.filter( + (vError) => vError.type === VALIDATION_ERRORS.WRONGBITWIDTH + ) + + bitwidthErrors.forEach((bwError) => { + const { element, expectedBitWidth } = bwError.extraInfo + element.newBitWidth(expectedBitWidth) + fixedErrors++ + }) + + return fixedErrors +} + +/** + * Checks if all the labels in the test data are unique. Called by validate() + * @param {Object} data - Object containing Test Data + */ +function checkDistinctIdentifiersData(data) { + const inputIdentifiersData = data.groups[0].inputs.map( + (input) => input.label + ) + const outputIdentifiersData = data.groups[0].outputs.map( + (output) => output.label + ) + const identifiersData = inputIdentifiersData.concat(outputIdentifiersData) + + return new Set(identifiersData).size === identifiersData.length +} + +/** + * Checks if all the input/output labels in the scope are unique. Called by validate() + * TODO: Replace with identifiers + * @param {Scope} scope - the circuit + */ +function checkDistinctIdentifiersScope(scope) { + const inputIdentifiersScope = scope.Input.map((input) => input.label) + const outputIdentifiersScope = scope.Output.map((output) => output.label) + let identifiersScope = inputIdentifiersScope.concat(outputIdentifiersScope) + + // Remove identifiers which have not been set yet (ie. empty strings) + identifiersScope = identifiersScope.filter((identifer) => identifer != '') + + return new Set(identifiersScope).size === identifiersScope.length +} + +/** + * Validates presence and bitwidths of test inputs in the circuit. + * Called by validate() + * @param {Object} data - Object containing Test Data + * @param {Scope} scope - the circuit + */ +function validateInputs(data, scope) { + const invalids = [] + + data.groups[0].inputs.forEach((dataInput) => { + const matchInput = scope.Input.find( + (simulatorInput) => simulatorInput.label === dataInput.label + ) + + if (matchInput === undefined) { + invalids.push({ + type: VALIDATION_ERRORS.NOTPRESENT, + identifier: dataInput.label, + message: 'Input is not present in the circuit', + }) + } else if (matchInput.bitWidth !== dataInput.bitWidth) { + invalids.push({ + type: VALIDATION_ERRORS.WRONGBITWIDTH, + identifier: dataInput.label, + extraInfo: { + element: matchInput, + expectedBitWidth: dataInput.bitWidth, + }, + message: `Input bitwidths don't match in circuit and test (${matchInput.bitWidth} vs ${dataInput.bitWidth})`, + }) + } + }) + + if (invalids.length > 0) return { ok: false, invalids } + return { ok: true } +} + +/** + * Validates presence and bitwidths of test outputs in the circuit. + * Called by validate() + * @param {Object} data - Object containing Test Data + * @param {Scope} scope - the circuit + */ +function validateOutputs(data, scope) { + const invalids = [] + + data.groups[0].outputs.forEach((dataOutput) => { + const matchOutput = scope.Output.find( + (simulatorOutput) => simulatorOutput.label === dataOutput.label + ) + + if (matchOutput === undefined) { + invalids.push({ + type: VALIDATION_ERRORS.NOTPRESENT, + identifier: dataOutput.label, + message: 'Output is not present in the circuit', + }) + } else if (matchOutput.bitWidth !== dataOutput.bitWidth) { + invalids.push({ + type: VALIDATION_ERRORS.WRONGBITWIDTH, + identifier: dataOutput.label, + extraInfo: { + element: matchOutput, + expectedBitWidth: dataOutput.bitWidth, + }, + message: `Output bitwidths don't match in circuit and test (${matchOutput.bitWidth} vs ${dataOutput.bitWidth})`, + }) + } + }) + + if (invalids.length > 0) return { ok: false, invalids } + return { ok: true } +} + +/** + * Returns object of scope inputs and outputs keyed by their labels + * @param {Object} data - Object containing Test Data + * @param {Scope=} scope - the circuit + */ +function bindIO(data, scope) { + const inputs = {} + const outputs = {} + let reset + + data.groups[0].inputs.forEach((dataInput) => { + inputs[dataInput.label] = scope.Input.find( + (simulatorInput) => simulatorInput.label === dataInput.label + ) + }) + + data.groups[0].outputs.forEach((dataOutput) => { + outputs[dataOutput.label] = scope.Output.find( + (simulatorOutput) => simulatorOutput.label === dataOutput.label + ) + }) + + if (data.type === 'seq') { + reset = scope.Input.find( + (simulatorOutput) => simulatorOutput.label === 'RST' + ) + } + + return { inputs, outputs, reset } +} + +/** + * Ticks clock recursively one full cycle (Only used in testbench context) + * @param {Scope} scope - the circuit whose clock to be ticked + */ +function tickClock(scope) { + scope.clockTick() + play(scope) + scope.clockTick() + play(scope) +} + +/** + * Triggers reset (Only used in testbench context) + * @param {Input} reset - reset pin to be triggered + * @param {Scope} scope - the circuit + */ +function triggerReset(reset, scope) { + reset.state = 1 + play(scope) + reset.state = 0 + play(scope) +} + +/** + * UI Function + * Sets IO labels and bitwidths on UI table + * Called by simulatorRunTestbench() + * @param {Object} data - Object containing the test data + */ +function setUITableHeaders(testbenchData) { + const data = testbenchData.testData + const inputCount = data.groups[0].inputs.length + const outputCount = data.groups[0].outputs.length + + $('#tb-manual-table-inputs-head').attr('colspan', inputCount) + $('#tb-manual-table-outputs-head').attr('colspan', outputCount) + + $('.testbench-runall-label').css('display', 'none') + + $('.tb-data#data-title') + .children() + .eq(1) + .text(data.title || 'Untitled') + $('.tb-data#data-type') + .children() + .eq(1) + .text(data.type === 'comb' ? 'Combinational' : 'Sequential') + + $('#tb-manual-table-labels').html('LABELS') + $('#tb-manual-table-bitwidths').html('Bitwidth') + + data.groups[0].inputs.concat(data.groups[0].outputs).forEach((io) => { + const label = `${escapeHtml(io.label)}` + const bw = `${escapeHtml(io.bitWidth.toString())}` + $('#tb-manual-table-labels').append(label) + $('#tb-manual-table-bitwidths').append(bw) + }) + + setUICurrentCase(testbenchData) +} + +/** + * UI Function + * Set current test case data on the UI + * @param {Object} data - Object containing the test data + * @param {number} groupIndex - Index of the group of current case + * @param {number} caseIndex - Index of the case within the group + */ +function setUICurrentCase(testbenchData) { + const data = testbenchData.testData + const groupIndex = testbenchData.currentGroup + const caseIndex = testbenchData.currentCase + + const currCaseElement = $('#tb-manual-table-current-case') + currCaseElement.empty() + currCaseElement.append('Current Case') + $('#tb-manual-table-test-result').empty() + $('#tb-manual-table-test-result').append('Result') + + data.groups[groupIndex].inputs.forEach((input) => { + currCaseElement.append( + `${escapeHtml(input.values[caseIndex])}` + ) + }) + + data.groups[groupIndex].outputs.forEach((output) => { + currCaseElement.append( + `${escapeHtml(output.values[caseIndex])}` + ) + }) + + $('.testbench-manual-panel .group-label').text( + data.groups[groupIndex].label + ) + $('.testbench-manual-panel .case-label').text(caseIndex + 1) +} + +/** + * UI Function + * Set the current test case result on the UI + * @param {Object} data - Object containing the test data + * @param {Map} result - Map containing the output values (returned by getOutputValues()) + */ +function setUIResult(testbenchData, result) { + const data = testbenchData.testData + const groupIndex = testbenchData.currentGroup + const caseIndex = testbenchData.currentCase + const resultElement = $('#tb-manual-table-test-result') + let inputCount = data.groups[0].inputs.length + resultElement.empty() + resultElement.append('Result') + while (inputCount--) { + resultElement.append(' - ') + } + + for (const output of result.keys()) { + const resultValue = result.get(output) + const expectedValue = data.groups[groupIndex].outputs.find( + (dataOutput) => dataOutput.label === output + ).values[caseIndex] + const color = resultValue === expectedValue ? '#17FC12' : '#FF1616' + resultElement.append( + `${escapeHtml(resultValue)}` + ) + } +} + +/** + * Use this function to navigate to test creator. This function starts the storage listener + * so the test is loaded directly into the simulator + * @param {string} type - 'create', 'edit' or 'result' + * @param {String} dataString - data in JSON string to load in case of 'edit' and 'result' + */ +function openCreator(type, dataString) { + const popupHeight = 800 + const popupWidth = 1200 + const popupTop = (window.height - popupHeight) / 2 + const popupLeft = (window.width - popupWidth) / 2 + const POPUP_STYLE_STRING = `height=${popupHeight},width=${popupWidth},top=${popupTop},left=${popupLeft}` + let popUp + + /* Listener to catch testData from pop up and load it onto the testbench */ + const dataListener = (message) => { + if ( + message.origin !== window.origin || + message.data.type !== 'testData' + ) + return + + // Check if the current scope requested the creator pop up + const data = JSON.parse(message.data.data) + + // Unbind event listener + window.removeEventListener('message', dataListener) + + // If scopeID does not match, do nothing and return + if (data.scopeID != globalScope.id) return + + // Load test data onto the scope + runTestBench(data.testData, globalScope, CONTEXT.CONTEXT_SIMULATOR) + + // Close the 'Pop up is open' dialog + $('#setTestbenchData').dialog('close') + } + + if (type === 'create') { + const url = `${TESTBENCH_CREATOR_PATH}?scopeID=${globalScope.id}&popUp=true` + popUp = window.open(url, 'popupWindow', POPUP_STYLE_STRING) + creatorOpenPrompt(popUp) + window.addEventListener('message', dataListener) + } + + if (type === 'edit') { + const url = `${TESTBENCH_CREATOR_PATH}?scopeID=${globalScope.id}&data=${dataString}&popUp=true` + popUp = window.open(url, 'popupWindow', POPUP_STYLE_STRING) + creatorOpenPrompt(popUp) + window.addEventListener('message', dataListener) + } + + if (type === 'result') { + const url = `${TESTBENCH_CREATOR_PATH}?scopeID=${globalScope.id}&result=${dataString}&popUp=true` + popUp = window.open(url, 'popupWindow', POPUP_STYLE_STRING) + } + + // Check if popup was closed (in case it was closed by window's X button), + // then close 'popup open' dialog + if (popUp && type !== 'result') { + const checkPopUp = setInterval(() => { + if (popUp.closed) { + // Close the dialog if it's open + if ($('#setTestbenchData').dialog('isOpen')) + $('#setTestbenchData').dialog('close') + + // Remove the event listener that listens for data from popup + window.removeEventListener('message', dataListener) + clearInterval(checkPopUp) + } + }, 1000) + } +} diff --git a/v0/src/simulator/src/testbench/ForceGate.js b/v0/src/simulator/src/testbench/ForceGate.js new file mode 100644 index 00000000..5da82c6f --- /dev/null +++ b/v0/src/simulator/src/testbench/ForceGate.js @@ -0,0 +1,92 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { fillText4 } from '../canvasApi' +/** + * @class + * ForceGate + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category testbench + */ +export default class ForceGate extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + this.setDimensions(20, 10) + this.objectType = 'ForceGate' + this.scope.ForceGate.push(this) + this.inp1 = new Node(-20, 0, 0, this) + this.inp2 = new Node(0, 0, 0, this) + this.output1 = new Node(20, 0, 1, this) + } + + /** + * @memberof ForceGate + * Checks if the element is resolvable + * @return {boolean} + */ + isResolvable() { + return this.inp1.value !== undefined || this.inp2.value !== undefined + } + + /** + * @memberof ForceGate + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + output1: findNode(this.output1), + inp1: findNode(this.inp1), + inp2: findNode(this.inp2), + }, + } + return data + } + + /** + * @memberof ForceGate + * resolve output values based on inputData + */ + resolve() { + if (this.inp2.value !== undefined) { + this.output1.value = this.inp2.value + } else { + this.output1.value = this.inp1.value + } + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof ForceGate + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + const xx = this.x + const yy = this.y + + ctx.beginPath() + ctx.fillStyle = 'Black' + ctx.textAlign = 'center' + + fillText4(ctx, 'I', -10, 0, xx, yy, this.direction, 10) + fillText4(ctx, 'O', 10, 0, xx, yy, this.direction, 10) + ctx.fill() + } +} + +/** + * @memberof ForceGate + * Help Tip + * @type {string} + * @category testbench + */ +ForceGate.prototype.tooltipText = 'Force Gate ToolTip : ForceGate Selected.' +ForceGate.prototype.objectType = 'ForceGate' diff --git a/v0/src/simulator/src/testbench/testbenchInput.js b/v0/src/simulator/src/testbench/testbenchInput.js new file mode 100644 index 00000000..bdf7452b --- /dev/null +++ b/v0/src/simulator/src/testbench/testbenchInput.js @@ -0,0 +1,351 @@ +import CircuitElement from '../circuitElement' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText } from '../canvasApi' +import Node, { findNode } from '../node' +import plotArea from '../plotArea' + +/** + * TestBench Input has a node for it's clock input. + * this.testData - the data of all test cases. + * Every testbench has a uniq identifier. + * @class + * @extends CircuitElement + * @param {number} x - the x coord of TB + * @param {number} y - the y coord of TB + * @param {Scope=} scope - the circuit on which TB is drawn + * @param {string} dir - direction + * @param {string} identifier - id to identify tests + * @param {JSON=} testData - input, output and number of tests + * @category testbench + */ +export default class TB_Input extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + identifier, + testData + ) { + super(x, y, scope, dir, 1) + this.objectType = 'TB_Input' + this.scope.TB_Input.push(this) + this.setIdentifier(identifier || 'Test1') + this.testData = testData || { inputs: [], outputs: [], n: 0 } + this.clockInp = new Node(0, 20, 0, this, 1) + this.outputs = [] + this.running = false // if tests are undergo + this.iteration = 0 + this.setup() + } + + /** + * @memberof TB_Input + * Takes input when double clicked. For help on generation of input refer to TB_Input.helplink + */ + dblclick() { + this.testData = JSON.parse(prompt('Enter TestBench Json')) + this.setup() + } + + setDimensions() { + this.leftDimensionX = 0 + this.rightDimensionX = 120 + + this.upDimensionY = 0 + this.downDimensionY = 40 + this.testData.inputs.length * 20 + } + + /** + * @memberof TB_Input + * setups the Test by parsing through the testbench data. + */ + setup() { + this.iteration = 0 + this.running = false + this.nodeList.clean(this.clockInp) + this.deleteNodes() + this.nodeList = [] + this.nodeList.push(this.clockInp) + this.testData = this.testData || { inputs: [], outputs: [], n: 0 } + // this.clockInp = new Node(0,20, 0,this,1); + + this.setDimensions() + + this.prevClockState = 0 + this.outputs = [] + + for (var i = 0; i < this.testData.inputs.length; i++) { + this.outputs.push( + new Node( + this.rightDimensionX, + 30 + i * 20, + 1, + this, + this.testData.inputs[i].bitWidth, + this.testData.inputs[i].label + ) + ) + } + + for (var i = 0; i < this.scope.TB_Output.length; i++) { + if (this.scope.TB_Output[i].identifier == this.identifier) { + this.scope.TB_Output[i].setup() + } + } + } + + /** + * @memberof TB_Input + * toggles state by simply negating this.running so that test cases stop + */ + toggleState() { + this.running = !this.running + this.prevClockState = 0 + } + + /** + * @memberof TB_Input + * function to run from test case 0 again + */ + resetIterations() { + this.iteration = 0 + this.prevClockState = 0 + } + + /** + * @memberof TB_Input + * function to resolve the testbench input adds + */ + resolve() { + if (this.clockInp.value != this.prevClockState) { + this.prevClockState = this.clockInp.value + if (this.clockInp.value == 1 && this.running) { + if (this.iteration < this.testData.n) { + this.iteration++ + } else { + this.running = false + } + } + } + if (this.running && this.iteration) { + for (var i = 0; i < this.testData.inputs.length; i++) { + this.outputs[i].value = parseInt( + this.testData.inputs[i].values[this.iteration - 1], + 2 + ) + simulationArea.simulationQueue.add(this.outputs[i]) + } + } + } + + /** + * @memberof TB_Input + * was a function to plot values incase any flag used as output to this element + */ + setPlotValue() { + return + var time = plotArea.stopWatch.ElapsedMilliseconds + if ( + this.plotValues.length && + this.plotValues[this.plotValues.length - 1][0] == time + ) { + this.plotValues.pop() + } + + if (this.plotValues.length == 0) { + this.plotValues.push([time, this.inp1.value]) + return + } + + if (this.plotValues[this.plotValues.length - 1][1] == this.inp1.value) { + return + } + this.plotValues.push([time, this.inp1.value]) + } + + customSave() { + var data = { + constructorParamaters: [ + this.direction, + this.identifier, + this.testData, + ], + nodes: { + outputs: this.outputs.map(findNode), + clockInp: findNode(this.clockInp), + }, + } + return data + } + + /** + * This function is used to set a uniq identifier to every testbench + * @memberof TB_Input + */ + setIdentifier(id = '') { + if (id.length == 0 || id == this.identifier) return + + for (var i = 0; i < this.scope.TB_Output.length; i++) { + this.scope.TB_Output[i].checkPairing() + } + + for (var i = 0; i < this.scope.TB_Output.length; i++) { + if (this.scope.TB_Output[i].identifier == this.identifier) { + this.scope.TB_Output[i].identifier = id + } + } + + this.identifier = id + + this.checkPaired() + } + + /** + * Check if there is a output tester paired with input TB. + * @memberof TB_Input + */ + checkPaired() { + for (var i = 0; i < this.scope.TB_Output.length; i++) { + if (this.scope.TB_Output[i].identifier == this.identifier) { + this.scope.TB_Output[i].checkPairing() + } + } + } + + delete() { + super.delete() + this.checkPaired() + } + + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = 'grey' + ctx.fillStyle = '#fcfcfc' + ctx.lineWidth = correctWidth(1) + var xx = this.x + var yy = this.y + + var xRotate = 0 + var yRotate = 0 + if (this.direction == 'LEFT') { + xRotate = 0 + yRotate = 0 + } else if (this.direction == 'RIGHT') { + xRotate = 120 - this.xSize + yRotate = 0 + } else if (this.direction == 'UP') { + xRotate = 60 - this.xSize / 2 + yRotate = -20 + } else { + xRotate = 60 - this.xSize / 2 + yRotate = 20 + } + + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = 'black' + fillText( + ctx, + `${this.identifier} [INPUT]`, + xx + this.rightDimensionX / 2, + yy + 14, + 10 + ) + + fillText( + ctx, + ['Not Running', 'Running'][+this.running], + xx + this.rightDimensionX / 2, + yy + 14 + 10 + 20 * this.testData.inputs.length, + 10 + ) + fillText( + ctx, + `Case: ${this.iteration}`, + xx + this.rightDimensionX / 2, + yy + 14 + 20 + 20 * this.testData.inputs.length, + 10 + ) + // fillText(ctx, "Case: "+this.iteration, xx , yy + 20+14, 10); + ctx.fill() + + ctx.font = '30px Raleway' + ctx.textAlign = 'right' + ctx.fillStyle = 'blue' + ctx.beginPath() + for (var i = 0; i < this.testData.inputs.length; i++) { + // ctx.beginPath(); + fillText( + ctx, + this.testData.inputs[i].label, + this.rightDimensionX - 5 + xx, + 30 + i * 20 + yy + 4, + 10 + ) + } + + ctx.fill() + if (this.running && this.iteration) { + ctx.font = '30px Raleway' + ctx.textAlign = 'left' + ctx.fillStyle = 'blue' + ctx.beginPath() + for (var i = 0; i < this.testData.inputs.length; i++) { + fillText( + ctx, + this.testData.inputs[i].values[this.iteration - 1], + 5 + xx, + 30 + i * 20 + yy + 4, + 10 + ) + } + + ctx.fill() + } + + ctx.beginPath() + ctx.strokeStyle = 'rgba(0,0,0,1)' + ctx.lineWidth = correctWidth(3) + var xx = this.x + var yy = this.y + // rect(ctx, xx - 20, yy - 20, 40, 40); + moveTo(ctx, 0, 15, xx, yy, this.direction) + lineTo(ctx, 5, 20, xx, yy, this.direction) + lineTo(ctx, 0, 25, xx, yy, this.direction) + + ctx.stroke() + } +} + +TB_Input.prototype.tooltipText = 'Test Bench Input Selected' + +/** + * @memberof TB_Input + * different algo for drawing center elements + * @category testbench + */ +TB_Input.prototype.centerElement = true + +TB_Input.prototype.helplink = 'https://docs.circuitverse.org/#/chapter7/3testcircuits' + +TB_Input.prototype.mutableProperties = { + identifier: { + name: 'TestBench Name:', + type: 'text', + maxlength: '10', + func: 'setIdentifier', + }, + iteration: { + name: 'Reset Iterations', + type: 'button', + func: 'resetIterations', + }, + toggleState: { + name: 'Toggle State', + type: 'button', + func: 'toggleState', + }, +} +TB_Input.prototype.objectType = 'TB_Input' diff --git a/v0/src/simulator/src/testbench/testbenchOutput.js b/v0/src/simulator/src/testbench/testbenchOutput.js new file mode 100644 index 00000000..865ec258 --- /dev/null +++ b/v0/src/simulator/src/testbench/testbenchOutput.js @@ -0,0 +1,324 @@ +import CircuitElement from '../circuitElement' +import simulationArea from '../simulationArea' +import { correctWidth, fillText } from '../canvasApi' +import Node, { findNode } from '../node' + +// helper function to convert decimal to binary +function dec2bin(dec, bitWidth = undefined) { + // only for positive nos + var bin = dec.toString(2) + if (bitWidth == undefined) return bin + return '0'.repeat(bitWidth - bin.length) + bin +} + +/** + * TestBench Output has a node for it's input which is + * compared to desired output according tp testData of + * input TB Every TB_output has a uniq identifier matching + * it's TB_Input + * @class + * @extends CircuitElement + * @param {number} x - the x coord of TB + * @param {number} y - the y coord of TB + * @param {Scope=} scope - the circuit on which TB is drawn + * @param {string} dir - direction + * @param {string} identifier - id to identify tests + * @category testbench + */ + +export default class TB_Output extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', identifier) { + super(x, y, scope, dir, 1) + // this.setDimensions(60,20); + this.objectType = 'TB_Output' + this.scope.TB_Output.push(this) + + // this.xSize=10; + + // this.plotValues = []; + // this.inp1 = new Node(0, 0, 0, this); + // this.inp1 = new Node(100, 100, 0, this); + this.setIdentifier(identifier || 'Test1') + this.inputs = [] + this.testBenchInput = undefined + + this.setup() + } + + // TB_Output.prototype.dblclick=function(){ + // this.testData=JSON.parse(prompt("Enter TestBench Json")); + // this.setup(); + // } + setDimensions() { + this.leftDimensionX = 0 + this.rightDimensionX = 160 + this.upDimensionY = 0 + this.downDimensionY = 40 + if (this.testBenchInput) { + this.downDimensionY = + 40 + this.testBenchInput.testData.outputs.length * 20 + } + } + + setup() { + // this.iteration = 0; + // this.running = false; + // this.nodeList.clean(this.clockInp); + this.deleteNodes() // deletes all nodes whenever setup is called. + this.nodeList = [] + + this.inputs = [] + this.testBenchInput = undefined + // find it's pair input + for (var i = 0; i < this.scope.TB_Input.length; i++) { + if (this.scope.TB_Input[i].identifier == this.identifier) { + this.testBenchInput = this.scope.TB_Input[i] + break + } + } + + this.setDimensions() + + if (this.testBenchInput) { + for ( + var i = 0; + i < this.testBenchInput.testData.outputs.length; + i++ + ) { + this.inputs.push( + new Node( + 0, + 30 + i * 20, + NODE_INPUT, + this, + this.testBenchInput.testData.outputs[i].bitWidth, + this.testBenchInput.testData.outputs[i].label + ) + ) + } + } + } + + customSave() { + var data = { + constructorParamaters: [this.direction, this.identifier], + nodes: { + inputs: this.inputs.map(findNode), + }, + } + return data + } + + /** + * @memberof TB_output + * set identifier for this testbench + */ + setIdentifier(id = '') { + if (id.length == 0 || id == this.identifier) return + this.identifier = id + this.setup() + } + + /** + * @memberof TB_output + * Function to check if the input for this TB exist + */ + checkPairing(id = '') { + if (this.testBenchInput) { + if ( + this.testBenchInput.deleted || + this.testBenchInput.identifier != this.identifier + ) { + this.setup() + } + } else { + this.setup() + } + } + + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = 'grey' + ctx.fillStyle = '#fcfcfc' + ctx.lineWidth = correctWidth(1) + var xx = this.x + var yy = this.y + + var xRotate = 0 + var yRotate = 0 + if (this.direction == 'LEFT') { + xRotate = 0 + yRotate = 0 + } else if (this.direction == 'RIGHT') { + xRotate = 120 - this.xSize + yRotate = 0 + } else if (this.direction == 'UP') { + xRotate = 60 - this.xSize / 2 + yRotate = -20 + } else { + xRotate = 60 - this.xSize / 2 + yRotate = 20 + } + + // rect2(ctx, -120+xRotate+this.xSize, -20+yRotate, 120-this.xSize, 40, xx, yy, "RIGHT"); + // if ((this.hover && !simulationArea.shiftDown) || simulationArea.lastSelected == this || simulationArea.multipleObjectSelections.contains(this)) + // ctx.fillStyle = "rgba(255, 255, 32,0.8)"; + // ctx.fill(); + // ctx.stroke(); + // + // ctx.font = "14px Raleway"; + // this.xOff = ctx.measureText(this.identifier).width; + // ctx.beginPath(); + // rect2(ctx, -105+xRotate+this.xSize, -11+yRotate,this.xOff + 10, 23, xx, yy, "RIGHT"); + // ctx.fillStyle = "#eee" + // ctx.strokeStyle = "#ccc"; + // ctx.fill(); + // ctx.stroke(); + // + + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = 'black' + fillText( + ctx, + `${this.identifier} [OUTPUT]`, + xx + this.rightDimensionX / 2, + yy + 14, + 10 + ) + + // fillText(ctx, ["Not Running","Running"][+this.running], xx + this.rightDimensionX/ 2 , yy + 14 + 10 + 20*this.testData.inputs.length, 10); + // fillText(ctx, "Case: "+(this.iteration), xx + this.rightDimensionX/ 2 , yy + 14 + 20 + 20*this.testData.inputs.length, 10); + fillText( + ctx, + ['Unpaired', 'Paired'][+(this.testBenchInput != undefined)], + xx + this.rightDimensionX / 2, + yy + this.downDimensionY - 5, + 10 + ) + ctx.fill() + + if (this.testBenchInput) { + ctx.beginPath() + ctx.font = '30px Raleway' + ctx.textAlign = 'left' + ctx.fillStyle = 'blue' + for ( + var i = 0; + i < this.testBenchInput.testData.outputs.length; + i++ + ) { + // ctx.beginPath(); + fillText( + ctx, + this.testBenchInput.testData.outputs[i].label, + 5 + xx, + 30 + i * 20 + yy + 4, + 10 + ) + } + ctx.fill() + + if (this.testBenchInput.running && this.testBenchInput.iteration) { + ctx.beginPath() + ctx.font = '30px Raleway' + ctx.textAlign = 'right' + ctx.fillStyle = 'blue' + ctx.beginPath() + for ( + var i = 0; + i < this.testBenchInput.testData.outputs.length; + i++ + ) { + fillText( + ctx, + this.testBenchInput.testData.outputs[i].values[ + this.testBenchInput.iteration - 1 + ], + xx + this.rightDimensionX - 5, + 30 + i * 20 + yy + 4, + 10 + ) + } + + ctx.fill() + } + + if (this.testBenchInput.running && this.testBenchInput.iteration) { + ctx.beginPath() + ctx.font = '30px Raleway' + ctx.textAlign = 'center' + ctx.fillStyle = 'blue' + + for ( + var i = 0; + i < this.testBenchInput.testData.outputs.length; + i++ + ) { + if (this.inputs[i].value != undefined) { + ctx.beginPath() + if ( + this.testBenchInput.testData.outputs[i].values[ + this.testBenchInput.iteration - 1 + ] == 'x' || + parseInt( + this.testBenchInput.testData.outputs[i].values[ + this.testBenchInput.iteration - 1 + ], + 2 + ) == this.inputs[i].value + ) { + ctx.fillStyle = 'green' + } else { + ctx.fillStyle = 'red' + } + fillText( + ctx, + dec2bin( + this.inputs[i].value, + this.inputs[i].bitWidth + ), + xx + this.rightDimensionX / 2, + 30 + i * 20 + yy + 4, + 10 + ) + ctx.fill() + } else { + ctx.beginPath() + if ( + this.testBenchInput.testData.outputs[i].values[ + this.testBenchInput.iteration - 1 + ] == 'x' + ) { + ctx.fillStyle = 'green' + } else { + ctx.fillStyle = 'red' + } + fillText( + ctx, + 'X', + xx + this.rightDimensionX / 2, + 30 + i * 20 + yy + 4, + 10 + ) + ctx.fill() + } + } + } + } + } +} + +TB_Output.prototype.tooltipText = 'Test Bench Output Selected' +TB_Output.prototype.helplink = 'https://docs.circuitverse.org/#/chapter7/3testcircuits' +TB_Output.prototype.centerElement = true +TB_Output.prototype.mutableProperties = { + identifier: { + name: 'TestBench Name:', + type: 'text', + maxlength: '10', + func: 'setIdentifier', + }, +} +TB_Output.prototype.objectType = 'TB_Output' diff --git a/v0/src/simulator/src/themer/customThemeAbstraction.js b/v0/src/simulator/src/themer/customThemeAbstraction.js new file mode 100644 index 00000000..399134ea --- /dev/null +++ b/v0/src/simulator/src/themer/customThemeAbstraction.js @@ -0,0 +1,44 @@ +/** + * CreateAbstraction + * @param {*} themeOptions + * @returns an Object + */ +export const CreateAbstraction = (themeOptions) => { + return { + Navbar: { + color: themeOptions['--bg-navbar'], + description: 'navbar background', + ref: ['--bg-navbar'], + }, + Primary: { + color: themeOptions['--primary'], + description: 'modals background', + ref: ['--primary'], + }, + Secondary: { + color: themeOptions['--bg-tabs'], + description: 'tabBar background', + ref: ['--bg-tabs'], + }, + Canvas: { + color: themeOptions['--canvas-fill'], + description: 'canvas background', + ref: ['--canvas-fill'], + }, + Stroke: { + color: themeOptions['--canvas-stroke'], + description: 'canvas grid color', + ref: ['--canvas-stroke'], + }, + Text: { + color: themeOptions['--text-lite'], + description: 'text color', + ref: ['--text-lite', '--text-panel', '--text-dark'], + }, + Borders: { + color: themeOptions['--br-secondary'], + description: 'borders color', + ref: ['--br-secondary'], + }, + } +} diff --git a/v0/src/simulator/src/themer/customThemer.js b/v0/src/simulator/src/themer/customThemer.js new file mode 100644 index 00000000..51a7e0b2 --- /dev/null +++ b/v0/src/simulator/src/themer/customThemer.js @@ -0,0 +1,154 @@ +// /* eslint-disable import/prefer-default-export */ +// /* eslint-disable import/no-cycle */ +// import { dots } from '../canvasApi' +// import themeOptions from './themes' +// import { updateThemeForStyle } from './themer' +// import { CreateAbstraction } from './customThemeAbstraction' + +// /** +// * +// */ +// var customTheme = CreateAbstraction(themeOptions['Custom Theme']) + +// const updateBG = () => dots(true, false, true) + +// /** +// * Generates Custom theme card HTML +// * return Html Element Theme card html (properties_container) +// */ +// // const getCustomThemeCard = () => { +// // var propertiesContainer = document.createElement('form') +// // const keys = Object.keys(customTheme) +// // keys.forEach((key) => { +// // const property = document.createElement('div') +// // const newPropertyLabel = document.createElement('label') +// // newPropertyLabel.textContent = `${key} (${customTheme[key].description})` +// // newPropertyLabel.setAttribute('for', key) +// // const newPropertyInput = document.createElement('input') +// // newPropertyInput.setAttribute('type', 'color') +// // newPropertyInput.setAttribute('name', key) +// // newPropertyInput.setAttribute('value', customTheme[key].color) +// // newPropertyInput.classList.add('customColorInput') +// // property.append(newPropertyLabel) +// // property.append(newPropertyInput) +// // propertiesContainer.append(property) +// // }) +// // const downloadAnchor = document.createElement('a') +// // downloadAnchor.setAttribute('id', 'downloadThemeFile') +// // downloadAnchor.setAttribute('style', 'display:none') +// // propertiesContainer.appendChild(downloadAnchor) +// // return propertiesContainer +// // } + +// /** +// * Create Custom Color Themes Dialog +// */ +// // export const CustomColorThemes = () => { +// // $('#CustomColorThemesDialog').empty() +// // $('#CustomColorThemesDialog').append(getCustomThemeCard()) +// // $('#CustomColorThemesDialog').dialog({ +// // resizable: false, +// // close() { +// // themeOptions['Custom Theme'] = +// // JSON.parse(localStorage.getItem('Custom Theme')) || +// // themeOptions['Default Theme'] // hack for closing dialog box without saving +// // // Rollback to previous theme +// // updateThemeForStyle(localStorage.getItem('theme')) +// // updateBG() +// // }, +// // buttons: [ +// // { +// // text: 'Apply Theme', +// // click() { +// // // update theme to Custom Theme +// // localStorage.setItem('theme', 'Custom Theme') +// // // add Custom theme to custom theme object +// // localStorage.setItem( +// // 'Custom Theme', +// // JSON.stringify(themeOptions['Custom Theme']) +// // ) +// // $('.set').removeClass('set') +// // $('.selected').addClass('set') +// // $(this).dialog('close') +// // }, +// // }, +// // { +// // text: 'Import Theme', +// // click() { +// // $('#importThemeFile').click() +// // }, +// // }, +// // { +// // text: 'Export Theme', +// // click() { +// // const dlAnchorElem = +// // document.getElementById('downloadThemeFile') +// // dlAnchorElem.setAttribute( +// // 'href', +// // `data:text/json;charset=utf-8,${encodeURIComponent( +// // JSON.stringify(themeOptions['Custom Theme']) +// // )}` +// // ) +// // dlAnchorElem.setAttribute('download', 'CV_CustomTheme.json') +// // dlAnchorElem.click() +// // }, +// // }, +// // ], +// // }) + +// // $('#CustomColorThemesDialog').focus() + +// // /** +// // * To preview the changes +// // */ +// // // function setColorEvent() { +// // // $('.customColorInput').on('input', (e) => { +// // // customTheme[e.target.name].color = e.target.value +// // // customTheme[e.target.name].ref.forEach((property) => { +// // // themeOptions['Custom Theme'][property] = e.target.value +// // // }) +// // // updateThemeForStyle('Custom Theme') +// // // updateBG() +// // // }) +// // // } +// // // setColorEvent() + +// // // hack for updating current theme to the saved custom theme +// // setTimeout(() => { +// // updateThemeForStyle('Custom Theme') +// // updateBG() +// // }, 50) + +// // /** +// // * Read JSON file and +// // * set Custom theme to the Content of the JSON file +// // * */ +// // // function receivedText(e) { +// // // const lines = JSON.parse(e.target.result) +// // // customTheme = CreateAbstraction(lines) +// // // themeOptions['Custom Theme'] = lines +// // // // preview theme +// // // updateThemeForStyle('Custom Theme') +// // // updateBG() +// // // // update colors in dialog box +// // // $('#CustomColorThemesDialog').empty() +// // // $('#CustomColorThemesDialog').append(getCustomThemeCard()) +// // // setColorEvent() +// // // } + +// // /** +// // * Add listener for file input +// // * Read imported JSON file +// // */ +// // // $('#importThemeFile').on('change', (event) => { +// // // var File = event.target.files[0] +// // // if (File !== null && File.name.split('.')[1] === 'json') { +// // // var fr = new FileReader() +// // // fr.onload = receivedText +// // // fr.readAsText(File) +// // // $('#importThemeFile').val('') +// // // } else { +// // // alert('File Not Supported !') +// // // } +// // // }) +// // } diff --git a/v0/src/simulator/src/themer/themeCardSvg.js b/v0/src/simulator/src/themer/themeCardSvg.js new file mode 100644 index 00000000..5e1776cb --- /dev/null +++ b/v0/src/simulator/src/themer/themeCardSvg.js @@ -0,0 +1,102 @@ +export default ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +` diff --git a/v0/src/simulator/src/themer/themer.js b/v0/src/simulator/src/themer/themer.js new file mode 100644 index 00000000..2c61865e --- /dev/null +++ b/v0/src/simulator/src/themer/themer.js @@ -0,0 +1,223 @@ +import { dots } from '../canvasApi' +import themeOptions from './themes' +import themeCardSvg from './themeCardSvg' +import { SimulatorStore } from '#/store/SimulatorStore/SimulatorStore' + +/** + * Extracts canvas theme colors from CSS-Variables and returns a JSON Object + * @returns {object} + */ +const getCanvasColors = () => { + let colors = {} + colors['hover_select'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--hover-and-sel') + colors['fill'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--fill') + colors['mini_fill'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--mini-map') + colors['mini_stroke'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--mini-map-stroke') + colors['stroke'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--stroke') + colors['stroke_alt'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--secondary-stroke') + colors['input_text'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--input-text') + colors['color_wire_draw'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--wire-draw') + colors['color_wire_con'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--wire-cnt') + colors['color_wire_pow'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--wire-pow') + colors['color_wire_sel'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--wire-sel') + colors['color_wire_lose'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--wire-lose') + colors['color_wire'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--wire-norm') + colors['text'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--text') + colors['node'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--node') + colors['node_norm'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--node-norm') + colors['splitter'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--splitter') + colors['out_rect'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--output-rect') + colors['canvas_stroke'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--canvas-stroke') + colors['canvas_fill'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--canvas-fill') + return colors +} + +/** + * Common canvas theme color object, used for rendering canvas elements + */ +export let colors = getCanvasColors() + +/** + * Updates theme + * 1) Sets CSS Variables for UI elements + * 2) Sets color variable for Canvas elements + */ +export function updateThemeForStyle(themeName) { + const selectedTheme = themeOptions[themeName] + if (selectedTheme === undefined) return + const html = document.getElementsByTagName('html')[0] + Object.keys(selectedTheme).forEach((property, i) => { + html.style.setProperty(property, selectedTheme[property]) + }) + colors = getCanvasColors() +} + +/** + * Theme Preview Card SVG + * Sets the SVG colors according to theme + * @param {string} themeName Name of theme + * @returns {SVG} + */ +export const getThemeCardSvg = (themeName) => { + const colors = themeOptions[themeName] + let svgIcon = $(themeCardSvg) + + // Dynamically set the colors according to the theme + $('.svgText', svgIcon).attr('fill', colors['--text-panel']) + + $('.svgNav', svgIcon).attr('fill', colors['--bg-tab']) + $('.svgNav', svgIcon).attr('stroke', colors['--br-primary']) + + $('.svgGridBG', svgIcon).attr('fill', colors['--canvas-fill']) + $('.svgGrid', svgIcon).attr('fill', colors['--canvas-stroke']) + + $('.svgPanel', svgIcon).attr('fill', colors['--primary']) + $('.svgPanel', svgIcon).attr('stroke', colors['--br-primary']) + + $('.svgChev', svgIcon).attr('stroke', colors['--br-secondary']) + + $('.svgHeader', svgIcon).attr('fill', colors['--primary']) + let temp = svgIcon.prop('outerHTML') + return svgIcon.prop('outerHTML') +} + +/** + * Generates theme card HTML + * @param {string} themeName Name of theme + * @param {boolean} selected Flag variable for currently selected theme + * @return {string} Theme card html + */ +export const getThemeCard = (themeName, selected) => { + if (themeName === 'Custom Theme') return '
' + let themeId = themeName.replace(' ', '') + let selectedClass = selected ? 'selected set' : '' + // themeSel is the hit area + return ` +
+
+ ${getThemeCardSvg(themeName)} + + + + +
+ ` +} + +/** + * Create Color Themes Dialog + */ +export const colorThemes = () => { + const simulatorStore = SimulatorStore() + simulatorStore.dialogBox.theme_dialog = true + + // const selectedTheme = localStorage.getItem('theme') + // $('#colorThemesDialog').empty() + // const themes = Object.keys(themeOptions) + // themes.forEach((theme) => { + // if (theme === selectedTheme) { + // $('#colorThemesDialog').append(getThemeCard(theme, true)) + // } else { + // $('#colorThemesDialog').append(getThemeCard(theme, false)) + // } + // }) + + // $('.selected label').trigger('click') + // $('#colorThemesDialog').dialog({ + // resizable: false, + // close() { + // // Rollback to previous theme + // updateThemeForStyle(localStorage.getItem('theme')) + // updateBG() + // }, + // buttons: [ + // { + // text: 'Apply Theme', + // click() { + // // check if any theme is selected or not + // if ($('.selected label').text()) { + // localStorage.removeItem('Custom Theme') + // localStorage.setItem( + // 'theme', + // $('.selected label').text() + // ) + // } + // $('.set').removeClass('set') + // $('.selected').addClass('set') + // $(this).dialog('close') + // }, + // }, + // { + // text: 'Custom Theme', + // click() { + // CustomColorThemes() + // $(this).dialog('close') + // }, + // }, + // ], + // }) + + $('#colorThemesDialog').focus() + $('.ui-dialog[aria-describedby="colorThemesDialog"]').on('click', () => + $('#colorThemesDialog').focus() + ) //hack for losing focus + + $('.themeSel').on('mousedown', (e) => { + e.preventDefault() + $('.selected').removeClass('selected') + let themeCard = $(e.target.parentElement) + themeCard.addClass('selected') + // Extract radio button + var radioButton = themeCard.find('input[type=radio]') + radioButton.trigger('click') // Mark as selected + updateThemeForStyle(themeCard.find('label').text()) // Extract theme name and set + updateBG() + }) +} + +export const updateBG = () => dots(true, false, true) +;(() => { + if (!localStorage.getItem('theme')) + localStorage.setItem('theme', 'Default Theme') + updateThemeForStyle(localStorage.getItem('theme')) +})() diff --git a/v0/src/simulator/src/themer/themes.js b/v0/src/simulator/src/themer/themes.js new file mode 100644 index 00000000..d4f8caa1 --- /dev/null +++ b/v0/src/simulator/src/themer/themes.js @@ -0,0 +1,382 @@ +export default { + 'Default Theme': { + '--text-navbar--alt': '#000', + '--br-secondary': '#7d7d7d', + '--br-circuit-cur': '#fff', + '--br-circuit': '#fff', + '--cus-radio_label': '#656565', + '--primary': '#454545', + '--text-lite': '#fff', + '--text-dark': '#000', + '--text-panel': 'white', + '--bg-navbar': '#454545', + '--qp-br-tl': '#333333', + '--qp-br-rd': '#535353', + '--qp-box-shadow-1': '#3b3b3b', + '--qp-box-shadow-2': '#4f4f4f', + '--bg-circuit': '#ddd', + '--br-circuit': '#454545', + '--br-primary': '#fff', + '--bg-primary-moz': '#454545e6', + '--bg-primary-chr': '#454545b3', + '--bg-tabs': '#8b8b8b', + '--bg-icons': '#7d7d7d', + '--bg-text': '#cacaca', + '--bg-secondary': '#bbbbbb', + '--canvas-stroke': '#eee', + '--canvas-fill': 'white', + '--context-text': 'white', + '--bg-toggle-btn-primary': '#42b983', + '--primary-btn-hov': '#3ca877', + '--btn-danger': '#dc5656', + '--btn-danger-darken': '#b03662', + '--disable': '#6c8b93', + '--cus-btn-hov--bg': '#ddd', + '--cus-btn-hov-text': '#000', + '--node': 'green', + '--stroke': 'black', + '--fill': 'white', + '--hover-and-sel': 'rgba(255, 255, 32, 0.8)', + '--wire-draw': 'black', + '--wire-cnt': 'green', + '--wire-pow': 'lightgreen', + '--wire-sel': 'blue', + '--wire-lose': 'red', + '--mini-map': 'green', + '--mini-map-stroke': 'darkgreen', + '--input-text': 'green', + '--secondary-stroke': 'red', + '--text': 'black', + '--wire-norm': 'black', + '--node-norm': 'green', + '--splitter': 'black', + '--output-rect': 'blue', + '--table-head-dark': '#3d3d3d', + }, + 'Night Sky': { + '--text-navbar--alt': '#fff', + '--br-secondary': '#665627', + '--cus-radio_label': '#0F111A', + '--primary': '#0F111A', //header bg, panels bg + '--text-lite': '#FFF', //normal state text + '--text-dark': 'white', //text state on hover, on drop down menu , context menu + '--text-panel': 'white', + '--bg-navbar': '#0F111A', + '--br-circuit': '#0F111A', //panel border, tabbar circuit border + '--br-primary': '#665627', //panel border, tabbar circuit border + '--br-circuit-cur': '#cccccc', + '--bg-circuit': '#bdc2ca', + '--bg-primary-moz': '#0f111ae6', //dialog bg + '--bg-primary-chr': '#0f111ab3', //dialog bg + '--bg-tabs': '#727d8d', //tabs bar primary bg, + '--bg-icons': '#4d647a', //ce icon bg + '--bg-text': '#727d8d', //drop down, content menu, text bg on hover + '--bg-secondary': '#536c84', //border color input button, + '--canvas-fill': '#1B2C33', //canvas bg + '--canvas-stroke': '#6A7980', //canvas stroke + '--context-text': 'white', + '--bg-toggle-btn-primary': '#48a69d', + '--primary-btn-hov': '#3f9189', + '--btn-danger': '#c33c6c', + '--btn-danger-darken': '#b03662', + '--qp-br-tl': '#282d46', //more ligthen than qp box shadow 1 + '--qp-br-rd': '#1d2132', + '--qp-box-shadow-1': '#1d2132', //lil lighten base + '--qp-box-shadow-2': '#0a0b11', //lil darken base + '--cus-btn-hov--bg': '#48a69d', + '--cus-btn-hov-text': '#fff', + '--node': '#285963', + '--stroke': '#35aea9', + '--fill': '#DEFFFE', + '--hover-and-sel': '#E3B924', + '--wire-draw': '#77878C', + '--wire-cnt': '#3B7F58', + '--wire-pow': '#75FFB0', + '--wire-sel': '#208CC9', + '--wire-lose': '#BF0426', + '--mini-map': '#3B7F58', + '--mini-map-stroke': '#607F6E', + '--input-text': '#3B7F58', + '--output-rect': '#0487D9', + '--secondary-stroke': '#BF0426', + '--text': '#E9FBF8', + '--wire-norm': '#277F7C', + '--node-norm': '#FFC231', + '--splitter': '#0284A8', + '--disable': '#4F74B0', + '--table-head-dark': '#000000', + }, + 'Lite-born Spring': { + '--text-navbar--alt': '#000', + '--br-secondary': '#6B6B6B', + '--cus-radio_label': '#6B6B6B', + '--primary': '#EAEAEB', //header bg + '--text-dark': '#6B6B6B', //normal state text + '--text-lite': 'white', //text state on hover, on drop down menu , context menu + '--text-panel': '#6B6B6B', + '--bg-navbar': '#6b6b6b', + '--qp-br-tl': '#969696', //more ligthen than qp box shadow 1 + '--qp-br-rd': '#545454', + '--qp-box-shadow-1': '#747474', //lil lighten base .. top left shadow + '--qp-box-shadow-2': '#5f5f5f', //lil darken base //down right shadow + // "--bg-tabs": "#EAEAEB", //tabs bar primary bg, + '--bg-tabs': '#A4A4A4', //tabs bar primary bg, + '--br-circuit-cur': '#42B983', + '--bg-circuit': '#D7D7D7', + '--br-circuit': '#42B983', + '--br-primary': '#42B983', //panel border, tabbar circuit border + '--context-text-hov': '#6B6B6B', + '--context-text': 'white', + '--bg-primary-moz': 'rgba(107, 107, 107, 0.904)', //dialog bg, navbar dropwdown //.9 opacity of nav + '--bg-primary-chr': 'rgba(107, 107, 107, 0.704)', //dialog bg navbar dropwdown // .7 opacity of nav + '--bg-icons': '#DDDDDD', //ce icon bg + '--bg-text': '#ddd', //drop down, content menu, text bg on hover + '--bg-secondary': '#6B6B6B', //border color input button, + '--bg-toggle-btn-primary': '#42B983', + '--primary-btn-hov': '#66C89C', + '--btn-danger': '#BF2424', + '--btn-danger-darken': '#BF414C', + '--cus-btn-hov--bg': '#42B983', + '--cus-btn-hov-text': '#fff', + '--canvas-fill': 'white', //canvas bg + '--canvas-stroke': '#BABABA', //canvas stroke + '--node': '#42B983', + '--stroke': '#6B6B6B', + '--fill': '#EAEAEB', + '--hover-and-sel': '#FFE99B', //yellow + '--wire-draw': '#6B6B6B', //black + '--wire-cnt': '#42B983', // + '--wire-pow': '#52E539', + '--wire-sel': '#0FB2F2', + '--wire-lose': '#F10530', + '--mini-map': '#42B983', + '--mini-map-stroke': '#0FB2F2', + '--input-text': '#42B983', + '--output-rect': '#0487D9', + '--secondary-stroke': '#F10530', + '--text': '#454545', + '--wire-norm': '#006839', + '--node-norm': '#FFC231', + '--splitter': '#00B462', + '--disable': '#656565', + '--table-head-dark': '#ffffff', + }, + 'G&W': { + '--text-navbar--alt': '#000', + '--br-secondary': '#6B6B6B', + '--cus-radio_label': '#6B6B6B', + '--primary': '#EAEAEB', //header bg + '--text-dark': '#6B6B6B', //normal state text + '--text-lite': 'white', //text state on hover, on drop down menu , context menu + '--text-panel': '#656565', + '--bg-navbar': '#6b6b6b', + '--qp-br-tl': '#969696', //more ligthen than qp box shadow 1 + '--qp-br-rd': '#545454', + '--qp-box-shadow-1': '#747474', //lil lighten base .. top left shadow + '--qp-box-shadow-2': '#5f5f5f', //lil darken base //down right shadow + // "--bg-tabs": "#EAEAEB", //tabs bar primary bg, + '--bg-tabs': '#A4A4A4', //tabs bar primary bg, + '--br-circuit-cur': '#6b6b6b', + '--bg-circuit': '#D7D7D7', + '--br-circuit': '#6b6b6b', + '--br-primary': '#6B6B6B', //panel border, tabbar circuit border + '--context-text-hov': '#6B6B6B', + '--context-text': 'white', + '--bg-primary-moz': 'rgba(107, 107, 107, 0.904)', //dialog bg, navbar dropwdown //.9 opacity of nav + '--bg-primary-chr': 'rgba(107, 107, 107, 0.704)', //dialog bg navbar dropwdown // .7 opacity of nav + '--bg-icons': '#DDDDDD', //ce icon bg + '--bg-text': '#ddd', //drop down, content menu, text bg on hover + '--bg-secondary': '#6B6B6B', //border color input button, + '--bg-toggle-btn-primary': '#3ac8a4', + '--primary-btn-hov': '#71D7BD', + '--btn-danger': '#fc8771', + '--btn-danger-darken': '#FDB2A4', + '--cus-btn-hov--bg': '#3ac8a4', + '--cus-btn-hov-text': '#fff', + '--canvas-fill': 'white', //canvas bg + '--canvas-stroke': '#BABABA', //canvas stroke + '--node': '#42B983', + '--stroke': '#6B6B6B', + '--fill': '#EAEAEB', + '--hover-and-sel': '#FFE99B', //yellow + '--wire-draw': '#6B6B6B', //black + '--wire-cnt': '#42B983', // + '--wire-pow': '#52E539', + '--wire-sel': '#0FB2F2', + '--wire-lose': '#F10530', + '--mini-map': '#42B983', + '--mini-map-stroke': '#0FB2F2', + '--input-text': '#42B983', + '--output-rect': '#0487D9', + '--secondary-stroke': '#F10530', + '--text': '#454545', + '--wire-norm': '#006839', + '--node-norm': '#FFC231', + '--splitter': '#00B462', + '--disable': '#656565', + '--table-head-dark': '#ffffff', + }, + 'High Contrast': { + '--text-navbar--alt': '#000', + '--br-secondary': '#F38518', + '--cus-radio_label': 'black', + '--primary': 'black', //header bg + '--text-dark': 'black', //normal state text + '--text-lite': 'white', //text state on hover, on drop down menu , context menu + '--text-panel': 'white', + '--bg-navbar': 'black', + '--qp-br-tl': '#F38518', //more ligthen than qp box shadow 1 + '--qp-br-rd': '#F38518', + '--qp-box-shadow-1': '#0D0D0D', //lil lighten base .. top left shadow + '--qp-box-shadow-2': '#0D0D0D', //lil darken base //down right shadow + '--bg-tabs': '#616161', //tabs bar primary bg, + '--text-circuit': 'black', + '--br-circuit-cur': '#F38518', + '--bg-circuit': '#B6B6B6', + '--br-circuit': '#F38518', + '--br-primary': '#F38518', //panel border, tabbar circuit border + '--context-text-hov': 'black', + '--context-text': 'white', + '--bg-primary-moz': 'rgba(0, 0, 0, 0.904)', //dialog bg, navbar dropwdown //.9 opacity of nav + '--bg-primary-chr': 'rgba(0, 0, 0, 0.704)', //dialog bg navbar dropwdown // .7 opacity of nav + '--bg-icons': '#262626', //ce icon bg + '--bg-text': '#ddd', //drop down, content menu, text bg on hover + '--bg-secondary': '#6B6B6B', //border color input button, + '--bg-toggle-btn-primary': '#009599', + '--primary-btn-hov': '#00b1b6', + '--btn-danger': '#E45605', + '--btn-danger-darken': '#fa792f', + '--cus-btn-hov--bg': '#009599', + '--cus-btn-hov-text': '#fff', + '--canvas-fill': 'black', //canvas bg + '--canvas-stroke': '#9ad5e9', //canvas stroke + '--node': '#26a841', + '--stroke': '#626262', + '--fill': '#d4d4d4', + '--hover-and-sel': '#ffdf6c', //yellow + '--wire-draw': '#909090', //black + '--wire-cnt': '#3bb15b', // + '--wire-pow': '#3ac53c', + '--wire-sel': '#049ffb', + '--wire-lose': '#f42f0b', + '--mini-map': '#1c2427', + '--mini-map-stroke': '#000', + '--input-text': '#42B983', + '--output-rect': '#005682', + '--secondary-stroke': '#f7081e', + '--text': '#fff', + '--wire-norm': '#00b965', + '--node-norm': '#F38518', + '--splitter': '#21de5a', + '--disable': '#262626', + '--table-head-dark': '#000000', + }, + 'Color Blind': { + '--text-navbar--alt': '#000', + '--br-secondary': '#e2dad1', + '--cus-radio_label': '#2e2b21', + '--primary': '#2e2b21', //header bg + '--text-dark': 'black', //normal state text + '--text-lite': 'white', //text state on hover, on drop down menu , context menu + '--text-panel': 'white', + '--bg-navbar': '#2e2b21', + '--qp-br-tl': '#716950', //more ligthen than qp box shadow 1 + '--qp-br-rd': '#6c654d', + '--qp-box-shadow-1': '#4f4a38', //lil lighten base .. top left shadow + '--qp-box-shadow-2': '#302d23', //lil darken base //down right shadow + '--bg-tabs': '#9a9a9a', //tabs bar primary bg, + '--text-circuit': 'black', + '--br-circuit-cur': '#e2dad1', + '--bg-circuit': '#d6d6d6', + '--br-circuit': '#e2dad1', + '--br-primary': '#e2dad1', //panel border, tabbar circuit border + '--context-text-hov': 'black', + '--context-text': 'white', + '--bg-primary-moz': 'rgba(46, 43, 33, 1)', //dialog bg, navbar dropwdown //.9 opacity of nav + '--bg-primary-chr': 'rgba(46, 43, 33, 1)', //dialog bg navbar dropwdown // .7 opacity of nav + '--bg-icons': '#9c7762', //ce icon bg + '--bg-text': '#ddd', //drop down, content menu, text bg on hover + '--bg-secondary': '#6B6B6B', //border color input button, + '--bg-toggle-btn-primary': '#bfaac1', + '--primary-btn-hov': '#ccbbcd', + '--btn-danger': '#b66e43', + '--btn-danger-darken': '#ba7144', + '--cus-btn-hov--bg': '#b66e43', + '--cus-btn-hov-text': '#fff', + '--canvas-fill': '#fff', //canvas bg + '--canvas-stroke': '#8d88ad', //canvas stroke + '--node': '#c59434', + '--stroke': '#342a1f', + '--fill': '#e0dcd3', + '--hover-and-sel': '#f4d4d4', //yellow + '--wire-draw': '#4c4c4c', //black + '--wire-cnt': '#908eb9', // + '--wire-pow': '#b3b1cf', + '--wire-sel': '#a7b8f8', + '--wire-lose': '#f42f0b', + '--mini-map': '#4b4636', + '--mini-map-stroke': '#000', + '--input-text': '#756d54', + '--output-rect': '#092c48', + '--secondary-stroke': '#cdb1ad', + '--text': '#000', + '--wire-norm': '#7f7cae', + '--node-norm': '#c59434', + '--splitter': '#836222', + '--disable': '#956c6a', + '--table-head-dark': '#2e2b21', + }, + 'Custom Theme': JSON.parse(localStorage.getItem('Custom Theme')) || { + '--text-navbar--alt': '#000', + '--br-secondary': '#7d7d7d', + '--br-circuit-cur': '#ffffff', + '--br-circuit': '#ffffff', + '--cus-radio_label': '#656565', + '--primary': '#454545', + '--text-lite': '#ffffff', + '--text-dark': '#000', + '--text-panel': '#ffffff', + '--bg-navbar': '#454545', + '--qp-br-tl': '#333333', + '--qp-br-rd': '#535353', + '--qp-box-shadow-1': '#3b3b3b', + '--qp-box-shadow-2': '#4f4f4f', + '--bg-circuit': '#ddd', + '--br-circuit': '#454545', + '--br-primary': '#ffffff', + '--bg-primary-moz': '#454545e6', + '--bg-primary-chr': '#454545b3', + '--bg-tabs': '#8b8b8b', + '--bg-icons': '#7d7d7d', + '--bg-text': '#cacaca', + '--bg-secondary': '#bbbbbb', + '--canvas-stroke': '#eee', + '--canvas-fill': '#ffffff', + '--context-text': '#ffffff', + '--bg-toggle-btn-primary': '#42b983', + '--primary-btn-hov': '#3ca877', + '--btn-danger': '#dc5656', + '--btn-danger-darken': '#b03662', + '--disable': '#6c8b93', + '--cus-btn-hov--bg': '#ddd', + '--cus-btn-hov-text': '#000', + '--node': '#008000', + '--stroke': '#000', + '--fill': '#ffffff', + '--hover-and-sel': '#ffff20cc', + '--wire-draw': '#000', + '--wire-cnt': '#008000', + '--wire-pow': '#90ee90', + '--wire-sel': '#0000ff', + '--wire-lose': '#ff0000', + '--mini-map': '#008000', + '--mini-map-stroke': '#006400', + '--input-text': '#008000', + '--secondary-stroke': '#ff0000', + '--text': '#000', + '--wire-norm': '#000', + '--node-norm': '#008000', + '--splitter': '#000', + '--output-rect': '#0000ff', + }, +} diff --git a/v0/src/simulator/src/tutorials.js b/v0/src/simulator/src/tutorials.js new file mode 100644 index 00000000..a1f10d67 --- /dev/null +++ b/v0/src/simulator/src/tutorials.js @@ -0,0 +1,143 @@ +import Driver from 'driver.js' + +export const tour = [ + { + element: '#guide_1', + className: 'guide_1', + popover: { + className: '', + title: 'Circuit Elements panel', + description: + 'This is where you can find all the circuit elements that are offered to build amazing circuits.', + position: 'right', + offset: 160, + }, + }, + { + element: '.guide_2', + popover: { + title: 'Properties Panel', + description: + 'This panel lets you change element properties as they are selected. When no elements are selected, the panel displays project properties.', + position: 'left', + offset: 200, + }, + }, + { + element: '.quick-btn', + popover: { + title: 'Quick Access Panel', + description: + 'This movable panel offers to perform some actions like Save Online, Open, Download quickly. Hover over the icons and see for yourself', + position: 'bottom', + // offset: 750, + }, + }, + // { + // element: '.forum-tab', + // popover: { + // className: "", + // title: 'Forum Tab', + // description: "The forums can help you report issues & bugs, feature requests, and discussing about circuits with the community!", + // position: 'right', + // // offset: -25, + // }, + // }, + { + element: '#tabsBar', + popover: { + title: 'Circuit Tabs', + description: + 'This section displays all the circuits you have in your project. You can easily add and delete circuits.', + position: 'bottom', + offset: 250, + }, + }, + { + element: '.timing-diagram-panel', + popover: { + title: 'Timing Diagram Panel (Waveform)', + description: + 'This panel displays the waveform created by circuits and can be used for resolving race conditions and debugging circuits.', + position: 'bottom', + offset: 0, + }, + }, + + // { + // element: '#delCirGuide', + // popover: { + // title: 'Delete sub-circuit button', + // description: "You can make delete sub-circuits by pressing the cross *Note that main circuit cannot be deleted.", + // position: 'right', + // // offset: 250, + // }, + // }, + { + element: '.report-sidebar a', + popover: { + className: 'bug-guide', + title: 'Report System', + description: + 'You can report any issues/bugs you face through this issue reporting button there and then quickly.', + position: 'left', + offset: -105, + }, + }, + { + element: '.tour-help', + popover: { + className: 'tourHelpStep', + title: 'Restart tutorial anytime', + description: + 'You can restart this tutorial anytime by clicking on "Tutorial Guide" under this dropdown.', + position: 'right', + offset: 0, + }, + }, +] + +// Not used currently +export const tutorialWrapper = () => { + const panelHighlight = new Driver() + document.querySelector('.panelHeader').addEventListener('click', (e) => { + if (localStorage.tutorials === 'next') { + panelHighlight.highlight({ + element: '#guide_1', + showButtons: false, + popover: { + title: 'Here are the elements', + description: + 'Select any element by clicking on it & then click anywhere on the grid to place the element.', + position: 'right', + offset: + e.target.nextElementSibling.offsetHeight + + e.target.offsetTop - + 45, + }, + }) + localStorage.setItem('tutorials', 'done') + } + }, { + once: true, + }) + document.querySelector('.icon').addEventListener('click', () => { + panelHighlight.reset(true) + }) +} + +const animatedTourDriver = new Driver({ + animate: true, + opacity: 0.8, + padding: 5, + showButtons: true, +}) + +export function showTourGuide() { + document.querySelector('.draggable-panel .maximize').click(); + animatedTourDriver.defineSteps(tour) + animatedTourDriver.start() + localStorage.setItem('tutorials_tour_done', true) +} + +export default showTourGuide diff --git a/v0/src/simulator/src/utils.js b/v0/src/simulator/src/utils.js new file mode 100644 index 00000000..9d6a32b9 --- /dev/null +++ b/v0/src/simulator/src/utils.js @@ -0,0 +1,277 @@ +import simulationArea from './simulationArea' +import { + scheduleUpdate, + play, + updateCanvasSet, + errorDetectedSet, + errorDetectedGet, +} from './engine' +import { layoutModeGet } from './layoutMode' +import plotArea from './plotArea' +import { SimulatorStore } from '#/store/SimulatorStore/SimulatorStore' + +window.globalScope = undefined +window.lightMode = false // To be deprecated +window.projectId = undefined +window.id = undefined +window.loading = false // Flag - all assets are loaded + +var prevErrorMessage // Global variable for error messages +var prevShowMessage // Global variable for error messages +export function generateId() { + var id = '' + var possible = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' + + for (var i = 0; i < 20; i++) { + id += possible.charAt(Math.floor(Math.random() * possible.length)) + } + + return id +} + +// To strip tags from input +export function stripTags(string = '') { + return string.replace(/(<([^>]+)>)/gi, '').trim() +} + +export function clockTick() { + if (!simulationArea.clockEnabled) return + if (errorDetectedGet()) return + if (layoutModeGet()) return + updateCanvasSet(true) + globalScope.clockTick() + plotArea.nextCycle() + play() + scheduleUpdate(0, 20) +} + +/** + * Helper function to show error + * @param {string} error -The error to be shown + * @category utils + */ +export function showError(error) { + errorDetectedSet(true) + // if error ha been shown return + if (error === prevErrorMessage) return + prevErrorMessage = error + var id = Math.floor(Math.random() * 10000) + $('#MessageDiv').append( + `` + ) + setTimeout(() => { + prevErrorMessage = undefined + $(`#${id}`).fadeOut() + }, 1500) +} + +// Helper function to show message +export function showMessage(mes) { + if (mes === prevShowMessage) return + prevShowMessage = mes + var id = Math.floor(Math.random() * 10000) + $('#MessageDiv').append( + `` + ) + setTimeout(() => { + prevShowMessage = undefined + $(`#${id}`).fadeOut() + }, 2500) +} + +export function distance(x1, y1, x2, y2) { + return Math.sqrt((x2 - x1) ** 2) + (y2 - y1) ** 2 +} + +/** + * Helper function to return unique list + * @param {Array} a - any array + * @category utils + */ +export function uniq(a) { + var seen = {} + const tmp = a.filter((item) => + seen.hasOwnProperty(item) ? false : (seen[item] = true) + ) + return tmp +} + +// Generates final verilog code for each element +// Gate = &/|/^ +// Invert is true for xNor, Nor, Nand +export function gateGenerateVerilog(gate, invert = false) { + var inputs = [] + var outputs = [] + + for (var i = 0; i < this.nodeList.length; i++) { + if (this.nodeList[i].type == NODE_INPUT) { + inputs.push(this.nodeList[i]) + } else { + if (this.nodeList[i].connections.length > 0) + outputs.push(this.nodeList[i]) + else outputs.push('') // Don't create a wire + } + } + + var res = 'assign ' + if (outputs.length == 1) res += outputs[0].verilogLabel + else res += `{${outputs.map((x) => x.verilogLabel).join(', ')}}` + + res += ' = ' + + var inputParams = inputs.map((x) => x.verilogLabel).join(` ${gate} `) + if (invert) { + res += `~(${inputParams});` + } else { + res += inputParams + ';' + } + return res +} + +// Helper function to download text +export function download(filename, text) { + var pom = document.createElement('a') + pom.setAttribute( + 'href', + 'data:text/plain;charset=utf-8,' + encodeURIComponent(text) + ) + pom.setAttribute('download', filename) + + if (document.createEvent) { + var event = document.createEvent('MouseEvents') + event.initEvent('click', true, true) + pom.dispatchEvent(event) + } else { + pom.click() + } +} + +// Helper function to open a new tab +export function openInNewTab(url) { + var win = window.open(url, '_blank') + win.focus() +} + +export function copyToClipboard(text) { + const textarea = document.createElement('textarea') + + // Move it off-screen. + textarea.style.cssText = 'position: absolute; left: -99999em' + + // Set to readonly to prevent mobile devices opening a keyboard when + // text is .select()'ed. + textarea.setAttribute('readonly', true) + + document.body.appendChild(textarea) + textarea.value = text + + // Check if there is any content selected previously. + const selected = + document.getSelection().rangeCount > 0 + ? document.getSelection().getRangeAt(0) + : false + + // iOS Safari blocks programmatic execCommand copying normally, without this hack. + // https://stackoverflow.com/questions/34045777/copy-to-clipboard-using-javascript-in-ios + if (navigator.userAgent.match(/ipad|ipod|iphone/i)) { + const editable = textarea.contentEditable + textarea.contentEditable = true + const range = document.createRange() + range.selectNodeContents(textarea) + const sel = window.getSelection() + sel.removeAllRanges() + sel.addRange(range) + textarea.setSelectionRange(0, 999999) + textarea.contentEditable = editable + } else { + textarea.select() + } + + try { + const result = document.execCommand('copy') + + // Restore previous selection. + if (selected) { + document.getSelection().removeAllRanges() + document.getSelection().addRange(selected) + } + textarea.remove() + return result + } catch (err) { + console.error(err) + textarea.remove() + return false + } +} + +export function truncateString(str, num) { + // If the length of str is less than or equal to num + // just return str--don't truncate it. + if (str.length <= num) { + return str + } + // Return str truncated with '...' concatenated to the end of str. + return str.slice(0, num) + '...' +} + +export function bitConverterDialog() { + const simulatorStore = SimulatorStore(); + simulatorStore.dialogBox.hex_bin_dec_converter_dialog = true; +} + +export function getImageDimensions(file) { + return new Promise(function (resolved, rejected) { + var i = new Image() + i.onload = function () { + resolved({ w: i.width, h: i.height }) + } + i.src = file + }) +} + +// convertors +export var convertors = { + dec2bin: (x) => '0b' + x.toString(2), + dec2hex: (x) => '0x' + x.toString(16), + dec2octal: (x) => '0' + x.toString(8), + dec2bcd: (x) => parseInt(x.toString(10), 16).toString(2), +} + +export function parseNumber(num) { + if (num instanceof Number) return num + if (num.slice(0, 2).toLocaleLowerCase() == '0b') + return parseInt(num.slice(2), 2) + if (num.slice(0, 2).toLocaleLowerCase() == '0x') + return parseInt(num.slice(2), 16) + if (num.slice(0, 1).toLocaleLowerCase() == '0') return parseInt(num, 8) + return parseInt(num) +} + +export function promptFile(contentType, multiple) { + var input = document.createElement('input') + input.type = 'file' + input.multiple = multiple + input.accept = contentType + return new Promise(function (resolve) { + document.activeElement.onfocus = function () { + document.activeElement.onfocus = null + setTimeout(resolve, 500) + } + input.onchange = function () { + var files = Array.from(input.files) + if (multiple) return resolve(files) + resolve(files[0]) + } + input.click() + }) +} + +export function escapeHtml(unsafe) { + return unsafe + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, ''') +} diff --git a/v0/src/simulator/src/ux.js b/v0/src/simulator/src/ux.js new file mode 100644 index 00000000..aaad33cd --- /dev/null +++ b/v0/src/simulator/src/ux.js @@ -0,0 +1,803 @@ +/* eslint-disable import/no-cycle */ +/* eslint-disable guard-for-in */ +/* eslint-disable no-restricted-syntax */ +/* eslint-disable no-restricted-syntax */ +/* eslint-disable guard-for-in */ + +import { layoutModeGet } from './layoutMode' +import { + scheduleUpdate, + wireToBeCheckedSet, + updateCanvasSet, + update, + updateSimulationSet, +} from './engine' +import simulationArea from './simulationArea' +import logixFunction from './data' +import { newCircuit, circuitProperty } from './circuit' +import modules from './modules' +import { updateRestrictedElementsInScope } from './restrictedElementDiv' +import { paste } from './events' +import { setProjectName, getProjectName } from './data/save' +import { changeScale } from './canvasApi' +import { generateImage, generateSaveData } from './data/save' +import { setupVerilogExportCodeWindow } from './verilog' +import { updateTestbenchUI, setupTestbenchUI } from './testbench' +import { applyVerilogTheme } from './Verilog2CV' +import { dragging } from './drag' + +export const uxvar = { + smartDropXX: 50, + smartDropYY: 80, +} +/** + * @type {number} - Is used to calculate the position where an element from sidebar is dropped + * @category ux + */ +uxvar.smartDropXX = 50 + +/** + * @type {number} - Is used to calculate the position where an element from sidebar is dropped + * @category ux + */ +uxvar.smartDropYY = 80 + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ +/** + * @type {Object} - Object stores the position of context menu; + * @category ux + */ +var ctxPos = { + x: 0, + y: 0, + visible: false, +} +// FUNCITON TO SHOW AND HIDE CONTEXT MENU +function hideContextMenu() { + var el = document.getElementById('contextMenu') + el.style = 'opacity:0;' + setTimeout(() => { + el.style = 'visibility:hidden;' + ctxPos.visible = false + }, 200) // Hide after 2 sec +} +/** + * Function displays context menu + * @category ux + */ +function showContextMenu() { + if (layoutModeGet()) return false // Hide context menu when it is in Layout Mode + $('#contextMenu').css({ + visibility: 'visible', + opacity: 1, + }) + + var windowHeight = + $('#simulationArea').height() - $('#contextMenu').height() - 10 + var windowWidth = + $('#simulationArea').width() - $('#contextMenu').width() - 10 + // for top, left, right, bottom + var topPosition + var leftPosition + var rightPosition + var bottomPosition + if (ctxPos.y > windowHeight && ctxPos.x <= windowWidth) { + //When user click on bottom-left part of window + leftPosition = ctxPos.x + bottomPosition = $(window).height() - ctxPos.y + $('#contextMenu').css({ + left: `${leftPosition}px`, + bottom: `${bottomPosition}px`, + right: 'auto', + top: 'auto', + }) + } else if (ctxPos.y > windowHeight && ctxPos.x > windowWidth) { + //When user click on bottom-right part of window + bottomPosition = $(window).height() - ctxPos.y + rightPosition = $(window).width() - ctxPos.x + $('#contextMenu').css({ + left: 'auto', + bottom: `${bottomPosition}px`, + right: `${rightPosition}px`, + top: 'auto', + }) + } else if (ctxPos.y <= windowHeight && ctxPos.x <= windowWidth) { + //When user click on top-left part of window + leftPosition = ctxPos.x + topPosition = ctxPos.y + $('#contextMenu').css({ + left: `${leftPosition}px`, + bottom: 'auto', + right: 'auto', + top: `${topPosition}px`, + }) + } else { + //When user click on top-right part of window + rightPosition = $(window).width() - ctxPos.x + topPosition = ctxPos.y + $('#contextMenu').css({ + left: 'auto', + bottom: 'auto', + right: `${rightPosition}px`, + top: `${topPosition}px`, + }) + } + ctxPos.visible = true + return false +} + +/** + * adds some UI elements to side bar and + * menu also attaches listeners to sidebar + * @category ux + */ +export function setupUI() { + var ctxEl = document.getElementById('contextMenu') + document.addEventListener('mousedown', (e) => { + // Check if mouse is not inside the context menu and menu is visible + if ( + !( + e.clientX >= ctxPos.x && + e.clientX <= ctxPos.x + ctxEl.offsetWidth && + e.clientY >= ctxPos.y && + e.clientY <= ctxPos.y + ctxEl.offsetHeight + ) && + ctxPos.visible && + e.which !== 3 + ) { + hideContextMenu() + } + + // Change the position of context whenever mouse is clicked + ctxPos.x = e.clientX + ctxPos.y = e.clientY + }) + document.getElementById('canvasArea').oncontextmenu = showContextMenu + + // commenting jquery-ui (not working) + // $('#sideBar').resizable({ + // handles: 'e', + // // minWidth:270, + // }); + // $('#menu, #subcircuitMenu').accordion({ + // collapsible: true, + // active: false, + // heightStyle: 'content', + // }); + + $('.logixButton').on('click', function () { + logixFunction[this.id]() + }) + // var dummyCounter=0; + + // calling apply on select theme in dropdown + + // $('#saveAsImg').on('click',function(){ + // saveAsImg(); + // }); + // $('#Save').on('click',function(){ + // Save(); + // }); + // $('#moduleProperty').draggable(); + setupPanels() + // setupVerilogExportCodeWindow() +} + +/** + * Keeps in check which property is being displayed + * @category ux + */ +var prevPropertyObj + +export function prevPropertyObjSet(param) { + prevPropertyObj = param +} + +export function prevPropertyObjGet() { + return prevPropertyObj +} + +function checkValidBitWidth() { + const selector = $("[name='newBitWidth']") + if ( + selector === undefined || + selector.val() > 32 || + selector.val() < 1 || + !$.isNumeric(selector.val()) + ) { + // fallback to previously saves state + selector.val(selector.attr('old-val')) + } else { + selector.attr('old-val', selector.val()) + } +} + +export function objectPropertyAttributeUpdate() { + checkValidBitWidth() + scheduleUpdate() + updateCanvasSet(true) + wireToBeCheckedSet(1) + let { value } = this + if (this.type === 'number') { + value = parseFloat(value) + } + if (simulationArea.lastSelected && simulationArea.lastSelected[this.name]) { + simulationArea.lastSelected[this.name](value) + // Commented out due to property menu refresh bug + // prevPropertyObjSet(simulationArea.lastSelected[this.name](this.value)) || prevPropertyObjGet(); + } else { + circuitProperty[this.name](value) + } +} + +export function objectPropertyAttributeCheckedUpdate() { + if (this.name === 'toggleLabelInLayoutMode') return // Hack to prevent toggleLabelInLayoutMode from toggling twice + scheduleUpdate() + updateCanvasSet(true) + wireToBeCheckedSet(1) + if (simulationArea.lastSelected && simulationArea.lastSelected[this.name]) { + simulationArea.lastSelected[this.name](this.value) + // Commented out due to property menu refresh bug + // prevPropertyObjSet(simulationArea.lastSelected[this.name](this.value)) || prevPropertyObjGet(); + } else { + circuitProperty[this.name](this.checked) + } +} + +export function checkPropertiesUpdate(value = 0) { + $('.objectPropertyAttribute').off( + 'change keyup paste click', + objectPropertyAttributeUpdate + ) + $('.objectPropertyAttribute').on( + 'change keyup paste click', + objectPropertyAttributeUpdate + ) + + $('.objectPropertyAttributeChecked').off( + 'change keyup paste click', + objectPropertyAttributeCheckedUpdate + ) + $('.objectPropertyAttributeChecked').on( + 'change keyup paste click', + objectPropertyAttributeCheckedUpdate + ) +} + +/** + * show properties of an object. + * @param {CircuiElement} obj - the object whose properties we want to be shown in sidebar + * @category ux + */ +export function showProperties(obj) { + if (obj === prevPropertyObjGet()) return + + /* + hideProperties() + prevPropertyObjSet(obj) + if (layoutModeGet()) { + // if an element is selected, show its properties instead of the layout dialog + if ( + simulationArea.lastSelected === undefined || + ['Wire', 'CircuitElement', 'Node'].indexOf( + simulationArea.lastSelected.objectType + ) !== -1 + ) { + $('#moduleProperty').hide() + $('#layoutDialog').show() + return + } + + $('#moduleProperty').show() + $('#layoutDialog').hide() + $('#moduleProperty-inner').append( + "
" + obj.objectType + '
' + ) + + if (obj.subcircuitMutableProperties && obj.canShowInSubcircuit) { + for (let attr in obj.subcircuitMutableProperties) { + var prop = obj.subcircuitMutableProperties[attr] + if (obj.subcircuitMutableProperties[attr].type == 'number') { + var s = + '

' + + prop.name + + "

" + $('#moduleProperty-inner').append(s) + } + } + if (!obj.labelDirectionFixed) { + if (!obj.subcircuitMetadata.labelDirection) + obj.subcircuitMetadata.labelDirection = obj.labelDirection + var s = $( + "' + ) + s.val(obj.subcircuitMetadata.labelDirection) + $('#moduleProperty-inner').append( + '

Label Direction: ' + $(s).prop('outerHTML') + '

' + ) + } + } + } else if ( + simulationArea.lastSelected === undefined || + ['Wire', 'CircuitElement', 'Node'].indexOf( + simulationArea.lastSelected.objectType + ) !== -1 + ) { + $('#moduleProperty').show() + + $('#moduleProperty-inner').append( + `

Project:

` + ) + $('#moduleProperty-inner').append( + `

Circuit:

` + ) + $('#moduleProperty-inner').append( + `

Clock Time (ms):

` + ) + $('#moduleProperty-inner').append( + `

Clock Enabled:

` + ) + $('#moduleProperty-inner').append( + `

Lite Mode:

` + ) + $('#moduleProperty-inner').append( + "

" + ) + // $('#moduleProperty-inner').append("

"); + } else { + $('#moduleProperty').show() + + $('#moduleProperty-inner').append( + `

${obj.objectType}
` + ) + // $('#moduleProperty').append(""); + if (!obj.fixedBitWidth) { + $('#moduleProperty-inner').append( + `

BitWidth:

` + ) + } + + if (obj.changeInputSize) { + $('#moduleProperty-inner').append( + `

Input Size:

` + ) + } + + if (!obj.propagationDelayFixed) { + $('#moduleProperty-inner').append( + `

Delay:

` + ) + } + + if (!obj.disableLabel) + $('#moduleProperty-inner').append( + `

Label:

` + ) + + var s + if (!obj.labelDirectionFixed) { + s = $( + `${ + "' + ) + s.val(obj.labelDirection) + $('#moduleProperty-inner').append( + `

Label Direction: ${$(s).prop('outerHTML')}

` + ) + } + + if (!obj.directionFixed) { + s = $( + `${ + "' + ) + $('#moduleProperty-inner').append( + `

Direction: ${$(s).prop('outerHTML')}

` + ) + } else if (!obj.orientationFixed) { + s = $( + `${ + "' + ) + $('#moduleProperty-inner').append( + `

Orientation: ${$(s).prop('outerHTML')}

` + ) + } + + if (obj.mutableProperties) { + for (const attr in obj.mutableProperties) { + var prop = obj.mutableProperties[attr] + if (obj.mutableProperties[attr].type === 'number') { + s = `

${ + prop.name + }

` + $('#moduleProperty-inner').append(s) + } else if (obj.mutableProperties[attr].type === 'text') { + s = `

${ + prop.name + }

` + $('#moduleProperty-inner').append(s) + } else if (obj.mutableProperties[attr].type === 'button') { + s = `

` + $('#moduleProperty-inner').append(s) + } else if (obj.mutableProperties[attr].type === 'textarea') { + s = `

${prop.name}

` + $('#moduleProperty-inner').append(s) + } + } + } + } + + var helplink = obj && obj.helplink + if (helplink) { + $('#moduleProperty-inner').append( + '

' + ) + $('#HelpButton').on('click', () => { + window.open(helplink) + }) + } +*/ + checkPropertiesUpdate(this) + + // $(".moduleProperty input[type='number']").inputSpinner(); +} + +/** + * Hides the properties in sidebar. + * @category ux + */ +export function hideProperties() { + $('#moduleProperty-inner').empty() + $('#moduleProperty').hide() + prevPropertyObjSet(undefined) + $('.objectPropertyAttribute').unbind('change keyup paste click') +} +/** + * checkss the input is safe or not + * @param {HTML} unsafe - the html which we wants to escape + * @category ux + */ +function escapeHtml(unsafe) { + return unsafe + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, ''') +} + +export function deleteSelected() { + if ( + simulationArea.lastSelected && + !( + simulationArea.lastSelected.objectType === 'Node' && + simulationArea.lastSelected.type !== 2 + ) + ) { + simulationArea.lastSelected.delete() + } + + for (var i = 0; i < simulationArea.multipleObjectSelections.length; i++) { + if ( + !( + simulationArea.multipleObjectSelections[i].objectType === + 'Node' && + simulationArea.multipleObjectSelections[i].type !== 2 + ) + ) + simulationArea.multipleObjectSelections[i].cleanDelete() + } + + simulationArea.multipleObjectSelections = [] + simulationArea.lastSelected = undefined + showProperties(simulationArea.lastSelected) + // Updated restricted elements + updateCanvasSet(true) + scheduleUpdate() + updateRestrictedElementsInScope() +} + +export function setupPanels() { + // $('#dragQPanel') + // .on('mousedown', () => + // $('.quick-btn').draggable({ + // disabled: false, + // containment: 'window', + // }) + // ) + // .on('mouseup', () => $('.quick-btn').draggable({ disabled: true })) + + // let position = { x: 0, y: 0 } + // interact('.quick-btn').draggable({ + // allowFrom: '#dragQPanel', + // listeners: { + // move(event) { + // position.x = position.x + event.dx + // position.y = position.y + event.dy + // event.target.style.transform = `translate(${position.x}px, ${position.y}px)` + // }, + // }, + // }) + + dragging('#dragQPanel', '.quick-btn') + + setupPanelListeners('.elementPanel') + setupPanelListeners('.layoutElementPanel') + setupPanelListeners('#moduleProperty') + setupPanelListeners('#layoutDialog') + setupPanelListeners('#verilogEditorPanel') + setupPanelListeners('.timing-diagram-panel') + setupPanelListeners('.testbench-manual-panel') + + // Minimize Timing Diagram (takes too much space) + $('.timing-diagram-panel .minimize').trigger('click') + + // Update the Testbench Panel UI + updateTestbenchUI() + // Minimize Testbench UI + $('.testbench-manual-panel .minimize').trigger('click') + + // Hack because minimizing panel then maximizing sets visibility recursively + // updateTestbenchUI calls some hide()s which are undone by maximization + // TODO: Remove hack + $('.testbench-manual-panel .maximize').on('click', setupTestbenchUI) + + $('#projectName').on('click', () => { + $("input[name='setProjectName']").focus().select() + }) +} + +function setupPanelListeners(panelSelector) { + var headerSelector = `${panelSelector} .panel-header` + var minimizeSelector = `${panelSelector} .minimize` + var maximizeSelector = `${panelSelector} .maximize` + var bodySelector = `${panelSelector} > .panel-body` + + dragging(headerSelector, panelSelector) + // let position = { x: 0, y: 0 } + // Drag Start + // $(headerSelector).on('mousedown', () => + // $(panelSelector).draggable({ disabled: false, containment: 'window' }) + // interact(panelSelector).draggable({ + // allowFrom: headerSelector, + // listeners: { + // move(event) { + // position.x += event.dx + // position.y += event.dy + + // event.target.style.transform = `translate(${position.x}px, ${position.y}px)` + // }, + // }, + // }) + // ) + // // Drag End + // $(headerSelector).on('mouseup', () => + // $(panelSelector).draggable({ disabled: true }) + // ) + // Current Panel on Top + var minimized = false + $(headerSelector).on('dblclick', () => + minimized + ? $(maximizeSelector).trigger('click') + : $(minimizeSelector).trigger('click') + ) + // Minimize + $(minimizeSelector).on('click', () => { + $(bodySelector).hide() + $(minimizeSelector).hide() + $(maximizeSelector).show() + minimized = true + }) + // Maximize + $(maximizeSelector).on('click', () => { + $(bodySelector).show() + $(minimizeSelector).show() + $(maximizeSelector).hide() + minimized = false + }) +} + +export function exitFullView() { + const exitViewBtn = document.querySelector('#exitViewBtn') + if (exitViewBtn) exitViewBtn.remove() + + const elements = document.querySelectorAll( + '.navbar, .modules, .report-sidebar, #tabsBar, #moduleProperty, .timing-diagram-panel, .testbench-manual-panel, .quick-btn' + ) + elements.forEach((element) => { + if (element instanceof HTMLElement) { + element.style.display = '' + } + }) +} + +export function fullView() { + const app = document.querySelector('#app') + + const exitViewEl = document.createElement('button') + exitViewEl.id = 'exitViewBtn' + exitViewEl.textContent = 'Exit Full Preview' + + const elements = document.querySelectorAll( + '.navbar, .modules, .report-sidebar, #tabsBar, #moduleProperty, .timing-diagram-panel, .testbench-manual-panel, .quick-btn' + ) + elements.forEach((element) => { + if (element instanceof HTMLElement) { + element.style.display = 'none' + } + }) + + app.appendChild(exitViewEl) + exitViewEl.addEventListener('click', exitFullView) +} + +/** + Fills the elements that can be displayed in the subcircuit, in the subcircuit menu +**/ +export function fillSubcircuitElements() { + $('#subcircuitMenu').empty() + var subCircuitElementExists = false + for (let el of circuitElementList) { + if (globalScope[el].length === 0) continue + if (!globalScope[el][0].canShowInSubcircuit) continue + let tempHTML = '' + + // add a panel for each existing group + tempHTML += `
${el}s
` + tempHTML += `
` + + let available = false + + // add an SVG for each element + for (let i = 0; i < globalScope[el].length; i++) { + if (!globalScope[el][i].subcircuitMetadata.showInSubcircuit) { + tempHTML += `
` + tempHTML += `` + tempHTML += `

${ + globalScope[el][i].label !== '' + ? globalScope[el][i].label + : 'unlabeled' + }

` + tempHTML += '
' + available = true + } + } + tempHTML += '
' + subCircuitElementExists = subCircuitElementExists || available + if (available) $('#subcircuitMenu').append(tempHTML) + } + + if (subCircuitElementExists) { + // $('#subcircuitMenu').accordion('refresh') + } else { + $('#subcircuitMenu').append('

No layout elements available

') + } + + $('.subcircuitModule').mousedown(function () { + let elementName = this.dataset.elementName + let elementIndex = this.dataset.elementId + + let element = globalScope[elementName][elementIndex] + + element.subcircuitMetadata.showInSubcircuit = true + element.newElement = true + simulationArea.lastSelected = element + this.parentElement.removeChild(this) + }) +} diff --git a/v0/src/simulator/src/verilog.js b/v0/src/simulator/src/verilog.js new file mode 100644 index 00000000..d0811b2c --- /dev/null +++ b/v0/src/simulator/src/verilog.js @@ -0,0 +1,580 @@ +/* + # Primary Developers + 1) James H-J Yeh, Ph.D. + 2) Satvik Ramaprasad + + refer verilog_documentation.md +*/ +import { scopeList } from './circuit' +import { errorDetectedGet } from './engine' +import { download } from './utils' +import { getProjectName } from './data/save' +import modules from './modules' +import { sanitizeLabel } from './verilogHelpers' +import CodeMirror from 'codemirror/lib/codemirror.js' +import 'codemirror/lib/codemirror.css' +import 'codemirror/addon/hint/show-hint.css' +import 'codemirror/mode/verilog/verilog.js' +import 'codemirror/addon/edit/closebrackets.js' +import 'codemirror/addon/hint/anyword-hint.js' +import 'codemirror/addon/hint/show-hint.js' +import 'codemirror/addon/display/autorefresh.js' +import { openInNewTab, copyToClipboard, showMessage } from './utils' +import { SimulatorStore } from '#/store/SimulatorStore/SimulatorStore' +var editor + +export function generateVerilog() { + const simulatorStore = SimulatorStore() + simulatorStore.dialogBox.exportverilog_dialog = true + // var dialog = $('#verilog-export-code-window-div') + // var data = verilog.exportVerilog() + // editor.setValue(data) + // $('#verilog-export-code-window-div .CodeMirror').css( + // 'height', + // $(window).height() - 200 + // ) + // dialog.dialog({ + // resizable: false, + // width: '90%', + // height: 'auto', + // position: { my: 'center', at: 'center', of: window }, + // buttons: [ + // { + // text: 'Download Verilog File', + // click() { + // var fileName = getProjectName() || 'Untitled' + // download(fileName + '.v', editor.getValue()) + // }, + // }, + // { + // text: 'Copy to Clipboard', + // click() { + // copyToClipboard(editor.getValue()) + // showMessage('Code has been copied') + // }, + // }, + // { + // text: 'Try in EDA Playground', + // click() { + // copyToClipboard(editor.getValue()) + // openInNewTab('https://www.edaplayground.com/x/XZpY') + // }, + // }, + // ], + // }) +} + +export function setupVerilogExportCodeWindow() { + var myTextarea = document.getElementById('verilog-export-code-window') + editor = CodeMirror.fromTextArea(myTextarea, { + mode: 'verilog', + autoRefresh: true, + styleActiveLine: true, + lineNumbers: true, + autoCloseBrackets: true, + smartIndent: true, + indentWithTabs: true, + extraKeys: { 'Ctrl-Space': 'autocomplete' }, + }) +} + +export var verilog = { + // Entry point to verilog generation + // scope = undefined means export all circuits + exportVerilog: function (scope = undefined) { + var dependencyList = {} + // Reset Verilog Element State + for (var elem in modules) { + // Not sure if globalScope here is correct. + if (modules[elem].resetVerilog) { + modules[elem].resetVerilog() + } + } + + // List of devices under test for which testbench needs to be created + var DUTs = [] + var SubCircuitIds = new Set() + + // Generate SubCircuit Dependency Graph + for (id in scopeList) { + dependencyList[id] = scopeList[id].getDependencies() + for (var i = 0; i < scopeList[id].SubCircuit.length; i++) { + SubCircuitIds.add(scopeList[id].SubCircuit[i].id) + } + } + + for (id in scopeList) { + if (!SubCircuitIds.has(id)) DUTs.push(scopeList[id]) + } + + // DFS on SubCircuit Dependency Graph + var visited = {} + var elementTypesUsed = {} + var output = '' + if (scope) { + // generate verilog only for scope + output += this.exportVerilogScope( + scope.id, + visited, + dependencyList, + elementTypesUsed + ) + } else { + // generate verilog for everything + for (id in scopeList) { + output += this.exportVerilogScope( + id, + visited, + dependencyList, + elementTypesUsed + ) + } + } + // Add Circuit Element - Module Specific Verilog Code + for (var element in elementTypesUsed) { + // If element has custom verilog + if (modules[element] && modules[element].moduleVerilog) { + output += modules[element].moduleVerilog() + } + } + + var report = this.generateReport(elementTypesUsed) + '\n' + var testbench = this.generateTestBenchCode(DUTs) + + return report + testbench + output + }, + generateReport: function (elementTypesUsed) { + var output = '' + output += '/**\n' + output += + ' * This is an autogenerated netlist code from CircuitVerse. Verilog Code can be\n' + output += + ' * tested on https://www.edaplayground.com/ using Icarus Verilog 0.9.7. This is an\n' + output += + ' * experimental module and some manual changes make need to be done in order for\n' + output += ' * this to work.\n' + output += ' *\n' + output += + ' * If you have any ideas/suggestions or bug fixes, raise an issue\n' + output += + ' * on https://github.com/CircuitVerse/CircuitVerse/issues/new/choose\n' + output += ' */\n' + output += '\n' + output += '/*\n' + output += sp(1) + 'Element Usage Report\n' + for (var elem in elementTypesUsed) { + if (elem == 'Node') continue + output += `${sp(2)}${elem} - ${elementTypesUsed[elem]} times\n` + } + output += '*/\n' + output += '\n' + var instructions = '' + output += '/*\n' + output += sp(1) + 'Usage Instructions and Tips\n' + instructions += + sp(2) + + 'Labels - Ensure unique label names and avoid using verilog keywords\n' + instructions += + sp(2) + + 'Warnings - Connect all optional inputs to remove warnings\n' + for (var elem in elementTypesUsed) { + // If element has custom instructions + if (modules[elem] && modules[elem].verilogInstructions) { + instructions += indent(2, modules[elem].verilogInstructions()) + } + } + output += instructions + output += '*/\n' + return output + }, + generateTestBenchCode: function (DUTs) { + if (DUTs.length == 0) return '' + var output = '// Sample Testbench Code - Uncomment to use\n' + + output += '\n/*\n' + output += 'module TestBench();\n' + var registers = {} + var wires = {} + for (var i = 1; i <= 32; i++) registers[i] = new Set() + for (var i = 1; i <= 32; i++) wires[i] = new Set() + + var clocks = new Set() + var inputs = new Set() + var outputs = new Set() + var deviceInstantiations = '' + for (var i = 0; i < DUTs.length; i++) { + var DUT = DUTs[i] + for (var j = 0; j < DUT.Input.length; j++) { + var inp = DUT.Input[j] + registers[inp.bitWidth].add(inp.label) + inputs.add(inp.label) + } + for (var j = 0; j < DUT.Output.length; j++) { + var out = DUT.Output[j] + wires[out.bitWidth].add(out.label) + outputs.add(out.label) + } + for (var j = 0; j < DUT.Clock.length; j++) { + var inp = DUT.Clock[j] + registers[1].add(inp.label) + clocks.add(inp.label) + } + var circuitName = sanitizeLabel(DUT.name) + var dutHeader = this.generateHeaderHelper(DUT) + deviceInstantiations += `${sp( + 1 + )}${circuitName} DUT${i}${dutHeader}\n` + } + output += '\n' + // Generate Reg Initialization Code + for (var bitWidth = 1; bitWidth <= 32; bitWidth++) { + if (registers[bitWidth].size == 0) continue + var regArray = [...registers[bitWidth]] + if (bitWidth == 1) output += `${sp(1)}reg ${regArray.join(', ')};\n` + else + output += `${sp(1)}reg [${bitWidth - 1}:0] ${regArray.join( + ', ' + )};\n` + } + output += '\n' + // Generate Wire Initialization Code + for (var bitWidth = 1; bitWidth <= 32; bitWidth++) { + if (wires[bitWidth].size == 0) continue + var wireArray = [...wires[bitWidth]] + if (bitWidth == 1) + output += `${sp(1)}wire ${wireArray.join(', ')};\n` + else + output += `${sp(1)}wire [${bitWidth - 1}:0] ${wireArray.join( + ', ' + )};\n` + } + output += '\n' + + output += deviceInstantiations + + if (clocks.size) { + output += `${sp(1)}always begin\n` + output += `${sp(2)}#10\n` + for (var clk of clocks) output += `${sp(2)}${clk} = 0;\n` + output += `${sp(2)}#10\n` + for (var clk of clocks) output += `${sp(2)}${clk} = 1;\n` + output += `${sp(1)}end\n` + output += '\n' + } + + output += `${sp(1)}initial begin\n` + + // Reset inputs to 0 + for (var inp of inputs) { + output += `${sp(2)}${inp} = 0;\n` + } + output += '\n' + output += `${sp(2)}#15\n` + for (var out of outputs) { + output += `${sp(2)}$display("${out} = %b", ${out});\n` + } + output += '\n' + output += `${sp(2)}#10\n` + for (var out of outputs) { + output += `${sp(2)}$display("${out} = %b", ${out});\n` + } + output += '\n' + output += `${sp(2)}$finish;\n\n` + output += `${sp(1)}end\n` + + output += 'endmodule\n' + + output += '\n*/\n' + + return output + }, + // Recursive DFS function + exportVerilogScope: function ( + id, + visited, + dependencyList, + elementTypesUsed + ) { + // Already Visited + if (visited[id]) return '' + // Mark as Visited + visited[id] = true + + var output = '' + // DFS on dependencies + for (var i = 0; i < dependencyList[id].length; i++) + output += + this.exportVerilogScope( + dependencyList[id][i], + visited, + dependencyList, + elementTypesUsed + ) + '\n' + + var scope = scopeList[id] + // Initialize labels for all elements + this.resetLabels(scope) + this.setLabels(scope) + + output += this.generateHeader(scope) + output += this.generateOutputList(scope) // generate output first to be consistent + output += this.generateInputList(scope) + + // Note: processGraph function populates scope.verilogWireList + var res = this.processGraph(scope, elementTypesUsed) + + // Generate Wire Initialization Code + for (var bitWidth = 1; bitWidth <= 32; bitWidth++) { + var wireList = scope.verilogWireList[bitWidth] + // Hack for splitter + wireList = wireList.filter((x) => !x.includes('[')) + if (wireList.length == 0) continue + if (bitWidth == 1) output += ' wire ' + wireList.join(', ') + ';\n' + else + output += + ' wire [' + + (bitWidth - 1) + + ':0] ' + + wireList.join(', ') + + ';\n' + } + + // Append Wire connections and module instantiations + output += res + + // Append footer + output += 'endmodule\n' + + return output + }, + // Performs DFS on the graph and generates netlist of wires and connections + processGraph: function (scope, elementTypesUsed) { + // Initializations + var res = '' + scope.stack = [] + scope.verilogWireList = [] + for (var i = 0; i <= 32; i++) scope.verilogWireList.push(new Array()) + + var verilogResolvedSet = new Set() + + // Start DFS from inputs + for (var i = 0; i < inputList.length; i++) { + for (var j = 0; j < scope[inputList[i]].length; j++) { + scope.stack.push(scope[inputList[i]][j]) + } + } + + // Iterative DFS on circuit graph + while (scope.stack.length) { + if (errorDetectedGet()) return + var elem = scope.stack.pop() + + if (verilogResolvedSet.has(elem)) continue + + // Process verilog creates variable names and adds elements to DFS stack + elem.processVerilog() + + // Record usage of element type + if (elem.objectType != 'Node') { + if (elementTypesUsed[elem.objectType]) + elementTypesUsed[elem.objectType]++ + else elementTypesUsed[elem.objectType] = 1 + } + + if ( + elem.objectType != 'Node' && + elem.objectType != 'Input' && + elem.objectType != 'Clock' + ) { + verilogResolvedSet.add(elem) + } + } + + // Generate connection verilog code and module instantiations + for (var elem of verilogResolvedSet) { + res += ' ' + elem.generateVerilog() + '\n' + } + return res + }, + + resetLabels: function (scope) { + for (var i = 0; i < scope.allNodes.length; i++) { + scope.allNodes[i].verilogLabel = '' + } + }, + // Sets labels for all Circuit Elements elements + setLabels: function (scope = globalScope) { + /** + * Sets a name for each element. If element is already labeled, + * the element is used directly, otherwise an automated label is provided + * sanitizeLabel is a helper function to escape white spaces + */ + for (var i = 0; i < scope.Input.length; i++) { + if (scope.Input[i].label == '') scope.Input[i].label = 'inp_' + i + else scope.Input[i].label = sanitizeLabel(scope.Input[i].label) + // copy label to node + scope.Input[i].output1.verilogLabel = scope.Input[i].label + } + for (var i = 0; i < scope.ConstantVal.length; i++) { + if (scope.ConstantVal[i].label == '') + scope.ConstantVal[i].label = 'const_' + i + else + scope.ConstantVal[i].label = sanitizeLabel( + scope.ConstantVal[i].label + ) + // copy label to node + scope.ConstantVal[i].output1.verilogLabel = + scope.ConstantVal[i].label + } + + // copy label to clock + for (var i = 0; i < scope.Clock.length; i++) { + if (scope.Clock[i].label == '') scope.Clock[i].label = 'clk_' + i + else scope.Clock[i].label = sanitizeLabel(scope.Clock[i].label) + scope.Clock[i].output1.verilogLabel = scope.Clock[i].label + } + + for (var i = 0; i < scope.Output.length; i++) { + if (scope.Output[i].label == '') scope.Output[i].label = 'out_' + i + else scope.Output[i].label = sanitizeLabel(scope.Output[i].label) + } + for (var i = 0; i < scope.SubCircuit.length; i++) { + if (scope.SubCircuit[i].label == '') + scope.SubCircuit[i].label = + scope.SubCircuit[i].data.name + '_' + i + else + scope.SubCircuit[i].label = sanitizeLabel( + scope.SubCircuit[i].label + ) + } + for (var i = 0; i < moduleList.length; i++) { + var m = moduleList[i] + for (var j = 0; j < scope[m].length; j++) { + scope[m][j].verilogLabel = + sanitizeLabel(scope[m][j].label) || + scope[m][j].verilogName() + '_' + j + } + } + }, + generateHeader: function (scope = globalScope) { + // Example: module HalfAdder (a,b,s,c); + var res = '\nmodule ' + sanitizeLabel(scope.name) + res += this.generateHeaderHelper(scope) + return res + }, + generateHeaderHelper: function (scope = globalScope) { + // Example: (a,b,s,c); + var res = '(' + var pins = [] + for (var i = 0; i < scope.Output.length; i++) { + pins.push(scope.Output[i].label) + } + for (var i = 0; i < scope.Clock.length; i++) { + pins.push(scope.Clock[i].label) + } + for (var i = 0; i < scope.Input.length; i++) { + pins.push(scope.Input[i].label) + } + res += pins.join(', ') + res += ');\n' + return res + }, + generateInputList: function (scope = globalScope) { + var inputs = {} + for (var i = 1; i <= 32; i++) inputs[i] = [] + + for (var i = 0; i < scope.Input.length; i++) { + inputs[scope.Input[i].bitWidth].push(scope.Input[i].label) + } + + for (var i = 0; i < scope.Clock.length; i++) { + inputs[scope.Clock[i].bitWidth].push(scope.Clock[i].label) + } + + var res = '' + for (var bitWidth in inputs) { + if (inputs[bitWidth].length == 0) continue + if (bitWidth == 1) res += ' input ' + inputs[1].join(', ') + ';\n' + else + res += + ' input [' + + (bitWidth - 1) + + ':0] ' + + inputs[bitWidth].join(', ') + + ';\n' + } + + return res + }, + generateOutputList: function (scope = globalScope) { + // Example 1: output s,cout; + var outputs = {} + for (var i = 0; i < scope.Output.length; i++) { + if (outputs[scope.Output[i].bitWidth]) + outputs[scope.Output[i].bitWidth].push(scope.Output[i].label) + else outputs[scope.Output[i].bitWidth] = [scope.Output[i].label] + } + var res = '' + for (var bitWidth in outputs) { + if (bitWidth == 1) + res += ' output ' + outputs[1].join(', ') + ';\n' + else + res += + ' output [' + + (bitWidth - 1) + + ':0] ' + + outputs[bitWidth].join(', ') + + ';\n' + } + + return res + }, + /* + sanitizeLabel: function(name){ + // Replace spaces by "_" + name = name.replace(/ /g , "_"); + // Replace Hyphens by "_" + name = name.replace(/-/g , "_"); + // Replace Colons by "_" + name = name.replace(/:/g , "_"); + // replace ~ with inv_ + name = name.replace(/~/g , "inv_"); + // Shorten Inverse to inv + name = name.replace(/Inverse/g , "inv"); + + // If first character is a number + if(name.substring(0, 1).search(/[0-9]/g) > -1) { + name = "w_" + name; + } + + // if first character is not \ already + if (name[0] != '\\') { + //if there are non-alphanum_ character, add \ + if (name.search(/[\W]/g) > -1) + name = "\\" + name; + } + return name; + }, + */ +} + +/* + Helper function to generate spaces for indentation +*/ +function sp(indentation) { + return ' '.repeat(indentation * 2) +} + +/* + Helper function to indent paragraph +*/ +function indent(indentation, string) { + var result = string.split('\n') + if (result[result.length - 1] == '') { + result.pop() + result = result.map((x) => sp(indentation) + x).join('\n') + result += '\n' + return result + } + return result.map((x) => sp(indentation) + x).join('\n') +} diff --git a/v0/src/simulator/src/verilogHelpers.js b/v0/src/simulator/src/verilogHelpers.js new file mode 100644 index 00000000..3f9a4123 --- /dev/null +++ b/v0/src/simulator/src/verilogHelpers.js @@ -0,0 +1,41 @@ +export function sanitizeLabel(name) { + // return name.replace(/ Inverse/g, "_inv").replace(/ /g , "_"); + var temp = name + // if there is a space anywhere but the last place + // replace spaces by "_" + // last space is required for escaped id + if (temp.search(/ /g) < temp.length - 1 && temp.search(/ /g) >= 0) { + temp = temp.replace(/ Inverse/g, '_inv') + temp = temp.replace(/ /g, '_') + } + // if first character is not \ already + if (temp.substring(0, 1).search(/\\/g) < 0) { + // if there are non-alphanum_ character, or first character is num, add \ + if ( + temp.search(/[\W]/g) > -1 || + temp.substring(0, 1).search(/[0-9]/g) > -1 + ) + temp = '\\' + temp + ' ' + } + return temp +} + +export function generateNodeName(node, currentCount, totalCount) { + if (node.verilogLabel) return node.verilogLabel + var parentVerilogLabel = node.parent.verilogLabel + var nodeName + if (node.label) { + nodeName = sanitizeLabel(node.label) + } else { + nodeName = totalCount > 1 ? 'out_' + currentCount : 'out' + } + if (parentVerilogLabel.substring(0, 1).search(/\\/g) < 0) + return parentVerilogLabel + '_' + nodeName + else + return ( + parentVerilogLabel.substring(0, parentVerilogLabel.length - 1) + + '_' + + nodeName + + ' ' + ) +} diff --git a/v0/src/simulator/src/wire.js b/v0/src/simulator/src/wire.js new file mode 100644 index 00000000..7e06e7d2 --- /dev/null +++ b/v0/src/simulator/src/wire.js @@ -0,0 +1,240 @@ +/* eslint-disable no-multi-assign */ +// wire object +import { drawLine } from './canvasApi' +import simulationArea from './simulationArea' +import Node from './node' +import { updateSimulationSet, forceResetNodesSet } from './engine' +import { colors } from './themer/themer' + +/** + * Wire - To connect two nodes. + * @class + * @memberof module:wire + * @param {Node} node1 + * @param {Node} node2 + * @param {Scope} scope - The circuit in which wire has to be drawn + * @category wire + */ +export default class Wire { + constructor(node1, node2, scope) { + this.objectType = 'Wire' + this.node1 = node1 + this.scope = scope + this.node2 = node2 + this.type = 'horizontal' + + this.updateData() + this.scope.wires.push(this) + forceResetNodesSet(true) + } + + // if data changes + updateData() { + this.x1 = this.node1.absX() + this.y1 = this.node1.absY() + this.x2 = this.node2.absX() + this.y2 = this.node2.absY() + if (this.x1 === this.x2) this.type = 'vertical' + } + + updateScope(scope) { + this.scope = scope + this.checkConnections() + } + + // to check if nodes are disconnected + checkConnections() { + var check = + this.node1.deleted || + this.node2.deleted || + !this.node1.connections.contains(this.node2) || + !this.node2.connections.contains(this.node1) + if (check) this.delete() + return check + } + + dblclick() { + if ( + this.node1.parent == globalScope.root && + this.node2.parent == globalScope.root + ) { + simulationArea.multipleObjectSelections = [this.node1, this.node2] + simulationArea.lastSelected = undefined + } + } + + update() { + var updated = false + if (embed) return updated + + if (this.node1.absX() === this.node2.absX()) { + this.x1 = this.x2 = this.node1.absX() + this.type = 'vertical' + } else if (this.node1.absY() === this.node2.absY()) { + this.y1 = this.y2 = this.node1.absY() + this.type = 'horizontal' + } + + // if (wireToBeChecked && this.checkConnections()) { + // this.delete(); + // return updated; + // } // SLOW , REMOVE + if ( + simulationArea.shiftDown === false && + simulationArea.mouseDown === true && + simulationArea.selected === false && + this.checkWithin( + simulationArea.mouseDownX, + simulationArea.mouseDownY + ) + ) { + simulationArea.selected = true + simulationArea.lastSelected = this + updated = true + } else if ( + simulationArea.mouseDown && + simulationArea.lastSelected === this && + !this.checkWithin(simulationArea.mouseX, simulationArea.mouseY) + ) { + var n = new Node( + simulationArea.mouseDownX, + simulationArea.mouseDownY, + 2, + this.scope.root + ) + n.clicked = true + n.wasClicked = true + simulationArea.lastSelected = n + this.converge(n) + } + // eslint-disable-next-line no-empty + if (simulationArea.lastSelected === this) { + } + + if (this.node1.deleted || this.node2.deleted) { + this.delete() + return updated + } // if either of the nodes are deleted + + if (simulationArea.mouseDown === false) { + if (this.type === 'horizontal') { + if (this.node1.absY() !== this.y1) { + // if(this.checkConnections()){this.delete();return;} + n = new Node(this.node1.absX(), this.y1, 2, this.scope.root) + this.converge(n) + updated = true + } else if (this.node2.absY() !== this.y2) { + // if(this.checkConnections()){this.delete();return;} + n = new Node(this.node2.absX(), this.y2, 2, this.scope.root) + this.converge(n) + updated = true + } + } else if (this.type === 'vertical') { + if (this.node1.absX() !== this.x1) { + // if(this.checkConnections()){this.delete();return;} + n = new Node(this.x1, this.node1.absY(), 2, this.scope.root) + this.converge(n) + updated = true + } else if (this.node2.absX() !== this.x2) { + // if(this.checkConnections()){this.delete();return;} + n = new Node(this.x2, this.node2.absY(), 2, this.scope.root) + this.converge(n) + updated = true + } + } + } + return updated + } + + draw() { + // for calculating min-max Width,min-max Height + // + const ctx = simulationArea.context + + var color + if (simulationArea.lastSelected == this) { + color = colors['color_wire_sel'] + } else if ( + this.node1.value == undefined || + this.node2.value == undefined + ) { + color = colors['color_wire_lose'] + } else if (this.node1.bitWidth == 1) { + color = [ + colors['color_wire_lose'], + colors['color_wire_con'], + colors['color_wire_pow'], + ][this.node1.value + 1] + } else { + color = colors['color_wire'] + } + drawLine( + ctx, + this.node1.absX(), + this.node1.absY(), + this.node2.absX(), + this.node2.absY(), + color, + 3 + ) + } + + // checks if node lies on wire + checkConvergence(n) { + return this.checkWithin(n.absX(), n.absY()) + } + + // fn checks if coordinate lies on wire + checkWithin(x, y) { + if ( + this.type === 'horizontal' && + this.node1.absX() < this.node2.absX() && + x > this.node1.absX() && + x < this.node2.absX() && + y === this.node2.absY() + ) + return true + if ( + this.type === 'horizontal' && + this.node1.absX() > this.node2.absX() && + x < this.node1.absX() && + x > this.node2.absX() && + y === this.node2.absY() + ) + return true + if ( + this.type === 'vertical' && + this.node1.absY() < this.node2.absY() && + y > this.node1.absY() && + y < this.node2.absY() && + x === this.node2.absX() + ) + return true + if ( + this.type === 'vertical' && + this.node1.absY() > this.node2.absY() && + y < this.node1.absY() && + y > this.node2.absY() && + x === this.node2.absX() + ) + return true + return false + } + + // add intermediate node between these 2 nodes + converge(n) { + this.node1.connect(n) + this.node2.connect(n) + this.delete() + } + + delete() { + forceResetNodesSet(true) + updateSimulationSet(true) + this.node1.connections.clean(this.node2) + this.node2.connections.clean(this.node1) + this.scope.wires.clean(this) + this.node1.checkDeleted() + this.node2.checkDeleted() + } +} diff --git a/v0/src/simulator/vendor/canvas2svg.js b/v0/src/simulator/vendor/canvas2svg.js new file mode 100644 index 00000000..73dae81d --- /dev/null +++ b/v0/src/simulator/vendor/canvas2svg.js @@ -0,0 +1,1469 @@ +/*!! + * Canvas 2 Svg v1.0.19 + * A low level canvas to SVG converter. Uses a mock canvas context to build an SVG document. + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/mit-license.php + * + * Author: + * Kerry Liu + * + * Copyright (c) 2014 Gliffy Inc. + */ + +;(function () { + 'use strict' + + var STYLES, ctx, CanvasGradient, CanvasPattern, namedEntities + + //helper function to format a string + function format(str, args) { + var keys = Object.keys(args), + i + for (i = 0; i < keys.length; i++) { + str = str.replace( + new RegExp('\\{' + keys[i] + '\\}', 'gi'), + args[keys[i]] + ) + } + return str + } + + //helper function that generates a random string + function randomString(holder) { + var chars, randomstring, i + if (!holder) { + throw new Error( + 'cannot create a random attribute name for an undefined object' + ) + } + chars = 'ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz' + randomstring = '' + do { + randomstring = '' + for (i = 0; i < 12; i++) { + randomstring += chars[Math.floor(Math.random() * chars.length)] + } + } while (holder[randomstring]) + return randomstring + } + + //helper function to map named to numbered entities + function createNamedToNumberedLookup(items, radix) { + var i, + entity, + lookup = {}, + base10, + base16 + items = items.split(',') + radix = radix || 10 + // Map from named to numbered entities. + for (i = 0; i < items.length; i += 2) { + entity = '&' + items[i + 1] + ';' + base10 = parseInt(items[i], radix) + lookup[entity] = '&#' + base10 + ';' + } + //FF and IE need to create a regex from hex values ie   == \xa0 + lookup['\\xa0'] = ' ' + return lookup + } + + //helper function to map canvas-textAlign to svg-textAnchor + function getTextAnchor(textAlign) { + //TODO: support rtl languages + var mapping = { + left: 'start', + right: 'end', + center: 'middle', + start: 'start', + end: 'end', + } + return mapping[textAlign] || mapping.start + } + + //helper function to map canvas-textBaseline to svg-dominantBaseline + function getDominantBaseline(textBaseline) { + //INFO: not supported in all browsers + var mapping = { + alphabetic: 'alphabetic', + hanging: 'hanging', + top: 'text-before-edge', + bottom: 'text-after-edge', + middle: 'central', + } + return mapping[textBaseline] || mapping.alphabetic + } + + // Unpack entities lookup where the numbers are in radix 32 to reduce the size + // entity mapping courtesy of tinymce + namedEntities = createNamedToNumberedLookup( + '50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,' + + '5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,' + + '5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,' + + '5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,' + + '68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,' + + '6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,' + + '6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,' + + '75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,' + + '7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,' + + '7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,' + + 'sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,' + + 'st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,' + + 't9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,' + + 'tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,' + + 'u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,' + + '81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,' + + '8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,' + + '8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,' + + '8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,' + + '8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,' + + 'nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,' + + 'rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,' + + 'Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,' + + '80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,' + + '811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro', + 32 + ) + + //Some basic mappings for attributes and default values. + STYLES = { + strokeStyle: { + svgAttr: 'stroke', //corresponding svg attribute + canvas: '#000000', //canvas default + svg: 'none', //svg default + apply: 'stroke', //apply on stroke() or fill() + }, + fillStyle: { + svgAttr: 'fill', + canvas: '#000000', + svg: null, //svg default is black, but we need to special case this to handle canvas stroke without fill + apply: 'fill', + }, + lineCap: { + svgAttr: 'stroke-linecap', + canvas: 'butt', + svg: 'butt', + apply: 'stroke', + }, + lineJoin: { + svgAttr: 'stroke-linejoin', + canvas: 'miter', + svg: 'miter', + apply: 'stroke', + }, + miterLimit: { + svgAttr: 'stroke-miterlimit', + canvas: 10, + svg: 4, + apply: 'stroke', + }, + lineWidth: { + svgAttr: 'stroke-width', + canvas: 1, + svg: 1, + apply: 'stroke', + }, + globalAlpha: { + svgAttr: 'opacity', + canvas: 1, + svg: 1, + apply: 'fill stroke', + }, + font: { + //font converts to multiple svg attributes, there is custom logic for this + canvas: '10px sans-serif', + }, + shadowColor: { + canvas: '#000000', + }, + shadowOffsetX: { + canvas: 0, + }, + shadowOffsetY: { + canvas: 0, + }, + shadowBlur: { + canvas: 0, + }, + textAlign: { + canvas: 'start', + }, + textBaseline: { + canvas: 'alphabetic', + }, + lineDash: { + svgAttr: 'stroke-dasharray', + canvas: [], + svg: null, + apply: 'stroke', + }, + } + + /** + * + * @param gradientNode - reference to the gradient + * @constructor + */ + CanvasGradient = function (gradientNode, ctx) { + this.__root = gradientNode + this.__ctx = ctx + } + + /** + * Adds a color stop to the gradient root + */ + CanvasGradient.prototype.addColorStop = function (offset, color) { + var stop = this.__ctx.__createElement('stop'), + regex, + matches + stop.setAttribute('offset', offset) + if (color.indexOf('rgba') !== -1) { + //separate alpha value, since webkit can't handle it + regex = + /rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d?\.?\d*)\s*\)/gi + matches = regex.exec(color) + stop.setAttribute( + 'stop-color', + format('rgb({r},{g},{b})', { + r: matches[1], + g: matches[2], + b: matches[3], + }) + ) + stop.setAttribute('stop-opacity', matches[4]) + } else { + stop.setAttribute('stop-color', color) + } + this.__root.appendChild(stop) + } + + CanvasPattern = function (pattern, ctx) { + this.__root = pattern + this.__ctx = ctx + } + + /** + * The mock canvas context + * @param o - options include: + * ctx - existing Context2D to wrap around + * width - width of your canvas (defaults to 500) + * height - height of your canvas (defaults to 500) + * enableMirroring - enables canvas mirroring (get image data) (defaults to false) + * document - the document object (defaults to the current document) + */ + ctx = function (o) { + var defaultOptions = { + width: 500, + height: 500, + enableMirroring: false, + }, + options + + //keep support for this way of calling C2S: new C2S(width,height) + if (arguments.length > 1) { + options = defaultOptions + options.width = arguments[0] + options.height = arguments[1] + } else if (!o) { + options = defaultOptions + } else { + options = o + } + + if (!(this instanceof ctx)) { + //did someone call this without new? + return new ctx(options) + } + + //setup options + this.width = options.width || defaultOptions.width + this.height = options.height || defaultOptions.height + this.enableMirroring = + options.enableMirroring !== undefined + ? options.enableMirroring + : defaultOptions.enableMirroring + + this.canvas = this ///point back to this instance! + this.__document = options.document || document + + // allow passing in an existing context to wrap around + // if a context is passed in, we know a canvas already exist + if (options.ctx) { + this.__ctx = options.ctx + } else { + this.__canvas = this.__document.createElement('canvas') + this.__ctx = this.__canvas.getContext('2d') + } + + this.__setDefaultStyles() + this.__stack = [this.__getStyleState()] + this.__groupStack = [] + + //the root svg element + this.__root = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + 'svg' + ) + this.__root.setAttribute('version', 1.1) + this.__root.setAttribute('xmlns', 'http://www.w3.org/2000/svg') + this.__root.setAttributeNS( + 'http://www.w3.org/2000/xmlns/', + 'xmlns:xlink', + 'http://www.w3.org/1999/xlink' + ) + this.__root.setAttribute('width', this.width) + this.__root.setAttribute('height', this.height) + + //make sure we don't generate the same ids in defs + this.__ids = {} + + //defs tag + this.__defs = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + 'defs' + ) + this.__root.appendChild(this.__defs) + + //also add a group child. the svg element can't use the transform attribute + this.__currentElement = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + 'g' + ) + this.__root.appendChild(this.__currentElement) + } + + /** + * Creates the specified svg element + * @private + */ + ctx.prototype.__createElement = function ( + elementName, + properties, + resetFill + ) { + if (typeof properties === 'undefined') { + properties = {} + } + + var element = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + elementName + ), + keys = Object.keys(properties), + i, + key + if (resetFill) { + //if fill or stroke is not specified, the svg element should not display. By default SVG's fill is black. + element.setAttribute('fill', 'none') + element.setAttribute('stroke', 'none') + } + for (i = 0; i < keys.length; i++) { + key = keys[i] + element.setAttribute(key, properties[key]) + } + return element + } + + /** + * Applies default canvas styles to the context + * @private + */ + ctx.prototype.__setDefaultStyles = function () { + //default 2d canvas context properties see:http://www.w3.org/TR/2dcontext/ + var keys = Object.keys(STYLES), + i, + key + for (i = 0; i < keys.length; i++) { + key = keys[i] + this[key] = STYLES[key].canvas + } + } + + /** + * Applies styles on restore + * @param styleState + * @private + */ + ctx.prototype.__applyStyleState = function (styleState) { + var keys = Object.keys(styleState), + i, + key + for (i = 0; i < keys.length; i++) { + key = keys[i] + this[key] = styleState[key] + } + } + + /** + * Gets the current style state + * @return {Object} + * @private + */ + ctx.prototype.__getStyleState = function () { + var i, + styleState = {}, + keys = Object.keys(STYLES), + key + for (i = 0; i < keys.length; i++) { + key = keys[i] + styleState[key] = this[key] + } + return styleState + } + + /** + * Apples the current styles to the current SVG element. On "ctx.fill" or "ctx.stroke" + * @param type + * @private + */ + ctx.prototype.__applyStyleToCurrentElement = function (type) { + var currentElement = this.__currentElement + var currentStyleGroup = this.__currentElementsToStyle + if (currentStyleGroup) { + currentElement.setAttribute(type, '') + currentElement = currentStyleGroup.element + currentStyleGroup.children.forEach(function (node) { + node.setAttribute(type, '') + }) + } + + var keys = Object.keys(STYLES), + i, + style, + value, + id, + regex, + matches + for (i = 0; i < keys.length; i++) { + style = STYLES[keys[i]] + value = this[keys[i]] + if (style.apply) { + //is this a gradient or pattern? + if (value instanceof CanvasPattern) { + //pattern + if (value.__ctx) { + //copy over defs + while (value.__ctx.__defs.childNodes.length) { + id = + value.__ctx.__defs.childNodes[0].getAttribute( + 'id' + ) + this.__ids[id] = id + this.__defs.appendChild( + value.__ctx.__defs.childNodes[0] + ) + } + } + currentElement.setAttribute( + style.apply, + format('url(#{id})', { + id: value.__root.getAttribute('id'), + }) + ) + } else if (value instanceof CanvasGradient) { + //gradient + currentElement.setAttribute( + style.apply, + format('url(#{id})', { + id: value.__root.getAttribute('id'), + }) + ) + } else if ( + style.apply.indexOf(type) !== -1 && + style.svg !== value + ) { + if ( + (style.svgAttr === 'stroke' || + style.svgAttr === 'fill') && + value.indexOf('rgba') !== -1 + ) { + //separate alpha value, since illustrator can't handle it + regex = + /rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d?\.?\d*)\s*\)/gi + matches = regex.exec(value) + currentElement.setAttribute( + style.svgAttr, + format('rgb({r},{g},{b})', { + r: matches[1], + g: matches[2], + b: matches[3], + }) + ) + //should take globalAlpha here + var opacity = matches[4] + var globalAlpha = this.globalAlpha + if (globalAlpha != null) { + opacity *= globalAlpha + } + currentElement.setAttribute( + style.svgAttr + '-opacity', + opacity + ) + } else { + var attr = style.svgAttr + if (keys[i] === 'globalAlpha') { + attr = type + '-' + style.svgAttr + if (currentElement.getAttribute(attr)) { + //fill-opacity or stroke-opacity has already been set by stroke or fill. + continue + } + } + //otherwise only update attribute if right type, and not svg default + currentElement.setAttribute(attr, value) + } + } + } + } + } + + /** + * Will return the closest group or svg node. May return the current element. + * @private + */ + ctx.prototype.__closestGroupOrSvg = function (node) { + node = node || this.__currentElement + if (node.nodeName === 'g' || node.nodeName === 'svg') { + return node + } else { + return this.__closestGroupOrSvg(node.parentNode) + } + } + + /** + * Returns the serialized value of the svg so far + * @param fixNamedEntities - Standalone SVG doesn't support named entities, which document.createTextNode encodes. + * If true, we attempt to find all named entities and encode it as a numeric entity. + * @return serialized svg + */ + ctx.prototype.getSerializedSvg = function (fixNamedEntities) { + var serialized = new XMLSerializer().serializeToString(this.__root), + keys, + i, + key, + value, + regexp, + xmlns + + //IE search for a duplicate xmnls because they didn't implement setAttributeNS correctly + xmlns = + /xmlns="http:\/\/www\.w3\.org\/2000\/svg".+xmlns="http:\/\/www\.w3\.org\/2000\/svg/gi + if (xmlns.test(serialized)) { + serialized = serialized.replace( + 'xmlns="http://www.w3.org/2000/svg', + 'xmlns:xlink="http://www.w3.org/1999/xlink' + ) + } + + if (fixNamedEntities) { + keys = Object.keys(namedEntities) + //loop over each named entity and replace with the proper equivalent. + for (i = 0; i < keys.length; i++) { + key = keys[i] + value = namedEntities[key] + regexp = new RegExp(key, 'gi') + if (regexp.test(serialized)) { + serialized = serialized.replace(regexp, value) + } + } + } + + return serialized + } + + /** + * Returns the root svg + * @return + */ + ctx.prototype.getSvg = function () { + return this.__root + } + /** + * Will generate a group tag. + */ + ctx.prototype.save = function () { + var group = this.__createElement('g') + var parent = this.__closestGroupOrSvg() + this.__groupStack.push(parent) + parent.appendChild(group) + this.__currentElement = group + this.__stack.push(this.__getStyleState()) + } + /** + * Sets current element to parent, or just root if already root + */ + ctx.prototype.restore = function () { + this.__currentElement = this.__groupStack.pop() + this.__currentElementsToStyle = null + //Clearing canvas will make the poped group invalid, currentElement is set to the root group node. + if (!this.__currentElement) { + this.__currentElement = this.__root.childNodes[1] + } + var state = this.__stack.pop() + this.__applyStyleState(state) + } + + /** + * Helper method to add transform + * @private + */ + ctx.prototype.__addTransform = function (t) { + //if the current element has siblings, add another group + var parent = this.__closestGroupOrSvg() + if (parent.childNodes.length > 0) { + if (this.__currentElement.nodeName === 'path') { + if (!this.__currentElementsToStyle) + this.__currentElementsToStyle = { + element: parent, + children: [], + } + this.__currentElementsToStyle.children.push( + this.__currentElement + ) + this.__applyCurrentDefaultPath() + } + + var group = this.__createElement('g') + parent.appendChild(group) + this.__currentElement = group + } + + var transform = this.__currentElement.getAttribute('transform') + if (transform) { + transform += ' ' + } else { + transform = '' + } + transform += t + this.__currentElement.setAttribute('transform', transform) + } + + /** + * scales the current element + */ + ctx.prototype.scale = function (x, y) { + if (y === undefined) { + y = x + } + this.__addTransform(format('scale({x},{y})', { x: x, y: y })) + } + + /** + * rotates the current element + */ + ctx.prototype.rotate = function (angle) { + var degrees = (angle * 180) / Math.PI + this.__addTransform( + format('rotate({angle},{cx},{cy})', { + angle: degrees, + cx: 0, + cy: 0, + }) + ) + } + + /** + * translates the current element + */ + ctx.prototype.translate = function (x, y) { + this.__addTransform(format('translate({x},{y})', { x: x, y: y })) + } + + /** + * applies a transform to the current element + */ + ctx.prototype.transform = function (a, b, c, d, e, f) { + this.__addTransform( + format('matrix({a},{b},{c},{d},{e},{f})', { + a: a, + b: b, + c: c, + d: d, + e: e, + f: f, + }) + ) + } + + /** + * Create a new Path Element + */ + ctx.prototype.beginPath = function () { + var path, parent + + // Note that there is only one current default path, it is not part of the drawing state. + // See also: https://html.spec.whatwg.org/multipage/scripting.html#current-default-path + this.__currentDefaultPath = '' + this.__currentPosition = {} + + path = this.__createElement('path', {}, true) + parent = this.__closestGroupOrSvg() + parent.appendChild(path) + this.__currentElement = path + } + + /** + * Helper function to apply currentDefaultPath to current path element + * @private + */ + ctx.prototype.__applyCurrentDefaultPath = function () { + var currentElement = this.__currentElement + if (currentElement.nodeName === 'path') { + currentElement.setAttribute('d', this.__currentDefaultPath) + } else { + console.error( + 'Attempted to apply path command to node', + currentElement.nodeName + ) + } + } + + /** + * Helper function to add path command + * @private + */ + ctx.prototype.__addPathCommand = function (command) { + this.__currentDefaultPath += ' ' + this.__currentDefaultPath += command + } + + /** + * Adds the move command to the current path element, + * if the currentPathElement is not empty create a new path element + */ + ctx.prototype.moveTo = function (x, y) { + if (this.__currentElement.nodeName !== 'path') { + this.beginPath() + } + + // creates a new subpath with the given point + this.__currentPosition = { x: x, y: y } + this.__addPathCommand(format('M {x} {y}', { x: x, y: y })) + } + + /** + * Closes the current path + */ + ctx.prototype.closePath = function () { + if (this.__currentDefaultPath) { + this.__addPathCommand('Z') + } + } + + /** + * Adds a line to command + */ + ctx.prototype.lineTo = function (x, y) { + this.__currentPosition = { x: x, y: y } + if (this.__currentDefaultPath.indexOf('M') > -1) { + this.__addPathCommand(format('L {x} {y}', { x: x, y: y })) + } else { + this.__addPathCommand(format('M {x} {y}', { x: x, y: y })) + } + } + + /** + * Add a bezier command + */ + ctx.prototype.bezierCurveTo = function (cp1x, cp1y, cp2x, cp2y, x, y) { + this.__currentPosition = { x: x, y: y } + this.__addPathCommand( + format('C {cp1x} {cp1y} {cp2x} {cp2y} {x} {y}', { + cp1x: cp1x, + cp1y: cp1y, + cp2x: cp2x, + cp2y: cp2y, + x: x, + y: y, + }) + ) + } + + /** + * Adds a quadratic curve to command + */ + ctx.prototype.quadraticCurveTo = function (cpx, cpy, x, y) { + this.__currentPosition = { x: x, y: y } + this.__addPathCommand( + format('Q {cpx} {cpy} {x} {y}', { cpx: cpx, cpy: cpy, x: x, y: y }) + ) + } + + /** + * Return a new normalized vector of given vector + */ + var normalize = function (vector) { + var len = Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1]) + return [vector[0] / len, vector[1] / len] + } + + /** + * Adds the arcTo to the current path + * + * @see http://www.w3.org/TR/2015/WD-2dcontext-20150514/#dom-context-2d-arcto + */ + ctx.prototype.arcTo = function (x1, y1, x2, y2, radius) { + // Let the point (x0, y0) be the last point in the subpath. + var x0 = this.__currentPosition && this.__currentPosition.x + var y0 = this.__currentPosition && this.__currentPosition.y + + // First ensure there is a subpath for (x1, y1). + if (typeof x0 == 'undefined' || typeof y0 == 'undefined') { + return + } + + // Negative values for radius must cause the implementation to throw an IndexSizeError exception. + if (radius < 0) { + throw new Error( + 'IndexSizeError: The radius provided (' + + radius + + ') is negative.' + ) + } + + // If the point (x0, y0) is equal to the point (x1, y1), + // or if the point (x1, y1) is equal to the point (x2, y2), + // or if the radius radius is zero, + // then the method must add the point (x1, y1) to the subpath, + // and connect that point to the previous point (x0, y0) by a straight line. + if ( + (x0 === x1 && y0 === y1) || + (x1 === x2 && y1 === y2) || + radius === 0 + ) { + this.lineTo(x1, y1) + return + } + + // Otherwise, if the points (x0, y0), (x1, y1), and (x2, y2) all lie on a single straight line, + // then the method must add the point (x1, y1) to the subpath, + // and connect that point to the previous point (x0, y0) by a straight line. + var unit_vec_p1_p0 = normalize([x0 - x1, y0 - y1]) + var unit_vec_p1_p2 = normalize([x2 - x1, y2 - y1]) + if ( + unit_vec_p1_p0[0] * unit_vec_p1_p2[1] === + unit_vec_p1_p0[1] * unit_vec_p1_p2[0] + ) { + this.lineTo(x1, y1) + return + } + + // Otherwise, let The Arc be the shortest arc given by circumference of the circle that has radius radius, + // and that has one point tangent to the half-infinite line that crosses the point (x0, y0) and ends at the point (x1, y1), + // and that has a different point tangent to the half-infinite line that ends at the point (x1, y1), and crosses the point (x2, y2). + // The points at which this circle touches these two lines are called the start and end tangent points respectively. + + // note that both vectors are unit vectors, so the length is 1 + var cos = + unit_vec_p1_p0[0] * unit_vec_p1_p2[0] + + unit_vec_p1_p0[1] * unit_vec_p1_p2[1] + var theta = Math.acos(Math.abs(cos)) + + // Calculate origin + var unit_vec_p1_origin = normalize([ + unit_vec_p1_p0[0] + unit_vec_p1_p2[0], + unit_vec_p1_p0[1] + unit_vec_p1_p2[1], + ]) + var len_p1_origin = radius / Math.sin(theta / 2) + var x = x1 + len_p1_origin * unit_vec_p1_origin[0] + var y = y1 + len_p1_origin * unit_vec_p1_origin[1] + + // Calculate start angle and end angle + // rotate 90deg clockwise (note that y axis points to its down) + var unit_vec_origin_start_tangent = [ + -unit_vec_p1_p0[1], + unit_vec_p1_p0[0], + ] + // rotate 90deg counter clockwise (note that y axis points to its down) + var unit_vec_origin_end_tangent = [ + unit_vec_p1_p2[1], + -unit_vec_p1_p2[0], + ] + var getAngle = function (vector) { + // get angle (clockwise) between vector and (1, 0) + var x = vector[0] + var y = vector[1] + if (y >= 0) { + // note that y axis points to its down + return Math.acos(x) + } else { + return -Math.acos(x) + } + } + var startAngle = getAngle(unit_vec_origin_start_tangent) + var endAngle = getAngle(unit_vec_origin_end_tangent) + + // Connect the point (x0, y0) to the start tangent point by a straight line + this.lineTo( + x + unit_vec_origin_start_tangent[0] * radius, + y + unit_vec_origin_start_tangent[1] * radius + ) + + // Connect the start tangent point to the end tangent point by arc + // and adding the end tangent point to the subpath. + this.arc(x, y, radius, startAngle, endAngle) + } + + /** + * Sets the stroke property on the current element + */ + ctx.prototype.stroke = function () { + if (this.__currentElement.nodeName === 'path') { + this.__currentElement.setAttribute( + 'paint-order', + 'fill stroke markers' + ) + } + this.__applyCurrentDefaultPath() + this.__applyStyleToCurrentElement('stroke') + } + + /** + * Sets fill properties on the current element + */ + ctx.prototype.fill = function () { + if (this.__currentElement.nodeName === 'path') { + this.__currentElement.setAttribute( + 'paint-order', + 'stroke fill markers' + ) + } + this.__applyCurrentDefaultPath() + this.__applyStyleToCurrentElement('fill') + } + + /** + * Adds a rectangle to the path. + */ + ctx.prototype.rect = function (x, y, width, height) { + if (this.__currentElement.nodeName !== 'path') { + this.beginPath() + } + this.moveTo(x, y) + this.lineTo(x + width, y) + this.lineTo(x + width, y + height) + this.lineTo(x, y + height) + this.lineTo(x, y) + this.closePath() + } + + /** + * adds a rectangle element + */ + ctx.prototype.fillRect = function (x, y, width, height) { + var rect, parent + rect = this.__createElement( + 'rect', + { + x: x, + y: y, + width: width, + height: height, + }, + true + ) + parent = this.__closestGroupOrSvg() + parent.appendChild(rect) + this.__currentElement = rect + this.__applyStyleToCurrentElement('fill') + } + + /** + * Draws a rectangle with no fill + * @param x + * @param y + * @param width + * @param height + */ + ctx.prototype.strokeRect = function (x, y, width, height) { + var rect, parent + rect = this.__createElement( + 'rect', + { + x: x, + y: y, + width: width, + height: height, + }, + true + ) + parent = this.__closestGroupOrSvg() + parent.appendChild(rect) + this.__currentElement = rect + this.__applyStyleToCurrentElement('stroke') + } + + /** + * Clear entire canvas: + * 1. save current transforms + * 2. remove all the childNodes of the root g element + */ + ctx.prototype.__clearCanvas = function () { + var current = this.__closestGroupOrSvg(), + transform = current.getAttribute('transform') + var rootGroup = this.__root.childNodes[1] + var childNodes = rootGroup.childNodes + for (var i = childNodes.length - 1; i >= 0; i--) { + if (childNodes[i]) { + rootGroup.removeChild(childNodes[i]) + } + } + this.__currentElement = rootGroup + //reset __groupStack as all the child group nodes are all removed. + this.__groupStack = [] + if (transform) { + this.__addTransform(transform) + } + } + + /** + * "Clears" a canvas by just drawing a white rectangle in the current group. + */ + ctx.prototype.clearRect = function (x, y, width, height) { + //clear entire canvas + if ( + x === 0 && + y === 0 && + width === this.width && + height === this.height + ) { + this.__clearCanvas() + return + } + var rect, + parent = this.__closestGroupOrSvg() + rect = this.__createElement( + 'rect', + { + x: x, + y: y, + width: width, + height: height, + fill: '#FFFFFF', + }, + true + ) + parent.appendChild(rect) + } + + /** + * Adds a linear gradient to a defs tag. + * Returns a canvas gradient object that has a reference to it's parent def + */ + ctx.prototype.createLinearGradient = function (x1, y1, x2, y2) { + var grad = this.__createElement( + 'linearGradient', + { + id: randomString(this.__ids), + x1: x1 + 'px', + x2: x2 + 'px', + y1: y1 + 'px', + y2: y2 + 'px', + gradientUnits: 'userSpaceOnUse', + }, + false + ) + this.__defs.appendChild(grad) + return new CanvasGradient(grad, this) + } + + /** + * Adds a radial gradient to a defs tag. + * Returns a canvas gradient object that has a reference to it's parent def + */ + ctx.prototype.createRadialGradient = function (x0, y0, r0, x1, y1, r1) { + var grad = this.__createElement( + 'radialGradient', + { + id: randomString(this.__ids), + cx: x1 + 'px', + cy: y1 + 'px', + r: r1 + 'px', + fx: x0 + 'px', + fy: y0 + 'px', + gradientUnits: 'userSpaceOnUse', + }, + false + ) + this.__defs.appendChild(grad) + return new CanvasGradient(grad, this) + } + + /** + * Parses the font string and returns svg mapping + * @private + */ + ctx.prototype.__parseFont = function () { + var regex = + /^\s*(?=(?:(?:[-a-z]+\s*){0,2}(italic|oblique))?)(?=(?:(?:[-a-z]+\s*){0,2}(small-caps))?)(?=(?:(?:[-a-z]+\s*){0,2}(bold(?:er)?|lighter|[1-9]00))?)(?:(?:normal|\1|\2|\3)\s*){0,3}((?:xx?-)?(?:small|large)|medium|smaller|larger|[.\d]+(?:\%|in|[cem]m|ex|p[ctx]))(?:\s*\/\s*(normal|[.\d]+(?:\%|in|[cem]m|ex|p[ctx])))?\s*([-,\'\"\sa-z0-9]+?)\s*$/i + var fontPart = regex.exec(this.font) + var data = { + style: fontPart[1] || 'normal', + size: fontPart[4] || '10px', + family: fontPart[6] || 'sans-serif', + weight: fontPart[3] || 'normal', + decoration: fontPart[2] || 'normal', + href: null, + } + + //canvas doesn't support underline natively, but we can pass this attribute + if (this.__fontUnderline === 'underline') { + data.decoration = 'underline' + } + + //canvas also doesn't support linking, but we can pass this as well + if (this.__fontHref) { + data.href = this.__fontHref + } + + return data + } + + /** + * Helper to link text fragments + * @param font + * @param element + * @return {*} + * @private + */ + ctx.prototype.__wrapTextLink = function (font, element) { + if (font.href) { + var a = this.__createElement('a') + a.setAttributeNS( + 'http://www.w3.org/1999/xlink', + 'xlink:href', + font.href + ) + a.appendChild(element) + return a + } + return element + } + + /** + * Fills or strokes text + * @param text + * @param x + * @param y + * @param action - stroke or fill + * @private + */ + ctx.prototype.__applyText = function (text, x, y, action) { + var font = this.__parseFont(), + parent = this.__closestGroupOrSvg(), + textElement = this.__createElement( + 'text', + { + 'font-family': font.family, + 'font-size': font.size, + 'font-style': font.style, + 'font-weight': font.weight, + 'text-decoration': font.decoration, + x: x, + y: y, + 'text-anchor': getTextAnchor(this.textAlign), + 'dominant-baseline': getDominantBaseline(this.textBaseline), + }, + true + ) + + textElement.appendChild(this.__document.createTextNode(text)) + this.__currentElement = textElement + this.__applyStyleToCurrentElement(action) + parent.appendChild(this.__wrapTextLink(font, textElement)) + } + + /** + * Creates a text element + * @param text + * @param x + * @param y + */ + ctx.prototype.fillText = function (text, x, y) { + this.__applyText(text, x, y, 'fill') + } + + /** + * Strokes text + * @param text + * @param x + * @param y + */ + ctx.prototype.strokeText = function (text, x, y) { + this.__applyText(text, x, y, 'stroke') + } + + /** + * No need to implement this for svg. + * @param text + * @return {TextMetrics} + */ + ctx.prototype.measureText = function (text) { + this.__ctx.font = this.font + return this.__ctx.measureText(text) + } + + /** + * Arc command! + */ + ctx.prototype.arc = function ( + x, + y, + radius, + startAngle, + endAngle, + counterClockwise + ) { + // in canvas no circle is drawn if no angle is provided. + if (startAngle === endAngle) { + return + } + startAngle = startAngle % (2 * Math.PI) + endAngle = endAngle % (2 * Math.PI) + if (startAngle === endAngle) { + //circle time! subtract some of the angle so svg is happy (svg elliptical arc can't draw a full circle) + endAngle = + (endAngle + 2 * Math.PI - 0.001 * (counterClockwise ? -1 : 1)) % + (2 * Math.PI) + } + var endX = x + radius * Math.cos(endAngle), + endY = y + radius * Math.sin(endAngle), + startX = x + radius * Math.cos(startAngle), + startY = y + radius * Math.sin(startAngle), + sweepFlag = counterClockwise ? 0 : 1, + largeArcFlag = 0, + diff = endAngle - startAngle + + // https://github.com/gliffy/canvas2svg/issues/4 + if (diff < 0) { + diff += 2 * Math.PI + } + + if (counterClockwise) { + largeArcFlag = diff > Math.PI ? 0 : 1 + } else { + largeArcFlag = diff > Math.PI ? 1 : 0 + } + + this.lineTo(startX, startY) + this.__addPathCommand( + format( + 'A {rx} {ry} {xAxisRotation} {largeArcFlag} {sweepFlag} {endX} {endY}', + { + rx: radius, + ry: radius, + xAxisRotation: 0, + largeArcFlag: largeArcFlag, + sweepFlag: sweepFlag, + endX: endX, + endY: endY, + } + ) + ) + + this.__currentPosition = { x: endX, y: endY } + } + + /** + * Generates a ClipPath from the clip command. + */ + ctx.prototype.clip = function () { + var group = this.__closestGroupOrSvg(), + clipPath = this.__createElement('clipPath'), + id = randomString(this.__ids), + newGroup = this.__createElement('g') + + this.__applyCurrentDefaultPath() + group.removeChild(this.__currentElement) + clipPath.setAttribute('id', id) + clipPath.appendChild(this.__currentElement) + + this.__defs.appendChild(clipPath) + + //set the clip path to this group + group.setAttribute('clip-path', format('url(#{id})', { id: id })) + + //clip paths can be scaled and transformed, we need to add another wrapper group to avoid later transformations + // to this path + group.appendChild(newGroup) + + this.__currentElement = newGroup + } + + /** + * Draws a canvas, image or mock context to this canvas. + * Note that all svg dom manipulation uses node.childNodes rather than node.children for IE support. + * http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage + */ + ctx.prototype.drawImage = function () { + //convert arguments to a real array + var args = Array.prototype.slice.call(arguments), + image = args[0], + dx, + dy, + dw, + dh, + sx = 0, + sy = 0, + sw, + sh, + parent, + svg, + defs, + group, + currentElement, + svgImage, + canvas, + context, + id + + if (args.length === 3) { + dx = args[1] + dy = args[2] + sw = image.width + sh = image.height + dw = sw + dh = sh + } else if (args.length === 5) { + dx = args[1] + dy = args[2] + dw = args[3] + dh = args[4] + sw = image.width + sh = image.height + } else if (args.length === 9) { + sx = args[1] + sy = args[2] + sw = args[3] + sh = args[4] + dx = args[5] + dy = args[6] + dw = args[7] + dh = args[8] + } else { + throw new Error( + 'Invalid number of arguments passed to drawImage: ' + + arguments.length + ) + } + + parent = this.__closestGroupOrSvg() + currentElement = this.__currentElement + var translateDirective = 'translate(' + dx + ', ' + dy + ')' + if (image instanceof ctx) { + //canvas2svg mock canvas context. In the future we may want to clone nodes instead. + //also I'm currently ignoring dw, dh, sw, sh, sx, sy for a mock context. + svg = image.getSvg().cloneNode(true) + if (svg.childNodes && svg.childNodes.length > 1) { + defs = svg.childNodes[0] + while (defs.childNodes.length) { + id = defs.childNodes[0].getAttribute('id') + this.__ids[id] = id + this.__defs.appendChild(defs.childNodes[0]) + } + group = svg.childNodes[1] + if (group) { + //save original transform + var originTransform = group.getAttribute('transform') + var transformDirective + if (originTransform) { + transformDirective = + originTransform + ' ' + translateDirective + } else { + transformDirective = translateDirective + } + group.setAttribute('transform', transformDirective) + parent.appendChild(group) + } + } + } else if (image.nodeName === 'CANVAS' || image.nodeName === 'IMG') { + //canvas or image + svgImage = this.__createElement('image') + svgImage.setAttribute('width', dw) + svgImage.setAttribute('height', dh) + svgImage.setAttribute('preserveAspectRatio', 'none') + + if (sx || sy || sw !== image.width || sh !== image.height) { + //crop the image using a temporary canvas + canvas = this.__document.createElement('canvas') + canvas.width = dw + canvas.height = dh + context = canvas.getContext('2d') + context.drawImage(image, sx, sy, sw, sh, 0, 0, dw, dh) + image = canvas + } + svgImage.setAttribute('transform', translateDirective) + svgImage.setAttributeNS( + 'http://www.w3.org/1999/xlink', + 'xlink:href', + image.nodeName === 'CANVAS' + ? image.toDataURL() + : image.getAttribute('src') + ) + parent.appendChild(svgImage) + } + } + + /** + * Generates a pattern tag + */ + ctx.prototype.createPattern = function (image, repetition) { + var pattern = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + 'pattern' + ), + id = randomString(this.__ids), + img + pattern.setAttribute('id', id) + pattern.setAttribute('width', image.width) + pattern.setAttribute('height', image.height) + if (image.nodeName === 'CANVAS' || image.nodeName === 'IMG') { + img = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + 'image' + ) + img.setAttribute('width', image.width) + img.setAttribute('height', image.height) + img.setAttributeNS( + 'http://www.w3.org/1999/xlink', + 'xlink:href', + image.nodeName === 'CANVAS' + ? image.toDataURL() + : image.getAttribute('src') + ) + pattern.appendChild(img) + this.__defs.appendChild(pattern) + } else if (image instanceof ctx) { + pattern.appendChild(image.__root.childNodes[1]) + this.__defs.appendChild(pattern) + } + return new CanvasPattern(pattern, this) + } + + ctx.prototype.setLineDash = function (dashArray) { + if (dashArray && dashArray.length > 0) { + this.lineDash = dashArray.join(',') + } else { + this.lineDash = null + } + } + + /** + * Not yet implemented + */ + ctx.prototype.drawFocusRing = function () {} + ctx.prototype.createImageData = function () {} + ctx.prototype.getImageData = function () {} + ctx.prototype.putImageData = function () {} + ctx.prototype.globalCompositeOperation = function () {} + ctx.prototype.setTransform = function () {} + + //add options for alternative namespace + if (typeof window === 'object') { + window.C2S = ctx + } + + // CommonJS/Browserify + if (typeof module === 'object' && typeof module.exports === 'object') { + module.exports = ctx + } +})() diff --git a/v0/src/simulator/vendor/images/ui-icons_444444_256x240.png b/v0/src/simulator/vendor/images/ui-icons_444444_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..8cc6f5db46457a0311d6c47791c1fc50243dc560 GIT binary patch literal 5005 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 F_FpV)`5XWM literal 0 HcmV?d00001 diff --git a/v0/src/simulator/vendor/images/ui-icons_555555_256x240.png b/v0/src/simulator/vendor/images/ui-icons_555555_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..c852a05639215f2fac0bafa2e574f6ecaca42042 GIT binary patch literal 5004 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 yf8ucF_Y3BpEK-@g6(007`S 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 DC)F%1 literal 0 HcmV?d00001 diff --git a/v0/src/simulator/vendor/images/ui-icons_777777_256x240.png b/v0/src/simulator/vendor/images/ui-icons_777777_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..e055acb943dea40e2443715ea6615b873561c7c7 GIT binary patch literal 4990 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 iJ2zWZK?(E((Gcn*faPR;C06Z5A z&zl1PWWNclAlUZn;R_dc_6f{g+gKX_-X?PGIn5Vwd--Q!#U;9b9PUfUvIWXYb(d9*?R-e!1XKJAf2^`&$*uX;M68oxnaMH?C#4g-c1+aj%7YHUiD zraD$(_r$x;ZCyf?;kvV6D-4Ra{n1qs!1hBU`|#>OX8luGB`zIkU(oH?kt#>fV@E|x z{2ptn5C$d+b+X3X%wRkS9UiB*W!%5Y$KjpI!$tD6riy6Ta)~D-{J;hg;$;r4M0+%K zN)=#bT_TuU5KGMiE2w^!B1Q5=)W1+#hZPU=J-Sv79}7%{L<0ffiE}e-1yK~to#JG* zqXYrMQlme0@@4t)Movl-{p}E;Ess|FG2F>OUk}bJ`cO#L0)`9Yk$iSUHY|QdWd{)d zuKE~T#UNQVyUwz?6mWXks0H^Kg#Wj`jq+>$vz8bwyF#enJknww8ZJn#Z7^0m-wB^o zt_Ug+TeP2_q$~O0Wvw6v*S8r(s!@p2j>07E2RL&%!X0or$}glbU$&}9w5CDoxb6c0 z@o`jEez%5~Z&63sZjr|!0%xVby*77dio(e*LFv;Gn@(tHK^>&&h;F|09D5ssXr6hf zS~?2pkr1o~V1G3EAEL%silp||*4XxcSLylT=O=SZvg#}6(>1K*<65UMSB0yCD-Rs= z4JT>vU9tdDxHQz?MOjk)V{r3RPsbB;5D`QE?4 z60uv50x1#a-(|w(S3&_xY-Fcp+~Hh2dx>+C|Mm!{N3*dEL{NUR%!h%o`t|fVyjV}o zKjyT#tkmi9Oaz1_mH6fCD5rqH0^2cYK$6v+0C&vk=SC$jRT;sw?6HaWQYeAoD35z4 zt158)r#%l}1miS<;+3KIXJndpvcJ#$$BbJ-r8lt@^)X(AvE^;zwmgH_YXSN^jSj+F zlh5$0^z@7-rQd*f*168N%j!1q$1khARtC`FlLowmY`6Tz`e2DvCFTV({1jL`3h->f z(s?;HYO21-1G45)g+{Y?Hyb-#0-Sa0j4OdPLk2;*%3J!UBSrUQ_%*dFb{p2<`Yihm)BQuhaQOK5 z5!1HR3DzKP@*4h~L|#XH%nQx&xBxFwtzXI-Wv@z&Z~gWqAt1Wyg9(^0e0eHirLE3v z%o>#HehsU2RX^Y9u({Rk?c2IXeWSp|qi}wr;-g)KTZNyQ)uAvr;$xg|xgp?IJ5%SL)R^()*29AxPl0jH0cF|J5NCaN&CMeC@O??BB$4EL6iv~2Mr?JzD=CTI9( z-xFjWip0WtL9e{<3TJ$krdVcj31)55*6F%hkVl?owy(yL6r;i;BiX`afIIggIa;VJ z#tqKb813_ox*;1av0q|ZYLFTm6@eU(=Fp4?!IhJprVkYS`@4D#z|FfI3c}s&i3tgf zX|G)&JL9C+p=l_y_E2cTjbmrppjgHGwPuDoxP+jliEAfB|p8w>?@o+?^Uz zC3KPmcd!U$`D$C!Uy;9@V{s!cm&>zpJ$AGe8_*b6z)4@L;X4+shchW|-30=I4B@&sDfT z9X;7VRR9!>!j=@J#F+1hv-?_8+ZARy z+Ai8N%qHw3U#0>Q&+a(6$aY%I<#t|a(&wrK-;Xcji*7-GE&}rO_7-ZFw1(u=A1$G3 ztH+>LQ|7?j2`lX-hN?J+%+WK_LStL({Sm7Ng#GFb;_ouT1r|+&INp(J+lR+~3zW>W zQ`i@q@sk1s=H-s#UXU?^a<4!c_?H{R;4>6;=(m}2)~{D1+mG#+*KHVeg#_Wx z)58$540!F60cXJ4%Cu>JYay%oN-NC8%=P)f9hsGA#xAljP1dvS(Xxtoish2!B$5we zOit}V=`1O9e`+Bp@*38)A=<=Sj97kpu){z*KGcs$UdH2g`M#OB59jeZW~VD3KPGbmP||+0h!!TmrCv-5ksaEv%uf z4w>3QE&g;tTW#+r6q+P!PPHWMe&(ZJC!%V{0pueEyD%*G{h-UKM~d8Fzml8XwYfj| zk~ceeA=uS$!M{-i=srsuERvM8{-Z(7=s5hcv5y~%pPQm~5pqL2SGt2AP*K<@V#CgF z+wB8a-7OdJ+RWQq5RE`6-!DPaQ=%H*y1z@?LXhhyr0O-OqTR38xX zjBp}+tY2lD4h*5L5~uHX#{7gKm8#@=-Z)DgrO*c!v+Y{#*w49nmmEhorT9H?Ux5zl zgMRP21#Gr{rXK|5=znA~v{;jOu4KLdy(8TH)F3YH2#a>ba=IMSH&0%*!LMljJ&`=zKkm+xx z)Wekt8Xp%1;&$v}Q)7S}nixYBm+&A?X^e_W`1VD-PfMXM3E!9itves8tS5G_$-=itmypK9I4u3W3;m*C!uY_ZCOWpuZ&K`J zmMQseO+6~GZ+`0sHSUC)>^PQ?)-~sorb`gB+fpRGM3&`ZHOT4lt(nk>Y}lG#s(zpy^-~&IHRrPuJqnAg+~p8dKUE` zbq;>V*23}Gxy%YfmL*VZ zGntw@#B{y6K`S1ppBM}CaC_P~+$fa04YI04Mhb~DU(2V$MyL=)gR+z1LowhG)}U?1 zAUQ_x=Fe~moFw_|$6^js!$A5URZMZ=Q6Fpo1~$p!6f&)ljC4wbc^ zfry`ca^uAg7}XaAO6K-m56dXJJZuVv80p{2B;QxE#nGMj7|^GfeOSbT zksdsU&6@Ct_YX3S-|ipf6ny(Va;hU6SG+uwelU9B;Iq?HPY@fB3;~j7<;+p$OT4d* zh{Ik`imxHj%IKdPS3a3v@I*+rR7&%j&+!4_`jAm?Dw~tcI64R9H%oC1i1kkXA%okw ziAS5ocIJ*H6kMD=mwN4_g{n))$H*w?MV$TMV0De=Ma>2_IUscuR+X{wPH#RHs1r*= zn&oJTq!fh47woJG$Pt7-uWX+}$!{3r5=BacAe#FYg@8&qq?{03S2p;3xoYY%VSx$$ zlW8vLZ>yK4CoIySv{Zt2PEexVlNnHG#mH2ro+CtGEb5%3@eLTcO~1;6b;#4O&AX=Gg+a!x-?Kq^T#%W z@;ffC%&|G7BTub8`OVWMvKIKKs66P%QuSAv_Ga6?k!0F$2RyDM*v8$HR88L$-42W; zoOz&}Fnh^8AMfrS;HOqWv-ese=C;|-1pNNYlrRi=U+cdND@^2HKRh?IqFOI)T{*6L z%@GpLjLtC&2-C-vW4AX~j|Vy|(6CU{ycC%iYDcS86sm7%(a{k>i@w_{X+UL7Gz@%r z?`#Zng2B_1N!CK+Vf*7HA-g+(0d;2Xs??hzZ^@9_()^lU`H69%5;rj@l1h|?@b70d6a>Zy z1a8+OUhnNkj2kRmHtvn5`1w+>pTkZ8S`i}jcNFi#>g@N;RoKgXS-Itg?yIFNzVe=} zi)|^K^sPUbA2ePrI>SMU`G(!%(`bHTEHK29=>FrwB;JytoXuifx)fG@TEuKQEMyZu z04=KD%TItxGb;!9(2NOLtt@1EZ?M9lTWWiJ330h0n|E)=?Z1c*ll82~E{8xvQf~;O%zT{f`m=xS(fpzDS1<@n5>c B6-WR8 literal 0 HcmV?d00001 diff --git a/v0/src/simulator/vendor/images/ui-icons_ffffff_256x240.png b/v0/src/simulator/vendor/images/ui-icons_ffffff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..7e4d1d08ebe2e9422b7266a529378ae6a1b2bd7b GIT binary patch literal 4948 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 YxHvcmUH!x5cdHAW)HTs5)gnjy4|6WDzyJUM literal 0 HcmV?d00001 diff --git a/v0/src/simulator/vendor/jquery-ui.min.css b/v0/src/simulator/vendor/jquery-ui.min.css new file mode 100644 index 00000000..4c702d0f --- /dev/null +++ b/v0/src/simulator/vendor/jquery-ui.min.css @@ -0,0 +1,1137 @@ +/*! jQuery UI - v1.13.1 - 2022-01-22 +* http://jqueryui.com +* Includes: draggable.css, core.css, resizable.css, sortable.css, accordion.css, button.css, controlgroup.css, checkboxradio.css, dialog.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-draggable-handle { + -ms-touch-action: none; + touch-action: none; +} +.ui-helper-hidden { + display: none; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.ui-helper-reset { + margin: 0; + padding: 0; + border: 0; + outline: 0; + line-height: 1.3; + text-decoration: none; + font-size: 100%; + list-style: none; +} +.ui-helper-clearfix:before, +.ui-helper-clearfix:after { + content: ''; + display: table; + border-collapse: collapse; +} +.ui-helper-clearfix:after { + clear: both; +} +.ui-helper-zfix { + width: 100%; + height: 100%; + top: 0; + left: 0; + position: absolute; + opacity: 0; + -ms-filter: 'alpha(opacity=0)'; +} +.ui-front { + z-index: 100; +} +.ui-state-disabled { + cursor: default !important; + pointer-events: none; +} +.ui-icon { + display: inline-block; + vertical-align: middle; + margin-top: -0.25em; + position: relative; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; +} +.ui-widget-icon-block { + left: 50%; + margin-left: -8px; + display: block; +} +.ui-widget-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.ui-resizable { + position: relative; +} +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + display: block; + -ms-touch-action: none; + touch-action: none; +} +.ui-resizable-disabled .ui-resizable-handle, +.ui-resizable-autohide .ui-resizable-handle { + display: none; +} +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0; +} +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0; +} +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0; + height: 100%; +} +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0; + height: 100%; +} +.ui-resizable-se { + cursor: se-resize; + width: 12px; + height: 12px; + right: 1px; + bottom: 1px; +} +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: -5px; + bottom: -5px; +} +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: -5px; + top: -5px; +} +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: -5px; + top: -5px; +} +.ui-sortable-handle { + -ms-touch-action: none; + touch-action: none; +} +.ui-accordion .ui-accordion-header { + display: block; + cursor: pointer; + position: relative; + margin: 2px 0 0 0; + padding: 0.5em 0.5em 0.5em 0.7em; + font-size: 100%; +} +.ui-accordion .ui-accordion-content { + padding: 1em 2.2em; + border-top: 0; + overflow: auto; +} +.ui-button { + padding: 0.4em 1em; + display: inline-block; + position: relative; + line-height: normal; + margin-right: 0.1em; + cursor: pointer; + vertical-align: middle; + text-align: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + overflow: visible; +} +.ui-button, +.ui-button:link, +.ui-button:visited, +.ui-button:hover, +.ui-button:active { + text-decoration: none; +} +.ui-button-icon-only { + width: 2em; + box-sizing: border-box; + text-indent: -9999px; + white-space: nowrap; +} +input.ui-button.ui-button-icon-only { + text-indent: 0; +} +.ui-button-icon-only .ui-icon { + position: absolute; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; +} +.ui-button.ui-icon-notext .ui-icon { + padding: 0; + width: 2.1em; + height: 2.1em; + text-indent: -9999px; + white-space: nowrap; +} +input.ui-button.ui-icon-notext .ui-icon { + width: auto; + height: auto; + text-indent: 0; + white-space: normal; + padding: 0.4em 1em; +} +input.ui-button::-moz-focus-inner, +button.ui-button::-moz-focus-inner { + border: 0; + padding: 0; +} +.ui-controlgroup { + vertical-align: middle; + display: inline-block; +} +.ui-controlgroup > .ui-controlgroup-item { + float: left; + margin-left: 0; + margin-right: 0; +} +.ui-controlgroup > .ui-controlgroup-item:focus, +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus { + z-index: 9999; +} +.ui-controlgroup-vertical > .ui-controlgroup-item { + display: block; + float: none; + width: 100%; + margin-top: 0; + margin-bottom: 0; + text-align: left; +} +.ui-controlgroup-vertical .ui-controlgroup-item { + box-sizing: border-box; +} +.ui-controlgroup .ui-controlgroup-label { + padding: 0.4em 1em; +} +.ui-controlgroup .ui-controlgroup-label span { + font-size: 80%; +} +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item { + border-left: none; +} +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item { + border-top: none; +} +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content { + border-right: none; +} +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content { + border-bottom: none; +} +.ui-controlgroup-vertical .ui-spinner-input { + width: 75%; + width: calc(100% - 2.4em); +} +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up { + border-top-style: solid; +} +.ui-checkboxradio-label .ui-icon-background { + box-shadow: inset 1px 1px 1px #ccc; + border-radius: 0.12em; + border: none; +} +.ui-checkboxradio-radio-label .ui-icon-background { + width: 16px; + height: 16px; + border-radius: 1em; + overflow: visible; + border: none; +} +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon, +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon { + background-image: none; + width: 8px; + height: 8px; + border-width: 4px; + border-style: solid; +} +.ui-checkboxradio-disabled { + pointer-events: none; +} +.ui-dialog { + position: absolute; + top: 0; + left: 0; + padding: 0.2em; + outline: 0; +} +.ui-dialog .ui-dialog-titlebar { + padding: 0.4em 1em; + position: relative; +} +.ui-dialog .ui-dialog-title { + float: left; + margin: 0.1em 0; + white-space: nowrap; + width: 90%; + overflow: hidden; + text-overflow: ellipsis; +} +.ui-dialog .ui-dialog-titlebar-close { + position: absolute; + right: 0.3em; + top: 50%; + width: 20px; + margin: -10px 0 0 0; + padding: 1px; + height: 20px; +} +.ui-dialog .ui-dialog-content { + position: relative; + border: 0; + padding: 0.5em 1em; + background: none; + overflow: auto; +} +.ui-dialog .ui-dialog-buttonpane { + text-align: left; + border-width: 1px 0 0 0; + background-image: none; + margin-top: 0.5em; + padding: 0.3em 1em 0.5em 0.4em; +} +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { + float: right; +} +.ui-dialog .ui-dialog-buttonpane button { + margin: 0.5em 0.4em 0.5em 0; + cursor: pointer; +} +.ui-dialog .ui-resizable-n { + height: 2px; + top: 0; +} +.ui-dialog .ui-resizable-e { + width: 2px; + right: 0; +} +.ui-dialog .ui-resizable-s { + height: 2px; + bottom: 0; +} +.ui-dialog .ui-resizable-w { + width: 2px; + left: 0; +} +.ui-dialog .ui-resizable-se, +.ui-dialog .ui-resizable-sw, +.ui-dialog .ui-resizable-ne, +.ui-dialog .ui-resizable-nw { + width: 7px; + height: 7px; +} +.ui-dialog .ui-resizable-se { + right: 0; + bottom: 0; +} +.ui-dialog .ui-resizable-sw { + left: 0; + bottom: 0; +} +.ui-dialog .ui-resizable-ne { + right: 0; + top: 0; +} +.ui-dialog .ui-resizable-nw { + left: 0; + top: 0; +} +.ui-draggable .ui-dialog-titlebar { + cursor: move; +} +.ui-widget { + font-family: Arial, Helvetica, sans-serif; + font-size: 1em; +} +.ui-widget .ui-widget { + font-size: 1em; +} +.ui-widget input, +.ui-widget select, +.ui-widget textarea, +.ui-widget button { + font-family: Arial, Helvetica, sans-serif; + font-size: 1em; +} +.ui-widget.ui-widget-content { + border: 1px solid #c5c5c5; +} +.ui-widget-content { + border: 1px solid #ddd; + background: #fff; + color: #333; +} +.ui-widget-content a { + color: #333; +} +.ui-widget-header { + border: 1px solid #ddd; + background: #e9e9e9; + color: #333; + font-weight: bold; +} +.ui-widget-header a { + color: #333; +} +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default, +.ui-button, +html .ui-button.ui-state-disabled:hover, +html .ui-button.ui-state-disabled:active { + border: 1px solid #c5c5c5; + background: #f6f6f6; + font-weight: normal; + color: #454545; +} +.ui-state-default a, +.ui-state-default a:link, +.ui-state-default a:visited, +a.ui-button, +a:link.ui-button, +a:visited.ui-button, +.ui-button { + color: #454545; + text-decoration: none; +} +.ui-state-hover, +.ui-widget-content .ui-state-hover, +.ui-widget-header .ui-state-hover, +.ui-state-focus, +.ui-widget-content .ui-state-focus, +.ui-widget-header .ui-state-focus, +.ui-button:hover, +.ui-button:focus { + border: 1px solid #ccc; + background: #ededed; + font-weight: normal; + color: #2b2b2b; +} +.ui-state-hover a, +.ui-state-hover a:hover, +.ui-state-hover a:link, +.ui-state-hover a:visited, +.ui-state-focus a, +.ui-state-focus a:hover, +.ui-state-focus a:link, +.ui-state-focus a:visited, +a.ui-button:hover, +a.ui-button:focus { + color: #2b2b2b; + text-decoration: none; +} +.ui-visual-focus { + box-shadow: 0 0 3px 1px rgb(94, 158, 214); +} +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active, +a.ui-button:active, +.ui-button:active, +.ui-button.ui-state-active:hover { + border: 1px solid #003eff; + background: #007fff; + font-weight: normal; + color: #fff; +} +.ui-icon-background, +.ui-state-active .ui-icon-background { + border: #003eff; + background-color: #fff; +} +.ui-state-active a, +.ui-state-active a:link, +.ui-state-active a:visited { + color: #fff; + text-decoration: none; +} +.ui-state-highlight, +.ui-widget-content .ui-state-highlight, +.ui-widget-header .ui-state-highlight { + border: 1px solid #dad55e; + background: #fffa90; + color: #777620; +} +.ui-state-checked { + border: 1px solid #dad55e; + background: #fffa90; +} +.ui-state-highlight a, +.ui-widget-content .ui-state-highlight a, +.ui-widget-header .ui-state-highlight a { + color: #777620; +} +.ui-state-error, +.ui-widget-content .ui-state-error, +.ui-widget-header .ui-state-error { + border: 1px solid #f1a899; + background: #fddfdf; + color: #5f3f3f; +} +.ui-state-error a, +.ui-widget-content .ui-state-error a, +.ui-widget-header .ui-state-error a { + color: #5f3f3f; +} +.ui-state-error-text, +.ui-widget-content .ui-state-error-text, +.ui-widget-header .ui-state-error-text { + color: #5f3f3f; +} +.ui-priority-primary, +.ui-widget-content .ui-priority-primary, +.ui-widget-header .ui-priority-primary { + font-weight: bold; +} +.ui-priority-secondary, +.ui-widget-content .ui-priority-secondary, +.ui-widget-header .ui-priority-secondary { + opacity: 0.7; + -ms-filter: 'alpha(opacity=70)'; + font-weight: normal; +} +.ui-state-disabled, +.ui-widget-content .ui-state-disabled, +.ui-widget-header .ui-state-disabled { + opacity: 0.35; + -ms-filter: 'alpha(opacity=35)'; + background-image: none; +} +.ui-state-disabled .ui-icon { + -ms-filter: 'alpha(opacity=35)'; +} +.ui-icon { + width: 16px; + height: 16px; +} +.ui-icon, +.ui-widget-content .ui-icon { + background-image: url('images/ui-icons_444444_256x240.png'); +} +.ui-widget-header .ui-icon { + background-image: url('images/ui-icons_444444_256x240.png'); +} +.ui-state-hover .ui-icon, +.ui-state-focus .ui-icon, +.ui-button:hover .ui-icon, +.ui-button:focus .ui-icon { + background-image: url('images/ui-icons_555555_256x240.png'); +} +.ui-state-active .ui-icon, +.ui-button:active .ui-icon { + background-image: url('images/ui-icons_ffffff_256x240.png'); +} +.ui-state-highlight .ui-icon, +.ui-button .ui-state-highlight.ui-icon { + background-image: url('images/ui-icons_777620_256x240.png'); +} +.ui-state-error .ui-icon, +.ui-state-error-text .ui-icon { + background-image: url('images/ui-icons_cc0000_256x240.png'); +} +.ui-button .ui-icon { + background-image: url('images/ui-icons_777777_256x240.png'); +} +.ui-icon-blank.ui-icon-blank.ui-icon-blank { + background-image: none; +} +.ui-icon-caret-1-n { + background-position: 0 0; +} +.ui-icon-caret-1-ne { + background-position: -16px 0; +} +.ui-icon-caret-1-e { + background-position: -32px 0; +} +.ui-icon-caret-1-se { + background-position: -48px 0; +} +.ui-icon-caret-1-s { + background-position: -65px 0; +} +.ui-icon-caret-1-sw { + background-position: -80px 0; +} +.ui-icon-caret-1-w { + background-position: -96px 0; +} +.ui-icon-caret-1-nw { + background-position: -112px 0; +} +.ui-icon-caret-2-n-s { + background-position: -128px 0; +} +.ui-icon-caret-2-e-w { + background-position: -144px 0; +} +.ui-icon-triangle-1-n { + background-position: 0 -16px; +} +.ui-icon-triangle-1-ne { + background-position: -16px -16px; +} +.ui-icon-triangle-1-e { + background-position: -32px -16px; +} +.ui-icon-triangle-1-se { + background-position: -48px -16px; +} +.ui-icon-triangle-1-s { + background-position: -65px -16px; +} +.ui-icon-triangle-1-sw { + background-position: -80px -16px; +} +.ui-icon-triangle-1-w { + background-position: -96px -16px; +} +.ui-icon-triangle-1-nw { + background-position: -112px -16px; +} +.ui-icon-triangle-2-n-s { + background-position: -128px -16px; +} +.ui-icon-triangle-2-e-w { + background-position: -144px -16px; +} +.ui-icon-arrow-1-n { + background-position: 0 -32px; +} +.ui-icon-arrow-1-ne { + background-position: -16px -32px; +} +.ui-icon-arrow-1-e { + background-position: -32px -32px; +} +.ui-icon-arrow-1-se { + background-position: -48px -32px; +} +.ui-icon-arrow-1-s { + background-position: -65px -32px; +} +.ui-icon-arrow-1-sw { + background-position: -80px -32px; +} +.ui-icon-arrow-1-w { + background-position: -96px -32px; +} +.ui-icon-arrow-1-nw { + background-position: -112px -32px; +} +.ui-icon-arrow-2-n-s { + background-position: -128px -32px; +} +.ui-icon-arrow-2-ne-sw { + background-position: -144px -32px; +} +.ui-icon-arrow-2-e-w { + background-position: -160px -32px; +} +.ui-icon-arrow-2-se-nw { + background-position: -176px -32px; +} +.ui-icon-arrowstop-1-n { + background-position: -192px -32px; +} +.ui-icon-arrowstop-1-e { + background-position: -208px -32px; +} +.ui-icon-arrowstop-1-s { + background-position: -224px -32px; +} +.ui-icon-arrowstop-1-w { + background-position: -240px -32px; +} +.ui-icon-arrowthick-1-n { + background-position: 1px -48px; +} +.ui-icon-arrowthick-1-ne { + background-position: -16px -48px; +} +.ui-icon-arrowthick-1-e { + background-position: -32px -48px; +} +.ui-icon-arrowthick-1-se { + background-position: -48px -48px; +} +.ui-icon-arrowthick-1-s { + background-position: -64px -48px; +} +.ui-icon-arrowthick-1-sw { + background-position: -80px -48px; +} +.ui-icon-arrowthick-1-w { + background-position: -96px -48px; +} +.ui-icon-arrowthick-1-nw { + background-position: -112px -48px; +} +.ui-icon-arrowthick-2-n-s { + background-position: -128px -48px; +} +.ui-icon-arrowthick-2-ne-sw { + background-position: -144px -48px; +} +.ui-icon-arrowthick-2-e-w { + background-position: -160px -48px; +} +.ui-icon-arrowthick-2-se-nw { + background-position: -176px -48px; +} +.ui-icon-arrowthickstop-1-n { + background-position: -192px -48px; +} +.ui-icon-arrowthickstop-1-e { + background-position: -208px -48px; +} +.ui-icon-arrowthickstop-1-s { + background-position: -224px -48px; +} +.ui-icon-arrowthickstop-1-w { + background-position: -240px -48px; +} +.ui-icon-arrowreturnthick-1-w { + background-position: 0 -64px; +} +.ui-icon-arrowreturnthick-1-n { + background-position: -16px -64px; +} +.ui-icon-arrowreturnthick-1-e { + background-position: -32px -64px; +} +.ui-icon-arrowreturnthick-1-s { + background-position: -48px -64px; +} +.ui-icon-arrowreturn-1-w { + background-position: -64px -64px; +} +.ui-icon-arrowreturn-1-n { + background-position: -80px -64px; +} +.ui-icon-arrowreturn-1-e { + background-position: -96px -64px; +} +.ui-icon-arrowreturn-1-s { + background-position: -112px -64px; +} +.ui-icon-arrowrefresh-1-w { + background-position: -128px -64px; +} +.ui-icon-arrowrefresh-1-n { + background-position: -144px -64px; +} +.ui-icon-arrowrefresh-1-e { + background-position: -160px -64px; +} +.ui-icon-arrowrefresh-1-s { + background-position: -176px -64px; +} +.ui-icon-arrow-4 { + background-position: 0 -80px; +} +.ui-icon-arrow-4-diag { + background-position: -16px -80px; +} +.ui-icon-extlink { + background-position: -32px -80px; +} +.ui-icon-newwin { + background-position: -48px -80px; +} +.ui-icon-refresh { + background-position: -64px -80px; +} +.ui-icon-shuffle { + background-position: -80px -80px; +} +.ui-icon-transfer-e-w { + background-position: -96px -80px; +} +.ui-icon-transferthick-e-w { + background-position: -112px -80px; +} +.ui-icon-folder-collapsed { + background-position: 0 -96px; +} +.ui-icon-folder-open { + background-position: -16px -96px; +} +.ui-icon-document { + background-position: -32px -96px; +} +.ui-icon-document-b { + background-position: -48px -96px; +} +.ui-icon-note { + background-position: -64px -96px; +} +.ui-icon-mail-closed { + background-position: -80px -96px; +} +.ui-icon-mail-open { + background-position: -96px -96px; +} +.ui-icon-suitcase { + background-position: -112px -96px; +} +.ui-icon-comment { + background-position: -128px -96px; +} +.ui-icon-person { + background-position: -144px -96px; +} +.ui-icon-print { + background-position: -160px -96px; +} +.ui-icon-trash { + background-position: -176px -96px; +} +.ui-icon-locked { + background-position: -192px -96px; +} +.ui-icon-unlocked { + background-position: -208px -96px; +} +.ui-icon-bookmark { + background-position: -224px -96px; +} +.ui-icon-tag { + background-position: -240px -96px; +} +.ui-icon-home { + background-position: 0 -112px; +} +.ui-icon-flag { + background-position: -16px -112px; +} +.ui-icon-calendar { + background-position: -32px -112px; +} +.ui-icon-cart { + background-position: -48px -112px; +} +.ui-icon-pencil { + background-position: -64px -112px; +} +.ui-icon-clock { + background-position: -80px -112px; +} +.ui-icon-disk { + background-position: -96px -112px; +} +.ui-icon-calculator { + background-position: -112px -112px; +} +.ui-icon-zoomin { + background-position: -128px -112px; +} +.ui-icon-zoomout { + background-position: -144px -112px; +} +.ui-icon-search { + background-position: -160px -112px; +} +.ui-icon-wrench { + background-position: -176px -112px; +} +.ui-icon-gear { + background-position: -192px -112px; +} +.ui-icon-heart { + background-position: -208px -112px; +} +.ui-icon-star { + background-position: -224px -112px; +} +.ui-icon-link { + background-position: -240px -112px; +} +.ui-icon-cancel { + background-position: 0 -128px; +} +.ui-icon-plus { + background-position: -16px -128px; +} +.ui-icon-plusthick { + background-position: -32px -128px; +} +.ui-icon-minus { + background-position: -48px -128px; +} +.ui-icon-minusthick { + background-position: -64px -128px; +} +.ui-icon-close { + background-position: -80px -128px; +} +.ui-icon-closethick { + background-position: -96px -128px; +} +.ui-icon-key { + background-position: -112px -128px; +} +.ui-icon-lightbulb { + background-position: -128px -128px; +} +.ui-icon-scissors { + background-position: -144px -128px; +} +.ui-icon-clipboard { + background-position: -160px -128px; +} +.ui-icon-copy { + background-position: -176px -128px; +} +.ui-icon-contact { + background-position: -192px -128px; +} +.ui-icon-image { + background-position: -208px -128px; +} +.ui-icon-video { + background-position: -224px -128px; +} +.ui-icon-script { + background-position: -240px -128px; +} +.ui-icon-alert { + background-position: 0 -144px; +} +.ui-icon-info { + background-position: -16px -144px; +} +.ui-icon-notice { + background-position: -32px -144px; +} +.ui-icon-help { + background-position: -48px -144px; +} +.ui-icon-check { + background-position: -64px -144px; +} +.ui-icon-bullet { + background-position: -80px -144px; +} +.ui-icon-radio-on { + background-position: -96px -144px; +} +.ui-icon-radio-off { + background-position: -112px -144px; +} +.ui-icon-pin-w { + background-position: -128px -144px; +} +.ui-icon-pin-s { + background-position: -144px -144px; +} +.ui-icon-play { + background-position: 0 -160px; +} +.ui-icon-pause { + background-position: -16px -160px; +} +.ui-icon-seek-next { + background-position: -32px -160px; +} +.ui-icon-seek-prev { + background-position: -48px -160px; +} +.ui-icon-seek-end { + background-position: -64px -160px; +} +.ui-icon-seek-start { + background-position: -80px -160px; +} +.ui-icon-seek-first { + background-position: -80px -160px; +} +.ui-icon-stop { + background-position: -96px -160px; +} +.ui-icon-eject { + background-position: -112px -160px; +} +.ui-icon-volume-off { + background-position: -128px -160px; +} +.ui-icon-volume-on { + background-position: -144px -160px; +} +.ui-icon-power { + background-position: 0 -176px; +} +.ui-icon-signal-diag { + background-position: -16px -176px; +} +.ui-icon-signal { + background-position: -32px -176px; +} +.ui-icon-battery-0 { + background-position: -48px -176px; +} +.ui-icon-battery-1 { + background-position: -64px -176px; +} +.ui-icon-battery-2 { + background-position: -80px -176px; +} +.ui-icon-battery-3 { + background-position: -96px -176px; +} +.ui-icon-circle-plus { + background-position: 0 -192px; +} +.ui-icon-circle-minus { + background-position: -16px -192px; +} +.ui-icon-circle-close { + background-position: -32px -192px; +} +.ui-icon-circle-triangle-e { + background-position: -48px -192px; +} +.ui-icon-circle-triangle-s { + background-position: -64px -192px; +} +.ui-icon-circle-triangle-w { + background-position: -80px -192px; +} +.ui-icon-circle-triangle-n { + background-position: -96px -192px; +} +.ui-icon-circle-arrow-e { + background-position: -112px -192px; +} +.ui-icon-circle-arrow-s { + background-position: -128px -192px; +} +.ui-icon-circle-arrow-w { + background-position: -144px -192px; +} +.ui-icon-circle-arrow-n { + background-position: -160px -192px; +} +.ui-icon-circle-zoomin { + background-position: -176px -192px; +} +.ui-icon-circle-zoomout { + background-position: -192px -192px; +} +.ui-icon-circle-check { + background-position: -208px -192px; +} +.ui-icon-circlesmall-plus { + background-position: 0 -208px; +} +.ui-icon-circlesmall-minus { + background-position: -16px -208px; +} +.ui-icon-circlesmall-close { + background-position: -32px -208px; +} +.ui-icon-squaresmall-plus { + background-position: -48px -208px; +} +.ui-icon-squaresmall-minus { + background-position: -64px -208px; +} +.ui-icon-squaresmall-close { + background-position: -80px -208px; +} +.ui-icon-grip-dotted-vertical { + background-position: 0 -224px; +} +.ui-icon-grip-dotted-horizontal { + background-position: -16px -224px; +} +.ui-icon-grip-solid-vertical { + background-position: -32px -224px; +} +.ui-icon-grip-solid-horizontal { + background-position: -48px -224px; +} +.ui-icon-gripsmall-diagonal-se { + background-position: -64px -224px; +} +.ui-icon-grip-diagonal-se { + background-position: -80px -224px; +} +.ui-corner-all, +.ui-corner-top, +.ui-corner-left, +.ui-corner-tl { + border-top-left-radius: 3px; +} +.ui-corner-all, +.ui-corner-top, +.ui-corner-right, +.ui-corner-tr { + border-top-right-radius: 3px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-left, +.ui-corner-bl { + border-bottom-left-radius: 3px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-br { + border-bottom-right-radius: 3px; +} +.ui-widget-overlay { + background: #aaa; + opacity: 0.3; + -ms-filter: Alpha(Opacity=30); +} +.ui-widget-shadow { + -webkit-box-shadow: 0 0 5px #666; + box-shadow: 0 0 5px #666; +} diff --git a/v0/src/simulator/vendor/jquery-ui.min.js b/v0/src/simulator/vendor/jquery-ui.min.js new file mode 100644 index 00000000..8453fa2f --- /dev/null +++ b/v0/src/simulator/vendor/jquery-ui.min.js @@ -0,0 +1,7887 @@ +/*! jQuery UI - v1.13.1 - 2022-01-22 + * http://jqueryui.com + * Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-patch.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/draggable.js, widgets/resizable.js, widgets/sortable.js, widgets/accordion.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/dialog.js, widgets/mouse.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js + * Copyright jQuery Foundation and other contributors; Licensed MIT */ + +!(function (t) { + 'use strict' + 'function' == typeof define && define.amd + ? define(['jquery'], t) + : t(jQuery) +})(function (x) { + 'use strict' + x.ui = x.ui || {} + x.ui.version = '1.13.1' + var o, + i = 0, + r = Array.prototype.hasOwnProperty, + a = Array.prototype.slice + ;(x.cleanData = + ((o = x.cleanData), + function (t) { + for (var e, i, s = 0; null != (i = t[s]); s++) + (e = x._data(i, 'events')) && + e.remove && + x(i).triggerHandler('remove') + o(t) + })), + (x.widget = function (t, i, e) { + var s, + o, + n, + r = {}, + a = t.split('.')[0], + h = a + '-' + (t = t.split('.')[1]) + return ( + e || ((e = i), (i = x.Widget)), + Array.isArray(e) && (e = x.extend.apply(null, [{}].concat(e))), + (x.expr.pseudos[h.toLowerCase()] = function (t) { + return !!x.data(t, h) + }), + (x[a] = x[a] || {}), + (s = x[a][t]), + (o = x[a][t] = + function (t, e) { + if (!this || !this._createWidget) return new o(t, e) + arguments.length && this._createWidget(t, e) + }), + x.extend(o, s, { + version: e.version, + _proto: x.extend({}, e), + _childConstructors: [], + }), + ((n = new i()).options = x.widget.extend({}, n.options)), + x.each(e, function (e, s) { + function o() { + return i.prototype[e].apply(this, arguments) + } + function n(t) { + return i.prototype[e].apply(this, t) + } + r[e] = + 'function' == typeof s + ? function () { + var t, + e = this._super, + i = this._superApply + return ( + (this._super = o), + (this._superApply = n), + (t = s.apply(this, arguments)), + (this._super = e), + (this._superApply = i), + t + ) + } + : s + }), + (o.prototype = x.widget.extend( + n, + { widgetEventPrefix: (s && n.widgetEventPrefix) || t }, + r, + { + constructor: o, + namespace: a, + widgetName: t, + widgetFullName: h, + } + )), + s + ? (x.each(s._childConstructors, function (t, e) { + var i = e.prototype + x.widget( + i.namespace + '.' + i.widgetName, + o, + e._proto + ) + }), + delete s._childConstructors) + : i._childConstructors.push(o), + x.widget.bridge(t, o), + o + ) + }), + (x.widget.extend = function (t) { + for ( + var e, i, s = a.call(arguments, 1), o = 0, n = s.length; + o < n; + o++ + ) + for (e in s[o]) + (i = s[o][e]), + r.call(s[o], e) && + void 0 !== i && + (x.isPlainObject(i) + ? (t[e] = x.isPlainObject(t[e]) + ? x.widget.extend({}, t[e], i) + : x.widget.extend({}, i)) + : (t[e] = i)) + return t + }), + (x.widget.bridge = function (n, e) { + var r = e.prototype.widgetFullName || n + x.fn[n] = function (i) { + var t = 'string' == typeof i, + s = a.call(arguments, 1), + o = this + return ( + t + ? this.length || 'instance' !== i + ? this.each(function () { + var t, + e = x.data(this, r) + return 'instance' === i + ? ((o = e), !1) + : e + ? 'function' != typeof e[i] || + '_' === i.charAt(0) + ? x.error( + "no such method '" + + i + + "' for " + + n + + ' widget instance' + ) + : (t = e[i].apply(e, s)) !== e && + void 0 !== t + ? ((o = + t && t.jquery + ? o.pushStack(t.get()) + : t), + !1) + : void 0 + : x.error( + 'cannot call methods on ' + + n + + " prior to initialization; attempted to call method '" + + i + + "'" + ) + }) + : (o = void 0) + : (s.length && + (i = x.widget.extend.apply(null, [i].concat(s))), + this.each(function () { + var t = x.data(this, r) + t + ? (t.option(i || {}), t._init && t._init()) + : x.data(this, r, new e(i, this)) + })), + o + ) + } + }), + (x.Widget = function () {}), + (x.Widget._childConstructors = []), + (x.Widget.prototype = { + widgetName: 'widget', + widgetEventPrefix: '', + defaultElement: '
', + options: { classes: {}, disabled: !1, create: null }, + _createWidget: function (t, e) { + ;(e = x(e || this.defaultElement || this)[0]), + (this.element = x(e)), + (this.uuid = i++), + (this.eventNamespace = '.' + this.widgetName + this.uuid), + (this.bindings = x()), + (this.hoverable = x()), + (this.focusable = x()), + (this.classesElementLookup = {}), + e !== this && + (x.data(e, this.widgetFullName, this), + this._on(!0, this.element, { + remove: function (t) { + t.target === e && this.destroy() + }, + }), + (this.document = x( + e.style ? e.ownerDocument : e.document || e + )), + (this.window = x( + this.document[0].defaultView || + this.document[0].parentWindow + ))), + (this.options = x.widget.extend( + {}, + this.options, + this._getCreateOptions(), + t + )), + this._create(), + this.options.disabled && + this._setOptionDisabled(this.options.disabled), + this._trigger('create', null, this._getCreateEventData()), + this._init() + }, + _getCreateOptions: function () { + return {} + }, + _getCreateEventData: x.noop, + _create: x.noop, + _init: x.noop, + destroy: function () { + var i = this + this._destroy(), + x.each(this.classesElementLookup, function (t, e) { + i._removeClass(e, t) + }), + this.element + .off(this.eventNamespace) + .removeData(this.widgetFullName), + this.widget() + .off(this.eventNamespace) + .removeAttr('aria-disabled'), + this.bindings.off(this.eventNamespace) + }, + _destroy: x.noop, + widget: function () { + return this.element + }, + option: function (t, e) { + var i, + s, + o, + n = t + if (0 === arguments.length) + return x.widget.extend({}, this.options) + if ('string' == typeof t) + if ( + ((n = {}), (t = (i = t.split('.')).shift()), i.length) + ) { + for ( + s = n[t] = x.widget.extend({}, this.options[t]), + o = 0; + o < i.length - 1; + o++ + ) + (s[i[o]] = s[i[o]] || {}), (s = s[i[o]]) + if (((t = i.pop()), 1 === arguments.length)) + return void 0 === s[t] ? null : s[t] + s[t] = e + } else { + if (1 === arguments.length) + return void 0 === this.options[t] + ? null + : this.options[t] + n[t] = e + } + return this._setOptions(n), this + }, + _setOptions: function (t) { + for (var e in t) this._setOption(e, t[e]) + return this + }, + _setOption: function (t, e) { + return ( + 'classes' === t && this._setOptionClasses(e), + (this.options[t] = e), + 'disabled' === t && this._setOptionDisabled(e), + this + ) + }, + _setOptionClasses: function (t) { + var e, i, s + for (e in t) + (s = this.classesElementLookup[e]), + t[e] !== this.options.classes[e] && + s && + s.length && + ((i = x(s.get())), + this._removeClass(s, e), + i.addClass( + this._classes({ + element: i, + keys: e, + classes: t, + add: !0, + }) + )) + }, + _setOptionDisabled: function (t) { + this._toggleClass( + this.widget(), + this.widgetFullName + '-disabled', + null, + !!t + ), + t && + (this._removeClass( + this.hoverable, + null, + 'ui-state-hover' + ), + this._removeClass( + this.focusable, + null, + 'ui-state-focus' + )) + }, + enable: function () { + return this._setOptions({ disabled: !1 }) + }, + disable: function () { + return this._setOptions({ disabled: !0 }) + }, + _classes: function (o) { + var n = [], + r = this + function t(t, e) { + for (var i, s = 0; s < t.length; s++) + (i = r.classesElementLookup[t[s]] || x()), + (i = o.add + ? ((function () { + var i = [] + o.element.each(function (t, e) { + x + .map( + r.classesElementLookup, + function (t) { + return t + } + ) + .some(function (t) { + return t.is(e) + }) || i.push(e) + }), + r._on(x(i), { + remove: '_untrackClassesElement', + }) + })(), + x( + x.uniqueSort( + i.get().concat(o.element.get()) + ) + )) + : x(i.not(o.element).get())), + (r.classesElementLookup[t[s]] = i), + n.push(t[s]), + e && o.classes[t[s]] && n.push(o.classes[t[s]]) + } + return ( + (o = x.extend( + { + element: this.element, + classes: this.options.classes || {}, + }, + o + )).keys && t(o.keys.match(/\S+/g) || [], !0), + o.extra && t(o.extra.match(/\S+/g) || []), + n.join(' ') + ) + }, + _untrackClassesElement: function (i) { + var s = this + x.each(s.classesElementLookup, function (t, e) { + ;-1 !== x.inArray(i.target, e) && + (s.classesElementLookup[t] = x(e.not(i.target).get())) + }), + this._off(x(i.target)) + }, + _removeClass: function (t, e, i) { + return this._toggleClass(t, e, i, !1) + }, + _addClass: function (t, e, i) { + return this._toggleClass(t, e, i, !0) + }, + _toggleClass: function (t, e, i, s) { + var o = 'string' == typeof t || null === t, + i = { + extra: o ? e : i, + keys: o ? t : e, + element: o ? this.element : t, + add: (s = 'boolean' == typeof s ? s : i), + } + return i.element.toggleClass(this._classes(i), s), this + }, + _on: function (o, n, t) { + var r, + a = this + 'boolean' != typeof o && ((t = n), (n = o), (o = !1)), + t + ? ((n = r = x(n)), + (this.bindings = this.bindings.add(n))) + : ((t = n), (n = this.element), (r = this.widget())), + x.each(t, function (t, e) { + function i() { + if ( + o || + (!0 !== a.options.disabled && + !x(this).hasClass('ui-state-disabled')) + ) + return ('string' == typeof e ? a[e] : e).apply( + a, + arguments + ) + } + 'string' != typeof e && + (i.guid = e.guid = e.guid || i.guid || x.guid++) + var s = t.match(/^([\w:-]*)\s*(.*)$/), + t = s[1] + a.eventNamespace, + s = s[2] + s ? r.on(t, s, i) : n.on(t, i) + }) + }, + _off: function (t, e) { + ;(e = + (e || '').split(' ').join(this.eventNamespace + ' ') + + this.eventNamespace), + t.off(e), + (this.bindings = x(this.bindings.not(t).get())), + (this.focusable = x(this.focusable.not(t).get())), + (this.hoverable = x(this.hoverable.not(t).get())) + }, + _delay: function (t, e) { + var i = this + return setTimeout(function () { + return ('string' == typeof t ? i[t] : t).apply(i, arguments) + }, e || 0) + }, + _hoverable: function (t) { + ;(this.hoverable = this.hoverable.add(t)), + this._on(t, { + mouseenter: function (t) { + this._addClass( + x(t.currentTarget), + null, + 'ui-state-hover' + ) + }, + mouseleave: function (t) { + this._removeClass( + x(t.currentTarget), + null, + 'ui-state-hover' + ) + }, + }) + }, + _focusable: function (t) { + ;(this.focusable = this.focusable.add(t)), + this._on(t, { + focusin: function (t) { + this._addClass( + x(t.currentTarget), + null, + 'ui-state-focus' + ) + }, + focusout: function (t) { + this._removeClass( + x(t.currentTarget), + null, + 'ui-state-focus' + ) + }, + }) + }, + _trigger: function (t, e, i) { + var s, + o, + n = this.options[t] + if ( + ((i = i || {}), + ((e = x.Event(e)).type = ( + t === this.widgetEventPrefix + ? t + : this.widgetEventPrefix + t + ).toLowerCase()), + (e.target = this.element[0]), + (o = e.originalEvent)) + ) + for (s in o) s in e || (e[s] = o[s]) + return ( + this.element.trigger(e, i), + !( + ('function' == typeof n && + !1 === n.apply(this.element[0], [e].concat(i))) || + e.isDefaultPrevented() + ) + ) + }, + }), + x.each({ show: 'fadeIn', hide: 'fadeOut' }, function (n, r) { + x.Widget.prototype['_' + n] = function (e, t, i) { + var s, + o = (t = 'string' == typeof t ? { effect: t } : t) + ? (!0 !== t && 'number' != typeof t && t.effect) || r + : n + 'number' == typeof (t = t || {}) + ? (t = { duration: t }) + : !0 === t && (t = {}), + (s = !x.isEmptyObject(t)), + (t.complete = i), + t.delay && e.delay(t.delay), + s && x.effects && x.effects.effect[o] + ? e[n](t) + : o !== n && e[o] + ? e[o](t.duration, t.easing, i) + : e.queue(function (t) { + x(this)[n](), i && i.call(e[0]), t() + }) + } + }) + var s, P, C, n, h, l, c, p, z + x.widget + function T(t, e, i) { + return [ + parseFloat(t[0]) * (p.test(t[0]) ? e / 100 : 1), + parseFloat(t[1]) * (p.test(t[1]) ? i / 100 : 1), + ] + } + function k(t, e) { + return parseInt(x.css(t, e), 10) || 0 + } + function H(t) { + return null != t && t === t.window + } + ;(P = Math.max), + (C = Math.abs), + (n = /left|center|right/), + (h = /top|center|bottom/), + (l = /[\+\-]\d+(\.[\d]+)?%?/), + (c = /^\w+/), + (p = /%$/), + (z = x.fn.position), + (x.position = { + scrollbarWidth: function () { + if (void 0 !== s) return s + var t, + e = x( + "
" + ), + i = e.children()[0] + return ( + x('body').append(e), + (t = i.offsetWidth), + e.css('overflow', 'scroll'), + t === (i = i.offsetWidth) && (i = e[0].clientWidth), + e.remove(), + (s = t - i) + ) + }, + getScrollInfo: function (t) { + var e = + t.isWindow || t.isDocument + ? '' + : t.element.css('overflow-x'), + i = + t.isWindow || t.isDocument + ? '' + : t.element.css('overflow-y'), + e = + 'scroll' === e || + ('auto' === e && t.width < t.element[0].scrollWidth) + return { + width: + 'scroll' === i || + ('auto' === i && t.height < t.element[0].scrollHeight) + ? x.position.scrollbarWidth() + : 0, + height: e ? x.position.scrollbarWidth() : 0, + } + }, + getWithinInfo: function (t) { + var e = x(t || window), + i = H(e[0]), + s = !!e[0] && 9 === e[0].nodeType + return { + element: e, + isWindow: i, + isDocument: s, + offset: !i && !s ? x(t).offset() : { left: 0, top: 0 }, + scrollLeft: e.scrollLeft(), + scrollTop: e.scrollTop(), + width: e.outerWidth(), + height: e.outerHeight(), + } + }, + }), + (x.fn.position = function (p) { + if (!p || !p.of) return z.apply(this, arguments) + var u, + d, + f, + g, + m, + t, + v = + 'string' == typeof (p = x.extend({}, p)).of + ? x(document).find(p.of) + : x(p.of), + _ = x.position.getWithinInfo(p.within), + b = x.position.getScrollInfo(_), + y = (p.collision || 'flip').split(' '), + w = {}, + e = + 9 === (t = (e = v)[0]).nodeType + ? { + width: e.width(), + height: e.height(), + offset: { top: 0, left: 0 }, + } + : H(t) + ? { + width: e.width(), + height: e.height(), + offset: { + top: e.scrollTop(), + left: e.scrollLeft(), + }, + } + : t.preventDefault + ? { + width: 0, + height: 0, + offset: { top: t.pageY, left: t.pageX }, + } + : { + width: e.outerWidth(), + height: e.outerHeight(), + offset: e.offset(), + } + return ( + v[0].preventDefault && (p.at = 'left top'), + (d = e.width), + (f = e.height), + (m = x.extend({}, (g = e.offset))), + x.each(['my', 'at'], function () { + var t, + e, + i = (p[this] || '').split(' ') + ;((i = + 1 === i.length + ? n.test(i[0]) + ? i.concat(['center']) + : h.test(i[0]) + ? ['center'].concat(i) + : ['center', 'center'] + : i)[0] = n.test(i[0]) ? i[0] : 'center'), + (i[1] = h.test(i[1]) ? i[1] : 'center'), + (t = l.exec(i[0])), + (e = l.exec(i[1])), + (w[this] = [t ? t[0] : 0, e ? e[0] : 0]), + (p[this] = [c.exec(i[0])[0], c.exec(i[1])[0]]) + }), + 1 === y.length && (y[1] = y[0]), + 'right' === p.at[0] + ? (m.left += d) + : 'center' === p.at[0] && (m.left += d / 2), + 'bottom' === p.at[1] + ? (m.top += f) + : 'center' === p.at[1] && (m.top += f / 2), + (u = T(w.at, d, f)), + (m.left += u[0]), + (m.top += u[1]), + this.each(function () { + var i, + t, + r = x(this), + a = r.outerWidth(), + h = r.outerHeight(), + e = k(this, 'marginLeft'), + s = k(this, 'marginTop'), + o = a + e + k(this, 'marginRight') + b.width, + n = h + s + k(this, 'marginBottom') + b.height, + l = x.extend({}, m), + c = T(w.my, r.outerWidth(), r.outerHeight()) + 'right' === p.my[0] + ? (l.left -= a) + : 'center' === p.my[0] && (l.left -= a / 2), + 'bottom' === p.my[1] + ? (l.top -= h) + : 'center' === p.my[1] && (l.top -= h / 2), + (l.left += c[0]), + (l.top += c[1]), + (i = { marginLeft: e, marginTop: s }), + x.each(['left', 'top'], function (t, e) { + x.ui.position[y[t]] && + x.ui.position[y[t]][e](l, { + targetWidth: d, + targetHeight: f, + elemWidth: a, + elemHeight: h, + collisionPosition: i, + collisionWidth: o, + collisionHeight: n, + offset: [u[0] + c[0], u[1] + c[1]], + my: p.my, + at: p.at, + within: _, + elem: r, + }) + }), + p.using && + (t = function (t) { + var e = g.left - l.left, + i = e + d - a, + s = g.top - l.top, + o = s + f - h, + n = { + target: { + element: v, + left: g.left, + top: g.top, + width: d, + height: f, + }, + element: { + element: r, + left: l.left, + top: l.top, + width: a, + height: h, + }, + horizontal: + i < 0 + ? 'left' + : 0 < e + ? 'right' + : 'center', + vertical: + o < 0 + ? 'top' + : 0 < s + ? 'bottom' + : 'middle', + } + d < a && + C(e + i) < d && + (n.horizontal = 'center'), + f < h && + C(s + o) < f && + (n.vertical = 'middle'), + P(C(e), C(i)) > P(C(s), C(o)) + ? (n.important = 'horizontal') + : (n.important = 'vertical'), + p.using.call(this, t, n) + }), + r.offset(x.extend(l, { using: t })) + }) + ) + }), + (x.ui.position = { + fit: { + left: function (t, e) { + var i = e.within, + s = i.isWindow ? i.scrollLeft : i.offset.left, + o = i.width, + n = t.left - e.collisionPosition.marginLeft, + r = s - n, + a = n + e.collisionWidth - o - s + e.collisionWidth > o + ? 0 < r && a <= 0 + ? ((i = t.left + r + e.collisionWidth - o - s), + (t.left += r - i)) + : (t.left = + !(0 < a && r <= 0) && a < r + ? s + o - e.collisionWidth + : s) + : 0 < r + ? (t.left += r) + : 0 < a + ? (t.left -= a) + : (t.left = P(t.left - n, t.left)) + }, + top: function (t, e) { + var i = e.within, + s = i.isWindow ? i.scrollTop : i.offset.top, + o = e.within.height, + n = t.top - e.collisionPosition.marginTop, + r = s - n, + a = n + e.collisionHeight - o - s + e.collisionHeight > o + ? 0 < r && a <= 0 + ? ((i = t.top + r + e.collisionHeight - o - s), + (t.top += r - i)) + : (t.top = + !(0 < a && r <= 0) && a < r + ? s + o - e.collisionHeight + : s) + : 0 < r + ? (t.top += r) + : 0 < a + ? (t.top -= a) + : (t.top = P(t.top - n, t.top)) + }, + }, + flip: { + left: function (t, e) { + var i = e.within, + s = i.offset.left + i.scrollLeft, + o = i.width, + n = i.isWindow ? i.scrollLeft : i.offset.left, + r = t.left - e.collisionPosition.marginLeft, + a = r - n, + h = r + e.collisionWidth - o - n, + l = + 'left' === e.my[0] + ? -e.elemWidth + : 'right' === e.my[0] + ? e.elemWidth + : 0, + i = + 'left' === e.at[0] + ? e.targetWidth + : 'right' === e.at[0] + ? -e.targetWidth + : 0, + r = -2 * e.offset[0] + a < 0 + ? ((s = t.left + l + i + r + e.collisionWidth - o - s) < + 0 || + s < C(a)) && + (t.left += l + i + r) + : 0 < h && + (0 < + (n = + t.left - + e.collisionPosition.marginLeft + + l + + i + + r - + n) || + C(n) < h) && + (t.left += l + i + r) + }, + top: function (t, e) { + var i = e.within, + s = i.offset.top + i.scrollTop, + o = i.height, + n = i.isWindow ? i.scrollTop : i.offset.top, + r = t.top - e.collisionPosition.marginTop, + a = r - n, + h = r + e.collisionHeight - o - n, + l = + 'top' === e.my[1] + ? -e.elemHeight + : 'bottom' === e.my[1] + ? e.elemHeight + : 0, + i = + 'top' === e.at[1] + ? e.targetHeight + : 'bottom' === e.at[1] + ? -e.targetHeight + : 0, + r = -2 * e.offset[1] + a < 0 + ? ((s = t.top + l + i + r + e.collisionHeight - o - s) < + 0 || + s < C(a)) && + (t.top += l + i + r) + : 0 < h && + (0 < + (n = + t.top - + e.collisionPosition.marginTop + + l + + i + + r - + n) || + C(n) < h) && + (t.top += l + i + r) + }, + }, + flipfit: { + left: function () { + x.ui.position.flip.left.apply(this, arguments), + x.ui.position.fit.left.apply(this, arguments) + }, + top: function () { + x.ui.position.flip.top.apply(this, arguments), + x.ui.position.fit.top.apply(this, arguments) + }, + }, + }) + var t + x.ui.position, + x.extend(x.expr.pseudos, { + data: x.expr.createPseudo + ? x.expr.createPseudo(function (e) { + return function (t) { + return !!x.data(t, e) + } + }) + : function (t, e, i) { + return !!x.data(t, i[3]) + }, + }), + x.fn.extend({ + disableSelection: + ((t = + 'onselectstart' in document.createElement('div') + ? 'selectstart' + : 'mousedown'), + function () { + return this.on(t + '.ui-disableSelection', function (t) { + t.preventDefault() + }) + }), + enableSelection: function () { + return this.off('.ui-disableSelection') + }, + }) + ;(x.ui.focusable = function (t, e) { + var i, + s, + o, + n, + r = t.nodeName.toLowerCase() + return 'area' === r + ? ((s = (i = t.parentNode).name), + !(!t.href || !s || 'map' !== i.nodeName.toLowerCase()) && + 0 < (s = x("img[usemap='#" + s + "']")).length && + s.is(':visible')) + : (/^(input|select|textarea|button|object)$/.test(r) + ? (o = !t.disabled) && + (n = x(t).closest('fieldset')[0]) && + (o = !n.disabled) + : (o = ('a' === r && t.href) || e), + o && + x(t).is(':visible') && + (function (t) { + var e = t.css('visibility') + for (; 'inherit' === e; ) + (t = t.parent()), (e = t.css('visibility')) + return 'visible' === e + })(x(t))) + }), + x.extend(x.expr.pseudos, { + focusable: function (t) { + return x.ui.focusable(t, null != x.attr(t, 'tabindex')) + }, + }) + var e, u + x.ui.focusable, + (x.fn._form = function () { + return 'string' == typeof this[0].form + ? this.closest('form') + : x(this[0].form) + }), + (x.ui.formResetMixin = { + _formResetHandler: function () { + var e = x(this) + setTimeout(function () { + var t = e.data('ui-form-reset-instances') + x.each(t, function () { + this.refresh() + }) + }) + }, + _bindFormResetHandler: function () { + var t + ;(this.form = this.element._form()), + this.form.length && + ((t = this.form.data('ui-form-reset-instances') || []) + .length || + this.form.on( + 'reset.ui-form-reset', + this._formResetHandler + ), + t.push(this), + this.form.data('ui-form-reset-instances', t)) + }, + _unbindFormResetHandler: function () { + var t + this.form.length && + ((t = this.form.data('ui-form-reset-instances')).splice( + x.inArray(this, t), + 1 + ), + t.length + ? this.form.data('ui-form-reset-instances', t) + : this.form + .removeData('ui-form-reset-instances') + .off('reset.ui-form-reset')) + }, + }) + x.expr.pseudos || (x.expr.pseudos = x.expr[':']), + x.uniqueSort || (x.uniqueSort = x.unique), + x.escapeSelector || + ((e = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g), + (u = function (t, e) { + return e + ? '\0' === t + ? '�' + : t.slice(0, -1) + + '\\' + + t.charCodeAt(t.length - 1).toString(16) + + ' ' + : '\\' + t + }), + (x.escapeSelector = function (t) { + return (t + '').replace(e, u) + })), + (x.fn.even && x.fn.odd) || + x.fn.extend({ + even: function () { + return this.filter(function (t) { + return t % 2 == 0 + }) + }, + odd: function () { + return this.filter(function (t) { + return t % 2 == 1 + }) + }, + }) + ;(x.ui.keyCode = { + BACKSPACE: 8, + COMMA: 188, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + LEFT: 37, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SPACE: 32, + TAB: 9, + UP: 38, + }), + (x.fn.labels = function () { + var t, e, i + return this.length + ? this[0].labels && this[0].labels.length + ? this.pushStack(this[0].labels) + : ((e = this.eq(0).parents('label')), + (t = this.attr('id')) && + ((i = (i = this.eq(0).parents().last()).add( + (i.length ? i : this).siblings() + )), + (t = "label[for='" + x.escapeSelector(t) + "']"), + (e = e.add(i.find(t).addBack(t)))), + this.pushStack(e)) + : this.pushStack([]) + }), + (x.fn.scrollParent = function (t) { + var e = this.css('position'), + i = 'absolute' === e, + s = t ? /(auto|scroll|hidden)/ : /(auto|scroll)/, + t = this.parents() + .filter(function () { + var t = x(this) + return ( + (!i || 'static' !== t.css('position')) && + s.test( + t.css('overflow') + + t.css('overflow-y') + + t.css('overflow-x') + ) + ) + }) + .eq(0) + return 'fixed' !== e && t.length + ? t + : x(this[0].ownerDocument || document) + }), + x.extend(x.expr.pseudos, { + tabbable: function (t) { + var e = x.attr(t, 'tabindex'), + i = null != e + return (!i || 0 <= e) && x.ui.focusable(t, i) + }, + }), + x.fn.extend({ + uniqueId: + ((d = 0), + function () { + return this.each(function () { + this.id || (this.id = 'ui-id-' + ++d) + }) + }), + removeUniqueId: function () { + return this.each(function () { + ;/^ui-id-\d+$/.test(this.id) && x(this).removeAttr('id') + }) + }, + }), + (x.ui.ie = !!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase())) + var d, + f = !1 + x(document).on('mouseup', function () { + f = !1 + }) + x.widget('ui.mouse', { + version: '1.13.1', + options: { + cancel: 'input, textarea, button, select, option', + distance: 1, + delay: 0, + }, + _mouseInit: function () { + var e = this + this.element + .on('mousedown.' + this.widgetName, function (t) { + return e._mouseDown(t) + }) + .on('click.' + this.widgetName, function (t) { + if ( + !0 === + x.data(t.target, e.widgetName + '.preventClickEvent') + ) + return ( + x.removeData( + t.target, + e.widgetName + '.preventClickEvent' + ), + t.stopImmediatePropagation(), + !1 + ) + }), + (this.started = !1) + }, + _mouseDestroy: function () { + this.element.off('.' + this.widgetName), + this._mouseMoveDelegate && + this.document + .off( + 'mousemove.' + this.widgetName, + this._mouseMoveDelegate + ) + .off( + 'mouseup.' + this.widgetName, + this._mouseUpDelegate + ) + }, + _mouseDown: function (t) { + if (!f) { + ;(this._mouseMoved = !1), + this._mouseStarted && this._mouseUp(t), + (this._mouseDownEvent = t) + var e = this, + i = 1 === t.which, + s = + !( + 'string' != typeof this.options.cancel || + !t.target.nodeName + ) && x(t.target).closest(this.options.cancel).length + return i && !s && this._mouseCapture(t) + ? ((this.mouseDelayMet = !this.options.delay), + this.mouseDelayMet || + (this._mouseDelayTimer = setTimeout(function () { + e.mouseDelayMet = !0 + }, this.options.delay)), + this._mouseDistanceMet(t) && + this._mouseDelayMet(t) && + ((this._mouseStarted = !1 !== this._mouseStart(t)), + !this._mouseStarted) + ? (t.preventDefault(), !0) + : (!0 === + x.data( + t.target, + this.widgetName + '.preventClickEvent' + ) && + x.removeData( + t.target, + this.widgetName + '.preventClickEvent' + ), + (this._mouseMoveDelegate = function (t) { + return e._mouseMove(t) + }), + (this._mouseUpDelegate = function (t) { + return e._mouseUp(t) + }), + this.document + .on( + 'mousemove.' + this.widgetName, + this._mouseMoveDelegate + ) + .on( + 'mouseup.' + this.widgetName, + this._mouseUpDelegate + ), + t.preventDefault(), + (f = !0))) + : !0 + } + }, + _mouseMove: function (t) { + if (this._mouseMoved) { + if ( + x.ui.ie && + (!document.documentMode || document.documentMode < 9) && + !t.button + ) + return this._mouseUp(t) + if (!t.which) + if ( + t.originalEvent.altKey || + t.originalEvent.ctrlKey || + t.originalEvent.metaKey || + t.originalEvent.shiftKey + ) + this.ignoreMissingWhich = !0 + else if (!this.ignoreMissingWhich) return this._mouseUp(t) + } + return ( + (t.which || t.button) && (this._mouseMoved = !0), + this._mouseStarted + ? (this._mouseDrag(t), t.preventDefault()) + : (this._mouseDistanceMet(t) && + this._mouseDelayMet(t) && + ((this._mouseStarted = + !1 !== this._mouseStart(this._mouseDownEvent, t)), + this._mouseStarted + ? this._mouseDrag(t) + : this._mouseUp(t)), + !this._mouseStarted) + ) + }, + _mouseUp: function (t) { + this.document + .off('mousemove.' + this.widgetName, this._mouseMoveDelegate) + .off('mouseup.' + this.widgetName, this._mouseUpDelegate), + this._mouseStarted && + ((this._mouseStarted = !1), + t.target === this._mouseDownEvent.target && + x.data( + t.target, + this.widgetName + '.preventClickEvent', + !0 + ), + this._mouseStop(t)), + this._mouseDelayTimer && + (clearTimeout(this._mouseDelayTimer), + delete this._mouseDelayTimer), + (this.ignoreMissingWhich = !1), + (f = !1), + t.preventDefault() + }, + _mouseDistanceMet: function (t) { + return ( + Math.max( + Math.abs(this._mouseDownEvent.pageX - t.pageX), + Math.abs(this._mouseDownEvent.pageY - t.pageY) + ) >= this.options.distance + ) + }, + _mouseDelayMet: function () { + return this.mouseDelayMet + }, + _mouseStart: function () {}, + _mouseDrag: function () {}, + _mouseStop: function () {}, + _mouseCapture: function () { + return !0 + }, + }), + (x.ui.plugin = { + add: function (t, e, i) { + var s, + o = x.ui[t].prototype + for (s in i) + (o.plugins[s] = o.plugins[s] || []), + o.plugins[s].push([e, i[s]]) + }, + call: function (t, e, i, s) { + var o, + n = t.plugins[e] + if ( + n && + (s || + (t.element[0].parentNode && + 11 !== t.element[0].parentNode.nodeType)) + ) + for (o = 0; o < n.length; o++) + t.options[n[o][0]] && n[o][1].apply(t.element, i) + }, + }), + (x.ui.safeActiveElement = function (e) { + var i + try { + i = e.activeElement + } catch (t) { + i = e.body + } + return (i = !(i = i || e.body).nodeName ? e.body : i) + }), + (x.ui.safeBlur = function (t) { + t && 'body' !== t.nodeName.toLowerCase() && x(t).trigger('blur') + }) + x.widget('ui.draggable', x.ui.mouse, { + version: '1.13.1', + widgetEventPrefix: 'drag', + options: { + addClasses: !0, + appendTo: 'parent', + axis: !1, + connectToSortable: !1, + containment: !1, + cursor: 'auto', + cursorAt: !1, + grid: !1, + handle: !1, + helper: 'original', + iframeFix: !1, + opacity: !1, + refreshPositions: !1, + revert: !1, + revertDuration: 500, + scope: 'default', + scroll: !0, + scrollSensitivity: 20, + scrollSpeed: 20, + snap: !1, + snapMode: 'both', + snapTolerance: 20, + stack: !1, + zIndex: !1, + drag: null, + start: null, + stop: null, + }, + _create: function () { + 'original' === this.options.helper && this._setPositionRelative(), + this.options.addClasses && this._addClass('ui-draggable'), + this._setHandleClassName(), + this._mouseInit() + }, + _setOption: function (t, e) { + this._super(t, e), + 'handle' === t && + (this._removeHandleClassName(), this._setHandleClassName()) + }, + _destroy: function () { + ;(this.helper || this.element).is('.ui-draggable-dragging') + ? (this.destroyOnClear = !0) + : (this._removeHandleClassName(), this._mouseDestroy()) + }, + _mouseCapture: function (t) { + var e = this.options + return ( + !( + this.helper || + e.disabled || + 0 < x(t.target).closest('.ui-resizable-handle').length + ) && + ((this.handle = this._getHandle(t)), + !!this.handle && + (this._blurActiveElement(t), + this._blockFrames( + !0 === e.iframeFix ? 'iframe' : e.iframeFix + ), + !0)) + ) + }, + _blockFrames: function (t) { + this.iframeBlocks = this.document.find(t).map(function () { + var t = x(this) + return x('
') + .css('position', 'absolute') + .appendTo(t.parent()) + .outerWidth(t.outerWidth()) + .outerHeight(t.outerHeight()) + .offset(t.offset())[0] + }) + }, + _unblockFrames: function () { + this.iframeBlocks && + (this.iframeBlocks.remove(), delete this.iframeBlocks) + }, + _blurActiveElement: function (t) { + var e = x.ui.safeActiveElement(this.document[0]) + x(t.target).closest(e).length || x.ui.safeBlur(e) + }, + _mouseStart: function (t) { + var e = this.options + return ( + (this.helper = this._createHelper(t)), + this._addClass(this.helper, 'ui-draggable-dragging'), + this._cacheHelperProportions(), + x.ui.ddmanager && (x.ui.ddmanager.current = this), + this._cacheMargins(), + (this.cssPosition = this.helper.css('position')), + (this.scrollParent = this.helper.scrollParent(!0)), + (this.offsetParent = this.helper.offsetParent()), + (this.hasFixedAncestor = + 0 < + this.helper.parents().filter(function () { + return 'fixed' === x(this).css('position') + }).length), + (this.positionAbs = this.element.offset()), + this._refreshOffsets(t), + (this.originalPosition = this.position = + this._generatePosition(t, !1)), + (this.originalPageX = t.pageX), + (this.originalPageY = t.pageY), + e.cursorAt && this._adjustOffsetFromHelper(e.cursorAt), + this._setContainment(), + !1 === this._trigger('start', t) + ? (this._clear(), !1) + : (this._cacheHelperProportions(), + x.ui.ddmanager && + !e.dropBehaviour && + x.ui.ddmanager.prepareOffsets(this, t), + this._mouseDrag(t, !0), + x.ui.ddmanager && x.ui.ddmanager.dragStart(this, t), + !0) + ) + }, + _refreshOffsets: function (t) { + ;(this.offset = { + top: this.positionAbs.top - this.margins.top, + left: this.positionAbs.left - this.margins.left, + scroll: !1, + parent: this._getParentOffset(), + relative: this._getRelativeOffset(), + }), + (this.offset.click = { + left: t.pageX - this.offset.left, + top: t.pageY - this.offset.top, + }) + }, + _mouseDrag: function (t, e) { + if ( + (this.hasFixedAncestor && + (this.offset.parent = this._getParentOffset()), + (this.position = this._generatePosition(t, !0)), + (this.positionAbs = this._convertPositionTo('absolute')), + !e) + ) { + e = this._uiHash() + if (!1 === this._trigger('drag', t, e)) + return this._mouseUp(new x.Event('mouseup', t)), !1 + this.position = e.position + } + return ( + (this.helper[0].style.left = this.position.left + 'px'), + (this.helper[0].style.top = this.position.top + 'px'), + x.ui.ddmanager && x.ui.ddmanager.drag(this, t), + !1 + ) + }, + _mouseStop: function (t) { + var e = this, + i = !1 + return ( + x.ui.ddmanager && + !this.options.dropBehaviour && + (i = x.ui.ddmanager.drop(this, t)), + this.dropped && ((i = this.dropped), (this.dropped = !1)), + ('invalid' === this.options.revert && !i) || + ('valid' === this.options.revert && i) || + !0 === this.options.revert || + ('function' == typeof this.options.revert && + this.options.revert.call(this.element, i)) + ? x(this.helper).animate( + this.originalPosition, + parseInt(this.options.revertDuration, 10), + function () { + !1 !== e._trigger('stop', t) && e._clear() + } + ) + : !1 !== this._trigger('stop', t) && this._clear(), + !1 + ) + }, + _mouseUp: function (t) { + return ( + this._unblockFrames(), + x.ui.ddmanager && x.ui.ddmanager.dragStop(this, t), + this.handleElement.is(t.target) && + this.element.trigger('focus'), + x.ui.mouse.prototype._mouseUp.call(this, t) + ) + }, + cancel: function () { + return ( + this.helper.is('.ui-draggable-dragging') + ? this._mouseUp( + new x.Event('mouseup', { target: this.element[0] }) + ) + : this._clear(), + this + ) + }, + _getHandle: function (t) { + return ( + !this.options.handle || + !!x(t.target).closest(this.element.find(this.options.handle)) + .length + ) + }, + _setHandleClassName: function () { + ;(this.handleElement = this.options.handle + ? this.element.find(this.options.handle) + : this.element), + this._addClass(this.handleElement, 'ui-draggable-handle') + }, + _removeHandleClassName: function () { + this._removeClass(this.handleElement, 'ui-draggable-handle') + }, + _createHelper: function (t) { + var e = this.options, + i = 'function' == typeof e.helper, + t = i + ? x(e.helper.apply(this.element[0], [t])) + : 'clone' === e.helper + ? this.element.clone().removeAttr('id') + : this.element + return ( + t.parents('body').length || + t.appendTo( + 'parent' === e.appendTo + ? this.element[0].parentNode + : e.appendTo + ), + i && t[0] === this.element[0] && this._setPositionRelative(), + t[0] === this.element[0] || + /(fixed|absolute)/.test(t.css('position')) || + t.css('position', 'absolute'), + t + ) + }, + _setPositionRelative: function () { + ;/^(?:r|a|f)/.test(this.element.css('position')) || + (this.element[0].style.position = 'relative') + }, + _adjustOffsetFromHelper: function (t) { + 'string' == typeof t && (t = t.split(' ')), + 'left' in + (t = Array.isArray(t) + ? { left: +t[0], top: +t[1] || 0 } + : t) && + (this.offset.click.left = t.left + this.margins.left), + 'right' in t && + (this.offset.click.left = + this.helperProportions.width - + t.right + + this.margins.left), + 'top' in t && + (this.offset.click.top = t.top + this.margins.top), + 'bottom' in t && + (this.offset.click.top = + this.helperProportions.height - + t.bottom + + this.margins.top) + }, + _isRootNode: function (t) { + return /(html|body)/i.test(t.tagName) || t === this.document[0] + }, + _getParentOffset: function () { + var t = this.offsetParent.offset(), + e = this.document[0] + return ( + 'absolute' === this.cssPosition && + this.scrollParent[0] !== e && + x.contains(this.scrollParent[0], this.offsetParent[0]) && + ((t.left += this.scrollParent.scrollLeft()), + (t.top += this.scrollParent.scrollTop())), + { + top: + (t = this._isRootNode(this.offsetParent[0]) + ? { top: 0, left: 0 } + : t).top + + (parseInt( + this.offsetParent.css('borderTopWidth'), + 10 + ) || 0), + left: + t.left + + (parseInt( + this.offsetParent.css('borderLeftWidth'), + 10 + ) || 0), + } + ) + }, + _getRelativeOffset: function () { + if ('relative' !== this.cssPosition) return { top: 0, left: 0 } + var t = this.element.position(), + e = this._isRootNode(this.scrollParent[0]) + return { + top: + t.top - + (parseInt(this.helper.css('top'), 10) || 0) + + (e ? 0 : this.scrollParent.scrollTop()), + left: + t.left - + (parseInt(this.helper.css('left'), 10) || 0) + + (e ? 0 : this.scrollParent.scrollLeft()), + } + }, + _cacheMargins: function () { + this.margins = { + left: parseInt(this.element.css('marginLeft'), 10) || 0, + top: parseInt(this.element.css('marginTop'), 10) || 0, + right: parseInt(this.element.css('marginRight'), 10) || 0, + bottom: parseInt(this.element.css('marginBottom'), 10) || 0, + } + }, + _cacheHelperProportions: function () { + this.helperProportions = { + width: this.helper.outerWidth(), + height: this.helper.outerHeight(), + } + }, + _setContainment: function () { + var t, + e, + i, + s = this.options, + o = this.document[0] + ;(this.relativeContainer = null), + s.containment + ? 'window' !== s.containment + ? 'document' !== s.containment + ? s.containment.constructor !== Array + ? ('parent' === s.containment && + (s.containment = + this.helper[0].parentNode), + (i = (e = x(s.containment))[0]) && + ((t = /(scroll|auto)/.test( + e.css('overflow') + )), + (this.containment = [ + (parseInt( + e.css('borderLeftWidth'), + 10 + ) || 0) + + (parseInt( + e.css('paddingLeft'), + 10 + ) || 0), + (parseInt( + e.css('borderTopWidth'), + 10 + ) || 0) + + (parseInt( + e.css('paddingTop'), + 10 + ) || 0), + (t + ? Math.max( + i.scrollWidth, + i.offsetWidth + ) + : i.offsetWidth) - + (parseInt( + e.css('borderRightWidth'), + 10 + ) || 0) - + (parseInt( + e.css('paddingRight'), + 10 + ) || 0) - + this.helperProportions.width - + this.margins.left - + this.margins.right, + (t + ? Math.max( + i.scrollHeight, + i.offsetHeight + ) + : i.offsetHeight) - + (parseInt( + e.css('borderBottomWidth'), + 10 + ) || 0) - + (parseInt( + e.css('paddingBottom'), + 10 + ) || 0) - + this.helperProportions.height - + this.margins.top - + this.margins.bottom, + ]), + (this.relativeContainer = e))) + : (this.containment = s.containment) + : (this.containment = [ + 0, + 0, + x(o).width() - + this.helperProportions.width - + this.margins.left, + (x(o).height() || + o.body.parentNode.scrollHeight) - + this.helperProportions.height - + this.margins.top, + ]) + : (this.containment = [ + x(window).scrollLeft() - + this.offset.relative.left - + this.offset.parent.left, + x(window).scrollTop() - + this.offset.relative.top - + this.offset.parent.top, + x(window).scrollLeft() + + x(window).width() - + this.helperProportions.width - + this.margins.left, + x(window).scrollTop() + + (x(window).height() || + o.body.parentNode.scrollHeight) - + this.helperProportions.height - + this.margins.top, + ]) + : (this.containment = null) + }, + _convertPositionTo: function (t, e) { + e = e || this.position + var i = 'absolute' === t ? 1 : -1, + t = this._isRootNode(this.scrollParent[0]) + return { + top: + e.top + + this.offset.relative.top * i + + this.offset.parent.top * i - + ('fixed' === this.cssPosition + ? -this.offset.scroll.top + : t + ? 0 + : this.offset.scroll.top) * + i, + left: + e.left + + this.offset.relative.left * i + + this.offset.parent.left * i - + ('fixed' === this.cssPosition + ? -this.offset.scroll.left + : t + ? 0 + : this.offset.scroll.left) * + i, + } + }, + _generatePosition: function (t, e) { + var i, + s = this.options, + o = this._isRootNode(this.scrollParent[0]), + n = t.pageX, + r = t.pageY + return ( + (o && this.offset.scroll) || + (this.offset.scroll = { + top: this.scrollParent.scrollTop(), + left: this.scrollParent.scrollLeft(), + }), + e && + (this.containment && + ((i = this.relativeContainer + ? ((i = this.relativeContainer.offset()), + [ + this.containment[0] + i.left, + this.containment[1] + i.top, + this.containment[2] + i.left, + this.containment[3] + i.top, + ]) + : this.containment), + t.pageX - this.offset.click.left < i[0] && + (n = i[0] + this.offset.click.left), + t.pageY - this.offset.click.top < i[1] && + (r = i[1] + this.offset.click.top), + t.pageX - this.offset.click.left > i[2] && + (n = i[2] + this.offset.click.left), + t.pageY - this.offset.click.top > i[3] && + (r = i[3] + this.offset.click.top)), + s.grid && + ((t = s.grid[1] + ? this.originalPageY + + Math.round((r - this.originalPageY) / s.grid[1]) * + s.grid[1] + : this.originalPageY), + (r = + !i || + t - this.offset.click.top >= i[1] || + t - this.offset.click.top > i[3] + ? t + : t - this.offset.click.top >= i[1] + ? t - s.grid[1] + : t + s.grid[1]), + (t = s.grid[0] + ? this.originalPageX + + Math.round((n - this.originalPageX) / s.grid[0]) * + s.grid[0] + : this.originalPageX), + (n = + !i || + t - this.offset.click.left >= i[0] || + t - this.offset.click.left > i[2] + ? t + : t - this.offset.click.left >= i[0] + ? t - s.grid[0] + : t + s.grid[0])), + 'y' === s.axis && (n = this.originalPageX), + 'x' === s.axis && (r = this.originalPageY)), + { + top: + r - + this.offset.click.top - + this.offset.relative.top - + this.offset.parent.top + + ('fixed' === this.cssPosition + ? -this.offset.scroll.top + : o + ? 0 + : this.offset.scroll.top), + left: + n - + this.offset.click.left - + this.offset.relative.left - + this.offset.parent.left + + ('fixed' === this.cssPosition + ? -this.offset.scroll.left + : o + ? 0 + : this.offset.scroll.left), + } + ) + }, + _clear: function () { + this._removeClass(this.helper, 'ui-draggable-dragging'), + this.helper[0] === this.element[0] || + this.cancelHelperRemoval || + this.helper.remove(), + (this.helper = null), + (this.cancelHelperRemoval = !1), + this.destroyOnClear && this.destroy() + }, + _trigger: function (t, e, i) { + return ( + (i = i || this._uiHash()), + x.ui.plugin.call(this, t, [e, i, this], !0), + /^(drag|start|stop)/.test(t) && + ((this.positionAbs = this._convertPositionTo('absolute')), + (i.offset = this.positionAbs)), + x.Widget.prototype._trigger.call(this, t, e, i) + ) + }, + plugins: {}, + _uiHash: function () { + return { + helper: this.helper, + position: this.position, + originalPosition: this.originalPosition, + offset: this.positionAbs, + } + }, + }), + x.ui.plugin.add('draggable', 'connectToSortable', { + start: function (e, t, i) { + var s = x.extend({}, t, { item: i.element }) + ;(i.sortables = []), + x(i.options.connectToSortable).each(function () { + var t = x(this).sortable('instance') + t && + !t.options.disabled && + (i.sortables.push(t), + t.refreshPositions(), + t._trigger('activate', e, s)) + }) + }, + stop: function (e, t, i) { + var s = x.extend({}, t, { item: i.element }) + ;(i.cancelHelperRemoval = !1), + x.each(i.sortables, function () { + var t = this + t.isOver + ? ((t.isOver = 0), + (i.cancelHelperRemoval = !0), + (t.cancelHelperRemoval = !1), + (t._storedCSS = { + position: t.placeholder.css('position'), + top: t.placeholder.css('top'), + left: t.placeholder.css('left'), + }), + t._mouseStop(e), + (t.options.helper = t.options._helper)) + : ((t.cancelHelperRemoval = !0), + t._trigger('deactivate', e, s)) + }) + }, + drag: function (i, s, o) { + x.each(o.sortables, function () { + var t = !1, + e = this + ;(e.positionAbs = o.positionAbs), + (e.helperProportions = o.helperProportions), + (e.offset.click = o.offset.click), + e._intersectsWith(e.containerCache) && + ((t = !0), + x.each(o.sortables, function () { + return ( + (this.positionAbs = o.positionAbs), + (this.helperProportions = + o.helperProportions), + (this.offset.click = o.offset.click), + (t = + this !== e && + this._intersectsWith( + this.containerCache + ) && + x.contains( + e.element[0], + this.element[0] + ) + ? !1 + : t) + ) + })), + t + ? (e.isOver || + ((e.isOver = 1), + (o._parent = s.helper.parent()), + (e.currentItem = s.helper + .appendTo(e.element) + .data('ui-sortable-item', !0)), + (e.options._helper = e.options.helper), + (e.options.helper = function () { + return s.helper[0] + }), + (i.target = e.currentItem[0]), + e._mouseCapture(i, !0), + e._mouseStart(i, !0, !0), + (e.offset.click.top = o.offset.click.top), + (e.offset.click.left = o.offset.click.left), + (e.offset.parent.left -= + o.offset.parent.left - + e.offset.parent.left), + (e.offset.parent.top -= + o.offset.parent.top - + e.offset.parent.top), + o._trigger('toSortable', i), + (o.dropped = e.element), + x.each(o.sortables, function () { + this.refreshPositions() + }), + (o.currentItem = o.element), + (e.fromOutside = o)), + e.currentItem && + (e._mouseDrag(i), (s.position = e.position))) + : e.isOver && + ((e.isOver = 0), + (e.cancelHelperRemoval = !0), + (e.options._revert = e.options.revert), + (e.options.revert = !1), + e._trigger('out', i, e._uiHash(e)), + e._mouseStop(i, !0), + (e.options.revert = e.options._revert), + (e.options.helper = e.options._helper), + e.placeholder && e.placeholder.remove(), + s.helper.appendTo(o._parent), + o._refreshOffsets(i), + (s.position = o._generatePosition(i, !0)), + o._trigger('fromSortable', i), + (o.dropped = !1), + x.each(o.sortables, function () { + this.refreshPositions() + })) + }) + }, + }), + x.ui.plugin.add('draggable', 'cursor', { + start: function (t, e, i) { + var s = x('body'), + i = i.options + s.css('cursor') && (i._cursor = s.css('cursor')), + s.css('cursor', i.cursor) + }, + stop: function (t, e, i) { + i = i.options + i._cursor && x('body').css('cursor', i._cursor) + }, + }), + x.ui.plugin.add('draggable', 'opacity', { + start: function (t, e, i) { + ;(e = x(e.helper)), (i = i.options) + e.css('opacity') && (i._opacity = e.css('opacity')), + e.css('opacity', i.opacity) + }, + stop: function (t, e, i) { + i = i.options + i._opacity && x(e.helper).css('opacity', i._opacity) + }, + }), + x.ui.plugin.add('draggable', 'scroll', { + start: function (t, e, i) { + i.scrollParentNotHidden || + (i.scrollParentNotHidden = i.helper.scrollParent(!1)), + i.scrollParentNotHidden[0] !== i.document[0] && + 'HTML' !== i.scrollParentNotHidden[0].tagName && + (i.overflowOffset = i.scrollParentNotHidden.offset()) + }, + drag: function (t, e, i) { + var s = i.options, + o = !1, + n = i.scrollParentNotHidden[0], + r = i.document[0] + n !== r && 'HTML' !== n.tagName + ? ((s.axis && 'x' === s.axis) || + (i.overflowOffset.top + n.offsetHeight - t.pageY < + s.scrollSensitivity + ? (n.scrollTop = o = n.scrollTop + s.scrollSpeed) + : t.pageY - i.overflowOffset.top < + s.scrollSensitivity && + (n.scrollTop = o = + n.scrollTop - s.scrollSpeed)), + (s.axis && 'y' === s.axis) || + (i.overflowOffset.left + n.offsetWidth - t.pageX < + s.scrollSensitivity + ? (n.scrollLeft = o = + n.scrollLeft + s.scrollSpeed) + : t.pageX - i.overflowOffset.left < + s.scrollSensitivity && + (n.scrollLeft = o = + n.scrollLeft - s.scrollSpeed))) + : ((s.axis && 'x' === s.axis) || + (t.pageY - x(r).scrollTop() < s.scrollSensitivity + ? (o = x(r).scrollTop( + x(r).scrollTop() - s.scrollSpeed + )) + : x(window).height() - + (t.pageY - x(r).scrollTop()) < + s.scrollSensitivity && + (o = x(r).scrollTop( + x(r).scrollTop() + s.scrollSpeed + ))), + (s.axis && 'y' === s.axis) || + (t.pageX - x(r).scrollLeft() < s.scrollSensitivity + ? (o = x(r).scrollLeft( + x(r).scrollLeft() - s.scrollSpeed + )) + : x(window).width() - + (t.pageX - x(r).scrollLeft()) < + s.scrollSensitivity && + (o = x(r).scrollLeft( + x(r).scrollLeft() + s.scrollSpeed + )))), + !1 !== o && + x.ui.ddmanager && + !s.dropBehaviour && + x.ui.ddmanager.prepareOffsets(i, t) + }, + }), + x.ui.plugin.add('draggable', 'snap', { + start: function (t, e, i) { + var s = i.options + ;(i.snapElements = []), + x( + s.snap.constructor !== String + ? s.snap.items || ':data(ui-draggable)' + : s.snap + ).each(function () { + var t = x(this), + e = t.offset() + this !== i.element[0] && + i.snapElements.push({ + item: this, + width: t.outerWidth(), + height: t.outerHeight(), + top: e.top, + left: e.left, + }) + }) + }, + drag: function (t, e, i) { + for ( + var s, + o, + n, + r, + a, + h, + l, + c, + p, + u = i.options, + d = u.snapTolerance, + f = e.offset.left, + g = f + i.helperProportions.width, + m = e.offset.top, + v = m + i.helperProportions.height, + _ = i.snapElements.length - 1; + 0 <= _; + _-- + ) + (h = + (a = i.snapElements[_].left - i.margins.left) + + i.snapElements[_].width), + (c = + (l = i.snapElements[_].top - i.margins.top) + + i.snapElements[_].height), + g < a - d || + h + d < f || + v < l - d || + c + d < m || + !x.contains( + i.snapElements[_].item.ownerDocument, + i.snapElements[_].item + ) + ? (i.snapElements[_].snapping && + i.options.snap.release && + i.options.snap.release.call( + i.element, + t, + x.extend(i._uiHash(), { + snapItem: i.snapElements[_].item, + }) + ), + (i.snapElements[_].snapping = !1)) + : ('inner' !== u.snapMode && + ((s = Math.abs(l - v) <= d), + (o = Math.abs(c - m) <= d), + (n = Math.abs(a - g) <= d), + (r = Math.abs(h - f) <= d), + s && + (e.position.top = i._convertPositionTo( + 'relative', + { + top: + l - + i.helperProportions.height, + left: 0, + } + ).top), + o && + (e.position.top = i._convertPositionTo( + 'relative', + { top: c, left: 0 } + ).top), + n && + (e.position.left = i._convertPositionTo( + 'relative', + { + top: 0, + left: + a - i.helperProportions.width, + } + ).left), + r && + (e.position.left = i._convertPositionTo( + 'relative', + { top: 0, left: h } + ).left)), + (p = s || o || n || r), + 'outer' !== u.snapMode && + ((s = Math.abs(l - m) <= d), + (o = Math.abs(c - v) <= d), + (n = Math.abs(a - f) <= d), + (r = Math.abs(h - g) <= d), + s && + (e.position.top = i._convertPositionTo( + 'relative', + { top: l, left: 0 } + ).top), + o && + (e.position.top = i._convertPositionTo( + 'relative', + { + top: + c - + i.helperProportions.height, + left: 0, + } + ).top), + n && + (e.position.left = i._convertPositionTo( + 'relative', + { top: 0, left: a } + ).left), + r && + (e.position.left = i._convertPositionTo( + 'relative', + { + top: 0, + left: + h - i.helperProportions.width, + } + ).left)), + !i.snapElements[_].snapping && + (s || o || n || r || p) && + i.options.snap.snap && + i.options.snap.snap.call( + i.element, + t, + x.extend(i._uiHash(), { + snapItem: i.snapElements[_].item, + }) + ), + (i.snapElements[_].snapping = + s || o || n || r || p)) + }, + }), + x.ui.plugin.add('draggable', 'stack', { + start: function (t, e, i) { + var s, + i = i.options, + i = x.makeArray(x(i.stack)).sort(function (t, e) { + return ( + (parseInt(x(t).css('zIndex'), 10) || 0) - + (parseInt(x(e).css('zIndex'), 10) || 0) + ) + }) + i.length && + ((s = parseInt(x(i[0]).css('zIndex'), 10) || 0), + x(i).each(function (t) { + x(this).css('zIndex', s + t) + }), + this.css('zIndex', s + i.length)) + }, + }), + x.ui.plugin.add('draggable', 'zIndex', { + start: function (t, e, i) { + ;(e = x(e.helper)), (i = i.options) + e.css('zIndex') && (i._zIndex = e.css('zIndex')), + e.css('zIndex', i.zIndex) + }, + stop: function (t, e, i) { + i = i.options + i._zIndex && x(e.helper).css('zIndex', i._zIndex) + }, + }) + x.ui.draggable + x.widget('ui.resizable', x.ui.mouse, { + version: '1.13.1', + widgetEventPrefix: 'resize', + options: { + alsoResize: !1, + animate: !1, + animateDuration: 'slow', + animateEasing: 'swing', + aspectRatio: !1, + autoHide: !1, + classes: { + 'ui-resizable-se': 'ui-icon ui-icon-gripsmall-diagonal-se', + }, + containment: !1, + ghost: !1, + grid: !1, + handles: 'e,s,se', + helper: !1, + maxHeight: null, + maxWidth: null, + minHeight: 10, + minWidth: 10, + zIndex: 90, + resize: null, + start: null, + stop: null, + }, + _num: function (t) { + return parseFloat(t) || 0 + }, + _isNumber: function (t) { + return !isNaN(parseFloat(t)) + }, + _hasScroll: function (t, e) { + if ('hidden' === x(t).css('overflow')) return !1 + var i = e && 'left' === e ? 'scrollLeft' : 'scrollTop', + e = !1 + if (0 < t[i]) return !0 + try { + ;(t[i] = 1), (e = 0 < t[i]), (t[i] = 0) + } catch (t) {} + return e + }, + _create: function () { + var t, + e = this.options, + i = this + this._addClass('ui-resizable'), + x.extend(this, { + _aspectRatio: !!e.aspectRatio, + aspectRatio: e.aspectRatio, + originalElement: this.element, + _proportionallyResizeElements: [], + _helper: + e.helper || e.ghost || e.animate + ? e.helper || 'ui-resizable-helper' + : null, + }), + this.element[0].nodeName.match( + /^(canvas|textarea|input|select|button|img)$/i + ) && + (this.element.wrap( + x("
").css({ + overflow: 'hidden', + position: this.element.css('position'), + width: this.element.outerWidth(), + height: this.element.outerHeight(), + top: this.element.css('top'), + left: this.element.css('left'), + }) + ), + (this.element = this.element + .parent() + .data( + 'ui-resizable', + this.element.resizable('instance') + )), + (this.elementIsWrapper = !0), + (t = { + marginTop: this.originalElement.css('marginTop'), + marginRight: this.originalElement.css('marginRight'), + marginBottom: this.originalElement.css('marginBottom'), + marginLeft: this.originalElement.css('marginLeft'), + }), + this.element.css(t), + this.originalElement.css('margin', 0), + (this.originalResizeStyle = + this.originalElement.css('resize')), + this.originalElement.css('resize', 'none'), + this._proportionallyResizeElements.push( + this.originalElement.css({ + position: 'static', + zoom: 1, + display: 'block', + }) + ), + this.originalElement.css(t), + this._proportionallyResize()), + this._setupHandles(), + e.autoHide && + x(this.element) + .on('mouseenter', function () { + e.disabled || + (i._removeClass('ui-resizable-autohide'), + i._handles.show()) + }) + .on('mouseleave', function () { + e.disabled || + i.resizing || + (i._addClass('ui-resizable-autohide'), + i._handles.hide()) + }), + this._mouseInit() + }, + _destroy: function () { + this._mouseDestroy(), this._addedHandles.remove() + function t(t) { + x(t) + .removeData('resizable') + .removeData('ui-resizable') + .off('.resizable') + } + var e + return ( + this.elementIsWrapper && + (t(this.element), + (e = this.element), + this.originalElement + .css({ + position: e.css('position'), + width: e.outerWidth(), + height: e.outerHeight(), + top: e.css('top'), + left: e.css('left'), + }) + .insertAfter(e), + e.remove()), + this.originalElement.css('resize', this.originalResizeStyle), + t(this.originalElement), + this + ) + }, + _setOption: function (t, e) { + switch ((this._super(t, e), t)) { + case 'handles': + this._removeHandles(), this._setupHandles() + break + case 'aspectRatio': + this._aspectRatio = !!e + } + }, + _setupHandles: function () { + var t, + e, + i, + s, + o, + n = this.options, + r = this + if ( + ((this.handles = + n.handles || + (x('.ui-resizable-handle', this.element).length + ? { + n: '.ui-resizable-n', + e: '.ui-resizable-e', + s: '.ui-resizable-s', + w: '.ui-resizable-w', + se: '.ui-resizable-se', + sw: '.ui-resizable-sw', + ne: '.ui-resizable-ne', + nw: '.ui-resizable-nw', + } + : 'e,s,se')), + (this._handles = x()), + (this._addedHandles = x()), + this.handles.constructor === String) + ) + for ( + 'all' === this.handles && + (this.handles = 'n,e,s,w,se,sw,ne,nw'), + i = this.handles.split(','), + this.handles = {}, + e = 0; + e < i.length; + e++ + ) + (s = + 'ui-resizable-' + + (t = String.prototype.trim.call(i[e]))), + (o = x('
')), + this._addClass(o, 'ui-resizable-handle ' + s), + o.css({ zIndex: n.zIndex }), + (this.handles[t] = '.ui-resizable-' + t), + this.element.children(this.handles[t]).length || + (this.element.append(o), + (this._addedHandles = this._addedHandles.add(o))) + ;(this._renderAxis = function (t) { + var e, i, s + for (e in ((t = t || this.element), this.handles)) + this.handles[e].constructor === String + ? (this.handles[e] = this.element + .children(this.handles[e]) + .first() + .show()) + : (this.handles[e].jquery || + this.handles[e].nodeType) && + ((this.handles[e] = x(this.handles[e])), + this._on(this.handles[e], { + mousedown: r._mouseDown, + })), + this.elementIsWrapper && + this.originalElement[0].nodeName.match( + /^(textarea|input|select|button)$/i + ) && + ((i = x(this.handles[e], this.element)), + (s = /sw|ne|nw|se|n|s/.test(e) + ? i.outerHeight() + : i.outerWidth()), + (i = [ + 'padding', + /ne|nw|n/.test(e) + ? 'Top' + : /se|sw|s/.test(e) + ? 'Bottom' + : /^e$/.test(e) + ? 'Right' + : 'Left', + ].join('')), + t.css(i, s), + this._proportionallyResize()), + (this._handles = this._handles.add(this.handles[e])) + }), + this._renderAxis(this.element), + (this._handles = this._handles.add( + this.element.find('.ui-resizable-handle') + )), + this._handles.disableSelection(), + this._handles.on('mouseover', function () { + r.resizing || + (this.className && + (o = this.className.match( + /ui-resizable-(se|sw|ne|nw|n|e|s|w)/i + )), + (r.axis = o && o[1] ? o[1] : 'se')) + }), + n.autoHide && + (this._handles.hide(), + this._addClass('ui-resizable-autohide')) + }, + _removeHandles: function () { + this._addedHandles.remove() + }, + _mouseCapture: function (t) { + var e, + i, + s = !1 + for (e in this.handles) + ((i = x(this.handles[e])[0]) !== t.target && + !x.contains(i, t.target)) || + (s = !0) + return !this.options.disabled && s + }, + _mouseStart: function (t) { + var e, + i, + s = this.options, + o = this.element + return ( + (this.resizing = !0), + this._renderProxy(), + (e = this._num(this.helper.css('left'))), + (i = this._num(this.helper.css('top'))), + s.containment && + ((e += x(s.containment).scrollLeft() || 0), + (i += x(s.containment).scrollTop() || 0)), + (this.offset = this.helper.offset()), + (this.position = { left: e, top: i }), + (this.size = this._helper + ? { + width: this.helper.width(), + height: this.helper.height(), + } + : { width: o.width(), height: o.height() }), + (this.originalSize = this._helper + ? { width: o.outerWidth(), height: o.outerHeight() } + : { width: o.width(), height: o.height() }), + (this.sizeDiff = { + width: o.outerWidth() - o.width(), + height: o.outerHeight() - o.height(), + }), + (this.originalPosition = { left: e, top: i }), + (this.originalMousePosition = { left: t.pageX, top: t.pageY }), + (this.aspectRatio = + 'number' == typeof s.aspectRatio + ? s.aspectRatio + : this.originalSize.width / this.originalSize.height || + 1), + (s = x('.ui-resizable-' + this.axis).css('cursor')), + x('body').css( + 'cursor', + 'auto' === s ? this.axis + '-resize' : s + ), + this._addClass('ui-resizable-resizing'), + this._propagate('start', t), + !0 + ) + }, + _mouseDrag: function (t) { + var e = this.originalMousePosition, + i = this.axis, + s = t.pageX - e.left || 0, + e = t.pageY - e.top || 0, + i = this._change[i] + return ( + this._updatePrevProperties(), + i && + ((e = i.apply(this, [t, s, e])), + this._updateVirtualBoundaries(t.shiftKey), + (this._aspectRatio || t.shiftKey) && + (e = this._updateRatio(e, t)), + (e = this._respectSize(e, t)), + this._updateCache(e), + this._propagate('resize', t), + (e = this._applyChanges()), + !this._helper && + this._proportionallyResizeElements.length && + this._proportionallyResize(), + x.isEmptyObject(e) || + (this._updatePrevProperties(), + this._trigger('resize', t, this.ui()), + this._applyChanges())), + !1 + ) + }, + _mouseStop: function (t) { + this.resizing = !1 + var e, + i, + s, + o = this.options, + n = this + return ( + this._helper && + ((s = + (e = + (i = this._proportionallyResizeElements).length && + /textarea/i.test(i[0].nodeName)) && + this._hasScroll(i[0], 'left') + ? 0 + : n.sizeDiff.height), + (i = e ? 0 : n.sizeDiff.width), + (e = { + width: n.helper.width() - i, + height: n.helper.height() - s, + }), + (i = + parseFloat(n.element.css('left')) + + (n.position.left - n.originalPosition.left) || + null), + (s = + parseFloat(n.element.css('top')) + + (n.position.top - n.originalPosition.top) || null), + o.animate || + this.element.css(x.extend(e, { top: s, left: i })), + n.helper.height(n.size.height), + n.helper.width(n.size.width), + this._helper && !o.animate && this._proportionallyResize()), + x('body').css('cursor', 'auto'), + this._removeClass('ui-resizable-resizing'), + this._propagate('stop', t), + this._helper && this.helper.remove(), + !1 + ) + }, + _updatePrevProperties: function () { + ;(this.prevPosition = { + top: this.position.top, + left: this.position.left, + }), + (this.prevSize = { + width: this.size.width, + height: this.size.height, + }) + }, + _applyChanges: function () { + var t = {} + return ( + this.position.top !== this.prevPosition.top && + (t.top = this.position.top + 'px'), + this.position.left !== this.prevPosition.left && + (t.left = this.position.left + 'px'), + this.size.width !== this.prevSize.width && + (t.width = this.size.width + 'px'), + this.size.height !== this.prevSize.height && + (t.height = this.size.height + 'px'), + this.helper.css(t), + t + ) + }, + _updateVirtualBoundaries: function (t) { + var e, + i, + s = this.options, + o = { + minWidth: this._isNumber(s.minWidth) ? s.minWidth : 0, + maxWidth: this._isNumber(s.maxWidth) ? s.maxWidth : 1 / 0, + minHeight: this._isNumber(s.minHeight) ? s.minHeight : 0, + maxHeight: this._isNumber(s.maxHeight) + ? s.maxHeight + : 1 / 0, + } + ;(this._aspectRatio || t) && + ((e = o.minHeight * this.aspectRatio), + (i = o.minWidth / this.aspectRatio), + (s = o.maxHeight * this.aspectRatio), + (t = o.maxWidth / this.aspectRatio), + e > o.minWidth && (o.minWidth = e), + i > o.minHeight && (o.minHeight = i), + s < o.maxWidth && (o.maxWidth = s), + t < o.maxHeight && (o.maxHeight = t)), + (this._vBoundaries = o) + }, + _updateCache: function (t) { + ;(this.offset = this.helper.offset()), + this._isNumber(t.left) && (this.position.left = t.left), + this._isNumber(t.top) && (this.position.top = t.top), + this._isNumber(t.height) && (this.size.height = t.height), + this._isNumber(t.width) && (this.size.width = t.width) + }, + _updateRatio: function (t) { + var e = this.position, + i = this.size, + s = this.axis + return ( + this._isNumber(t.height) + ? (t.width = t.height * this.aspectRatio) + : this._isNumber(t.width) && + (t.height = t.width / this.aspectRatio), + 'sw' === s && + ((t.left = e.left + (i.width - t.width)), (t.top = null)), + 'nw' === s && + ((t.top = e.top + (i.height - t.height)), + (t.left = e.left + (i.width - t.width))), + t + ) + }, + _respectSize: function (t) { + var e = this._vBoundaries, + i = this.axis, + s = + this._isNumber(t.width) && + e.maxWidth && + e.maxWidth < t.width, + o = + this._isNumber(t.height) && + e.maxHeight && + e.maxHeight < t.height, + n = + this._isNumber(t.width) && + e.minWidth && + e.minWidth > t.width, + r = + this._isNumber(t.height) && + e.minHeight && + e.minHeight > t.height, + a = this.originalPosition.left + this.originalSize.width, + h = this.originalPosition.top + this.originalSize.height, + l = /sw|nw|w/.test(i), + i = /nw|ne|n/.test(i) + return ( + n && (t.width = e.minWidth), + r && (t.height = e.minHeight), + s && (t.width = e.maxWidth), + o && (t.height = e.maxHeight), + n && l && (t.left = a - e.minWidth), + s && l && (t.left = a - e.maxWidth), + r && i && (t.top = h - e.minHeight), + o && i && (t.top = h - e.maxHeight), + t.width || t.height || t.left || !t.top + ? t.width || t.height || t.top || !t.left || (t.left = null) + : (t.top = null), + t + ) + }, + _getPaddingPlusBorderDimensions: function (t) { + for ( + var e = 0, + i = [], + s = [ + t.css('borderTopWidth'), + t.css('borderRightWidth'), + t.css('borderBottomWidth'), + t.css('borderLeftWidth'), + ], + o = [ + t.css('paddingTop'), + t.css('paddingRight'), + t.css('paddingBottom'), + t.css('paddingLeft'), + ]; + e < 4; + e++ + ) + (i[e] = parseFloat(s[e]) || 0), (i[e] += parseFloat(o[e]) || 0) + return { height: i[0] + i[2], width: i[1] + i[3] } + }, + _proportionallyResize: function () { + if (this._proportionallyResizeElements.length) + for ( + var t, e = 0, i = this.helper || this.element; + e < this._proportionallyResizeElements.length; + e++ + ) + (t = this._proportionallyResizeElements[e]), + this.outerDimensions || + (this.outerDimensions = + this._getPaddingPlusBorderDimensions(t)), + t.css({ + height: + i.height() - this.outerDimensions.height || 0, + width: i.width() - this.outerDimensions.width || 0, + }) + }, + _renderProxy: function () { + var t = this.element, + e = this.options + ;(this.elementOffset = t.offset()), + this._helper + ? ((this.helper = + this.helper || + x('
').css({ overflow: 'hidden' })), + this._addClass(this.helper, this._helper), + this.helper.css({ + width: this.element.outerWidth(), + height: this.element.outerHeight(), + position: 'absolute', + left: this.elementOffset.left + 'px', + top: this.elementOffset.top + 'px', + zIndex: ++e.zIndex, + }), + this.helper.appendTo('body').disableSelection()) + : (this.helper = this.element) + }, + _change: { + e: function (t, e) { + return { width: this.originalSize.width + e } + }, + w: function (t, e) { + var i = this.originalSize + return { + left: this.originalPosition.left + e, + width: i.width - e, + } + }, + n: function (t, e, i) { + var s = this.originalSize + return { + top: this.originalPosition.top + i, + height: s.height - i, + } + }, + s: function (t, e, i) { + return { height: this.originalSize.height + i } + }, + se: function (t, e, i) { + return x.extend( + this._change.s.apply(this, arguments), + this._change.e.apply(this, [t, e, i]) + ) + }, + sw: function (t, e, i) { + return x.extend( + this._change.s.apply(this, arguments), + this._change.w.apply(this, [t, e, i]) + ) + }, + ne: function (t, e, i) { + return x.extend( + this._change.n.apply(this, arguments), + this._change.e.apply(this, [t, e, i]) + ) + }, + nw: function (t, e, i) { + return x.extend( + this._change.n.apply(this, arguments), + this._change.w.apply(this, [t, e, i]) + ) + }, + }, + _propagate: function (t, e) { + x.ui.plugin.call(this, t, [e, this.ui()]), + 'resize' !== t && this._trigger(t, e, this.ui()) + }, + plugins: {}, + ui: function () { + return { + originalElement: this.originalElement, + element: this.element, + helper: this.helper, + position: this.position, + size: this.size, + originalSize: this.originalSize, + originalPosition: this.originalPosition, + } + }, + }), + x.ui.plugin.add('resizable', 'animate', { + stop: function (e) { + var i = x(this).resizable('instance'), + t = i.options, + s = i._proportionallyResizeElements, + o = s.length && /textarea/i.test(s[0].nodeName), + n = o && i._hasScroll(s[0], 'left') ? 0 : i.sizeDiff.height, + r = o ? 0 : i.sizeDiff.width, + o = { width: i.size.width - r, height: i.size.height - n }, + r = + parseFloat(i.element.css('left')) + + (i.position.left - i.originalPosition.left) || null, + n = + parseFloat(i.element.css('top')) + + (i.position.top - i.originalPosition.top) || null + i.element.animate( + x.extend(o, n && r ? { top: n, left: r } : {}), + { + duration: t.animateDuration, + easing: t.animateEasing, + step: function () { + var t = { + width: parseFloat(i.element.css('width')), + height: parseFloat(i.element.css('height')), + top: parseFloat(i.element.css('top')), + left: parseFloat(i.element.css('left')), + } + s && + s.length && + x(s[0]).css({ + width: t.width, + height: t.height, + }), + i._updateCache(t), + i._propagate('resize', e) + }, + } + ) + }, + }), + x.ui.plugin.add('resizable', 'containment', { + start: function () { + var i, + s, + o = x(this).resizable('instance'), + t = o.options, + e = o.element, + n = t.containment, + r = + n instanceof x + ? n.get(0) + : /parent/.test(n) + ? e.parent().get(0) + : n + r && + ((o.containerElement = x(r)), + /document/.test(n) || n === document + ? ((o.containerOffset = { left: 0, top: 0 }), + (o.containerPosition = { left: 0, top: 0 }), + (o.parentData = { + element: x(document), + left: 0, + top: 0, + width: x(document).width(), + height: + x(document).height() || + document.body.parentNode.scrollHeight, + })) + : ((i = x(r)), + (s = []), + x(['Top', 'Right', 'Left', 'Bottom']).each(function ( + t, + e + ) { + s[t] = o._num(i.css('padding' + e)) + }), + (o.containerOffset = i.offset()), + (o.containerPosition = i.position()), + (o.containerSize = { + height: i.innerHeight() - s[3], + width: i.innerWidth() - s[1], + }), + (t = o.containerOffset), + (e = o.containerSize.height), + (n = o.containerSize.width), + (n = o._hasScroll(r, 'left') ? r.scrollWidth : n), + (e = o._hasScroll(r) ? r.scrollHeight : e), + (o.parentData = { + element: r, + left: t.left, + top: t.top, + width: n, + height: e, + }))) + }, + resize: function (t) { + var e = x(this).resizable('instance'), + i = e.options, + s = e.containerOffset, + o = e.position, + n = e._aspectRatio || t.shiftKey, + r = { top: 0, left: 0 }, + a = e.containerElement, + t = !0 + a[0] !== document && + /static/.test(a.css('position')) && + (r = s), + o.left < (e._helper ? s.left : 0) && + ((e.size.width = + e.size.width + + (e._helper + ? e.position.left - s.left + : e.position.left - r.left)), + n && + ((e.size.height = e.size.width / e.aspectRatio), + (t = !1)), + (e.position.left = i.helper ? s.left : 0)), + o.top < (e._helper ? s.top : 0) && + ((e.size.height = + e.size.height + + (e._helper + ? e.position.top - s.top + : e.position.top)), + n && + ((e.size.width = e.size.height * e.aspectRatio), + (t = !1)), + (e.position.top = e._helper ? s.top : 0)), + (i = + e.containerElement.get(0) === + e.element.parent().get(0)), + (o = /relative|absolute/.test( + e.containerElement.css('position') + )), + i && o + ? ((e.offset.left = + e.parentData.left + e.position.left), + (e.offset.top = e.parentData.top + e.position.top)) + : ((e.offset.left = e.element.offset().left), + (e.offset.top = e.element.offset().top)), + (o = Math.abs( + e.sizeDiff.width + + (e._helper + ? e.offset.left - r.left + : e.offset.left - s.left) + )), + (s = Math.abs( + e.sizeDiff.height + + (e._helper + ? e.offset.top - r.top + : e.offset.top - s.top) + )), + o + e.size.width >= e.parentData.width && + ((e.size.width = e.parentData.width - o), + n && + ((e.size.height = e.size.width / e.aspectRatio), + (t = !1))), + s + e.size.height >= e.parentData.height && + ((e.size.height = e.parentData.height - s), + n && + ((e.size.width = e.size.height * e.aspectRatio), + (t = !1))), + t || + ((e.position.left = e.prevPosition.left), + (e.position.top = e.prevPosition.top), + (e.size.width = e.prevSize.width), + (e.size.height = e.prevSize.height)) + }, + stop: function () { + var t = x(this).resizable('instance'), + e = t.options, + i = t.containerOffset, + s = t.containerPosition, + o = t.containerElement, + n = x(t.helper), + r = n.offset(), + a = n.outerWidth() - t.sizeDiff.width, + n = n.outerHeight() - t.sizeDiff.height + t._helper && + !e.animate && + /relative/.test(o.css('position')) && + x(this).css({ + left: r.left - s.left - i.left, + width: a, + height: n, + }), + t._helper && + !e.animate && + /static/.test(o.css('position')) && + x(this).css({ + left: r.left - s.left - i.left, + width: a, + height: n, + }) + }, + }), + x.ui.plugin.add('resizable', 'alsoResize', { + start: function () { + var t = x(this).resizable('instance').options + x(t.alsoResize).each(function () { + var t = x(this) + t.data('ui-resizable-alsoresize', { + width: parseFloat(t.width()), + height: parseFloat(t.height()), + left: parseFloat(t.css('left')), + top: parseFloat(t.css('top')), + }) + }) + }, + resize: function (t, i) { + var e = x(this).resizable('instance'), + s = e.options, + o = e.originalSize, + n = e.originalPosition, + r = { + height: e.size.height - o.height || 0, + width: e.size.width - o.width || 0, + top: e.position.top - n.top || 0, + left: e.position.left - n.left || 0, + } + x(s.alsoResize).each(function () { + var t = x(this), + s = x(this).data('ui-resizable-alsoresize'), + o = {}, + e = t.parents(i.originalElement[0]).length + ? ['width', 'height'] + : ['width', 'height', 'top', 'left'] + x.each(e, function (t, e) { + var i = (s[e] || 0) + (r[e] || 0) + i && 0 <= i && (o[e] = i || null) + }), + t.css(o) + }) + }, + stop: function () { + x(this).removeData('ui-resizable-alsoresize') + }, + }), + x.ui.plugin.add('resizable', 'ghost', { + start: function () { + var t = x(this).resizable('instance'), + e = t.size + ;(t.ghost = t.originalElement.clone()), + t.ghost.css({ + opacity: 0.25, + display: 'block', + position: 'relative', + height: e.height, + width: e.width, + margin: 0, + left: 0, + top: 0, + }), + t._addClass(t.ghost, 'ui-resizable-ghost'), + !1 !== x.uiBackCompat && + 'string' == typeof t.options.ghost && + t.ghost.addClass(this.options.ghost), + t.ghost.appendTo(t.helper) + }, + resize: function () { + var t = x(this).resizable('instance') + t.ghost && + t.ghost.css({ + position: 'relative', + height: t.size.height, + width: t.size.width, + }) + }, + stop: function () { + var t = x(this).resizable('instance') + t.ghost && + t.helper && + t.helper.get(0).removeChild(t.ghost.get(0)) + }, + }), + x.ui.plugin.add('resizable', 'grid', { + resize: function () { + var t, + e = x(this).resizable('instance'), + i = e.options, + s = e.size, + o = e.originalSize, + n = e.originalPosition, + r = e.axis, + a = 'number' == typeof i.grid ? [i.grid, i.grid] : i.grid, + h = a[0] || 1, + l = a[1] || 1, + c = Math.round((s.width - o.width) / h) * h, + p = Math.round((s.height - o.height) / l) * l, + u = o.width + c, + d = o.height + p, + f = i.maxWidth && i.maxWidth < u, + g = i.maxHeight && i.maxHeight < d, + m = i.minWidth && i.minWidth > u, + s = i.minHeight && i.minHeight > d + ;(i.grid = a), + m && (u += h), + s && (d += l), + f && (u -= h), + g && (d -= l), + /^(se|s|e)$/.test(r) + ? ((e.size.width = u), (e.size.height = d)) + : /^(ne)$/.test(r) + ? ((e.size.width = u), + (e.size.height = d), + (e.position.top = n.top - p)) + : /^(sw)$/.test(r) + ? ((e.size.width = u), + (e.size.height = d), + (e.position.left = n.left - c)) + : ((d - l <= 0 || u - h <= 0) && + (t = e._getPaddingPlusBorderDimensions(this)), + 0 < d - l + ? ((e.size.height = d), + (e.position.top = n.top - p)) + : ((d = l - t.height), + (e.size.height = d), + (e.position.top = n.top + o.height - d)), + 0 < u - h + ? ((e.size.width = u), + (e.position.left = n.left - c)) + : ((u = h - t.width), + (e.size.width = u), + (e.position.left = n.left + o.width - u))) + }, + }) + x.ui.resizable, + x.widget('ui.sortable', x.ui.mouse, { + version: '1.13.1', + widgetEventPrefix: 'sort', + ready: !1, + options: { + appendTo: 'parent', + axis: !1, + connectWith: !1, + containment: !1, + cursor: 'auto', + cursorAt: !1, + dropOnEmpty: !0, + forcePlaceholderSize: !1, + forceHelperSize: !1, + grid: !1, + handle: !1, + helper: 'original', + items: '> *', + opacity: !1, + placeholder: !1, + revert: !1, + scroll: !0, + scrollSensitivity: 20, + scrollSpeed: 20, + scope: 'default', + tolerance: 'intersect', + zIndex: 1e3, + activate: null, + beforeStop: null, + change: null, + deactivate: null, + out: null, + over: null, + receive: null, + remove: null, + sort: null, + start: null, + stop: null, + update: null, + }, + _isOverAxis: function (t, e, i) { + return e <= t && t < e + i + }, + _isFloating: function (t) { + return ( + /left|right/.test(t.css('float')) || + /inline|table-cell/.test(t.css('display')) + ) + }, + _create: function () { + ;(this.containerCache = {}), + this._addClass('ui-sortable'), + this.refresh(), + (this.offset = this.element.offset()), + this._mouseInit(), + this._setHandleClassName(), + (this.ready = !0) + }, + _setOption: function (t, e) { + this._super(t, e), 'handle' === t && this._setHandleClassName() + }, + _setHandleClassName: function () { + var t = this + this._removeClass( + this.element.find('.ui-sortable-handle'), + 'ui-sortable-handle' + ), + x.each(this.items, function () { + t._addClass( + this.instance.options.handle + ? this.item.find(this.instance.options.handle) + : this.item, + 'ui-sortable-handle' + ) + }) + }, + _destroy: function () { + this._mouseDestroy() + for (var t = this.items.length - 1; 0 <= t; t--) + this.items[t].item.removeData(this.widgetName + '-item') + return this + }, + _mouseCapture: function (t, e) { + var i = null, + s = !1, + o = this + return ( + !this.reverting && + !this.options.disabled && + 'static' !== this.options.type && + (this._refreshItems(t), + x(t.target) + .parents() + .each(function () { + if (x.data(this, o.widgetName + '-item') === o) + return (i = x(this)), !1 + }), + !!(i = + x.data(t.target, o.widgetName + '-item') === o + ? x(t.target) + : i) && + !( + this.options.handle && + !e && + (x(this.options.handle, i) + .find('*') + .addBack() + .each(function () { + this === t.target && (s = !0) + }), + !s) + ) && + ((this.currentItem = i), + this._removeCurrentsFromItems(), + !0)) + ) + }, + _mouseStart: function (t, e, i) { + var s, + o, + n = this.options + if ( + ((this.currentContainer = this).refreshPositions(), + (this.appendTo = x( + 'parent' !== n.appendTo + ? n.appendTo + : this.currentItem.parent() + )), + (this.helper = this._createHelper(t)), + this._cacheHelperProportions(), + this._cacheMargins(), + (this.offset = this.currentItem.offset()), + (this.offset = { + top: this.offset.top - this.margins.top, + left: this.offset.left - this.margins.left, + }), + x.extend(this.offset, { + click: { + left: t.pageX - this.offset.left, + top: t.pageY - this.offset.top, + }, + relative: this._getRelativeOffset(), + }), + this.helper.css('position', 'absolute'), + (this.cssPosition = this.helper.css('position')), + n.cursorAt && this._adjustOffsetFromHelper(n.cursorAt), + (this.domPosition = { + prev: this.currentItem.prev()[0], + parent: this.currentItem.parent()[0], + }), + this.helper[0] !== this.currentItem[0] && + this.currentItem.hide(), + this._createPlaceholder(), + (this.scrollParent = this.placeholder.scrollParent()), + x.extend(this.offset, { parent: this._getParentOffset() }), + n.containment && this._setContainment(), + n.cursor && + 'auto' !== n.cursor && + ((o = this.document.find('body')), + (this.storedCursor = o.css('cursor')), + o.css('cursor', n.cursor), + (this.storedStylesheet = x( + '' + ).appendTo(o))), + n.zIndex && + (this.helper.css('zIndex') && + (this._storedZIndex = this.helper.css('zIndex')), + this.helper.css('zIndex', n.zIndex)), + n.opacity && + (this.helper.css('opacity') && + (this._storedOpacity = this.helper.css('opacity')), + this.helper.css('opacity', n.opacity)), + this.scrollParent[0] !== this.document[0] && + 'HTML' !== this.scrollParent[0].tagName && + (this.overflowOffset = this.scrollParent.offset()), + this._trigger('start', t, this._uiHash()), + this._preserveHelperProportions || + this._cacheHelperProportions(), + !i) + ) + for (s = this.containers.length - 1; 0 <= s; s--) + this.containers[s]._trigger( + 'activate', + t, + this._uiHash(this) + ) + return ( + x.ui.ddmanager && (x.ui.ddmanager.current = this), + x.ui.ddmanager && + !n.dropBehaviour && + x.ui.ddmanager.prepareOffsets(this, t), + (this.dragging = !0), + this._addClass(this.helper, 'ui-sortable-helper'), + this.helper.parent().is(this.appendTo) || + (this.helper.detach().appendTo(this.appendTo), + (this.offset.parent = this._getParentOffset())), + (this.position = this.originalPosition = + this._generatePosition(t)), + (this.originalPageX = t.pageX), + (this.originalPageY = t.pageY), + (this.lastPositionAbs = this.positionAbs = + this._convertPositionTo('absolute')), + this._mouseDrag(t), + !0 + ) + }, + _scroll: function (t) { + var e = this.options, + i = !1 + return ( + this.scrollParent[0] !== this.document[0] && + 'HTML' !== this.scrollParent[0].tagName + ? (this.overflowOffset.top + + this.scrollParent[0].offsetHeight - + t.pageY < + e.scrollSensitivity + ? (this.scrollParent[0].scrollTop = i = + this.scrollParent[0].scrollTop + + e.scrollSpeed) + : t.pageY - this.overflowOffset.top < + e.scrollSensitivity && + (this.scrollParent[0].scrollTop = i = + this.scrollParent[0].scrollTop - + e.scrollSpeed), + this.overflowOffset.left + + this.scrollParent[0].offsetWidth - + t.pageX < + e.scrollSensitivity + ? (this.scrollParent[0].scrollLeft = i = + this.scrollParent[0].scrollLeft + + e.scrollSpeed) + : t.pageX - this.overflowOffset.left < + e.scrollSensitivity && + (this.scrollParent[0].scrollLeft = i = + this.scrollParent[0].scrollLeft - + e.scrollSpeed)) + : (t.pageY - this.document.scrollTop() < + e.scrollSensitivity + ? (i = this.document.scrollTop( + this.document.scrollTop() - e.scrollSpeed + )) + : this.window.height() - + (t.pageY - this.document.scrollTop()) < + e.scrollSensitivity && + (i = this.document.scrollTop( + this.document.scrollTop() + e.scrollSpeed + )), + t.pageX - this.document.scrollLeft() < + e.scrollSensitivity + ? (i = this.document.scrollLeft( + this.document.scrollLeft() - e.scrollSpeed + )) + : this.window.width() - + (t.pageX - this.document.scrollLeft()) < + e.scrollSensitivity && + (i = this.document.scrollLeft( + this.document.scrollLeft() + e.scrollSpeed + ))), + i + ) + }, + _mouseDrag: function (t) { + var e, + i, + s, + o, + n = this.options + for ( + this.position = this._generatePosition(t), + this.positionAbs = this._convertPositionTo('absolute'), + (this.options.axis && 'y' === this.options.axis) || + (this.helper[0].style.left = + this.position.left + 'px'), + (this.options.axis && 'x' === this.options.axis) || + (this.helper[0].style.top = + this.position.top + 'px'), + n.scroll && + !1 !== this._scroll(t) && + (this._refreshItemPositions(!0), + x.ui.ddmanager && + !n.dropBehaviour && + x.ui.ddmanager.prepareOffsets(this, t)), + this.dragDirection = { + vertical: this._getDragVerticalDirection(), + horizontal: this._getDragHorizontalDirection(), + }, + e = this.items.length - 1; + 0 <= e; + e-- + ) + if ( + ((s = (i = this.items[e]).item[0]), + (o = this._intersectsWithPointer(i)) && + i.instance === this.currentContainer && + !( + s === this.currentItem[0] || + this.placeholder[ + 1 === o ? 'next' : 'prev' + ]()[0] === s || + x.contains(this.placeholder[0], s) || + ('semi-dynamic' === this.options.type && + x.contains(this.element[0], s)) + )) + ) { + if ( + ((this.direction = 1 === o ? 'down' : 'up'), + 'pointer' !== this.options.tolerance && + !this._intersectsWithSides(i)) + ) + break + this._rearrange(t, i), + this._trigger('change', t, this._uiHash()) + break + } + return ( + this._contactContainers(t), + x.ui.ddmanager && x.ui.ddmanager.drag(this, t), + this._trigger('sort', t, this._uiHash()), + (this.lastPositionAbs = this.positionAbs), + !1 + ) + }, + _mouseStop: function (t, e) { + var i, s, o, n + if (t) + return ( + x.ui.ddmanager && + !this.options.dropBehaviour && + x.ui.ddmanager.drop(this, t), + this.options.revert + ? ((s = (i = this).placeholder.offset()), + (n = {}), + ((o = this.options.axis) && 'x' !== o) || + (n.left = + s.left - + this.offset.parent.left - + this.margins.left + + (this.offsetParent[0] === + this.document[0].body + ? 0 + : this.offsetParent[0].scrollLeft)), + (o && 'y' !== o) || + (n.top = + s.top - + this.offset.parent.top - + this.margins.top + + (this.offsetParent[0] === + this.document[0].body + ? 0 + : this.offsetParent[0].scrollTop)), + (this.reverting = !0), + x(this.helper).animate( + n, + parseInt(this.options.revert, 10) || 500, + function () { + i._clear(t) + } + )) + : this._clear(t, e), + !1 + ) + }, + cancel: function () { + if (this.dragging) { + this._mouseUp(new x.Event('mouseup', { target: null })), + 'original' === this.options.helper + ? (this.currentItem.css(this._storedCSS), + this._removeClass( + this.currentItem, + 'ui-sortable-helper' + )) + : this.currentItem.show() + for (var t = this.containers.length - 1; 0 <= t; t--) + this.containers[t]._trigger( + 'deactivate', + null, + this._uiHash(this) + ), + this.containers[t].containerCache.over && + (this.containers[t]._trigger( + 'out', + null, + this._uiHash(this) + ), + (this.containers[t].containerCache.over = 0)) + } + return ( + this.placeholder && + (this.placeholder[0].parentNode && + this.placeholder[0].parentNode.removeChild( + this.placeholder[0] + ), + 'original' !== this.options.helper && + this.helper && + this.helper[0].parentNode && + this.helper.remove(), + x.extend(this, { + helper: null, + dragging: !1, + reverting: !1, + _noFinalSort: null, + }), + this.domPosition.prev + ? x(this.domPosition.prev).after(this.currentItem) + : x(this.domPosition.parent).prepend( + this.currentItem + )), + this + ) + }, + serialize: function (e) { + var t = this._getItemsAsjQuery(e && e.connected), + i = [] + return ( + (e = e || {}), + x(t).each(function () { + var t = ( + x(e.item || this).attr(e.attribute || 'id') || '' + ).match(e.expression || /(.+)[\-=_](.+)/) + t && + i.push( + (e.key || t[1] + '[]') + + '=' + + (e.key && e.expression ? t[1] : t[2]) + ) + }), + !i.length && e.key && i.push(e.key + '='), + i.join('&') + ) + }, + toArray: function (t) { + var e = this._getItemsAsjQuery(t && t.connected), + i = [] + return ( + (t = t || {}), + e.each(function () { + i.push( + x(t.item || this).attr(t.attribute || 'id') || '' + ) + }), + i + ) + }, + _intersectsWith: function (t) { + var e = this.positionAbs.left, + i = e + this.helperProportions.width, + s = this.positionAbs.top, + o = s + this.helperProportions.height, + n = t.left, + r = n + t.width, + a = t.top, + h = a + t.height, + l = this.offset.click.top, + c = this.offset.click.left, + l = 'x' === this.options.axis || (a < s + l && s + l < h), + c = 'y' === this.options.axis || (n < e + c && e + c < r) + return 'pointer' === this.options.tolerance || + this.options.forcePointerForContainers || + ('pointer' !== this.options.tolerance && + this.helperProportions[ + this.floating ? 'width' : 'height' + ] > t[this.floating ? 'width' : 'height']) + ? l && c + : n < e + this.helperProportions.width / 2 && + i - this.helperProportions.width / 2 < r && + a < s + this.helperProportions.height / 2 && + o - this.helperProportions.height / 2 < h + }, + _intersectsWithPointer: function (t) { + var e = + 'x' === this.options.axis || + this._isOverAxis( + this.positionAbs.top + this.offset.click.top, + t.top, + t.height + ), + t = + 'y' === this.options.axis || + this._isOverAxis( + this.positionAbs.left + this.offset.click.left, + t.left, + t.width + ) + return ( + !(!e || !t) && + ((e = this.dragDirection.vertical), + (t = this.dragDirection.horizontal), + this.floating + ? 'right' === t || 'down' === e + ? 2 + : 1 + : e && ('down' === e ? 2 : 1)) + ) + }, + _intersectsWithSides: function (t) { + var e = this._isOverAxis( + this.positionAbs.top + this.offset.click.top, + t.top + t.height / 2, + t.height + ), + i = this._isOverAxis( + this.positionAbs.left + this.offset.click.left, + t.left + t.width / 2, + t.width + ), + s = this.dragDirection.vertical, + t = this.dragDirection.horizontal + return this.floating && t + ? ('right' === t && i) || ('left' === t && !i) + : s && (('down' === s && e) || ('up' === s && !e)) + }, + _getDragVerticalDirection: function () { + var t = this.positionAbs.top - this.lastPositionAbs.top + return 0 != t && (0 < t ? 'down' : 'up') + }, + _getDragHorizontalDirection: function () { + var t = this.positionAbs.left - this.lastPositionAbs.left + return 0 != t && (0 < t ? 'right' : 'left') + }, + refresh: function (t) { + return ( + this._refreshItems(t), + this._setHandleClassName(), + this.refreshPositions(), + this + ) + }, + _connectWith: function () { + var t = this.options + return t.connectWith.constructor === String + ? [t.connectWith] + : t.connectWith + }, + _getItemsAsjQuery: function (t) { + var e, + i, + s, + o, + n = [], + r = [], + a = this._connectWith() + if (a && t) + for (e = a.length - 1; 0 <= e; e--) + for ( + i = (s = x(a[e], this.document[0])).length - 1; + 0 <= i; + i-- + ) + (o = x.data(s[i], this.widgetFullName)) && + o !== this && + !o.options.disabled && + r.push([ + 'function' == typeof o.options.items + ? o.options.items.call(o.element) + : x(o.options.items, o.element) + .not('.ui-sortable-helper') + .not('.ui-sortable-placeholder'), + o, + ]) + function h() { + n.push(this) + } + for ( + r.push([ + 'function' == typeof this.options.items + ? this.options.items.call(this.element, null, { + options: this.options, + item: this.currentItem, + }) + : x(this.options.items, this.element) + .not('.ui-sortable-helper') + .not('.ui-sortable-placeholder'), + this, + ]), + e = r.length - 1; + 0 <= e; + e-- + ) + r[e][0].each(h) + return x(n) + }, + _removeCurrentsFromItems: function () { + var i = this.currentItem.find( + ':data(' + this.widgetName + '-item)' + ) + this.items = x.grep(this.items, function (t) { + for (var e = 0; e < i.length; e++) + if (i[e] === t.item[0]) return !1 + return !0 + }) + }, + _refreshItems: function (t) { + ;(this.items = []), (this.containers = [this]) + var e, + i, + s, + o, + n, + r, + a, + h, + l = this.items, + c = [ + [ + 'function' == typeof this.options.items + ? this.options.items.call(this.element[0], t, { + item: this.currentItem, + }) + : x(this.options.items, this.element), + this, + ], + ], + p = this._connectWith() + if (p && this.ready) + for (e = p.length - 1; 0 <= e; e--) + for ( + i = (s = x(p[e], this.document[0])).length - 1; + 0 <= i; + i-- + ) + (o = x.data(s[i], this.widgetFullName)) && + o !== this && + !o.options.disabled && + (c.push([ + 'function' == typeof o.options.items + ? o.options.items.call( + o.element[0], + t, + { item: this.currentItem } + ) + : x(o.options.items, o.element), + o, + ]), + this.containers.push(o)) + for (e = c.length - 1; 0 <= e; e--) + for ( + n = c[e][1], h = (r = c[e][(i = 0)]).length; + i < h; + i++ + ) + (a = x(r[i])).data(this.widgetName + '-item', n), + l.push({ + item: a, + instance: n, + width: 0, + height: 0, + left: 0, + top: 0, + }) + }, + _refreshItemPositions: function (t) { + for (var e, i, s = this.items.length - 1; 0 <= s; s--) + (e = this.items[s]), + (this.currentContainer && + e.instance !== this.currentContainer && + e.item[0] !== this.currentItem[0]) || + ((i = this.options.toleranceElement + ? x(this.options.toleranceElement, e.item) + : e.item), + t || + ((e.width = i.outerWidth()), + (e.height = i.outerHeight())), + (i = i.offset()), + (e.left = i.left), + (e.top = i.top)) + }, + refreshPositions: function (t) { + var e, i + if ( + ((this.floating = + !!this.items.length && + ('x' === this.options.axis || + this._isFloating(this.items[0].item))), + this.offsetParent && + this.helper && + (this.offset.parent = this._getParentOffset()), + this._refreshItemPositions(t), + this.options.custom && + this.options.custom.refreshContainers) + ) + this.options.custom.refreshContainers.call(this) + else + for (e = this.containers.length - 1; 0 <= e; e--) + (i = this.containers[e].element.offset()), + (this.containers[e].containerCache.left = i.left), + (this.containers[e].containerCache.top = i.top), + (this.containers[e].containerCache.width = + this.containers[e].element.outerWidth()), + (this.containers[e].containerCache.height = + this.containers[e].element.outerHeight()) + return this + }, + _createPlaceholder: function (i) { + var s, + o, + n = (i = i || this).options + ;(n.placeholder && n.placeholder.constructor !== String) || + ((s = n.placeholder), + (o = i.currentItem[0].nodeName.toLowerCase()), + (n.placeholder = { + element: function () { + var t = x('<' + o + '>', i.document[0]) + return ( + i + ._addClass( + t, + 'ui-sortable-placeholder', + s || i.currentItem[0].className + ) + ._removeClass(t, 'ui-sortable-helper'), + 'tbody' === o + ? i._createTrPlaceholder( + i.currentItem.find('tr').eq(0), + x('', i.document[0]).appendTo(t) + ) + : 'tr' === o + ? i._createTrPlaceholder(i.currentItem, t) + : 'img' === o && + t.attr('src', i.currentItem.attr('src')), + s || t.css('visibility', 'hidden'), + t + ) + }, + update: function (t, e) { + ;(s && !n.forcePlaceholderSize) || + ((e.height() && + (!n.forcePlaceholderSize || + ('tbody' !== o && 'tr' !== o))) || + e.height( + i.currentItem.innerHeight() - + parseInt( + i.currentItem.css( + 'paddingTop' + ) || 0, + 10 + ) - + parseInt( + i.currentItem.css( + 'paddingBottom' + ) || 0, + 10 + ) + ), + e.width() || + e.width( + i.currentItem.innerWidth() - + parseInt( + i.currentItem.css( + 'paddingLeft' + ) || 0, + 10 + ) - + parseInt( + i.currentItem.css( + 'paddingRight' + ) || 0, + 10 + ) + )) + }, + })), + (i.placeholder = x( + n.placeholder.element.call(i.element, i.currentItem) + )), + i.currentItem.after(i.placeholder), + n.placeholder.update(i, i.placeholder) + }, + _createTrPlaceholder: function (t, e) { + var i = this + t.children().each(function () { + x(' ', i.document[0]) + .attr('colspan', x(this).attr('colspan') || 1) + .appendTo(e) + }) + }, + _contactContainers: function (t) { + for ( + var e, + i, + s, + o, + n, + r, + a, + h, + l, + c = null, + p = null, + u = this.containers.length - 1; + 0 <= u; + u-- + ) + x.contains( + this.currentItem[0], + this.containers[u].element[0] + ) || + (this._intersectsWith(this.containers[u].containerCache) + ? (c && + x.contains( + this.containers[u].element[0], + c.element[0] + )) || + ((c = this.containers[u]), (p = u)) + : this.containers[u].containerCache.over && + (this.containers[u]._trigger( + 'out', + t, + this._uiHash(this) + ), + (this.containers[u].containerCache.over = 0))) + if (c) + if (1 === this.containers.length) + this.containers[p].containerCache.over || + (this.containers[p]._trigger( + 'over', + t, + this._uiHash(this) + ), + (this.containers[p].containerCache.over = 1)) + else { + for ( + i = 1e4, + s = null, + o = (h = + c.floating || + this._isFloating(this.currentItem)) + ? 'left' + : 'top', + n = h ? 'width' : 'height', + l = h ? 'pageX' : 'pageY', + e = this.items.length - 1; + 0 <= e; + e-- + ) + x.contains( + this.containers[p].element[0], + this.items[e].item[0] + ) && + this.items[e].item[0] !== this.currentItem[0] && + ((r = this.items[e].item.offset()[o]), + (a = !1), + t[l] - r > this.items[e][n] / 2 && (a = !0), + Math.abs(t[l] - r) < i && + ((i = Math.abs(t[l] - r)), + (s = this.items[e]), + (this.direction = a ? 'up' : 'down'))) + ;(s || this.options.dropOnEmpty) && + (this.currentContainer !== this.containers[p] + ? (s + ? this._rearrange(t, s, null, !0) + : this._rearrange( + t, + null, + this.containers[p].element, + !0 + ), + this._trigger('change', t, this._uiHash()), + this.containers[p]._trigger( + 'change', + t, + this._uiHash(this) + ), + (this.currentContainer = this.containers[p]), + this.options.placeholder.update( + this.currentContainer, + this.placeholder + ), + (this.scrollParent = + this.placeholder.scrollParent()), + this.scrollParent[0] !== this.document[0] && + 'HTML' !== this.scrollParent[0].tagName && + (this.overflowOffset = + this.scrollParent.offset()), + this.containers[p]._trigger( + 'over', + t, + this._uiHash(this) + ), + (this.containers[p].containerCache.over = 1)) + : this.currentContainer.containerCache.over || + (this.containers[p]._trigger( + 'over', + t, + this._uiHash() + ), + (this.currentContainer.containerCache.over = 1))) + } + }, + _createHelper: function (t) { + var e = this.options, + t = + 'function' == typeof e.helper + ? x( + e.helper.apply(this.element[0], [ + t, + this.currentItem, + ]) + ) + : 'clone' === e.helper + ? this.currentItem.clone() + : this.currentItem + return ( + t.parents('body').length || + this.appendTo[0].appendChild(t[0]), + t[0] === this.currentItem[0] && + (this._storedCSS = { + width: this.currentItem[0].style.width, + height: this.currentItem[0].style.height, + position: this.currentItem.css('position'), + top: this.currentItem.css('top'), + left: this.currentItem.css('left'), + }), + (t[0].style.width && !e.forceHelperSize) || + t.width(this.currentItem.width()), + (t[0].style.height && !e.forceHelperSize) || + t.height(this.currentItem.height()), + t + ) + }, + _adjustOffsetFromHelper: function (t) { + 'string' == typeof t && (t = t.split(' ')), + 'left' in + (t = Array.isArray(t) + ? { left: +t[0], top: +t[1] || 0 } + : t) && + (this.offset.click.left = t.left + this.margins.left), + 'right' in t && + (this.offset.click.left = + this.helperProportions.width - + t.right + + this.margins.left), + 'top' in t && + (this.offset.click.top = t.top + this.margins.top), + 'bottom' in t && + (this.offset.click.top = + this.helperProportions.height - + t.bottom + + this.margins.top) + }, + _getParentOffset: function () { + this.offsetParent = this.helper.offsetParent() + var t = this.offsetParent.offset() + return ( + 'absolute' === this.cssPosition && + this.scrollParent[0] !== this.document[0] && + x.contains( + this.scrollParent[0], + this.offsetParent[0] + ) && + ((t.left += this.scrollParent.scrollLeft()), + (t.top += this.scrollParent.scrollTop())), + { + top: + (t = + this.offsetParent[0] === + this.document[0].body || + (this.offsetParent[0].tagName && + 'html' === + this.offsetParent[0].tagName.toLowerCase() && + x.ui.ie) + ? { top: 0, left: 0 } + : t).top + + (parseInt( + this.offsetParent.css('borderTopWidth'), + 10 + ) || 0), + left: + t.left + + (parseInt( + this.offsetParent.css('borderLeftWidth'), + 10 + ) || 0), + } + ) + }, + _getRelativeOffset: function () { + if ('relative' !== this.cssPosition) return { top: 0, left: 0 } + var t = this.currentItem.position() + return { + top: + t.top - + (parseInt(this.helper.css('top'), 10) || 0) + + this.scrollParent.scrollTop(), + left: + t.left - + (parseInt(this.helper.css('left'), 10) || 0) + + this.scrollParent.scrollLeft(), + } + }, + _cacheMargins: function () { + this.margins = { + left: parseInt(this.currentItem.css('marginLeft'), 10) || 0, + top: parseInt(this.currentItem.css('marginTop'), 10) || 0, + } + }, + _cacheHelperProportions: function () { + this.helperProportions = { + width: this.helper.outerWidth(), + height: this.helper.outerHeight(), + } + }, + _setContainment: function () { + var t, + e, + i = this.options + 'parent' === i.containment && + (i.containment = this.helper[0].parentNode), + ('document' !== i.containment && + 'window' !== i.containment) || + (this.containment = [ + 0 - + this.offset.relative.left - + this.offset.parent.left, + 0 - + this.offset.relative.top - + this.offset.parent.top, + 'document' === i.containment + ? this.document.width() + : this.window.width() - + this.helperProportions.width - + this.margins.left, + ('document' === i.containment + ? this.document.height() || + document.body.parentNode.scrollHeight + : this.window.height() || + this.document[0].body.parentNode + .scrollHeight) - + this.helperProportions.height - + this.margins.top, + ]), + /^(document|window|parent)$/.test(i.containment) || + ((t = x(i.containment)[0]), + (e = x(i.containment).offset()), + (i = 'hidden' !== x(t).css('overflow')), + (this.containment = [ + e.left + + (parseInt(x(t).css('borderLeftWidth'), 10) || + 0) + + (parseInt(x(t).css('paddingLeft'), 10) || 0) - + this.margins.left, + e.top + + (parseInt(x(t).css('borderTopWidth'), 10) || + 0) + + (parseInt(x(t).css('paddingTop'), 10) || 0) - + this.margins.top, + e.left + + (i + ? Math.max(t.scrollWidth, t.offsetWidth) + : t.offsetWidth) - + (parseInt(x(t).css('borderLeftWidth'), 10) || + 0) - + (parseInt(x(t).css('paddingRight'), 10) || 0) - + this.helperProportions.width - + this.margins.left, + e.top + + (i + ? Math.max(t.scrollHeight, t.offsetHeight) + : t.offsetHeight) - + (parseInt(x(t).css('borderTopWidth'), 10) || + 0) - + (parseInt(x(t).css('paddingBottom'), 10) || 0) - + this.helperProportions.height - + this.margins.top, + ])) + }, + _convertPositionTo: function (t, e) { + e = e || this.position + var i = 'absolute' === t ? 1 : -1, + s = + 'absolute' !== this.cssPosition || + (this.scrollParent[0] !== this.document[0] && + x.contains( + this.scrollParent[0], + this.offsetParent[0] + )) + ? this.scrollParent + : this.offsetParent, + t = /(html|body)/i.test(s[0].tagName) + return { + top: + e.top + + this.offset.relative.top * i + + this.offset.parent.top * i - + ('fixed' === this.cssPosition + ? -this.scrollParent.scrollTop() + : t + ? 0 + : s.scrollTop()) * + i, + left: + e.left + + this.offset.relative.left * i + + this.offset.parent.left * i - + ('fixed' === this.cssPosition + ? -this.scrollParent.scrollLeft() + : t + ? 0 + : s.scrollLeft()) * + i, + } + }, + _generatePosition: function (t) { + var e = this.options, + i = t.pageX, + s = t.pageY, + o = + 'absolute' !== this.cssPosition || + (this.scrollParent[0] !== this.document[0] && + x.contains( + this.scrollParent[0], + this.offsetParent[0] + )) + ? this.scrollParent + : this.offsetParent, + n = /(html|body)/i.test(o[0].tagName) + return ( + 'relative' !== this.cssPosition || + (this.scrollParent[0] !== this.document[0] && + this.scrollParent[0] !== this.offsetParent[0]) || + (this.offset.relative = this._getRelativeOffset()), + this.originalPosition && + (this.containment && + (t.pageX - this.offset.click.left < + this.containment[0] && + (i = + this.containment[0] + + this.offset.click.left), + t.pageY - this.offset.click.top < + this.containment[1] && + (s = + this.containment[1] + + this.offset.click.top), + t.pageX - this.offset.click.left > + this.containment[2] && + (i = + this.containment[2] + + this.offset.click.left), + t.pageY - this.offset.click.top > + this.containment[3] && + (s = + this.containment[3] + + this.offset.click.top)), + e.grid && + ((t = + this.originalPageY + + Math.round( + (s - this.originalPageY) / e.grid[1] + ) * + e.grid[1]), + (s = + !this.containment || + (t - this.offset.click.top >= + this.containment[1] && + t - this.offset.click.top <= + this.containment[3]) + ? t + : t - this.offset.click.top >= + this.containment[1] + ? t - e.grid[1] + : t + e.grid[1]), + (t = + this.originalPageX + + Math.round( + (i - this.originalPageX) / e.grid[0] + ) * + e.grid[0]), + (i = + !this.containment || + (t - this.offset.click.left >= + this.containment[0] && + t - this.offset.click.left <= + this.containment[2]) + ? t + : t - this.offset.click.left >= + this.containment[0] + ? t - e.grid[0] + : t + e.grid[0]))), + { + top: + s - + this.offset.click.top - + this.offset.relative.top - + this.offset.parent.top + + ('fixed' === this.cssPosition + ? -this.scrollParent.scrollTop() + : n + ? 0 + : o.scrollTop()), + left: + i - + this.offset.click.left - + this.offset.relative.left - + this.offset.parent.left + + ('fixed' === this.cssPosition + ? -this.scrollParent.scrollLeft() + : n + ? 0 + : o.scrollLeft()), + } + ) + }, + _rearrange: function (t, e, i, s) { + i + ? i[0].appendChild(this.placeholder[0]) + : e.item[0].parentNode.insertBefore( + this.placeholder[0], + 'down' === this.direction + ? e.item[0] + : e.item[0].nextSibling + ), + (this.counter = this.counter ? ++this.counter : 1) + var o = this.counter + this._delay(function () { + o === this.counter && this.refreshPositions(!s) + }) + }, + _clear: function (t, e) { + this.reverting = !1 + var i, + s = [] + if ( + (!this._noFinalSort && + this.currentItem.parent().length && + this.placeholder.before(this.currentItem), + (this._noFinalSort = null), + this.helper[0] === this.currentItem[0]) + ) { + for (i in this._storedCSS) + ('auto' !== this._storedCSS[i] && + 'static' !== this._storedCSS[i]) || + (this._storedCSS[i] = '') + this.currentItem.css(this._storedCSS), + this._removeClass( + this.currentItem, + 'ui-sortable-helper' + ) + } else this.currentItem.show() + function o(e, i, s) { + return function (t) { + s._trigger(e, t, i._uiHash(i)) + } + } + for ( + this.fromOutside && + !e && + s.push(function (t) { + this._trigger( + 'receive', + t, + this._uiHash(this.fromOutside) + ) + }), + (!this.fromOutside && + this.domPosition.prev === + this.currentItem + .prev() + .not('.ui-sortable-helper')[0] && + this.domPosition.parent === + this.currentItem.parent()[0]) || + e || + s.push(function (t) { + this._trigger('update', t, this._uiHash()) + }), + this !== this.currentContainer && + (e || + (s.push(function (t) { + this._trigger('remove', t, this._uiHash()) + }), + s.push( + function (e) { + return function (t) { + e._trigger( + 'receive', + t, + this._uiHash(this) + ) + } + }.call(this, this.currentContainer) + ), + s.push( + function (e) { + return function (t) { + e._trigger( + 'update', + t, + this._uiHash(this) + ) + } + }.call(this, this.currentContainer) + ))), + i = this.containers.length - 1; + 0 <= i; + i-- + ) + e || s.push(o('deactivate', this, this.containers[i])), + this.containers[i].containerCache.over && + (s.push(o('out', this, this.containers[i])), + (this.containers[i].containerCache.over = 0)) + if ( + (this.storedCursor && + (this.document + .find('body') + .css('cursor', this.storedCursor), + this.storedStylesheet.remove()), + this._storedOpacity && + this.helper.css('opacity', this._storedOpacity), + this._storedZIndex && + this.helper.css( + 'zIndex', + 'auto' === this._storedZIndex + ? '' + : this._storedZIndex + ), + (this.dragging = !1), + e || this._trigger('beforeStop', t, this._uiHash()), + this.placeholder[0].parentNode.removeChild( + this.placeholder[0] + ), + this.cancelHelperRemoval || + (this.helper[0] !== this.currentItem[0] && + this.helper.remove(), + (this.helper = null)), + !e) + ) { + for (i = 0; i < s.length; i++) s[i].call(this, t) + this._trigger('stop', t, this._uiHash()) + } + return (this.fromOutside = !1), !this.cancelHelperRemoval + }, + _trigger: function () { + !1 === x.Widget.prototype._trigger.apply(this, arguments) && + this.cancel() + }, + _uiHash: function (t) { + var e = t || this + return { + helper: e.helper, + placeholder: e.placeholder || x([]), + position: e.position, + originalPosition: e.originalPosition, + offset: e.positionAbs, + item: e.currentItem, + sender: t ? t.element : null, + } + }, + }), + x.widget('ui.accordion', { + version: '1.13.1', + options: { + active: 0, + animate: {}, + classes: { + 'ui-accordion-header': 'ui-corner-top', + 'ui-accordion-header-collapsed': 'ui-corner-all', + 'ui-accordion-content': 'ui-corner-bottom', + }, + collapsible: !1, + event: 'click', + header: function (t) { + return t + .find('> li > :first-child') + .add(t.find('> :not(li)').even()) + }, + heightStyle: 'auto', + icons: { + activeHeader: 'ui-icon-triangle-1-s', + header: 'ui-icon-triangle-1-e', + }, + activate: null, + beforeActivate: null, + }, + hideProps: { + borderTopWidth: 'hide', + borderBottomWidth: 'hide', + paddingTop: 'hide', + paddingBottom: 'hide', + height: 'hide', + }, + showProps: { + borderTopWidth: 'show', + borderBottomWidth: 'show', + paddingTop: 'show', + paddingBottom: 'show', + height: 'show', + }, + _create: function () { + var t = this.options + ;(this.prevShow = this.prevHide = x()), + this._addClass('ui-accordion', 'ui-widget ui-helper-reset'), + this.element.attr('role', 'tablist'), + t.collapsible || + (!1 !== t.active && null != t.active) || + (t.active = 0), + this._processPanels(), + t.active < 0 && (t.active += this.headers.length), + this._refresh() + }, + _getCreateEventData: function () { + return { + header: this.active, + panel: this.active.length ? this.active.next() : x(), + } + }, + _createIcons: function () { + var t, + e = this.options.icons + e && + ((t = x('')), + this._addClass( + t, + 'ui-accordion-header-icon', + 'ui-icon ' + e.header + ), + t.prependTo(this.headers), + (t = this.active.children('.ui-accordion-header-icon')), + this._removeClass(t, e.header) + ._addClass(t, null, e.activeHeader) + ._addClass(this.headers, 'ui-accordion-icons')) + }, + _destroyIcons: function () { + this._removeClass(this.headers, 'ui-accordion-icons'), + this.headers.children('.ui-accordion-header-icon').remove() + }, + _destroy: function () { + var t + this.element.removeAttr('role'), + this.headers + .removeAttr( + 'role aria-expanded aria-selected aria-controls tabIndex' + ) + .removeUniqueId(), + this._destroyIcons(), + (t = this.headers + .next() + .css('display', '') + .removeAttr('role aria-hidden aria-labelledby') + .removeUniqueId()), + 'content' !== this.options.heightStyle && + t.css('height', '') + }, + _setOption: function (t, e) { + 'active' !== t + ? ('event' === t && + (this.options.event && + this._off(this.headers, this.options.event), + this._setupEvents(e)), + this._super(t, e), + 'collapsible' !== t || + e || + !1 !== this.options.active || + this._activate(0), + 'icons' === t && + (this._destroyIcons(), e && this._createIcons())) + : this._activate(e) + }, + _setOptionDisabled: function (t) { + this._super(t), + this.element.attr('aria-disabled', t), + this._toggleClass(null, 'ui-state-disabled', !!t), + this._toggleClass( + this.headers.add(this.headers.next()), + null, + 'ui-state-disabled', + !!t + ) + }, + _keydown: function (t) { + if (!t.altKey && !t.ctrlKey) { + var e = x.ui.keyCode, + i = this.headers.length, + s = this.headers.index(t.target), + o = !1 + switch (t.keyCode) { + case e.RIGHT: + case e.DOWN: + o = this.headers[(s + 1) % i] + break + case e.LEFT: + case e.UP: + o = this.headers[(s - 1 + i) % i] + break + case e.SPACE: + case e.ENTER: + this._eventHandler(t) + break + case e.HOME: + o = this.headers[0] + break + case e.END: + o = this.headers[i - 1] + } + o && + (x(t.target).attr('tabIndex', -1), + x(o).attr('tabIndex', 0), + x(o).trigger('focus'), + t.preventDefault()) + } + }, + _panelKeyDown: function (t) { + t.keyCode === x.ui.keyCode.UP && + t.ctrlKey && + x(t.currentTarget).prev().trigger('focus') + }, + refresh: function () { + var t = this.options + this._processPanels(), + (!1 === t.active && !0 === t.collapsible) || + !this.headers.length + ? ((t.active = !1), (this.active = x())) + : !1 === t.active + ? this._activate(0) + : this.active.length && + !x.contains(this.element[0], this.active[0]) + ? this.headers.length === + this.headers.find('.ui-state-disabled').length + ? ((t.active = !1), (this.active = x())) + : this._activate(Math.max(0, t.active - 1)) + : (t.active = this.headers.index(this.active)), + this._destroyIcons(), + this._refresh() + }, + _processPanels: function () { + var t = this.headers, + e = this.panels + 'function' == typeof this.options.header + ? (this.headers = this.options.header(this.element)) + : (this.headers = this.element.find(this.options.header)), + this._addClass( + this.headers, + 'ui-accordion-header ui-accordion-header-collapsed', + 'ui-state-default' + ), + (this.panels = this.headers + .next() + .filter(':not(.ui-accordion-content-active)') + .hide()), + this._addClass( + this.panels, + 'ui-accordion-content', + 'ui-helper-reset ui-widget-content' + ), + e && + (this._off(t.not(this.headers)), + this._off(e.not(this.panels))) + }, + _refresh: function () { + var i, + t = this.options, + e = t.heightStyle, + s = this.element.parent() + ;(this.active = this._findActive(t.active)), + this._addClass( + this.active, + 'ui-accordion-header-active', + 'ui-state-active' + )._removeClass( + this.active, + 'ui-accordion-header-collapsed' + ), + this._addClass( + this.active.next(), + 'ui-accordion-content-active' + ), + this.active.next().show(), + this.headers + .attr('role', 'tab') + .each(function () { + var t = x(this), + e = t.uniqueId().attr('id'), + i = t.next(), + s = i.uniqueId().attr('id') + t.attr('aria-controls', s), + i.attr('aria-labelledby', e) + }) + .next() + .attr('role', 'tabpanel'), + this.headers + .not(this.active) + .attr({ + 'aria-selected': 'false', + 'aria-expanded': 'false', + tabIndex: -1, + }) + .next() + .attr({ 'aria-hidden': 'true' }) + .hide(), + this.active.length + ? this.active + .attr({ + 'aria-selected': 'true', + 'aria-expanded': 'true', + tabIndex: 0, + }) + .next() + .attr({ 'aria-hidden': 'false' }) + : this.headers.eq(0).attr('tabIndex', 0), + this._createIcons(), + this._setupEvents(t.event), + 'fill' === e + ? ((i = s.height()), + this.element.siblings(':visible').each(function () { + var t = x(this), + e = t.css('position') + 'absolute' !== e && + 'fixed' !== e && + (i -= t.outerHeight(!0)) + }), + this.headers.each(function () { + i -= x(this).outerHeight(!0) + }), + this.headers + .next() + .each(function () { + x(this).height( + Math.max( + 0, + i - + x(this).innerHeight() + + x(this).height() + ) + ) + }) + .css('overflow', 'auto')) + : 'auto' === e && + ((i = 0), + this.headers + .next() + .each(function () { + var t = x(this).is(':visible') + t || x(this).show(), + (i = Math.max( + i, + x(this).css('height', '').height() + )), + t || x(this).hide() + }) + .height(i)) + }, + _activate: function (t) { + t = this._findActive(t)[0] + t !== this.active[0] && + ((t = t || this.active[0]), + this._eventHandler({ + target: t, + currentTarget: t, + preventDefault: x.noop, + })) + }, + _findActive: function (t) { + return 'number' == typeof t ? this.headers.eq(t) : x() + }, + _setupEvents: function (t) { + var i = { keydown: '_keydown' } + t && + x.each(t.split(' '), function (t, e) { + i[e] = '_eventHandler' + }), + this._off(this.headers.add(this.headers.next())), + this._on(this.headers, i), + this._on(this.headers.next(), { keydown: '_panelKeyDown' }), + this._hoverable(this.headers), + this._focusable(this.headers) + }, + _eventHandler: function (t) { + var e = this.options, + i = this.active, + s = x(t.currentTarget), + o = s[0] === i[0], + n = o && e.collapsible, + r = n ? x() : s.next(), + a = i.next(), + r = { + oldHeader: i, + oldPanel: a, + newHeader: n ? x() : s, + newPanel: r, + } + t.preventDefault(), + (o && !e.collapsible) || + !1 === this._trigger('beforeActivate', t, r) || + ((e.active = !n && this.headers.index(s)), + (this.active = o ? x() : s), + this._toggle(r), + this._removeClass( + i, + 'ui-accordion-header-active', + 'ui-state-active' + ), + e.icons && + ((i = i.children('.ui-accordion-header-icon')), + this._removeClass( + i, + null, + e.icons.activeHeader + )._addClass(i, null, e.icons.header)), + o || + (this._removeClass( + s, + 'ui-accordion-header-collapsed' + )._addClass( + s, + 'ui-accordion-header-active', + 'ui-state-active' + ), + e.icons && + ((o = s.children('.ui-accordion-header-icon')), + this._removeClass( + o, + null, + e.icons.header + )._addClass(o, null, e.icons.activeHeader)), + this._addClass( + s.next(), + 'ui-accordion-content-active' + ))) + }, + _toggle: function (t) { + var e = t.newPanel, + i = this.prevShow.length ? this.prevShow : t.oldPanel + this.prevShow.add(this.prevHide).stop(!0, !0), + (this.prevShow = e), + (this.prevHide = i), + this.options.animate + ? this._animate(e, i, t) + : (i.hide(), e.show(), this._toggleComplete(t)), + i.attr({ 'aria-hidden': 'true' }), + i.prev().attr({ + 'aria-selected': 'false', + 'aria-expanded': 'false', + }), + e.length && i.length + ? i + .prev() + .attr({ tabIndex: -1, 'aria-expanded': 'false' }) + : e.length && + this.headers + .filter(function () { + return ( + 0 === + parseInt(x(this).attr('tabIndex'), 10) + ) + }) + .attr('tabIndex', -1), + e.attr('aria-hidden', 'false').prev().attr({ + 'aria-selected': 'true', + 'aria-expanded': 'true', + tabIndex: 0, + }) + }, + _animate: function (t, i, e) { + var s, + o, + n, + r = this, + a = 0, + h = t.css('box-sizing'), + l = t.length && (!i.length || t.index() < i.index()), + c = this.options.animate || {}, + p = (l && c.down) || c, + l = function () { + r._toggleComplete(e) + } + return ( + (o = + (o = 'string' == typeof p ? p : o) || + p.easing || + c.easing), + (n = + (n = 'number' == typeof p ? p : n) || + p.duration || + c.duration), + i.length + ? t.length + ? ((s = t.show().outerHeight()), + i.animate(this.hideProps, { + duration: n, + easing: o, + step: function (t, e) { + e.now = Math.round(t) + }, + }), + void t.hide().animate(this.showProps, { + duration: n, + easing: o, + complete: l, + step: function (t, e) { + ;(e.now = Math.round(t)), + 'height' !== e.prop + ? 'content-box' === h && + (a += e.now) + : 'content' !== + r.options.heightStyle && + ((e.now = Math.round( + s - i.outerHeight() - a + )), + (a = 0)) + }, + })) + : i.animate(this.hideProps, n, o, l) + : t.animate(this.showProps, n, o, l) + ) + }, + _toggleComplete: function (t) { + var e = t.oldPanel, + i = e.prev() + this._removeClass(e, 'ui-accordion-content-active'), + this._removeClass( + i, + 'ui-accordion-header-active' + )._addClass(i, 'ui-accordion-header-collapsed'), + e.length && + (e.parent()[0].className = e.parent()[0].className), + this._trigger('activate', null, t) + }, + }) + var g = /ui-corner-([a-z]){2,6}/g + x.widget('ui.controlgroup', { + version: '1.13.1', + defaultElement: '
', + options: { + direction: 'horizontal', + disabled: null, + onlyVisible: !0, + items: { + button: 'input[type=button], input[type=submit], input[type=reset], button, a', + controlgroupLabel: '.ui-controlgroup-label', + checkboxradio: "input[type='checkbox'], input[type='radio']", + selectmenu: 'select', + spinner: '.ui-spinner-input', + }, + }, + _create: function () { + this._enhance() + }, + _enhance: function () { + this.element.attr('role', 'toolbar'), this.refresh() + }, + _destroy: function () { + this._callChildMethod('destroy'), + this.childWidgets.removeData('ui-controlgroup-data'), + this.element.removeAttr('role'), + this.options.items.controlgroupLabel && + this.element + .find(this.options.items.controlgroupLabel) + .find('.ui-controlgroup-label-contents') + .contents() + .unwrap() + }, + _initWidgets: function () { + var n = this, + r = [] + x.each(this.options.items, function (s, t) { + var e, + o = {} + if (t) + return 'controlgroupLabel' === s + ? ((e = n.element.find(t)).each(function () { + var t = x(this) + t.children('.ui-controlgroup-label-contents') + .length || + t + .contents() + .wrapAll( + "" + ) + }), + n._addClass( + e, + null, + 'ui-widget ui-widget-content ui-state-default' + ), + void (r = r.concat(e.get()))) + : void ( + x.fn[s] && + ((o = n['_' + s + 'Options'] + ? n['_' + s + 'Options']('middle') + : { classes: {} }), + n.element.find(t).each(function () { + var t = x(this), + e = t[s]('instance'), + i = x.widget.extend({}, o) + ;('button' === s && + t.parent('.ui-spinner').length) || + ((e = e || t[s]()[s]('instance')) && + (i.classes = n._resolveClassesValues( + i.classes, + e + )), + t[s](i), + (i = t[s]('widget')), + x.data( + i[0], + 'ui-controlgroup-data', + e || t[s]('instance') + ), + r.push(i[0])) + })) + ) + }), + (this.childWidgets = x(x.uniqueSort(r))), + this._addClass(this.childWidgets, 'ui-controlgroup-item') + }, + _callChildMethod: function (e) { + this.childWidgets.each(function () { + var t = x(this).data('ui-controlgroup-data') + t && t[e] && t[e]() + }) + }, + _updateCornerClass: function (t, e) { + e = this._buildSimpleOptions(e, 'label').classes.label + this._removeClass( + t, + null, + 'ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all' + ), + this._addClass(t, null, e) + }, + _buildSimpleOptions: function (t, e) { + var i = 'vertical' === this.options.direction, + s = { classes: {} } + return ( + (s.classes[e] = { + middle: '', + first: 'ui-corner-' + (i ? 'top' : 'left'), + last: 'ui-corner-' + (i ? 'bottom' : 'right'), + only: 'ui-corner-all', + }[t]), + s + ) + }, + _spinnerOptions: function (t) { + t = this._buildSimpleOptions(t, 'ui-spinner') + return ( + (t.classes['ui-spinner-up'] = ''), + (t.classes['ui-spinner-down'] = ''), + t + ) + }, + _buttonOptions: function (t) { + return this._buildSimpleOptions(t, 'ui-button') + }, + _checkboxradioOptions: function (t) { + return this._buildSimpleOptions(t, 'ui-checkboxradio-label') + }, + _selectmenuOptions: function (t) { + var e = 'vertical' === this.options.direction + return { + width: e && 'auto', + classes: { + middle: { + 'ui-selectmenu-button-open': '', + 'ui-selectmenu-button-closed': '', + }, + first: { + 'ui-selectmenu-button-open': + 'ui-corner-' + (e ? 'top' : 'tl'), + 'ui-selectmenu-button-closed': + 'ui-corner-' + (e ? 'top' : 'left'), + }, + last: { + 'ui-selectmenu-button-open': e ? '' : 'ui-corner-tr', + 'ui-selectmenu-button-closed': + 'ui-corner-' + (e ? 'bottom' : 'right'), + }, + only: { + 'ui-selectmenu-button-open': 'ui-corner-top', + 'ui-selectmenu-button-closed': 'ui-corner-all', + }, + }[t], + } + }, + _resolveClassesValues: function (i, s) { + var o = {} + return ( + x.each(i, function (t) { + var e = s.options.classes[t] || '', + e = String.prototype.trim.call(e.replace(g, '')) + o[t] = (e + ' ' + i[t]).replace(/\s+/g, ' ') + }), + o + ) + }, + _setOption: function (t, e) { + 'direction' === t && + this._removeClass('ui-controlgroup-' + this.options.direction), + this._super(t, e), + 'disabled' !== t + ? this.refresh() + : this._callChildMethod(e ? 'disable' : 'enable') + }, + refresh: function () { + var o, + n = this + this._addClass( + 'ui-controlgroup ui-controlgroup-' + this.options.direction + ), + 'horizontal' === this.options.direction && + this._addClass(null, 'ui-helper-clearfix'), + this._initWidgets(), + (o = this.childWidgets), + (o = this.options.onlyVisible ? o.filter(':visible') : o) + .length && + (x.each(['first', 'last'], function (t, e) { + var i, + s = o[e]().data('ui-controlgroup-data') + s && n['_' + s.widgetName + 'Options'] + ? (((i = n['_' + s.widgetName + 'Options']( + 1 === o.length ? 'only' : e + )).classes = n._resolveClassesValues( + i.classes, + s + )), + s.element[s.widgetName](i)) + : n._updateCornerClass(o[e](), e) + }), + this._callChildMethod('refresh')) + }, + }) + x.widget('ui.checkboxradio', [ + x.ui.formResetMixin, + { + version: '1.13.1', + options: { + disabled: null, + label: null, + icon: !0, + classes: { + 'ui-checkboxradio-label': 'ui-corner-all', + 'ui-checkboxradio-icon': 'ui-corner-all', + }, + }, + _getCreateOptions: function () { + var t, + e = this, + i = this._super() || {} + return ( + this._readType(), + (t = this.element.labels()), + (this.label = x(t[t.length - 1])), + this.label.length || + x.error('No label found for checkboxradio widget'), + (this.originalLabel = ''), + this.label + .contents() + .not(this.element[0]) + .each(function () { + e.originalLabel += + 3 === this.nodeType + ? x(this).text() + : this.outerHTML + }), + this.originalLabel && (i.label = this.originalLabel), + null != (t = this.element[0].disabled) && (i.disabled = t), + i + ) + }, + _create: function () { + var t = this.element[0].checked + this._bindFormResetHandler(), + null == this.options.disabled && + (this.options.disabled = this.element[0].disabled), + this._setOption('disabled', this.options.disabled), + this._addClass( + 'ui-checkboxradio', + 'ui-helper-hidden-accessible' + ), + this._addClass( + this.label, + 'ui-checkboxradio-label', + 'ui-button ui-widget' + ), + 'radio' === this.type && + this._addClass( + this.label, + 'ui-checkboxradio-radio-label' + ), + this.options.label && + this.options.label !== this.originalLabel + ? this._updateLabel() + : this.originalLabel && + (this.options.label = this.originalLabel), + this._enhance(), + t && + this._addClass( + this.label, + 'ui-checkboxradio-checked', + 'ui-state-active' + ), + this._on({ + change: '_toggleClasses', + focus: function () { + this._addClass( + this.label, + null, + 'ui-state-focus ui-visual-focus' + ) + }, + blur: function () { + this._removeClass( + this.label, + null, + 'ui-state-focus ui-visual-focus' + ) + }, + }) + }, + _readType: function () { + var t = this.element[0].nodeName.toLowerCase() + ;(this.type = this.element[0].type), + ('input' === t && /radio|checkbox/.test(this.type)) || + x.error( + "Can't create checkboxradio on element.nodeName=" + + t + + ' and element.type=' + + this.type + ) + }, + _enhance: function () { + this._updateIcon(this.element[0].checked) + }, + widget: function () { + return this.label + }, + _getRadioGroup: function () { + var t = this.element[0].name, + e = "input[name='" + x.escapeSelector(t) + "']" + return t + ? (this.form.length + ? x(this.form[0].elements).filter(e) + : x(e).filter(function () { + return 0 === x(this)._form().length + }) + ).not(this.element) + : x([]) + }, + _toggleClasses: function () { + var t = this.element[0].checked + this._toggleClass( + this.label, + 'ui-checkboxradio-checked', + 'ui-state-active', + t + ), + this.options.icon && + 'checkbox' === this.type && + this._toggleClass( + this.icon, + null, + 'ui-icon-check ui-state-checked', + t + )._toggleClass(this.icon, null, 'ui-icon-blank', !t), + 'radio' === this.type && + this._getRadioGroup().each(function () { + var t = x(this).checkboxradio('instance') + t && + t._removeClass( + t.label, + 'ui-checkboxradio-checked', + 'ui-state-active' + ) + }) + }, + _destroy: function () { + this._unbindFormResetHandler(), + this.icon && (this.icon.remove(), this.iconSpace.remove()) + }, + _setOption: function (t, e) { + if ('label' !== t || e) { + if ((this._super(t, e), 'disabled' === t)) + return ( + this._toggleClass( + this.label, + null, + 'ui-state-disabled', + e + ), + void (this.element[0].disabled = e) + ) + this.refresh() + } + }, + _updateIcon: function (t) { + var e = 'ui-icon ui-icon-background ' + this.options.icon + ? (this.icon || + ((this.icon = x('')), + (this.iconSpace = x(' ')), + this._addClass( + this.iconSpace, + 'ui-checkboxradio-icon-space' + )), + 'checkbox' === this.type + ? ((e += t + ? 'ui-icon-check ui-state-checked' + : 'ui-icon-blank'), + this._removeClass( + this.icon, + null, + t ? 'ui-icon-blank' : 'ui-icon-check' + )) + : (e += 'ui-icon-blank'), + this._addClass(this.icon, 'ui-checkboxradio-icon', e), + t || + this._removeClass( + this.icon, + null, + 'ui-icon-check ui-state-checked' + ), + this.icon.prependTo(this.label).after(this.iconSpace)) + : void 0 !== this.icon && + (this.icon.remove(), + this.iconSpace.remove(), + delete this.icon) + }, + _updateLabel: function () { + var t = this.label.contents().not(this.element[0]) + this.icon && (t = t.not(this.icon[0])), + (t = this.iconSpace + ? t.not(this.iconSpace[0]) + : t).remove(), + this.label.append(this.options.label) + }, + refresh: function () { + var t = this.element[0].checked, + e = this.element[0].disabled + this._updateIcon(t), + this._toggleClass( + this.label, + 'ui-checkboxradio-checked', + 'ui-state-active', + t + ), + null !== this.options.label && this._updateLabel(), + e !== this.options.disabled && + this._setOptions({ disabled: e }) + }, + }, + ]) + var m + x.ui.checkboxradio + x.widget('ui.button', { + version: '1.13.1', + defaultElement: '" + ) + .button({ + label: x('').text(this.options.closeText).html(), + icon: 'ui-icon-closethick', + showLabel: !1, + }) + .appendTo(this.uiDialogTitlebar)), + this._addClass( + this.uiDialogTitlebarClose, + 'ui-dialog-titlebar-close' + ), + this._on(this.uiDialogTitlebarClose, { + click: function (t) { + t.preventDefault(), this.close(t) + }, + }), + (t = x('').uniqueId().prependTo(this.uiDialogTitlebar)), + this._addClass(t, 'ui-dialog-title'), + this._title(t), + this.uiDialogTitlebar.prependTo(this.uiDialog), + this.uiDialog.attr({ 'aria-labelledby': t.attr('id') }) + }, + _title: function (t) { + this.options.title ? t.text(this.options.title) : t.html(' ') + }, + _createButtonPane: function () { + ;(this.uiDialogButtonPane = x('
')), + this._addClass( + this.uiDialogButtonPane, + 'ui-dialog-buttonpane', + 'ui-widget-content ui-helper-clearfix' + ), + (this.uiButtonSet = x('
').appendTo( + this.uiDialogButtonPane + )), + this._addClass(this.uiButtonSet, 'ui-dialog-buttonset'), + this._createButtons() + }, + _createButtons: function () { + var s = this, + t = this.options.buttons + this.uiDialogButtonPane.remove(), + this.uiButtonSet.empty(), + x.isEmptyObject(t) || (Array.isArray(t) && !t.length) + ? this._removeClass(this.uiDialog, 'ui-dialog-buttons') + : (x.each(t, function (t, e) { + var i + ;(e = x.extend( + { type: 'button' }, + (e = + 'function' == typeof e + ? { click: e, text: t } + : e) + )), + (i = e.click), + (t = { + icon: e.icon, + iconPosition: e.iconPosition, + showLabel: e.showLabel, + icons: e.icons, + text: e.text, + }), + delete e.click, + delete e.icon, + delete e.iconPosition, + delete e.showLabel, + delete e.icons, + 'boolean' == typeof e.text && delete e.text, + x('', e) + .button(t) + .appendTo(s.uiButtonSet) + .on('click', function () { + i.apply(s.element[0], arguments) + }) + }), + this._addClass(this.uiDialog, 'ui-dialog-buttons'), + this.uiDialogButtonPane.appendTo(this.uiDialog)) + }, + _makeDraggable: function () { + var o = this, + n = this.options + function r(t) { + return { position: t.position, offset: t.offset } + } + this.uiDialog.draggable({ + cancel: '.ui-dialog-content, .ui-dialog-titlebar-close', + handle: '.ui-dialog-titlebar', + containment: 'document', + start: function (t, e) { + o._addClass(x(this), 'ui-dialog-dragging'), + o._blockFrames(), + o._trigger('dragStart', t, r(e)) + }, + drag: function (t, e) { + o._trigger('drag', t, r(e)) + }, + stop: function (t, e) { + var i = e.offset.left - o.document.scrollLeft(), + s = e.offset.top - o.document.scrollTop() + ;(n.position = { + my: 'left top', + at: + 'left' + + (0 <= i ? '+' : '') + + i + + ' top' + + (0 <= s ? '+' : '') + + s, + of: o.window, + }), + o._removeClass(x(this), 'ui-dialog-dragging'), + o._unblockFrames(), + o._trigger('dragStop', t, r(e)) + }, + }) + }, + _makeResizable: function () { + var o = this, + n = this.options, + t = n.resizable, + e = this.uiDialog.css('position'), + t = 'string' == typeof t ? t : 'n,e,s,w,se,sw,ne,nw' + function r(t) { + return { + originalPosition: t.originalPosition, + originalSize: t.originalSize, + position: t.position, + size: t.size, + } + } + this.uiDialog + .resizable({ + cancel: '.ui-dialog-content', + containment: 'document', + alsoResize: this.element, + maxWidth: n.maxWidth, + maxHeight: n.maxHeight, + minWidth: n.minWidth, + minHeight: this._minHeight(), + handles: t, + start: function (t, e) { + o._addClass(x(this), 'ui-dialog-resizing'), + o._blockFrames(), + o._trigger('resizeStart', t, r(e)) + }, + resize: function (t, e) { + o._trigger('resize', t, r(e)) + }, + stop: function (t, e) { + var i = o.uiDialog.offset(), + s = i.left - o.document.scrollLeft(), + i = i.top - o.document.scrollTop() + ;(n.height = o.uiDialog.height()), + (n.width = o.uiDialog.width()), + (n.position = { + my: 'left top', + at: + 'left' + + (0 <= s ? '+' : '') + + s + + ' top' + + (0 <= i ? '+' : '') + + i, + of: o.window, + }), + o._removeClass(x(this), 'ui-dialog-resizing'), + o._unblockFrames(), + o._trigger('resizeStop', t, r(e)) + }, + }) + .css('position', e) + }, + _trackFocus: function () { + this._on(this.widget(), { + focusin: function (t) { + this._makeFocusTarget(), + (this._focusedElement = x(t.target)) + }, + }) + }, + _makeFocusTarget: function () { + this._untrackInstance(), this._trackingInstances().unshift(this) + }, + _untrackInstance: function () { + var t = this._trackingInstances(), + e = x.inArray(this, t) + ;-1 !== e && t.splice(e, 1) + }, + _trackingInstances: function () { + var t = this.document.data('ui-dialog-instances') + return t || this.document.data('ui-dialog-instances', (t = [])), t + }, + _minHeight: function () { + var t = this.options + return 'auto' === t.height + ? t.minHeight + : Math.min(t.minHeight, t.height) + }, + _position: function () { + var t = this.uiDialog.is(':visible') + t || this.uiDialog.show(), + this.uiDialog.position(this.options.position), + t || this.uiDialog.hide() + }, + _setOptions: function (t) { + var i = this, + s = !1, + o = {} + x.each(t, function (t, e) { + i._setOption(t, e), + t in i.sizeRelatedOptions && (s = !0), + t in i.resizableRelatedOptions && (o[t] = e) + }), + s && (this._size(), this._position()), + this.uiDialog.is(':data(ui-resizable)') && + this.uiDialog.resizable('option', o) + }, + _setOption: function (t, e) { + var i, + s = this.uiDialog + 'disabled' !== t && + (this._super(t, e), + 'appendTo' === t && this.uiDialog.appendTo(this._appendTo()), + 'buttons' === t && this._createButtons(), + 'closeText' === t && + this.uiDialogTitlebarClose.button({ + label: x('') + .text('' + this.options.closeText) + .html(), + }), + 'draggable' === t && + ((i = s.is(':data(ui-draggable)')) && + !e && + s.draggable('destroy'), + !i && e && this._makeDraggable()), + 'position' === t && this._position(), + 'resizable' === t && + ((i = s.is(':data(ui-resizable)')) && + !e && + s.resizable('destroy'), + i && + 'string' == typeof e && + s.resizable('option', 'handles', e), + i || !1 === e || this._makeResizable()), + 'title' === t && + this._title(this.uiDialogTitlebar.find('.ui-dialog-title'))) + }, + _size: function () { + var t, + e, + i, + s = this.options + this.element.show().css({ + width: 'auto', + minHeight: 0, + maxHeight: 'none', + height: 0, + }), + s.minWidth > s.width && (s.width = s.minWidth), + (t = this.uiDialog + .css({ height: 'auto', width: s.width }) + .outerHeight()), + (e = Math.max(0, s.minHeight - t)), + (i = + 'number' == typeof s.maxHeight + ? Math.max(0, s.maxHeight - t) + : 'none'), + 'auto' === s.height + ? this.element.css({ + minHeight: e, + maxHeight: i, + height: 'auto', + }) + : this.element.height(Math.max(0, s.height - t)), + this.uiDialog.is(':data(ui-resizable)') && + this.uiDialog.resizable( + 'option', + 'minHeight', + this._minHeight() + ) + }, + _blockFrames: function () { + this.iframeBlocks = this.document.find('iframe').map(function () { + var t = x(this) + return x('
') + .css({ + position: 'absolute', + width: t.outerWidth(), + height: t.outerHeight(), + }) + .appendTo(t.parent()) + .offset(t.offset())[0] + }) + }, + _unblockFrames: function () { + this.iframeBlocks && + (this.iframeBlocks.remove(), delete this.iframeBlocks) + }, + _allowInteraction: function (t) { + return ( + !!x(t.target).closest('.ui-dialog').length || + !!x(t.target).closest('.ui-datepicker').length + ) + }, + _createOverlay: function () { + var i, s + this.options.modal && + ((i = x.fn.jquery.substring(0, 4)), + (s = !0), + this._delay(function () { + s = !1 + }), + this.document.data('ui-dialog-overlays') || + this.document.on( + 'focusin.ui-dialog', + function (t) { + var e + s || + (e = + this._trackingInstances()[0])._allowInteraction( + t + ) || + (t.preventDefault(), + e._focusTabbable(), + ('3.4.' !== i && '3.5.' !== i) || + e._delay(e._restoreTabbableFocus)) + }.bind(this) + ), + (this.overlay = x('
').appendTo(this._appendTo())), + this._addClass( + this.overlay, + null, + 'ui-widget-overlay ui-front' + ), + this._on(this.overlay, { mousedown: '_keepFocus' }), + this.document.data( + 'ui-dialog-overlays', + (this.document.data('ui-dialog-overlays') || 0) + 1 + )) + }, + _destroyOverlay: function () { + var t + this.options.modal && + this.overlay && + ((t = this.document.data('ui-dialog-overlays') - 1) + ? this.document.data('ui-dialog-overlays', t) + : (this.document.off('focusin.ui-dialog'), + this.document.removeData('ui-dialog-overlays')), + this.overlay.remove(), + (this.overlay = null)) + }, + }), + !1 !== x.uiBackCompat && + x.widget('ui.dialog', x.ui.dialog, { + options: { dialogClass: '' }, + _createWrapper: function () { + this._super(), + this.uiDialog.addClass(this.options.dialogClass) + }, + _setOption: function (t, e) { + 'dialogClass' === t && + this.uiDialog + .removeClass(this.options.dialogClass) + .addClass(e), + this._superApply(arguments) + }, + }) + x.ui.dialog + var v = x, + _ = {}, + b = _.toString, + y = /^([\-+])=\s*(\d+\.?\d*)/, + w = [ + { + re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, + parse: function (t) { + return [t[1], t[2], t[3], t[4]] + }, + }, + { + re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, + parse: function (t) { + return [2.55 * t[1], 2.55 * t[2], 2.55 * t[3], t[4]] + }, + }, + { + re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})?/, + parse: function (t) { + return [ + parseInt(t[1], 16), + parseInt(t[2], 16), + parseInt(t[3], 16), + t[4] ? (parseInt(t[4], 16) / 255).toFixed(2) : 1, + ] + }, + }, + { + re: /#([a-f0-9])([a-f0-9])([a-f0-9])([a-f0-9])?/, + parse: function (t) { + return [ + parseInt(t[1] + t[1], 16), + parseInt(t[2] + t[2], 16), + parseInt(t[3] + t[3], 16), + t[4] ? (parseInt(t[4] + t[4], 16) / 255).toFixed(2) : 1, + ] + }, + }, + { + re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, + space: 'hsla', + parse: function (t) { + return [t[1], t[2] / 100, t[3] / 100, t[4]] + }, + }, + ], + I = (v.Color = function (t, e, i, s) { + return new v.Color.fn.parse(t, e, i, s) + }), + S = { + rgba: { + props: { + red: { idx: 0, type: 'byte' }, + green: { idx: 1, type: 'byte' }, + blue: { idx: 2, type: 'byte' }, + }, + }, + hsla: { + props: { + hue: { idx: 0, type: 'degrees' }, + saturation: { idx: 1, type: 'percent' }, + lightness: { idx: 2, type: 'percent' }, + }, + }, + }, + D = { + byte: { floor: !0, max: 255 }, + percent: { max: 1 }, + degrees: { mod: 360, floor: !0 }, + }, + W = (I.support = {}), + O = v('

')[0], + E = v.each + function L(t) { + return null == t + ? t + '' + : 'object' == typeof t + ? _[b.call(t)] || 'object' + : typeof t + } + function N(t, e, i) { + var s = D[e.type] || {} + return null == t + ? i || !e.def + ? null + : e.def + : ((t = s.floor ? ~~t : parseFloat(t)), + isNaN(t) + ? e.def + : s.mod + ? (t + s.mod) % s.mod + : Math.min(s.max, Math.max(0, t))) + } + function R(s) { + var o = I(), + n = (o._rgba = []) + return ( + (s = s.toLowerCase()), + E(w, function (t, e) { + var i = e.re.exec(s), + i = i && e.parse(i), + e = e.space || 'rgba' + if (i) + return ( + (i = o[e](i)), + (o[S[e].cache] = i[S[e].cache]), + (n = o._rgba = i._rgba), + !1 + ) + }), + n.length + ? ('0,0,0,0' === n.join() && v.extend(n, V.transparent), o) + : V[s] + ) + } + function M(t, e, i) { + return 6 * (i = (i + 1) % 1) < 1 + ? t + (e - t) * i * 6 + : 2 * i < 1 + ? e + : 3 * i < 2 + ? t + (e - t) * (2 / 3 - i) * 6 + : t + } + ;(O.style.cssText = 'background-color:rgba(1,1,1,.5)'), + (W.rgba = -1 < O.style.backgroundColor.indexOf('rgba')), + E(S, function (t, e) { + ;(e.cache = '_' + t), + (e.props.alpha = { idx: 3, type: 'percent', def: 1 }) + }), + v.each( + 'Boolean Number String Function Array Date RegExp Object Error Symbol'.split( + ' ' + ), + function (t, e) { + _['[object ' + e + ']'] = e.toLowerCase() + } + ), + ((I.fn = v.extend(I.prototype, { + parse: function (o, t, e, i) { + if (void 0 === o) + return (this._rgba = [null, null, null, null]), this + ;(o.jquery || o.nodeType) && ((o = v(o).css(t)), (t = void 0)) + var n = this, + s = L(o), + r = (this._rgba = []) + return ( + void 0 !== t && ((o = [o, t, e, i]), (s = 'array')), + 'string' === s + ? this.parse(R(o) || V._default) + : 'array' === s + ? (E(S.rgba.props, function (t, e) { + r[e.idx] = N(o[e.idx], e) + }), + this) + : 'object' === s + ? (E( + S, + o instanceof I + ? function (t, e) { + o[e.cache] && + (n[e.cache] = o[e.cache].slice()) + } + : function (t, i) { + var s = i.cache + E(i.props, function (t, e) { + if (!n[s] && i.to) { + if ( + 'alpha' === t || + null == o[t] + ) + return + n[s] = i.to(n._rgba) + } + n[s][e.idx] = N(o[t], e, !0) + }), + n[s] && + v.inArray( + null, + n[s].slice(0, 3) + ) < 0 && + (null == n[s][3] && + (n[s][3] = 1), + i.from && + (n._rgba = i.from(n[s]))) + } + ), + this) + : void 0 + ) + }, + is: function (t) { + var o = I(t), + n = !0, + r = this + return ( + E(S, function (t, e) { + var i, + s = o[e.cache] + return ( + s && + ((i = + r[e.cache] || + (e.to && e.to(r._rgba)) || + []), + E(e.props, function (t, e) { + if (null != s[e.idx]) + return (n = s[e.idx] === i[e.idx]) + })), + n + ) + }), + n + ) + }, + _space: function () { + var i = [], + s = this + return ( + E(S, function (t, e) { + s[e.cache] && i.push(t) + }), + i.pop() + ) + }, + transition: function (t, r) { + var e = (l = I(t))._space(), + i = S[e], + t = 0 === this.alpha() ? I('transparent') : this, + a = t[i.cache] || i.to(t._rgba), + h = a.slice(), + l = l[i.cache] + return ( + E(i.props, function (t, e) { + var i = e.idx, + s = a[i], + o = l[i], + n = D[e.type] || {} + null !== o && + (null === s + ? (h[i] = o) + : (n.mod && + (o - s > n.mod / 2 + ? (s += n.mod) + : s - o > n.mod / 2 && (s -= n.mod)), + (h[i] = N((o - s) * r + s, e)))) + }), + this[e](h) + ) + }, + blend: function (t) { + if (1 === this._rgba[3]) return this + var e = this._rgba.slice(), + i = e.pop(), + s = I(t)._rgba + return I( + v.map(e, function (t, e) { + return (1 - i) * s[e] + i * t + }) + ) + }, + toRgbaString: function () { + var t = 'rgba(', + e = v.map(this._rgba, function (t, e) { + return null != t ? t : 2 < e ? 1 : 0 + }) + return 1 === e[3] && (e.pop(), (t = 'rgb(')), t + e.join() + ')' + }, + toHslaString: function () { + var t = 'hsla(', + e = v.map(this.hsla(), function (t, e) { + return ( + null == t && (t = 2 < e ? 1 : 0), + (t = e && e < 3 ? Math.round(100 * t) + '%' : t) + ) + }) + return 1 === e[3] && (e.pop(), (t = 'hsl(')), t + e.join() + ')' + }, + toHexString: function (t) { + var e = this._rgba.slice(), + i = e.pop() + return ( + t && e.push(~~(255 * i)), + '#' + + v + .map(e, function (t) { + return 1 === (t = (t || 0).toString(16)).length + ? '0' + t + : t + }) + .join('') + ) + }, + toString: function () { + return 0 === this._rgba[3] ? 'transparent' : this.toRgbaString() + }, + })).parse.prototype = I.fn), + (S.hsla.to = function (t) { + if (null == t[0] || null == t[1] || null == t[2]) + return [null, null, null, t[3]] + var e = t[0] / 255, + i = t[1] / 255, + s = t[2] / 255, + o = t[3], + n = Math.max(e, i, s), + r = Math.min(e, i, s), + a = n - r, + h = n + r, + t = 0.5 * h, + i = + r === n + ? 0 + : e === n + ? (60 * (i - s)) / a + 360 + : i === n + ? (60 * (s - e)) / a + 120 + : (60 * (e - i)) / a + 240, + h = 0 == a ? 0 : t <= 0.5 ? a / h : a / (2 - h) + return [Math.round(i) % 360, h, t, null == o ? 1 : o] + }), + (S.hsla.from = function (t) { + if (null == t[0] || null == t[1] || null == t[2]) + return [null, null, null, t[3]] + var e = t[0] / 360, + i = t[1], + s = t[2], + t = t[3], + i = s <= 0.5 ? s * (1 + i) : s + i - s * i, + s = 2 * s - i + return [ + Math.round(255 * M(s, i, e + 1 / 3)), + Math.round(255 * M(s, i, e)), + Math.round(255 * M(s, i, e - 1 / 3)), + t, + ] + }), + E(S, function (h, t) { + var e = t.props, + n = t.cache, + r = t.to, + a = t.from + ;(I.fn[h] = function (t) { + if ((r && !this[n] && (this[n] = r(this._rgba)), void 0 === t)) + return this[n].slice() + var i = L(t), + s = 'array' === i || 'object' === i ? t : arguments, + o = this[n].slice() + return ( + E(e, function (t, e) { + t = s['object' === i ? t : e.idx] + null == t && (t = o[e.idx]), (o[e.idx] = N(t, e)) + }), + a ? (((t = I(a(o)))[n] = o), t) : I(o) + ) + }), + E(e, function (r, a) { + I.fn[r] || + (I.fn[r] = function (t) { + var e, + i = L(t), + s = + 'alpha' === r + ? this._hsla + ? 'hsla' + : 'rgba' + : h, + o = this[s](), + n = o[a.idx] + return 'undefined' === i + ? n + : ('function' === i && + (i = L((t = t.call(this, n)))), + null == t && a.empty + ? this + : ('string' === i && + (e = y.exec(t)) && + (t = + n + + parseFloat(e[2]) * + ('+' === e[1] ? 1 : -1)), + (o[a.idx] = t), + this[s](o))) + }) + }) + }), + (I.hook = function (t) { + t = t.split(' ') + E(t, function (t, n) { + ;(v.cssHooks[n] = { + set: function (t, e) { + var i, + s, + o = '' + if ( + 'transparent' !== e && + ('string' !== L(e) || (i = R(e))) + ) { + if ( + ((e = I(i || e)), !W.rgba && 1 !== e._rgba[3]) + ) { + for ( + s = + 'backgroundColor' === n + ? t.parentNode + : t; + ('' === o || 'transparent' === o) && + s && + s.style; + + ) + try { + ;(o = v.css(s, 'backgroundColor')), + (s = s.parentNode) + } catch (t) {} + e = e.blend( + o && 'transparent' !== o ? o : '_default' + ) + } + e = e.toRgbaString() + } + try { + t.style[n] = e + } catch (t) {} + }, + }), + (v.fx.step[n] = function (t) { + t.colorInit || + ((t.start = I(t.elem, n)), + (t.end = I(t.end)), + (t.colorInit = !0)), + v.cssHooks[n].set( + t.elem, + t.start.transition(t.end, t.pos) + ) + }) + }) + })( + 'backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor' + ), + (v.cssHooks.borderColor = { + expand: function (i) { + var s = {} + return ( + E(['Top', 'Right', 'Bottom', 'Left'], function (t, e) { + s['border' + e + 'Color'] = i + }), + s + ) + }, + }) + var A, + B, + F, + q, + j, + X, + Y, + U, + K, + $, + V = (v.Color.names = { + aqua: '#00ffff', + black: '#000000', + blue: '#0000ff', + fuchsia: '#ff00ff', + gray: '#808080', + green: '#008000', + lime: '#00ff00', + maroon: '#800000', + navy: '#000080', + olive: '#808000', + purple: '#800080', + red: '#ff0000', + silver: '#c0c0c0', + teal: '#008080', + white: '#ffffff', + yellow: '#ffff00', + transparent: [null, null, null, 0], + _default: '#ffffff', + }), + Q = 'ui-effects-', + G = 'ui-effects-style', + Z = 'ui-effects-animated' + function J(t) { + var e, + i, + s = t.ownerDocument.defaultView + ? t.ownerDocument.defaultView.getComputedStyle(t, null) + : t.currentStyle, + o = {} + if (s && s.length && s[0] && s[s[0]]) + for (i = s.length; i--; ) + 'string' == typeof s[(e = s[i])] && + (o[ + e.replace(/-([\da-z])/gi, function (t, e) { + return e.toUpperCase() + }) + ] = s[e]) + else for (e in s) 'string' == typeof s[e] && (o[e] = s[e]) + return o + } + function tt(t, e, i, s) { + return ( + (t = { effect: (t = x.isPlainObject(t) ? (e = t).effect : t) }), + 'function' == typeof (e = null == e ? {} : e) && + ((s = e), (i = null), (e = {})), + ('number' != typeof e && !x.fx.speeds[e]) || + ((s = i), (i = e), (e = {})), + 'function' == typeof i && ((s = i), (i = null)), + e && x.extend(t, e), + (i = i || e.duration), + (t.duration = x.fx.off + ? 0 + : 'number' == typeof i + ? i + : i in x.fx.speeds + ? x.fx.speeds[i] + : x.fx.speeds._default), + (t.complete = s || e.complete), + t + ) + } + function et(t) { + return ( + !t || + 'number' == typeof t || + x.fx.speeds[t] || + ('string' == typeof t && !x.effects.effect[t]) || + 'function' == typeof t || + ('object' == typeof t && !t.effect) + ) + } + function it(t, e) { + var i = e.outerWidth(), + e = e.outerHeight(), + t = + /^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/.exec( + t + ) || ['', 0, i, e, 0] + return { + top: parseFloat(t[1]) || 0, + right: 'auto' === t[2] ? i : parseFloat(t[2]), + bottom: 'auto' === t[3] ? e : parseFloat(t[3]), + left: parseFloat(t[4]) || 0, + } + } + ;(x.effects = { effect: {} }), + (q = ['add', 'remove', 'toggle']), + (j = { + border: 1, + borderBottom: 1, + borderColor: 1, + borderLeft: 1, + borderRight: 1, + borderTop: 1, + borderWidth: 1, + margin: 1, + padding: 1, + }), + x.each( + [ + 'borderLeftStyle', + 'borderRightStyle', + 'borderBottomStyle', + 'borderTopStyle', + ], + function (t, e) { + x.fx.step[e] = function (t) { + ;(('none' !== t.end && !t.setAttr) || + (1 === t.pos && !t.setAttr)) && + (v.style(t.elem, e, t.end), (t.setAttr = !0)) + } + } + ), + x.fn.addBack || + (x.fn.addBack = function (t) { + return this.add( + null == t ? this.prevObject : this.prevObject.filter(t) + ) + }), + (x.effects.animateClass = function (o, t, e, i) { + var n = x.speed(t, e, i) + return this.queue(function () { + var i = x(this), + t = i.attr('class') || '', + e = (e = n.children ? i.find('*').addBack() : i).map( + function () { + return { el: x(this), start: J(this) } + } + ), + s = function () { + x.each(q, function (t, e) { + o[e] && i[e + 'Class'](o[e]) + }) + } + s(), + (e = e.map(function () { + return ( + (this.end = J(this.el[0])), + (this.diff = (function (t, e) { + var i, + s, + o = {} + for (i in e) + (s = e[i]), + t[i] !== s && + (j[i] || + (!x.fx.step[i] && + isNaN(parseFloat(s))) || + (o[i] = s)) + return o + })(this.start, this.end)), + this + ) + })), + i.attr('class', t), + (e = e.map(function () { + var t = this, + e = x.Deferred(), + i = x.extend({}, n, { + queue: !1, + complete: function () { + e.resolve(t) + }, + }) + return this.el.animate(this.diff, i), e.promise() + })), + x.when.apply(x, e.get()).done(function () { + s(), + x.each(arguments, function () { + var e = this.el + x.each(this.diff, function (t) { + e.css(t, '') + }) + }), + n.complete.call(i[0]) + }) + }) + }), + x.fn.extend({ + addClass: + ((F = x.fn.addClass), + function (t, e, i, s) { + return e + ? x.effects.animateClass.call(this, { add: t }, e, i, s) + : F.apply(this, arguments) + }), + removeClass: + ((B = x.fn.removeClass), + function (t, e, i, s) { + return 1 < arguments.length + ? x.effects.animateClass.call( + this, + { remove: t }, + e, + i, + s + ) + : B.apply(this, arguments) + }), + toggleClass: + ((A = x.fn.toggleClass), + function (t, e, i, s, o) { + return 'boolean' == typeof e || void 0 === e + ? i + ? x.effects.animateClass.call( + this, + e ? { add: t } : { remove: t }, + i, + s, + o + ) + : A.apply(this, arguments) + : x.effects.animateClass.call( + this, + { toggle: t }, + e, + i, + s + ) + }), + switchClass: function (t, e, i, s, o) { + return x.effects.animateClass.call( + this, + { add: e, remove: t }, + i, + s, + o + ) + }, + }), + x.expr && + x.expr.pseudos && + x.expr.pseudos.animated && + (x.expr.pseudos.animated = + ((X = x.expr.pseudos.animated), + function (t) { + return !!x(t).data(Z) || X(t) + })), + !1 !== x.uiBackCompat && + x.extend(x.effects, { + save: function (t, e) { + for (var i = 0, s = e.length; i < s; i++) + null !== e[i] && t.data(Q + e[i], t[0].style[e[i]]) + }, + restore: function (t, e) { + for (var i, s = 0, o = e.length; s < o; s++) + null !== e[s] && + ((i = t.data(Q + e[s])), t.css(e[s], i)) + }, + setMode: function (t, e) { + return (e = + 'toggle' === e + ? t.is(':hidden') + ? 'show' + : 'hide' + : e) + }, + createWrapper: function (i) { + if (i.parent().is('.ui-effects-wrapper')) return i.parent() + var s = { + width: i.outerWidth(!0), + height: i.outerHeight(!0), + float: i.css('float'), + }, + t = x('

') + .addClass('ui-effects-wrapper') + .css({ + fontSize: '100%', + background: 'transparent', + border: 'none', + margin: 0, + padding: 0, + }), + e = { width: i.width(), height: i.height() }, + o = document.activeElement + try { + o.id + } catch (t) { + o = document.body + } + return ( + i.wrap(t), + (i[0] !== o && !x.contains(i[0], o)) || + x(o).trigger('focus'), + (t = i.parent()), + 'static' === i.css('position') + ? (t.css({ position: 'relative' }), + i.css({ position: 'relative' })) + : (x.extend(s, { + position: i.css('position'), + zIndex: i.css('z-index'), + }), + x.each( + ['top', 'left', 'bottom', 'right'], + function (t, e) { + ;(s[e] = i.css(e)), + isNaN(parseInt(s[e], 10)) && + (s[e] = 'auto') + } + ), + i.css({ + position: 'relative', + top: 0, + left: 0, + right: 'auto', + bottom: 'auto', + })), + i.css(e), + t.css(s).show() + ) + }, + removeWrapper: function (t) { + var e = document.activeElement + return ( + t.parent().is('.ui-effects-wrapper') && + (t.parent().replaceWith(t), + (t[0] !== e && !x.contains(t[0], e)) || + x(e).trigger('focus')), + t + ) + }, + }), + x.extend(x.effects, { + version: '1.13.1', + define: function (t, e, i) { + return ( + i || ((i = e), (e = 'effect')), + (x.effects.effect[t] = i), + (x.effects.effect[t].mode = e), + i + ) + }, + scaledDimensions: function (t, e, i) { + if (0 === e) + return { + height: 0, + width: 0, + outerHeight: 0, + outerWidth: 0, + } + var s = 'horizontal' !== i ? (e || 100) / 100 : 1, + e = 'vertical' !== i ? (e || 100) / 100 : 1 + return { + height: t.height() * e, + width: t.width() * s, + outerHeight: t.outerHeight() * e, + outerWidth: t.outerWidth() * s, + } + }, + clipToBox: function (t) { + return { + width: t.clip.right - t.clip.left, + height: t.clip.bottom - t.clip.top, + left: t.clip.left, + top: t.clip.top, + } + }, + unshift: function (t, e, i) { + var s = t.queue() + 1 < e && s.splice.apply(s, [1, 0].concat(s.splice(e, i))), + t.dequeue() + }, + saveStyle: function (t) { + t.data(G, t[0].style.cssText) + }, + restoreStyle: function (t) { + ;(t[0].style.cssText = t.data(G) || ''), t.removeData(G) + }, + mode: function (t, e) { + t = t.is(':hidden') + return ( + 'toggle' === e && (e = t ? 'show' : 'hide'), + (e = (t ? 'hide' === e : 'show' === e) ? 'none' : e) + ) + }, + getBaseline: function (t, e) { + var i, s + switch (t[0]) { + case 'top': + i = 0 + break + case 'middle': + i = 0.5 + break + case 'bottom': + i = 1 + break + default: + i = t[0] / e.height + } + switch (t[1]) { + case 'left': + s = 0 + break + case 'center': + s = 0.5 + break + case 'right': + s = 1 + break + default: + s = t[1] / e.width + } + return { x: s, y: i } + }, + createPlaceholder: function (t) { + var e, + i = t.css('position'), + s = t.position() + return ( + t + .css({ + marginTop: t.css('marginTop'), + marginBottom: t.css('marginBottom'), + marginLeft: t.css('marginLeft'), + marginRight: t.css('marginRight'), + }) + .outerWidth(t.outerWidth()) + .outerHeight(t.outerHeight()), + /^(static|relative)/.test(i) && + ((i = 'absolute'), + (e = x('<' + t[0].nodeName + '>') + .insertAfter(t) + .css({ + display: /^(inline|ruby)/.test(t.css('display')) + ? 'inline-block' + : 'block', + visibility: 'hidden', + marginTop: t.css('marginTop'), + marginBottom: t.css('marginBottom'), + marginLeft: t.css('marginLeft'), + marginRight: t.css('marginRight'), + float: t.css('float'), + }) + .outerWidth(t.outerWidth()) + .outerHeight(t.outerHeight()) + .addClass('ui-effects-placeholder')), + t.data(Q + 'placeholder', e)), + t.css({ position: i, left: s.left, top: s.top }), + e + ) + }, + removePlaceholder: function (t) { + var e = Q + 'placeholder', + i = t.data(e) + i && (i.remove(), t.removeData(e)) + }, + cleanUp: function (t) { + x.effects.restoreStyle(t), x.effects.removePlaceholder(t) + }, + setTransition: function (s, t, o, n) { + return ( + (n = n || {}), + x.each(t, function (t, e) { + var i = s.cssUnit(e) + 0 < i[0] && (n[e] = i[0] * o + i[1]) + }), + n + ) + }, + }), + x.fn.extend({ + effect: function () { + function t(t) { + var e = x(this), + i = x.effects.mode(e, a) || n + e.data(Z, !0), + h.push(i), + n && + ('show' === i || (i === n && 'hide' === i)) && + e.show(), + (n && 'none' === i) || x.effects.saveStyle(e), + 'function' == typeof t && t() + } + var s = tt.apply(this, arguments), + o = x.effects.effect[s.effect], + n = o.mode, + e = s.queue, + i = e || 'fx', + r = s.complete, + a = s.mode, + h = [] + return x.fx.off || !o + ? a + ? this[a](s.duration, r) + : this.each(function () { + r && r.call(this) + }) + : !1 === e + ? this.each(t).each(l) + : this.queue(i, t).queue(i, l) + function l(t) { + var e = x(this) + function i() { + 'function' == typeof r && r.call(e[0]), + 'function' == typeof t && t() + } + ;(s.mode = h.shift()), + !1 === x.uiBackCompat || n + ? 'none' === s.mode + ? (e[a](), i()) + : o.call(e[0], s, function () { + e.removeData(Z), + x.effects.cleanUp(e), + 'hide' === s.mode && e.hide(), + i() + }) + : (e.is(':hidden') ? 'hide' === a : 'show' === a) + ? (e[a](), i()) + : o.call(e[0], s, i) + } + }, + show: + ((K = x.fn.show), + function (t) { + if (et(t)) return K.apply(this, arguments) + t = tt.apply(this, arguments) + return (t.mode = 'show'), this.effect.call(this, t) + }), + hide: + ((U = x.fn.hide), + function (t) { + if (et(t)) return U.apply(this, arguments) + t = tt.apply(this, arguments) + return (t.mode = 'hide'), this.effect.call(this, t) + }), + toggle: + ((Y = x.fn.toggle), + function (t) { + if (et(t) || 'boolean' == typeof t) + return Y.apply(this, arguments) + t = tt.apply(this, arguments) + return (t.mode = 'toggle'), this.effect.call(this, t) + }), + cssUnit: function (t) { + var i = this.css(t), + s = [] + return ( + x.each(['em', 'px', '%', 'pt'], function (t, e) { + 0 < i.indexOf(e) && (s = [parseFloat(i), e]) + }), + s + ) + }, + cssClip: function (t) { + return t + ? this.css( + 'clip', + 'rect(' + + t.top + + 'px ' + + t.right + + 'px ' + + t.bottom + + 'px ' + + t.left + + 'px)' + ) + : it(this.css('clip'), this) + }, + transfer: function (t, e) { + var i = x(this), + s = x(t.to), + o = 'fixed' === s.css('position'), + n = x('body'), + r = o ? n.scrollTop() : 0, + a = o ? n.scrollLeft() : 0, + n = s.offset(), + n = { + top: n.top - r, + left: n.left - a, + height: s.innerHeight(), + width: s.innerWidth(), + }, + s = i.offset(), + h = x("
") + h.appendTo('body') + .addClass(t.className) + .css({ + top: s.top - r, + left: s.left - a, + height: i.innerHeight(), + width: i.innerWidth(), + position: o ? 'fixed' : 'absolute', + }) + .animate(n, t.duration, t.easing, function () { + h.remove(), 'function' == typeof e && e() + }) + }, + }), + (x.fx.step.clip = function (t) { + t.clipInit || + ((t.start = x(t.elem).cssClip()), + 'string' == typeof t.end && (t.end = it(t.end, t.elem)), + (t.clipInit = !0)), + x(t.elem).cssClip({ + top: t.pos * (t.end.top - t.start.top) + t.start.top, + right: + t.pos * (t.end.right - t.start.right) + t.start.right, + bottom: + t.pos * (t.end.bottom - t.start.bottom) + + t.start.bottom, + left: t.pos * (t.end.left - t.start.left) + t.start.left, + }) + }), + ($ = {}), + x.each(['Quad', 'Cubic', 'Quart', 'Quint', 'Expo'], function (e, t) { + $[t] = function (t) { + return Math.pow(t, e + 2) + } + }), + x.extend($, { + Sine: function (t) { + return 1 - Math.cos((t * Math.PI) / 2) + }, + Circ: function (t) { + return 1 - Math.sqrt(1 - t * t) + }, + Elastic: function (t) { + return 0 === t || 1 === t + ? t + : -Math.pow(2, 8 * (t - 1)) * + Math.sin(((80 * (t - 1) - 7.5) * Math.PI) / 15) + }, + Back: function (t) { + return t * t * (3 * t - 2) + }, + Bounce: function (t) { + for (var e, i = 4; t < ((e = Math.pow(2, --i)) - 1) / 11; ); + return ( + 1 / Math.pow(4, 3 - i) - + 7.5625 * Math.pow((3 * e - 2) / 22 - t, 2) + ) + }, + }), + x.each($, function (t, e) { + ;(x.easing['easeIn' + t] = e), + (x.easing['easeOut' + t] = function (t) { + return 1 - e(1 - t) + }), + (x.easing['easeInOut' + t] = function (t) { + return t < 0.5 ? e(2 * t) / 2 : 1 - e(-2 * t + 2) / 2 + }) + }) + ;(O = x.effects), + x.effects.define('blind', 'hide', function (t, e) { + var i = { + up: ['bottom', 'top'], + vertical: ['bottom', 'top'], + down: ['top', 'bottom'], + left: ['right', 'left'], + horizontal: ['right', 'left'], + right: ['left', 'right'], + }, + s = x(this), + o = t.direction || 'up', + n = s.cssClip(), + r = { clip: x.extend({}, n) }, + a = x.effects.createPlaceholder(s) + ;(r.clip[i[o][0]] = r.clip[i[o][1]]), + 'show' === t.mode && + (s.cssClip(r.clip), + a && a.css(x.effects.clipToBox(r)), + (r.clip = n)), + a && a.animate(x.effects.clipToBox(r), t.duration, t.easing), + s.animate(r, { + queue: !1, + duration: t.duration, + easing: t.easing, + complete: e, + }) + }), + x.effects.define('bounce', function (t, e) { + var i, + s, + o = x(this), + n = t.mode, + r = 'hide' === n, + a = 'show' === n, + h = t.direction || 'up', + l = t.distance, + c = t.times || 5, + n = 2 * c + (a || r ? 1 : 0), + p = t.duration / n, + u = t.easing, + d = 'up' === h || 'down' === h ? 'top' : 'left', + f = 'up' === h || 'left' === h, + g = 0, + t = o.queue().length + for ( + x.effects.createPlaceholder(o), + h = o.css(d), + l = l || o['top' == d ? 'outerHeight' : 'outerWidth']() / 3, + a && + (((s = { opacity: 1 })[d] = h), + o + .css('opacity', 0) + .css(d, f ? 2 * -l : 2 * l) + .animate(s, p, u)), + r && (l /= Math.pow(2, c - 1)), + (s = {})[d] = h; + g < c; + g++ + ) + ((i = {})[d] = (f ? '-=' : '+=') + l), + o.animate(i, p, u).animate(s, p, u), + (l = r ? 2 * l : l / 2) + r && + (((i = { opacity: 0 })[d] = (f ? '-=' : '+=') + l), + o.animate(i, p, u)), + o.queue(e), + x.effects.unshift(o, t, 1 + n) + }), + x.effects.define('clip', 'hide', function (t, e) { + var i = {}, + s = x(this), + o = t.direction || 'vertical', + n = 'both' === o, + r = n || 'horizontal' === o, + n = n || 'vertical' === o, + o = s.cssClip() + ;(i.clip = { + top: n ? (o.bottom - o.top) / 2 : o.top, + right: r ? (o.right - o.left) / 2 : o.right, + bottom: n ? (o.bottom - o.top) / 2 : o.bottom, + left: r ? (o.right - o.left) / 2 : o.left, + }), + x.effects.createPlaceholder(s), + 'show' === t.mode && (s.cssClip(i.clip), (i.clip = o)), + s.animate(i, { + queue: !1, + duration: t.duration, + easing: t.easing, + complete: e, + }) + }), + x.effects.define('drop', 'hide', function (t, e) { + var i = x(this), + s = 'show' === t.mode, + o = t.direction || 'left', + n = 'up' === o || 'down' === o ? 'top' : 'left', + r = 'up' === o || 'left' === o ? '-=' : '+=', + a = '+=' == r ? '-=' : '+=', + h = { opacity: 0 } + x.effects.createPlaceholder(i), + (o = + t.distance || + i['top' == n ? 'outerHeight' : 'outerWidth'](!0) / 2), + (h[n] = r + o), + s && (i.css(h), (h[n] = a + o), (h.opacity = 1)), + i.animate(h, { + queue: !1, + duration: t.duration, + easing: t.easing, + complete: e, + }) + }), + x.effects.define('explode', 'hide', function (t, e) { + var i, + s, + o, + n, + r, + a, + h = t.pieces ? Math.round(Math.sqrt(t.pieces)) : 3, + l = h, + c = x(this), + p = 'show' === t.mode, + u = c.show().css('visibility', 'hidden').offset(), + d = Math.ceil(c.outerWidth() / l), + f = Math.ceil(c.outerHeight() / h), + g = [] + function m() { + g.push(this), + g.length === h * l && + (c.css({ visibility: 'visible' }), x(g).remove(), e()) + } + for (i = 0; i < h; i++) + for (n = u.top + i * f, a = i - (h - 1) / 2, s = 0; s < l; s++) + (o = u.left + s * d), + (r = s - (l - 1) / 2), + c + .clone() + .appendTo('body') + .wrap('
') + .css({ + position: 'absolute', + visibility: 'visible', + left: -s * d, + top: -i * f, + }) + .parent() + .addClass('ui-effects-explode') + .css({ + position: 'absolute', + overflow: 'hidden', + width: d, + height: f, + left: o + (p ? r * d : 0), + top: n + (p ? a * f : 0), + opacity: p ? 0 : 1, + }) + .animate( + { + left: o + (p ? 0 : r * d), + top: n + (p ? 0 : a * f), + opacity: p ? 1 : 0, + }, + t.duration || 500, + t.easing, + m + ) + }), + x.effects.define('fade', 'toggle', function (t, e) { + var i = 'show' === t.mode + x(this) + .css('opacity', i ? 0 : 1) + .animate( + { opacity: i ? 1 : 0 }, + { + queue: !1, + duration: t.duration, + easing: t.easing, + complete: e, + } + ) + }), + x.effects.define('fold', 'hide', function (e, t) { + var i = x(this), + s = e.mode, + o = 'show' === s, + n = 'hide' === s, + r = e.size || 15, + a = /([0-9]+)%/.exec(r), + h = e.horizFirst ? ['right', 'bottom'] : ['bottom', 'right'], + l = e.duration / 2, + c = x.effects.createPlaceholder(i), + p = i.cssClip(), + u = { clip: x.extend({}, p) }, + d = { clip: x.extend({}, p) }, + f = [p[h[0]], p[h[1]]], + s = i.queue().length + a && (r = (parseInt(a[1], 10) / 100) * f[n ? 0 : 1]), + (u.clip[h[0]] = r), + (d.clip[h[0]] = r), + (d.clip[h[1]] = 0), + o && + (i.cssClip(d.clip), + c && c.css(x.effects.clipToBox(d)), + (d.clip = p)), + i + .queue(function (t) { + c && + c + .animate(x.effects.clipToBox(u), l, e.easing) + .animate(x.effects.clipToBox(d), l, e.easing), + t() + }) + .animate(u, l, e.easing) + .animate(d, l, e.easing) + .queue(t), + x.effects.unshift(i, s, 4) + }), + x.effects.define('highlight', 'show', function (t, e) { + var i = x(this), + s = { backgroundColor: i.css('backgroundColor') } + 'hide' === t.mode && (s.opacity = 0), + x.effects.saveStyle(i), + i + .css({ + backgroundImage: 'none', + backgroundColor: t.color || '#ffff99', + }) + .animate(s, { + queue: !1, + duration: t.duration, + easing: t.easing, + complete: e, + }) + }), + x.effects.define('size', function (s, e) { + var o, + i = x(this), + t = ['fontSize'], + n = [ + 'borderTopWidth', + 'borderBottomWidth', + 'paddingTop', + 'paddingBottom', + ], + r = [ + 'borderLeftWidth', + 'borderRightWidth', + 'paddingLeft', + 'paddingRight', + ], + a = s.mode, + h = 'effect' !== a, + l = s.scale || 'both', + c = s.origin || ['middle', 'center'], + p = i.css('position'), + u = i.position(), + d = x.effects.scaledDimensions(i), + f = s.from || d, + g = s.to || x.effects.scaledDimensions(i, 0) + x.effects.createPlaceholder(i), + 'show' === a && ((a = f), (f = g), (g = a)), + (o = { + from: { y: f.height / d.height, x: f.width / d.width }, + to: { y: g.height / d.height, x: g.width / d.width }, + }), + ('box' !== l && 'both' !== l) || + (o.from.y !== o.to.y && + ((f = x.effects.setTransition(i, n, o.from.y, f)), + (g = x.effects.setTransition(i, n, o.to.y, g))), + o.from.x !== o.to.x && + ((f = x.effects.setTransition(i, r, o.from.x, f)), + (g = x.effects.setTransition(i, r, o.to.x, g)))), + ('content' !== l && 'both' !== l) || + (o.from.y !== o.to.y && + ((f = x.effects.setTransition(i, t, o.from.y, f)), + (g = x.effects.setTransition(i, t, o.to.y, g)))), + c && + ((c = x.effects.getBaseline(c, d)), + (f.top = (d.outerHeight - f.outerHeight) * c.y + u.top), + (f.left = (d.outerWidth - f.outerWidth) * c.x + u.left), + (g.top = (d.outerHeight - g.outerHeight) * c.y + u.top), + (g.left = (d.outerWidth - g.outerWidth) * c.x + u.left)), + delete f.outerHeight, + delete f.outerWidth, + i.css(f), + ('content' !== l && 'both' !== l) || + ((n = n.concat(['marginTop', 'marginBottom']).concat(t)), + (r = r.concat(['marginLeft', 'marginRight'])), + i.find('*[width]').each(function () { + var t = x(this), + e = x.effects.scaledDimensions(t), + i = { + height: e.height * o.from.y, + width: e.width * o.from.x, + outerHeight: e.outerHeight * o.from.y, + outerWidth: e.outerWidth * o.from.x, + }, + e = { + height: e.height * o.to.y, + width: e.width * o.to.x, + outerHeight: e.height * o.to.y, + outerWidth: e.width * o.to.x, + } + o.from.y !== o.to.y && + ((i = x.effects.setTransition(t, n, o.from.y, i)), + (e = x.effects.setTransition(t, n, o.to.y, e))), + o.from.x !== o.to.x && + ((i = x.effects.setTransition( + t, + r, + o.from.x, + i + )), + (e = x.effects.setTransition(t, r, o.to.x, e))), + h && x.effects.saveStyle(t), + t.css(i), + t.animate(e, s.duration, s.easing, function () { + h && x.effects.restoreStyle(t) + }) + })), + i.animate(g, { + queue: !1, + duration: s.duration, + easing: s.easing, + complete: function () { + var t = i.offset() + 0 === g.opacity && i.css('opacity', f.opacity), + h || + (i + .css( + 'position', + 'static' === p ? 'relative' : p + ) + .offset(t), + x.effects.saveStyle(i)), + e() + }, + }) + }), + x.effects.define('scale', function (t, e) { + var i = x(this), + s = t.mode, + s = + parseInt(t.percent, 10) || + (0 === parseInt(t.percent, 10) || 'effect' !== s ? 0 : 100), + s = x.extend( + !0, + { + from: x.effects.scaledDimensions(i), + to: x.effects.scaledDimensions( + i, + s, + t.direction || 'both' + ), + origin: t.origin || ['middle', 'center'], + }, + t + ) + t.fade && ((s.from.opacity = 1), (s.to.opacity = 0)), + x.effects.effect.size.call(this, s, e) + }), + x.effects.define('puff', 'hide', function (t, e) { + t = x.extend(!0, {}, t, { + fade: !0, + percent: parseInt(t.percent, 10) || 150, + }) + x.effects.effect.scale.call(this, t, e) + }), + x.effects.define('pulsate', 'show', function (t, e) { + var i = x(this), + s = t.mode, + o = 'show' === s, + n = 2 * (t.times || 5) + (o || 'hide' === s ? 1 : 0), + r = t.duration / n, + a = 0, + h = 1, + s = i.queue().length + for ( + (!o && i.is(':visible')) || + (i.css('opacity', 0).show(), (a = 1)); + h < n; + h++ + ) + i.animate({ opacity: a }, r, t.easing), (a = 1 - a) + i.animate({ opacity: a }, r, t.easing), + i.queue(e), + x.effects.unshift(i, s, 1 + n) + }), + x.effects.define('shake', function (t, e) { + var i = 1, + s = x(this), + o = t.direction || 'left', + n = t.distance || 20, + r = t.times || 3, + a = 2 * r + 1, + h = Math.round(t.duration / a), + l = 'up' === o || 'down' === o ? 'top' : 'left', + c = 'up' === o || 'left' === o, + p = {}, + u = {}, + d = {}, + o = s.queue().length + for ( + x.effects.createPlaceholder(s), + p[l] = (c ? '-=' : '+=') + n, + u[l] = (c ? '+=' : '-=') + 2 * n, + d[l] = (c ? '-=' : '+=') + 2 * n, + s.animate(p, h, t.easing); + i < r; + i++ + ) + s.animate(u, h, t.easing).animate(d, h, t.easing) + s + .animate(u, h, t.easing) + .animate(p, h / 2, t.easing) + .queue(e), + x.effects.unshift(s, o, 1 + a) + }), + x.effects.define('slide', 'show', function (t, e) { + var i, + s, + o = x(this), + n = { + up: ['bottom', 'top'], + down: ['top', 'bottom'], + left: ['right', 'left'], + right: ['left', 'right'], + }, + r = t.mode, + a = t.direction || 'left', + h = 'up' === a || 'down' === a ? 'top' : 'left', + l = 'up' === a || 'left' === a, + c = + t.distance || + o['top' == h ? 'outerHeight' : 'outerWidth'](!0), + p = {} + x.effects.createPlaceholder(o), + (i = o.cssClip()), + (s = o.position()[h]), + (p[h] = (l ? -1 : 1) * c + s), + (p.clip = o.cssClip()), + (p.clip[n[a][1]] = p.clip[n[a][0]]), + 'show' === r && + (o.cssClip(p.clip), + o.css(h, p[h]), + (p.clip = i), + (p[h] = s)), + o.animate(p, { + queue: !1, + duration: t.duration, + easing: t.easing, + complete: e, + }) + }), + !1 !== x.uiBackCompat && + x.effects.define('transfer', function (t, e) { + x(this).transfer(t, e) + }) +}) diff --git a/v0/src/simulator/vendor/table2csv.js b/v0/src/simulator/vendor/table2csv.js new file mode 100644 index 00000000..ab734062 --- /dev/null +++ b/v0/src/simulator/vendor/table2csv.js @@ -0,0 +1,113 @@ +jQuery.fn.table2CSV = function (options) { + var options = jQuery.extend( + { + separator: ',', + header: [], + headerSelector: 'none', + columnSelector: 'td, th', + delivery: 'value', // popup, value, download + // filename: 'test.csv', // filename to download + transform_gt_lt: true, // make > and < to > and < + }, + options + ) + + var csvData = [] + var headerArr = [] + var el = this + + //header + var numCols = options.header.length + var tmpRow = [] // construct header avalible array + + if (numCols > 0) { + for (var i = 0; i < numCols; i++) { + tmpRow[tmpRow.length] = formatData(options.header[i]) + } + } else { + $(el) + .filter(':visible') + .find(options.headerSelector) + .each(function () { + if ($(this).css('display') != 'none') + tmpRow[tmpRow.length] = formatData($(this).html()) + }) + } + + row2CSV(tmpRow) + + // actual data + $(el) + .find('tr') + .each(function () { + var tmpRow = [] + $(this) + .filter(':visible') + .find(options.columnSelector) + .each(function () { + if ($(this).css('display') != 'none') + tmpRow[tmpRow.length] = formatData($(this).html()) + }) + row2CSV(tmpRow) + }) + if (options.delivery == 'popup') { + var mydata = csvData.join('\n') + if (options.transform_gt_lt) { + mydata = sinri_recover_gt_and_lt(mydata) + } + return popup(mydata) + } else if (options.delivery == 'download') { + var mydata = csvData.join('\n') + if (options.transform_gt_lt) { + mydata = sinri_recover_gt_and_lt(mydata) + } + var url = 'data:text/csv;charset=utf8,' + encodeURIComponent(mydata) + window.open(url) + return true + } else { + var mydata = csvData.join('\n') + if (options.transform_gt_lt) { + mydata = sinri_recover_gt_and_lt(mydata) + } + return mydata + } + + function sinri_recover_gt_and_lt(input) { + var regexp = new RegExp(/>/g) + var input = input.replace(regexp, '>') + var regexp = new RegExp(/</g) + var input = input.replace(regexp, '<') + return input + } + + function row2CSV(tmpRow) { + var tmp = tmpRow.join('') // to remove any blank rows + // alert(tmp); + if (tmpRow.length > 0 && tmp != '') { + var mystr = tmpRow.join(options.separator) + csvData[csvData.length] = mystr + } + } + function formatData(input) { + // double " according to rfc4180 + var regexp = new RegExp(/["]/g) + var output = input.replace(regexp, '""') + //HTML + var regexp = new RegExp(/\<[^\<]+\>/g) + var output = output.replace(regexp, '') + output = output.replace(/ /gi, ' ') //replace   + if (output == '') return '' + return '"' + output.trim() + '"' + } + function popup(data) { + var generator = window.open('', 'csv', 'height=400,width=600') + generator.document.write('CSV') + generator.document.write('') + generator.document.write('') + generator.document.write('') + generator.document.close() + return true + } +} diff --git a/v0/src/store/SimulatorStore/SimulatorStore.ts b/v0/src/store/SimulatorStore/SimulatorStore.ts new file mode 100644 index 00000000..69aa9cb3 --- /dev/null +++ b/v0/src/store/SimulatorStore/SimulatorStore.ts @@ -0,0 +1,13 @@ +import { extractStore } from '../extractStore' +import { defineStore } from 'pinia' +import { useActions } from './actions' +import { useGetters } from './getters' +import { useState } from './state' + +export const SimulatorStore = defineStore('simulatorStore', () => { + return { + ...extractStore(useState()), + ...extractStore(useGetters()), + ...extractStore(useActions()), + } +}) diff --git a/v0/src/store/SimulatorStore/actions.ts b/v0/src/store/SimulatorStore/actions.ts new file mode 100644 index 00000000..e127bc5f --- /dev/null +++ b/v0/src/store/SimulatorStore/actions.ts @@ -0,0 +1,16 @@ +import { defineStore } from 'pinia' +import { useState } from './state' + +export const useActions = defineStore('simulatorStore.actions', () => { + const state = useState() + + function showTitle(): void { + console.log(state.title) + } + + // Note you are free to define as many internal functions as you want. + // You only expose the functions that are returned. + return { + showTitle, + } +}) diff --git a/v0/src/store/SimulatorStore/getters.ts b/v0/src/store/SimulatorStore/getters.ts new file mode 100644 index 00000000..6d409942 --- /dev/null +++ b/v0/src/store/SimulatorStore/getters.ts @@ -0,0 +1,15 @@ +import { defineStore } from 'pinia' +import { computed } from 'vue' +import { useState } from './state' + +export const useGetters = defineStore('simulatorStore.getters', () => { + const state = useState() + + const getTitle = computed((): string => { + return `${state.title} !!!` + }) + + return { + getTitle, + } +}) diff --git a/v0/src/store/SimulatorStore/state.ts b/v0/src/store/SimulatorStore/state.ts new file mode 100644 index 00000000..1bad89ad --- /dev/null +++ b/v0/src/store/SimulatorStore/state.ts @@ -0,0 +1,66 @@ +import { defineStore } from 'pinia' + +// use camel case variable names +export interface State { + title: string + activeCircuit: + | Object + | { + id: number | string + name: string + } + circuit_list: Array + dialogBox: { + // create_circuit: boolean + // delete_circuit: boolean + combinationalanalysis_dialog: boolean + hex_bin_dec_converter_dialog: boolean + saveimage_dialog: boolean + theme_dialog: boolean + customshortcut_dialog: boolean + insertsubcircuit_dialog: boolean + exportverilog_dialog: boolean + save_project_dialog: boolean + open_project_dialog: boolean + export_project_dialog: boolean + import_project_dialog: boolean + } + // createCircuit: Object | { circuitName: string } + combinationalAnalysis: Object +} + +export const useState = defineStore({ + id: 'simulatorStore.state', + + state: (): State => { + return { + title: 'Welcome to CircuitVerse Simulator', + activeCircuit: {}, + circuit_list: [], + dialogBox: { + // create_circuit: false, + // delete_circuit: false, + combinationalanalysis_dialog: false, + hex_bin_dec_converter_dialog: false, + saveimage_dialog: false, + theme_dialog: false, + customshortcut_dialog: false, + insertsubcircuit_dialog: false, + exportverilog_dialog: false, + save_project_dialog: false, + open_project_dialog: false, + export_project_dialog: false, + import_project_dialog: false, + }, + // createCircuit: { + // circuitName: 'Untitled Circuit', + // }, + combinationalAnalysis: { + inputNameList: 'eg. In A, In B', + outputNameList: 'eg. Out X, Out Y', + booleanExpression: 'Example: (AB)', + decimalColumnBox: false, + }, + } + }, +}) diff --git a/v0/src/store/authStore.ts b/v0/src/store/authStore.ts new file mode 100644 index 00000000..12dd433c --- /dev/null +++ b/v0/src/store/authStore.ts @@ -0,0 +1,57 @@ +import { defineStore } from 'pinia' + +interface AuthStoreType { + isLoggedIn: boolean + userId: string | number + username: string + locale: string + isAdmin: boolean +} + +interface UserInfo { + isLoggedIn: boolean + id: string + attributes: { + name: string + locale: string + admin: boolean + } +} +export const useAuthStore = defineStore({ + id: 'authStore', + state: (): AuthStoreType => ({ + isLoggedIn: false, + userId: '', + username: '', + locale: 'en', + isAdmin: false, + }), + actions: { + setUserInfo(userInfo: UserInfo): void { + this.isLoggedIn = true + this.userId = userInfo.id ?? '' + this.username = userInfo.attributes.name ?? '' + this.locale = userInfo.attributes.locale ?? 'en' + this.isAdmin = userInfo.attributes.admin + }, + }, + getters: { + getIsLoggedIn(): boolean { + return this.isLoggedIn + }, + getUserId(): string | number { + return this.userId + }, + getUsername(): string { + return this.username + }, + getLocale(): string { + return this.locale + }, + getIsAdmin(): boolean { + return this.isAdmin + }, + }, +}) + +// TODO: extract store verify and check better ways to impliment diff --git a/v0/src/store/extractStore.ts b/v0/src/store/extractStore.ts new file mode 100644 index 00000000..f7b48129 --- /dev/null +++ b/v0/src/store/extractStore.ts @@ -0,0 +1,40 @@ +import type { + PiniaCustomStateProperties, + StoreActions, + StoreGeneric, + StoreGetters, + StoreState, +} from 'pinia' +import type { ToRefs } from 'vue' +import { isReactive, isRef, toRaw, toRef } from 'vue' + +type Extracted = ToRefs< + StoreState & + StoreGetters & + PiniaCustomStateProperties> +> & + StoreActions + +/** + * Creates an object of references with all the state, getters, actions + * and plugin-added state properties of the store. + * + * @param store - store to extract the refs from + */ +export function extractStore( + store: SS +): Extracted { + const rawStore = toRaw(store) + const refs: Record = {} + + for (const [key, value] of Object.entries(rawStore)) { + if (isRef(value) || isReactive(value)) { + refs[key] = toRef(store, key) + } else if (typeof value === 'function') { + refs[key] = value + } + } + + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + return refs as Extracted +} diff --git a/v0/src/store/projectStore.ts b/v0/src/store/projectStore.ts new file mode 100644 index 00000000..3a09d0c8 --- /dev/null +++ b/v0/src/store/projectStore.ts @@ -0,0 +1,37 @@ +import { defineStore } from 'pinia' + +interface projectStoreType { + project: { + // id: number //use later if needed + name: string + nameDefined: boolean + } +} + +export const useProjectStore = defineStore({ + id: 'projectStore', + state: (): projectStoreType => ({ + project: { + // id: 0, //use later if needed + name: 'Untitled', + nameDefined: false, + }, + }), + actions: { + setProjectName(projectName: string): void { + this.project.name = projectName + this.project.nameDefined = true + }, + setProjectNameDefined(defined: boolean = true): void { + this.project.nameDefined = defined + }, + }, + getters: { + getProjectName(): string { + return this.project.name + }, + getProjectNameDefined(): boolean { + return this.project.nameDefined + }, + }, +}) diff --git a/v0/src/store/promptStore.ts b/v0/src/store/promptStore.ts new file mode 100644 index 00000000..612c35b3 --- /dev/null +++ b/v0/src/store/promptStore.ts @@ -0,0 +1,113 @@ +import { HTMLContent } from '@tiptap/core' +import { defineStore } from 'pinia' + +interface promptStoreType { + resolvePromise: Function + // resolvePromise: (value?: string | undefined) => void + prompt: { + activate: boolean + messageText: string + isPersistent: boolean + buttonList: Array<{ + text: string + emitOption: string + }> + inputList: Array<{ + text: string + val: string + placeholder: string + id: string + class: string + style: string + type: string + }> + } + confirm: { + activate: boolean + messageText: string + isPersistent: boolean + buttonList: Array<{ + text: string + emitOption: string | boolean + }> + } + DeleteCircuit: { + activate: boolean + messageText: string + isPersistent: boolean + buttonList: Array<{ + text: string + emitOption: string + }> + circuitItem: object + } + UpdateProjectDetail: { + activate: boolean + projectId: number + projectName: string + projectTags: string + projectType: Readonly | string + projectDescription: HTMLContent + } +} + +export const usePromptStore = defineStore({ + id: 'promptStore', + state: (): promptStoreType => ({ + resolvePromise: (): any => {}, + prompt: { + activate: false, + messageText: '', + isPersistent: false, + buttonList: [], + inputList: [], + }, + confirm: { + activate: false, + messageText: '', + isPersistent: false, + buttonList: [], + }, + DeleteCircuit: { + activate: false, + messageText: '', + isPersistent: false, + buttonList: [], + circuitItem: {}, + }, + UpdateProjectDetail: { + activate: false, + projectId: 0, + projectName: '', + projectTags: '', + projectType: 'Public', + projectDescription: '', + }, + }), + actions: { + // resolvePromise(): any {}, + setProjectName(projectName: string): void { + this.UpdateProjectDetail.projectName = projectName + }, + setProjectId(projectId: number): void { + this.UpdateProjectDetail.projectId = projectId + }, + }, + getters: { + getProjectName(): string { + return this.UpdateProjectDetail.projectName + }, + getProjectId(): number { + return this.UpdateProjectDetail.projectId + }, + getProjectTags(): string { + return this.UpdateProjectDetail.projectTags + }, + getProjectType(): Readonly | string { + return this.UpdateProjectDetail.projectType + }, + getProjectDescription(): HTMLContent { + return this.UpdateProjectDetail.projectDescription + }, + }, +}) diff --git a/v0/src/styles/color_theme.scss b/v0/src/styles/color_theme.scss new file mode 100644 index 00000000..5bdc9fff --- /dev/null +++ b/v0/src/styles/color_theme.scss @@ -0,0 +1,551 @@ +:root { + --primary: #454545; + + --bg-navbar: #454545; + --text-navbar--alt: #000; + --qp-br-tl: #333; + --qp-br-rd: #535353; + + --br-circuit: #454545; + --br-circuit-cur: #fff; + --bg-tabs: #8b8b8b; + --bg-circuit: #bbb; + + --text-lite: #fff; + --text-dark: #000; + --text-panel: #fff; + --text-circuit: #000; + + --context-text: #fff; + --context-text-hov: #000; + + --cus-radio_label: #656565; + + --br-secondary: #7d7d7d; + + --br-primary: #fff; + --bg-primary-moz: hsla(0, 0%, 27%, 0.902); + --bg-primary-chr: hsla(0, 0%, 27%, 0.702); + --bg-icons: #7d7d7d; + --bg-text: #cacaca; + --bg-secondary: #bbb; + --canvas-stroke:#eee; + --canvas-fill: #fff; + --bg-toggle-btn-primary: #42b983; + --primary-btn-hov: #3ca877; + --btn-danger: #dc5656; + --btn-danger-darken: #b03662; + --disable: #6c8b93; + --qp-box-shadow-1: #3b3b3b; + --qp-box-shadow-2: #4f4f4f; + --cus-btn-hov--bg: #ddd; + --cus-btn-hov-text: #000; + --node: green; + --stroke: black; + --fill: white; + --hover-and-sel: rgba(255, 255, 32, 0.8); + --wire-draw: #000; + --wire-cnt: green; + --wire-pow: Lime; + --wire-sel: blue; + --wire-lose: red; + --mini-map: green; + --mini-map-stroke: darkgreen; + --input-text: green; + --secondary-stroke: red; + --text: black; + --wire-norm: black; + --node-norm: green; + --splitter: black; + --output-rect: blue; +} + +::-moz-selection { + color: var(--text-lite); + background: var(--bg-icons); +} + +::selection { + color: var(--text-lite); + background: var(--bg-icons); +} + +.navbar-menu > li > a { + color: #fff; +} + +.projectName { + color: #fff; +} + +.header { + background: var(--bg-navbar); +} + +.dropdown > ul { + background-color: var(--bg-primary-moz); + border: 0.5px solid var(--bg-tabs); +} + +@supports (backdrop-filter: blur()) { + .dropdown > ul { + background-color: var(--bg-primary-chr); + } +} + +.dropdown > ul::before { + border-top: 1px solid var(--bg-tabs); + border-right: 1px solid var(--bg-tabs); +} + +.dropdown > ul::after { + border-top: 1.5px solid var(--primary); +} + +.dropdown-menu > li > a { + color: #fff !important; +} + +.signIn-btn { + color: #fff !important; +} + +.dropdown-menu > li > a:hover { + color: var(--text-navbar--alt) !important; + background: var(--bg-text); +} + +#contextMenu { + border: 0.5px solid var(--bg-tabs); + background-color: var(--bg-primary-moz); + color: var(--context-text); +} + +#contextMenu ul li:hover { + color: var(--context-text-hov); + background: var(--bg-text); +} + +@supports (backdrop-filter: blur()) { + #contextMenu { + background-color: var(--bg-primary-chr); + } +} + +.draggable-panel { + background: var(--primary); + border: 2px solid var(--br-primary); + box-shadow: 0px 0px 10px #4545457f; +} + +.panel-header { + color: var(--text-panel); + background: var(--primary); +} + +.panel-body { + color: var(--text-panel); + border-top: 1px solid var(--br-secondary); +} + +.panel-header::before { + border-top: 2px solid var(--text-panel); +} + +.search-input { + color: var(--text-panel); + border: 1px solid var(--br-secondary); +} + +.timing-diagram-toolbar input { + color: var(--text-panel); + border: 1px solid var(--br-secondary); +} + +.search-results, +.search-close { + color: var(--text-panel); +} + +#exitViewBtn { + border: 1px solid var(--br-primary); +} +.ce-hidden, +.prop-hidden, +#exitViewBtn { + color: var(--text-panel); + background: var(--primary); +} + +.ui-accordion-header { + color: var(--text-panel) !important; +} + +.panelHeader:hover { + background-color: var(--bg-icons); +} + +.panelHeader:after, +.panelHeader:before { + background-color: var(--br-primary); + border: 1px solid var(--br-primary); +} + +.ui-accordion .ui-accordion-content { + background-color: white; +} + +.icon { + background-color: white; +} + +.custom-tooltip-styling { + background-color: var(--bg-icons) !important; + color: var(--text-panel) !important; + border: 1px solid var(--br-primary); +} + +.icon:hover { + background-color: var(--bg-icons); +} + +.search-results::-webkit-scrollbar-thumb { + background-color: #585858; +} + +.search-results::-webkit-scrollbar-thumb:hover { + background-color: var(--primary); +} + +.timing-diagram-toolbar { + background-color: var(--bg-tabs); +} + +#tabsBar { + background-color: var(--bg-tabs); + border-top: 1px solid var(--br-primary); + border-bottom: 1px solid var(--br-primary); +} + +#tabsBar .circuits { + border: 1px solid var(--br-circuit); +} + +#tabsBar .circuits { + color: var(--text-circuit); + background-color: var(--bg-tabs); +} + +#tabsBar .current { + color: var(--text-circuit); + background-color: var(--bg-circuit); + border: 1px solid var(--br-circuit-cur); +} + +#tabsBar .current > span { +} + +#tabsBar button { + color: var(--text-panel); + background-color: var(--primary); + border: 1px solid var(--br-circuit-cur); +} + +#tabsBar button:hover { + color: var(--text-panel); + + border: 1px solid var(--br-circuit-cur); +} + +.moduleProperty input, +.moduleProperty textarea { + color: var(--text-panel); +} + +.moduleProperty { + background: var(--primary); + border: 2px solid var(--br-primary); + box-shadow: 0px 0px 10px #4545457f; + color: var(--text-panel); +} + +#moduleProperty-title { + color: var(--text-panel); +} + +.moduleProperty input, +.moduleProperty select, +.moduleProperty textarea { + border: 1px solid var(--br-secondary) !important; + color: var(--text-panel); +} + +.moduleProperty input:focus, +.moduleProperty select:focus, +.moduleProperty textarea:focus { + color: var(--text-panel); + border-color: var(--br-primary) !important; +} + +.input-group div button { + color: var(--text-lite); +} + +.input-group-prepend button:hover { + background: rgba(202, 202, 202, 0.5); +} + +.input-group-append button:hover { + background: rgba(202, 202, 202, 0.5); +} + +.slider { + background-color: #ccc; + box-shadow: inset 0px 0px 5px rgba(69, 69, 69, 0.255); +} + +.slider:before { + background-color: white; + box-shadow: 0px 0px 7px rgba(69, 69, 69, 0.8); +} + +input:checked + .slider { + background-color: var(--bg-toggle-btn-primary); +} + +.custom-btn--primary { + background-color: var(--bg-toggle-btn-primary); + color: var(--text-lite); +} +.custom-btn--primary:hover { + background-color: var(--primary-btn-hov); + color: var(--text-lite); +} +.custom-btn--secondary { + border: 1px solid white; + color: var(--text-lite); +} +.custom-btn--secondary:hover { + background-color: #ddd; + color: var(--cus-btn-hov-text); +} + +.custom-btn--secondary:active, +.custom-btn--secondary:focus { + border: 1px solid white; +} + +.custom-btn--tertiary { + background-color: var(--btn-danger); + color: var(--text-lite); +} + +.custom-btn--tertiary:hover { + background-color: var(--btn-danger-darken); + color: var(--text-lite); +} + +#HelpButton { + border: 2px solid var(--br-primary); + color: var(--text-panel); +} + +select { + background: var(--bg-secondary); + background-color: var(--primary); + color: var(--text-lite); +} + +#layoutDialog { + border: 2px solid var(--br-primary); + box-shadow: 0px 0px 10px #4545457f; + background-color: var(--primary); + color: var(--text-panel); +} + +#layoutDialog > div span:before { + color: var(--text-panel); +} + +.panel-heading { + color: var(--text-panel); +} + +.ui-dialog { + border: 0.5px solid var(--br-primary) !important; + background: var(--bg-primary-moz) !important; +} + +@supports (backdrop-filter: blur()) { + .ui-dialog { + background-color: var(--bg-primary-chr) !important; + } +} + +.ui-widget-header { + color: var(--text-lite) !important; + border-bottom: 0.5px solid var(--br-primary); +} + +.option { + background-color: white; + color: var(--cus-radio_label); +} + +.custom-radio span { + border: 3px solid var(--cus-radio_label); +} + +.custom-radio span:after { + background: var(--cus-radio_label); +} + +#saveImageDialog { + border: 1px solid var(--br-secondary); +} +.download-dialog-section-2 { + color: var(--text-lite); +} + +.download-dialog-section-2 .active-btn { + background: var(--bg-toggle-btn-primary); + color: var(--text-lite); +} + +.download-dialog-section-2 .inactive-btn { + color: var(--text-lite); +} + +.download-dialog-section-3 { + border: 1px solid var(--br-secondary); +} + +.download-dialog-section-3 > span { + color: var(--text-lite); +} + +.ui-dialog-titlebar-close::before:hover { + background-color: var(--primary); +} + +.ui-dialog .ui-dialog-buttonpane button:hover { + color: var(--cus-btn-hov-text) !important; + background: var(--cus-btn-hov--bg); + border: 1px solid transparent; +} + +.render-btn { + color: var(--text-lite); + border: 1px solid white; +} + +.render-btn:active { + border: 1px solid var(--br-primary); +} + +.render-btn:hover { + background: #3ba374; + color: var(--text-lite); + border: 1px solid transparent; +} + +#combinationalAnalysis { + border: 1px solid var(--br-secondary); + color: var(--text-lite); +} + +#combinationalAnalysis p input { + border-bottom: 1px solid white !important; + color: var(--text-lite); +} + +.content-table tr th { + background-color: var(--primary); + color: var(--text-lite); +} + +.content-table th, +.content-table td { + background-color: #f3f3f3; +} + +#openProjectDialog { + color: var(--text-lite); +} + +#openProjectDialog > label { + border: 1px solid var(--br-primary); + color: var(--text-lite); +} + +#openProjectDialog > label > span { + border: 3px solid white; +} + +#openProjectDialog > label > span:after { + background: var(--text-lite); +} + +#insertSubcircuitDialog { + color: var(--text-lite); +} + +.disable::after { + background: var(--disable); +} + +.radio-green { + background: #42b983; +} + +.btn-group-toggle { + border: 1px solid var(--br-secondary) !important; +} + +.set { + border: 2px solid cyan !important; +} + +.theme { + color: var(--text-panel) !important; + background: var(--bg-icons) !important; + border-radius: 1.5px; +} + +.input-group-prepend button:hover { + background: var(--bg-secondary) !important; + color: var(--text-lite) !important; +} + +.input-group-append button:hover { + background: var(--bg-secondary) !important; + color: var(--text-lite) !important; +} + +.input-group-prepend button { + color: var(--text-panel) !important; +} + +.input-group-append button { + color: var(--text-panel) !important; +} + +#Rectangle_1072 { + stroke: var(--text-panel); +} + +#Path_36 { + fill: var(--text-panel); +} + +.layout--btn-group { + display: block; + margin-right: 25px; + margin-top: -10px; +} + +#clockProperty { + background: var(--primary); + border: 1px solid var(--br-primary); + color: var(--text-panel); +} diff --git a/v0/src/styles/css/0-helpers/_color-config.scss b/v0/src/styles/css/0-helpers/_color-config.scss new file mode 100644 index 00000000..dfe909f0 --- /dev/null +++ b/v0/src/styles/css/0-helpers/_color-config.scss @@ -0,0 +1,22 @@ +// +// Color configuration +// + +$primary: $charcoal; //base color theme +$input: $silver; //input border (mainly bottom) +$text-primary: $white; //global font color +$text-secondary: $silver; //placeholder text +$sim-primary: $white; //simulator bg +$sim-secondary: $very-light-grey; //simulator gridlines +$dialog-primary: $primary; //dialog boxes bg color +$dialog-secondary: $grey; //dialog boxes box border color +$button-primary: $medium-sea-green; //btn primary +$button-secondary: $roman; //delete button +$error-primary: $carousel-pink; //error text color +$box-shadow: $grey-shadow; //box shadow +$border-primary: $white; //border color +$border-secondary: $suva-grey; //dropdown border color +$border-tertiary: $silver; //input box border +$bg-primary--nav: $suva-grey; //nav-bar bg color +$bg-secondary--nav: $primary; //active nav-bar menu bg color +$bg-tertiary--nav: $gainsboro; //inactive nav-bar menu bg color diff --git a/v0/src/styles/css/0-helpers/_functions.scss b/v0/src/styles/css/0-helpers/_functions.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/0-helpers/_mixins.scss b/v0/src/styles/css/0-helpers/_mixins.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/0-helpers/_variables.scss b/v0/src/styles/css/0-helpers/_variables.scss new file mode 100644 index 00000000..93711734 --- /dev/null +++ b/v0/src/styles/css/0-helpers/_variables.scss @@ -0,0 +1,16 @@ +// +// Color Variables +// + +$charcoal: #454545; +$silver: #bbbbbb; +$gainsboro: #dddddd; +$white: #ffffff; +$grey: #7d7d7d; +$very-light-grey: #cacaca; +$suva-grey: #8b8b8b; +$medium-sea-green: #42b983; +$roman: #dc5656; +$grey-shadow: #4545457f; +$fire-brick: #ac3522; +$carousel-pink: #f8d7da; diff --git a/v0/src/styles/css/2-basics/_buttons.scss b/v0/src/styles/css/2-basics/_buttons.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/2-basics/_close.scss b/v0/src/styles/css/2-basics/_close.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/2-basics/_global.scss b/v0/src/styles/css/2-basics/_global.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/2-basics/_links.scss b/v0/src/styles/css/2-basics/_links.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/2-basics/_toggle.scss b/v0/src/styles/css/2-basics/_toggle.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/2-basics/_typography.scss b/v0/src/styles/css/2-basics/_typography.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/2-basics/base.scss b/v0/src/styles/css/2-basics/base.scss new file mode 100644 index 00000000..f7f722b9 --- /dev/null +++ b/v0/src/styles/css/2-basics/base.scss @@ -0,0 +1,11 @@ +/* base/default rule set here + no class or ID selectors +*/ + +html { + box-sizing: border-box; +} + +* *:before *:after { + box-sizing: inherit; +} diff --git a/v0/src/styles/css/2-basics/reset.scss b/v0/src/styles/css/2-basics/reset.scss new file mode 100644 index 00000000..ba934af9 --- /dev/null +++ b/v0/src/styles/css/2-basics/reset.scss @@ -0,0 +1,64 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +/* File modified - uncomment below */ +/* +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +*/ +/* HTML5 display-role reset for older browsers */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { + display: block; +} +body { + line-height: 1; +} +ol, +ul { + list-style: none; +} +blockquote, +q { + quotes: none; +} +blockquote:before, +blockquote:after, +q:before, +q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/v0/src/styles/css/3-sub-components/_navigation.scss b/v0/src/styles/css/3-sub-components/_navigation.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/3-sub-components/_searchbar.scss b/v0/src/styles/css/3-sub-components/_searchbar.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/3-sub-components/_shortcut-menu.scss b/v0/src/styles/css/3-sub-components/_shortcut-menu.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/3-sub-components/_zoom-slider.scss b/v0/src/styles/css/3-sub-components/_zoom-slider.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/4-components/_bool-logic-dialog.scss b/v0/src/styles/css/4-components/_bool-logic-dialog.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/4-components/_canvas.scss b/v0/src/styles/css/4-components/_canvas.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/4-components/_circuitelements.scss b/v0/src/styles/css/4-components/_circuitelements.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/4-components/_context-menu.scss b/v0/src/styles/css/4-components/_context-menu.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/4-components/_dropdown.scss b/v0/src/styles/css/4-components/_dropdown.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/4-components/_header.scss b/v0/src/styles/css/4-components/_header.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/4-components/_layout-dialog.scss b/v0/src/styles/css/4-components/_layout-dialog.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/4-components/_navbar.scss b/v0/src/styles/css/4-components/_navbar.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/4-components/_new-circuit-dialog.scss b/v0/src/styles/css/4-components/_new-circuit-dialog.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/4-components/_properties.scss b/v0/src/styles/css/4-components/_properties.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/4-components/_save-img-dialog.scss b/v0/src/styles/css/4-components/_save-img-dialog.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/4-components/_shortcut-dialog.scss b/v0/src/styles/css/4-components/_shortcut-dialog.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/4-components/_tabs-bar.scss b/v0/src/styles/css/4-components/_tabs-bar.scss new file mode 100644 index 00000000..e69de29b diff --git a/v0/src/styles/css/5-layout/simulator.scss b/v0/src/styles/css/5-layout/simulator.scss new file mode 100644 index 00000000..89b84d4d --- /dev/null +++ b/v0/src/styles/css/5-layout/simulator.scss @@ -0,0 +1,321 @@ +/* old ui ruleset starts here */ +.deleteOfflineProject { + float: right; + cursor: pointer; + padding: 2px; +} + +.pointerCursor { + cursor: pointer; +} + +.defaultCursor { + cursor: default; +} + +#container { + display: table; + width: 100%; + height: 100%; +} + +#container > div { + display: table-row; + height: 0; +} + +#container > div.fill { + height: auto; +} + +/* END OF MODULES */ + +#restrictedDiv { + position: absolute; + top: 10px; + margin-left: 10px; + width: 560px; + z-index: 100; +} + +#restrictedElementsDiv { + position: absolute; + top: 90px; + right: 10px; + z-index: 100; + width: 200px; +} + +#MessageDiv { + position: absolute; + left: 30px; + bottom: 30px; + z-index: 110; +} + +.errorMessage { + height: auto; + width: 100%; + padding: 2px; + margin: 2px; + border: 1px solid red; + border-radius: 3px; + background-color: #fee; + font-size: 15px; +} + +.normalMessage { + height: auto; + width: 100%; + padding: 2px; + margin: 2px; + border: 1px solid green; + border-radius: 3px; + background-color: #99ff33; + font-size: 15px; +} + +#canvasArea { + display: block; + position: relative; + width: 100%; + background-color: red; +} + +.simulation { + position: relative; + width: auto; + height: 100%; + overflow: hidden; + background-color: 'white'; +} + +.left { + float: left; +} + +.right { + float: right; +} + +.objectPropertyAttributeChecked.btn { + width: 100%; + margin-bottom: 5px; +} + +/* For loading screen - pace.js */ + +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + position: fixed; + width: 100vw; + height: 100vh; + background-color: #fff; + z-index: 100000; +} + +.pace-inactive { + display: none; +} + +#Help { + visibility: hidden; + /* Hidden by default. Visible on click */ + min-width: 250px; + /* Set a default minimum width */ + margin-left: -125px; + /* Divide value of min-width by 2 */ + background-color: #333; + /* Black background color */ + color: #fff; + /* White text color */ + text-align: center; + /* Centered text */ + border-radius: 2px; + /* Rounded borders */ + padding: 16px; + /* Padding */ + position: fixed; + /* Sit on top of the screen */ + z-index: 1; + /* Add a z-index if needed */ + right: 50px; + /* Center the snackbar */ + bottom: 50px; + /* 30px from the bottom */ + opacity: 0; +} + +#Help.show { + visibility: visible; + /* Show the snackbar */ + opacity: 1; + -webkit-transition-delay: 0.5s; + /* Safari */ + transition-delay: 0.5s; + -webkit-transition-duration: 0.3s; + /* Safari */ + transition-duration: 0.3s; +} + +@-webkit-keyframes fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@-webkit-keyframes fadeout { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +@keyframes fadeout { + from { + bottom: 0px; + opacity: 1; + } + to { + bottom: 0; + opacity: 0; + } +} + +.pace .pace-progress { + background: #29d; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 50%; + height: 5px; +} + +/* LOADING ICON CSS STARTS*/ + +.sk-folding-cube { + margin: 20px auto; + width: 40px; + height: 40px; + position: relative; + -webkit-transform: rotateZ(45deg); + transform: rotateZ(45deg); +} + +.sk-folding-cube .sk-cube { + float: left; + width: 50%; + height: 50%; + position: relative; + -webkit-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} + +.sk-folding-cube .sk-cube:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #09f; + -webkit-animation: sk-foldCubeAngle 2.4s infinite linear both; + animation: sk-foldCubeAngle 2.4s infinite linear both; + -webkit-transform-origin: 100% 100%; + -ms-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} + +.sk-folding-cube .sk-cube2 { + -webkit-transform: scale(1.1) rotateZ(90deg); + transform: scale(1.1) rotateZ(90deg); +} + +.sk-folding-cube .sk-cube3 { + -webkit-transform: scale(1.1) rotateZ(180deg); + transform: scale(1.1) rotateZ(180deg); +} + +.sk-folding-cube .sk-cube4 { + -webkit-transform: scale(1.1) rotateZ(270deg); + transform: scale(1.1) rotateZ(270deg); +} + +.sk-folding-cube .sk-cube2:before { + -webkit-animation-delay: 0.3s; + animation-delay: 0.3s; +} + +.sk-folding-cube .sk-cube3:before { + -webkit-animation-delay: 0.6s; + animation-delay: 0.6s; +} + +.sk-folding-cube .sk-cube4:before { + -webkit-animation-delay: 0.9s; + animation-delay: 0.9s; +} + +@-webkit-keyframes sk-foldCubeAngle { + 0%, + 10% { + -webkit-transform: perspective(140px) rotateX(-180deg); + transform: perspective(140px) rotateX(-180deg); + opacity: 0; + } + 25%, + 75% { + -webkit-transform: perspective(140px) rotateX(0deg); + transform: perspective(140px) rotateX(0deg); + opacity: 1; + } + 90%, + 100% { + -webkit-transform: perspective(140px) rotateY(180deg); + transform: perspective(140px) rotateY(180deg); + opacity: 0; + } +} + +@keyframes sk-foldCubeAngle { + 0%, + 10% { + -webkit-transform: perspective(140px) rotateX(-180deg); + transform: perspective(140px) rotateX(-180deg); + opacity: 0; + } + 25%, + 75% { + -webkit-transform: perspective(140px) rotateX(0deg); + transform: perspective(140px) rotateX(0deg); + opacity: 1; + } + 90%, + 100% { + -webkit-transform: perspective(140px) rotateY(180deg); + transform: perspective(140px) rotateY(180deg); + opacity: 0; + } +} + +/* LOADING ICON CSS ENDS*/ diff --git a/v0/src/styles/css/UX.css b/v0/src/styles/css/UX.css new file mode 100644 index 00000000..e5011d8a --- /dev/null +++ b/v0/src/styles/css/UX.css @@ -0,0 +1,969 @@ +.deleteOfflineProject { + float: right; + cursor: pointer; + padding: 2px; +} + +#contextMenu { + width: 150px; + visibility: hidden; + box-shadow: 0px 2px 7px rgba(0, 0, 0, 0.2); + border: 1px solid rgba(0, 0, 0, 0.2); + position: fixed; + z-index: 100; + background: #fff; + opacity: 0; + top: 100; + left: 100; + cursor: pointer; + color: #000; + padding-bottom: 4px; + padding-top: 4px; + transition: opacity 0.2s ease-in-out; + user-select: none; +} + +#contextMenu ul { + margin: 0; + padding: 0; + font: 16px sans-serif; +} + +#contextMenu ul li { + list-style: none; + padding: 8px; + padding-left: 20px; +} + +#contextMenu ul li a { + text-decoration: none; + color: #000 !important; +} + +#contextMenu ul li:hover { + background: rgba(0, 0, 0, 0.1); +} + +button:focus { + outline: 0; +} + +.side { + height: 100%; + background-color: #333; + padding: 3px; + color: #fff; + border-side: 1px solid #0099ff; + border-bottom: 40px solid #0099ff; + padding: 0.5em; +} + +.option { + display: block; + background-color: black; + border: 1px solid #005cb3; + color: #0099ff; + padding: 5px; + width: 200px; + margin: 3px; + word-wrap: break-word; + overflow-x: hidden; +} + +.pannel-heading { + background-color: #f5f5f5; +} + +#layoutDialog { + position: absolute; + right: 100px; + top: 100px; + z-index: 101; + width: 200px; + height: 230px; + border: 1px solid grey; + border-radius: 2px; + background-color: white; + overflow-x: hidden; +} + +.projectName { + /*margin:3px;*/ + color: #0099ff; + margin: 0 auto; + text-align: center; + font-size: 1.4em; + position: static; + left: 50%; + display: block; + width: 500px; + text-align: center; + margin-left: -250px; +} + +.inline { + width: auto; + padding-right: 20px; + display: inline-block; +} + +.option:hover { + border-color: #0099ff; +} + +input[type='radio']:checked ~ label { + color: #0dff92; +} + +.option input[type='radio'] { + margin-right: 5px; + /*position: absolute;*/ + visibility: hidden; +} + +.option input[type='radio']:checked { + /*position: absolute;*/ + visibility: visible; +} + +.zoomButton:focus { + outline: 0; +} + +.zoomButton { + padding: 5px; + opacity: 0.3; +} + +.zoomButton:hover { + /*height:20px; + width:20px;*/ + opacity: 0.8; + transition: opacity 0.2s; +} + +.ui-accordion-header-icon.ui-icon { + /*background-image: url("./ui-icons_white_256x240.png");*/ +} + +.noSelect { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + -o-user-select: none; +} + +.pointerCursor { + cursor: pointer; +} + +.defaultCursor { + cursor: default; +} + +#container { + display: table; + width: 100%; + height: 100%; +} + +#container > div { + display: table-row; + height: 0; +} + +#container > div.fill { + height: auto; +} + +#modules-header { + margin-bottom: 0.5em; + font-size: 1.3em; + text-transform: uppercase; + font-family: Arial, Helvetica, sans-serif; + color: #0099ff; + text-align: center; + padding-top: 0.3em; +} + +.panel { + padding: 0em; + background-color: #333; + margin: 0; + border-radius: 0; + margin-bottom: 0em; + border: 1px solid #0099ff; +} + +.ui-accordion-header { + background-color: #333; + color: #fff; + border: 1px solid #0099ff; + border-radius: 0; + margin: 0em; + padding: 0em; + outline: none; +} + +.ui-accordion-header.ui-accordion-header-active.ui-state-active { + background-color: #0099ff; + outline: none; + margin-bottom: 0; +} + +.ui-accordion-header.ui-state-hover { + background-color: #0066cc; + outline: none; + /*margin-bottom: 0;*/ +} + +/* MODULES */ + +.moduleProperty { + display: none; + background-color: #333; + color: #fff; + /*padding-bottom: 2em;*/ + margin-top: 1em; +} + +#moduleProperty-inner { + border: 1px solid #0099ff; + padding: 1em; + /*margin-bottom: 1em;*/ +} + +#moduleProperty-toolTip { + padding: 10px; + /*font-size: 1.1em;*/ + color: #0099ff; +} + +#moduleProperty-title { + text-transform: uppercase; + font-size: 1.3em; + color: #0099ff; + margin-bottom: 0.55em; + text-align: center; +} + +#moduleProperty-header { + font-size: 1.1em; + text-transform: uppercase; + margin-bottom: 0.5em; +} + +#moduleProperty-inner > p { + margin: 0; + margin-top: 0.2em; +} + +input, +select { + padding: 0.25rem; +} + +.moduleProperty input, +.moduleProperty select { + background-color: #333; + border: none; + border-bottom: 2px solid #ccc; +} + +.moduleProperty input:active, +.moduleProperty input:focus, +.moduleProperty select:active, +.moduleProperty select:focus { + border-bottom: 2px solid #0099ff; +} + +.navbar.navbar-default { + margin: 0px; + border-radius: 0px; + border: 0; + padding: 0px; + min-height: 0px; + border-bottom: 1px solid #0099ff; +} + +.navbar-brand { + padding: 7px 15px; + height: auto; +} + +/* END OF MODULES */ + +#tabsBar { + width: 100%; + /*height: 3em;*/ + margin-left: 20px; + background-color: #000; +} + +#tabsBar div { + display: inline-block; + /*padding-left: 0.5em;*/ + margin: 0.1em; + color: #fff; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + position: relative; +} + +#tabsBar .circuits { + color: #fff; + text-align: center; + background-color: #00284d; + padding-left: 0.5em; + padding-right: 1.5em; + border: 1px solid #005cb3; + border-radius: 0.1em; +} + +#tabsBar .circuits:hover { + background-color: #00ace6; + /*border: 1px solid #0099ff;*/ + transition-duration: 100ms; +} + +#tabsBar .current { + /*background-color: #0086b3;*/ + background-color: #004280; + border: 1px solid #0099ff; +} + +.tabsCloseButton:hover { + color: #fff; + font-family: 'Gill Sans', sans-serif; + margin-left: 1em; + opacity: 0.5; +} +.tabsCloseButton { + color: #111; + font-family: 'Gill Sans', sans-serif; + margin-left: 1em; + opacity: 1; + position: absolute; + top: 5px; + right: 3; +} + +th, +td { + padding-left: 15px; + padding-right: 15px; + text-align: left; + border: 1px solid #0099ff; + color: white; +} + +#booleanTable { + width: 200px; +} + +table { + border-collapse: collapse; + -webkit-user-select: none; + /* Chrome/Safari */ + -moz-user-select: none; + /* Firefox */ + -ms-user-select: none; + /* IE10+ */ + /* Rules below not implemented in browsers yet */ + -o-user-select: none; + user-select: none; +} + +body, +html { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + overflow: hidden; +} + +#restrictedDiv { + position: absolute; + top: 10px; + margin-left: 10px; + width: 560px; + z-index: 100; +} + +#restrictedElementsDiv { + position: absolute; + top: 90px; + right: 10px; + z-index: 100; + width: 200px; +} + +#MessageDiv { + position: absolute; + margin-left: 30px; + bottom: 100px; + /*height:auto;*/ + /*width:60%;*/ + /*padding: 2px;*/ + /*border: 3px solid red;*/ + /*border-radius: 6px;*/ + /*background-color: #fcc;*/ + z-index: 10; +} + +.errorMessage { + /*position: absolute;*/ + /*margin-left: 30%;*/ + /*bottom: 1px;*/ + height: auto; + width: 100%; + /*margin-bottom: 10px;*/ + padding: 2px; + margin: 2px; + border: 1px solid red; + border-radius: 3px; + background-color: #fee; + font-size: 15px; + /*z-index: 10;*/ +} + +.normalMessage { + /*position: absolute;*/ + /*margin-left: 30%;*/ + /*bottom: 150px;*/ + height: auto; + width: 100%; + /*margin-bottom: 10px;*/ + padding: 2px; + margin: 2px; + border: 1px solid green; + border-radius: 3px; + background-color: #99ff33; + font-size: 15px; + /*z-index: 10;*/ +} + +#canvasArea { + display: block; + position: relative; + /*height: 100%;*/ + width: 100%; + background-color: red; +} + +.simulation { + position: relative; + width: auto; + height: 100%; + overflow: hidden; + background-color: 'white'; +} + +.switch { + position: relative; + display: inline-block; + width: 43px; + height: 17px; + margin-bottom: 0px; +} + +.switch input { + display: none; +} + +.slider { + position: absolute; + cursor: pointer; + top: 2; + left: 0; + right: 0; + bottom: -2; + background-color: #ccc; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.slider:before { + position: absolute; + content: ''; + height: 17px; + width: 17px; + left: 0px; + bottom: 0px; + background-color: white; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +input:checked + .slider { + background-color: #2196f3; +} + +input:focus + .slider { + box-shadow: 0 0 1px #2196f3; +} + +input:checked + .slider:before { + -webkit-transform: translateX(26px); + -ms-transform: translateX(26px); + transform: translateX(26px); +} + +/* Rounded sliders */ + +.slider.round { + border-radius: 34px; +} + +.slider.round:before { + border-radius: 50%; +} + +/* Slider for white background */ +.slider2 { + position: absolute; + cursor: pointer; + top: 2; + left: 0; + right: 0; + bottom: -2; + /* border: 1px solid black; */ + background-color: #ccc; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.slider2:before { + position: absolute; + content: ''; + height: 17px; + width: 17px; + left: 0px; + bottom: 0px; + background-color: #aaa; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +input:checked + .slider2 { + background-color: #2196f3; +} + +input:focus + .slider2 { + box-shadow: 0 0 1px #2196f3; +} + +input:checked + .slider2:before { + -webkit-transform: translateX(26px); + -ms-transform: translateX(26px); + transform: translateX(26px); +} + +/* Rounded sliders */ + +.slider2.round { + border-radius: 34px; +} + +.slider2.round:before { + border-radius: 50%; +} + +#miniMap { + position: fixed; + z-index: 2; + bottom: 20px; + right: 40px; + /*height:150px; + width: 25%;*/ + overflow-y: scroll; + background-color: black; + /*border:1px solid #aaa;*/ + opacity: 0.97; + box-shadow: 0px 0px 15px #888888; + overflow: hidden; + /*transition: opacity .25s ease-in-out;*/ +} + +#plot { + position: fixed; + z-index: 1; + bottom: 0; + right: 0; + /*display: block;*/ + /*height: 0px;*/ + /*width: 100%;*/ + overflow-y: scroll; + background-color: #eee; + /*background-blend-mode: color;*/ +} + +.left { + float: left; +} + +.right { + float: right; +} + +.icon { + position: relative; + height: 70px; + width: 70px; + /*margin: 1px;*/ + margin-bottom: 5px; + margin-left: 3px; + display: inline-block; + background-color: white; + border-radius: 4px; + /*border-color: #0099ff;*/ + border: 2px solid #0099ff; + text-align: center; + font-size: 8px; + padding: 5px; +} + +img { + display: none; +} + +div.icon img { + -webkit-user-drag: none; + -khtml-user-drag: none; + -moz-user-drag: none; + -o-user-drag: none; + user-drag: none; + /*margin: auto;*/ + width: 100%; + /*height:100%;*/ + display: inline-block; +} + +.img__description { + position: absolute; + /*top: 0;*/ + bottom: -16; + text-align: center; + left: 0; + right: 0; + background-color: #0099ff; + color: white; + font-size: 8px; + /*background: rgba(29, 106, 154, 0.72); + color: #fff;*/ + visibility: hidden; + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; + opacity: 0; + /* transition effect. not necessary */ + transition: opacity 0.2s, visibility 0.2s; +} + +.icon:hover .img__description { + visibility: visible; + opacity: 1; +} + +.icon:hover { + /*background-color: #cce5ff;*/ + /*border-color: blue;*/ + margin-bottom: 1px; + height: 74px; + background-color: #f5f5f5; + transition: height 0.2s margin 0.2s; +} + +.objectPropertyAttributeChecked.btn { + width: 100%; + margin-bottom: 5px; +} + +/* For loading screen - pace.js */ + +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + width: 100%; + height: 100%; + background-color: #fff; +} + +.pace-inactive { + display: none; +} + +#Help { + visibility: hidden; + /* Hidden by default. Visible on click */ + min-width: 250px; + /* Set a default minimum width */ + margin-left: -125px; + /* Divide value of min-width by 2 */ + background-color: #333; + /* Black background color */ + color: #fff; + /* White text color */ + text-align: center; + /* Centered text */ + border-radius: 2px; + /* Rounded borders */ + padding: 16px; + /* Padding */ + position: fixed; + /* Sit on top of the screen */ + z-index: 1; + /* Add a z-index if needed */ + right: 50px; + /* Center the snackbar */ + bottom: 50px; + /* 30px from the bottom */ + opacity: 0; +} + +#Help.show { + visibility: visible; + /* Show the snackbar */ + opacity: 1; + -webkit-transition-delay: 0.5s; + /* Safari */ + transition-delay: 0.5s; + -webkit-transition-duration: 0.3s; + /* Safari */ + transition-duration: 0.3s; +} + +/* Animations to fade the snackbar in and out */ + +@-webkit-keyframes fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@-webkit-keyframes fadeout { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +@keyframes fadeout { + from { + bottom: 0px; + opacity: 1; + } + to { + bottom: 0; + opacity: 0; + } +} + +.pace .pace-progress { + background: #29d; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 50%; + height: 5px; +} + +/* dropdown-menu styles */ + +.dropdown-menu { + background-color: black; + border: 1px solid #09f; + border-top: none; +} + +.navbar-nav > li > a { + padding: 7px 15px; +} + +.dropdown-menu > li > a { + color: #939393 !important; + padding: 3px 14px; +} + +.dropdown-menu > li > a:hover { + color: #4db8ff !important; + background-color: black; +} + +.ui-dialog { + background: #222; +} + +.ui-dialog p { + color: #9d9d9d; +} + +.ui-widget-header { + border: 1px solid #0099ff; + color: #0099ff; +} + +.ui-dialog-buttonpane { + background-color: black; +} + +.ui-dialog-titlebar { + background-color: black; +} + +.ui-dialog-titlebar-close { + background-image: url('../img/cross.png'); + position: absolute; + right: 0.3em; + top: 50%; + width: 21px; + margin: -10px 0 0 0; + padding: 1px; + height: 20px; +} + +.ui-icon-close { + background-position: -80px -128px; +} + +.ui-dialog .ui-dialog-buttonpane button { + background-color: #004280; + border: 1px solid #09f; + color: white; +} + +.navbar .nav.pull-right { + float: right; + margin-right: 10px; + /*set margin this way in your custom stylesheet*/ +} + +/* LOADING ICON CSS STARTS*/ + +.sk-folding-cube { + margin: 20px auto; + width: 40px; + height: 40px; + position: relative; + -webkit-transform: rotateZ(45deg); + transform: rotateZ(45deg); +} + +.sk-folding-cube .sk-cube { + float: left; + width: 50%; + height: 50%; + position: relative; + -webkit-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} + +.sk-folding-cube .sk-cube:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #09f; + -webkit-animation: sk-foldCubeAngle 2.4s infinite linear both; + animation: sk-foldCubeAngle 2.4s infinite linear both; + -webkit-transform-origin: 100% 100%; + -ms-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} + +.sk-folding-cube .sk-cube2 { + -webkit-transform: scale(1.1) rotateZ(90deg); + transform: scale(1.1) rotateZ(90deg); +} + +.sk-folding-cube .sk-cube3 { + -webkit-transform: scale(1.1) rotateZ(180deg); + transform: scale(1.1) rotateZ(180deg); +} + +.sk-folding-cube .sk-cube4 { + -webkit-transform: scale(1.1) rotateZ(270deg); + transform: scale(1.1) rotateZ(270deg); +} + +.sk-folding-cube .sk-cube2:before { + -webkit-animation-delay: 0.3s; + animation-delay: 0.3s; +} + +.sk-folding-cube .sk-cube3:before { + -webkit-animation-delay: 0.6s; + animation-delay: 0.6s; +} + +.sk-folding-cube .sk-cube4:before { + -webkit-animation-delay: 0.9s; + animation-delay: 0.9s; +} + +@-webkit-keyframes sk-foldCubeAngle { + 0%, + 10% { + -webkit-transform: perspective(140px) rotateX(-180deg); + transform: perspective(140px) rotateX(-180deg); + opacity: 0; + } + 25%, + 75% { + -webkit-transform: perspective(140px) rotateX(0deg); + transform: perspective(140px) rotateX(0deg); + opacity: 1; + } + 90%, + 100% { + -webkit-transform: perspective(140px) rotateY(180deg); + transform: perspective(140px) rotateY(180deg); + opacity: 0; + } +} + +@keyframes sk-foldCubeAngle { + 0%, + 10% { + -webkit-transform: perspective(140px) rotateX(-180deg); + transform: perspective(140px) rotateX(-180deg); + opacity: 0; + } + 25%, + 75% { + -webkit-transform: perspective(140px) rotateX(0deg); + transform: perspective(140px) rotateX(0deg); + opacity: 1; + } + 90%, + 100% { + -webkit-transform: perspective(140px) rotateY(180deg); + transform: perspective(140px) rotateY(180deg); + opacity: 0; + } +} + +/* LOADING ICON CSS ENDS*/ diff --git a/v0/src/styles/css/assets/layout-panel/down.svg b/v0/src/styles/css/assets/layout-panel/down.svg new file mode 100644 index 00000000..d8e8d105 --- /dev/null +++ b/v0/src/styles/css/assets/layout-panel/down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/styles/css/assets/layout-panel/left.svg b/v0/src/styles/css/assets/layout-panel/left.svg new file mode 100644 index 00000000..f73a40ff --- /dev/null +++ b/v0/src/styles/css/assets/layout-panel/left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/styles/css/assets/layout-panel/minus.svg b/v0/src/styles/css/assets/layout-panel/minus.svg new file mode 100644 index 00000000..b26d17f4 --- /dev/null +++ b/v0/src/styles/css/assets/layout-panel/minus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/styles/css/assets/layout-panel/plus.svg b/v0/src/styles/css/assets/layout-panel/plus.svg new file mode 100644 index 00000000..364e696d --- /dev/null +++ b/v0/src/styles/css/assets/layout-panel/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/styles/css/assets/layout-panel/right.svg b/v0/src/styles/css/assets/layout-panel/right.svg new file mode 100644 index 00000000..bef89def --- /dev/null +++ b/v0/src/styles/css/assets/layout-panel/right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/styles/css/assets/layout-panel/up.svg b/v0/src/styles/css/assets/layout-panel/up.svg new file mode 100644 index 00000000..7c014709 --- /dev/null +++ b/v0/src/styles/css/assets/layout-panel/up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/styles/css/assets/logo.svg b/v0/src/styles/css/assets/logo.svg new file mode 100644 index 00000000..ffae4558 --- /dev/null +++ b/v0/src/styles/css/assets/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/styles/css/assets/shorcuts/delete.svg b/v0/src/styles/css/assets/shorcuts/delete.svg new file mode 100644 index 00000000..3611bbac --- /dev/null +++ b/v0/src/styles/css/assets/shorcuts/delete.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/styles/css/assets/shorcuts/download.svg b/v0/src/styles/css/assets/shorcuts/download.svg new file mode 100644 index 00000000..9dc67f1e --- /dev/null +++ b/v0/src/styles/css/assets/shorcuts/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/styles/css/assets/shorcuts/dragDots.svg b/v0/src/styles/css/assets/shorcuts/dragDots.svg new file mode 100644 index 00000000..dacde439 --- /dev/null +++ b/v0/src/styles/css/assets/shorcuts/dragDots.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v0/src/styles/css/assets/shorcuts/fit.svg b/v0/src/styles/css/assets/shorcuts/fit.svg new file mode 100644 index 00000000..4cc765e2 --- /dev/null +++ b/v0/src/styles/css/assets/shorcuts/fit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/styles/css/assets/shorcuts/new.svg b/v0/src/styles/css/assets/shorcuts/new.svg new file mode 100644 index 00000000..bc1bb3bd --- /dev/null +++ b/v0/src/styles/css/assets/shorcuts/new.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/styles/css/assets/shorcuts/redo.svg b/v0/src/styles/css/assets/shorcuts/redo.svg new file mode 100644 index 00000000..30e00a4c --- /dev/null +++ b/v0/src/styles/css/assets/shorcuts/redo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/styles/css/assets/shorcuts/save-online.svg b/v0/src/styles/css/assets/shorcuts/save-online.svg new file mode 100644 index 00000000..bb414b9a --- /dev/null +++ b/v0/src/styles/css/assets/shorcuts/save-online.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/styles/css/assets/shorcuts/save.svg b/v0/src/styles/css/assets/shorcuts/save.svg new file mode 100644 index 00000000..9e3c8da5 --- /dev/null +++ b/v0/src/styles/css/assets/shorcuts/save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/styles/css/assets/shorcuts/undo.svg b/v0/src/styles/css/assets/shorcuts/undo.svg new file mode 100644 index 00000000..c82d8b64 --- /dev/null +++ b/v0/src/styles/css/assets/shorcuts/undo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/styles/css/assets/small-components/chevron-down.svg b/v0/src/styles/css/assets/small-components/chevron-down.svg new file mode 100644 index 00000000..e4c8404d --- /dev/null +++ b/v0/src/styles/css/assets/small-components/chevron-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/styles/css/assets/small-components/close.svg b/v0/src/styles/css/assets/small-components/close.svg new file mode 100644 index 00000000..8dc79fa4 --- /dev/null +++ b/v0/src/styles/css/assets/small-components/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v0/src/styles/css/custom_mailer.css b/v0/src/styles/css/custom_mailer.css new file mode 100644 index 00000000..3284a610 --- /dev/null +++ b/v0/src/styles/css/custom_mailer.css @@ -0,0 +1,6 @@ +.navbar, +.navbar-search-active, +.footer-empty-div, +.footer-container-fluid { + display: none; +} diff --git a/v0/src/styles/css/embed.css b/v0/src/styles/css/embed.css new file mode 100644 index 00000000..ed09eb73 --- /dev/null +++ b/v0/src/styles/css/embed.css @@ -0,0 +1,261 @@ +.switch { + position: relative; + display: inline-block; + width: 43px; + height: 17px; + margin-bottom: 0px; +} + +.switch input { + display: none; +} + +.slider { + position: absolute; + cursor: pointer; + top: 2; + left: 0; + right: 0; + bottom: -2; + background-color: #ccc; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.slider:before { + position: absolute; + content: ''; + height: 17px; + width: 17px; + left: 0px; + bottom: 0px; + background-color: white; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +#clockProperty { + padding: 10px; +} + +#clockPropertyHeader { + border-radius: 3px; +} +#clockProperty { + padding: 10px; + border-radius: 6px; + opacity: 0.1; + transition: 0.4s; + height: 109px; + display: flex; + flex-direction: column; + justify-content: space-between; +} +#clockProperty:hover { + opacity: 1; + -webkit-transition: 0.4s; + transition: 0.4s; +} +input:checked + .slider { + /* background-color: #2196F3; */ +} + +input:focus + .slider { + box-shadow: 0 0 1px #2196f3; +} + +input:checked + .slider:before { + -webkit-transform: translateX(26px); + -ms-transform: translateX(26px); + transform: translateX(26px); +} + +#tabsBar .circuits { + color: #000; + text-align: center; + padding-left: 0.5em; + padding-right: 0.5em; + border: 1px solid #111; + display: inline-block; +} +button:focus { + outline: 0; +} +#tabsBar .circuits:hover { + background-color: lightgray; + /*border: 1px solid #0099ff;*/ + transition-duration: 100ms; +} +#tabsBar .current { + transition-duration: 100ms; +} + +.noSelect { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + -o-user-select: none; +} +.pointerCursor { + cursor: pointer; +} +.defaultCursor { + cursor: default; +} +.simulation { + position: relative; + width: auto; + height: 100%; + overflow: hidden; + background-color: 'white'; +} + +#elementName { + position: absolute; + left: 6px; + bottom: 6px; + background-color: white; + z-index: 101; + color: black; + padding: 1px; + border: 0.5px solid black; + display: none; +} + +/* LOADING ICON CSS STARTS*/ +.sk-folding-cube { + margin: 20px auto; + width: 40px; + height: 40px; + position: relative; + -webkit-transform: rotateZ(45deg); + transform: rotateZ(45deg); +} + +.sk-folding-cube .sk-cube { + float: left; + width: 50%; + height: 50%; + position: relative; + -webkit-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} +.sk-folding-cube .sk-cube:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #09f; + -webkit-animation: sk-foldCubeAngle 2.4s infinite linear both; + animation: sk-foldCubeAngle 2.4s infinite linear both; + -webkit-transform-origin: 100% 100%; + -ms-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} +.sk-folding-cube .sk-cube2 { + -webkit-transform: scale(1.1) rotateZ(90deg); + transform: scale(1.1) rotateZ(90deg); +} +.sk-folding-cube .sk-cube3 { + -webkit-transform: scale(1.1) rotateZ(180deg); + transform: scale(1.1) rotateZ(180deg); +} +.sk-folding-cube .sk-cube4 { + -webkit-transform: scale(1.1) rotateZ(270deg); + transform: scale(1.1) rotateZ(270deg); +} +.sk-folding-cube .sk-cube2:before { + -webkit-animation-delay: 0.3s; + animation-delay: 0.3s; +} +.sk-folding-cube .sk-cube3:before { + -webkit-animation-delay: 0.6s; + animation-delay: 0.6s; +} +.sk-folding-cube .sk-cube4:before { + -webkit-animation-delay: 0.9s; + animation-delay: 0.9s; +} +@-webkit-keyframes sk-foldCubeAngle { + 0%, + 10% { + -webkit-transform: perspective(140px) rotateX(-180deg); + transform: perspective(140px) rotateX(-180deg); + opacity: 0; + } + 25%, + 75% { + -webkit-transform: perspective(140px) rotateX(0deg); + transform: perspective(140px) rotateX(0deg); + opacity: 1; + } + 90%, + 100% { + -webkit-transform: perspective(140px) rotateY(180deg); + transform: perspective(140px) rotateY(180deg); + opacity: 0; + } +} + +@keyframes sk-foldCubeAngle { + 0%, + 10% { + -webkit-transform: perspective(140px) rotateX(-180deg); + transform: perspective(140px) rotateX(-180deg); + opacity: 0; + } + 25%, + 75% { + -webkit-transform: perspective(140px) rotateX(0deg); + transform: perspective(140px) rotateX(0deg); + opacity: 1; + } + 90%, + 100% { + -webkit-transform: perspective(140px) rotateY(180deg); + transform: perspective(140px) rotateY(180deg); + opacity: 0; + } +} +/* LOADING ICON CSS ENDS*/ + +#restrictedElementsDiv { + position: absolute; + bottom: 10; + right: 2; + z-index: 100; + width: 215px; + font-size: 14px; + background-color: gainsboro; + border: 1px solid #0d3349; + opacity: 0.1; + padding: 3px 5px; +} + +#restrictedElementsDiv:hover { + opacity: 1; + transition: 0.4s; +} + +.zoom-wrapper { + position: absolute; + bottom: 1px; + right: 0px; + font-size: 10px; + z-index: 100; +} + +.zoom-wrapper button { + opacity: 0.3; +} +.zoom-wrapper button:hover { + opacity: 1; +} + +.embed-fullscreen-btn { + border-radius: 20px; +} diff --git a/v0/src/styles/css/error.css b/v0/src/styles/css/error.css new file mode 100644 index 00000000..cf03badb --- /dev/null +++ b/v0/src/styles/css/error.css @@ -0,0 +1,24 @@ +.error-code { + color: #42b983; + font-family: 'CircuitBoredNF'; + font-size: 142px; +} + +.help-text-main { + color: #1c1c1c; + font-family: 'Segoe UI'; + font-size: 22px; + font-weight: 400; + margin: 0; +} + +.return { + color: #42b983; + display: inline-block; + font-family: 'Segoe UI'; + font-weight: 700; +} + +.return:hover { + color: #42b983; +} diff --git a/v0/src/styles/css/main.stylesheet.css b/v0/src/styles/css/main.stylesheet.css new file mode 100644 index 00000000..b487179b --- /dev/null +++ b/v0/src/styles/css/main.stylesheet.css @@ -0,0 +1,1956 @@ +/* +************ +* This stylesheet is to be made modular later +************ +*/ + +@import './5-layout/simulator.scss'; +@import './2-basics/base.scss'; +@import './2-basics/reset.scss'; +@import './shortcut.panel.css'; +@import './embed.css'; +@import './plugin-stylesheets/checkBo.min.css'; +/** new UI ruleset starts here */ +/*! Adding color variables to root, required later for hokey binding */ + +/* typography */ +@font-face { + font-family: Raleway; + src: url('https://fonts.gstatic.com/s/raleway/v18/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCIPrcVIT9d0c8.woff'); +} + +/* typography */ +@font-face { + font-family: 'Nunito', sans-serif; + src: url('https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,200;1,200&display=swap'); +} + +/** Global Styles starts here */ + +body { + line-height: 1 !important; +} + +body, +html { + font-family: 'Nunito', sans-serif; + font-weight: 200; + width: 100%; + height: 100%; + margin: 0; + padding: 0; + overflow: hidden; + position: fixed; +} + +button:focus { + outline: 0; +} + +a { + color: var(--text-primary); +} + +a:hover { + color: white; + text-decoration: none; +} + +select > option { + color: black; + padding: 2px 4px; + margin-right: 5px; +} + +select:focus, +select > option:focus { + border: none; + outline: none; +} + +input[type='number']:focus { + background-color: transparent; + outline: none; + border: none; + color: white; +} + +table { + border-collapse: collapse; + -webkit-user-select: none; + /* Chrome/Safari */ + -moz-user-select: none; + /* Firefox */ + -ms-user-select: none; + /* IE10+ */ + /* Rules below not implemented in browsers yet */ + -o-user-select: none; + user-select: none; +} + +button { + background: none; + color: inherit; + border: none; + padding: 0; + font: inherit; + cursor: pointer; + outline: inherit; + box-shadow: none; +} + +button:not('.quick-btn button'):active { + background: transparent !important; +} + +button:active, +button:focus { + box-shadow: none !important; + border: none; + outline: none; + /* border-color: white !important; */ +} + +button:focus { + box-shadow: none; +} + +input[type='text']:focus { + background: transparent; + /* color: white; */ +} + +/*! Global styles ends here */ + +.noSelect { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + -o-user-select: none; +} + +.navbar-menu { + position: relative; + transition: all 0.2s ease-in-out; +} + +.navbar-menu > li > a { + border: 1px solid transparent; + border-radius: 1px; + padding: 2px 8px; + transition: all 0.2s ease-in-out; + margin-right: 10px; +} + +.navbar-menu > li > a span, +.acc-caret { + content: ''; + background: url(./assets/small-components/chevron-down.svg) center/cover + no-repeat; + display: inline-block; + height: 5px; + width: 5px; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-66%); + padding: 4px; + margin: 0 5px; + transition: all 0.2s ease-in-out; +} + +.acc-caret { + right: -17px; +} +.navbar-menu > li > a:hover { + border-bottom: 1px solid white; + text-decoration: none; +} + +.navbar-menu > li > a:hover span, +.acc-drop:hover .acc-caret { + background: none; +} + +.projectName { + position: relative; + left: 0.5rem; + font-size: 1em; + text-align: center; + display: inline-block; + width: 35vw; + overflow: hidden; + text-overflow: ellipsis; +} + +@media (max-width: 991px) { + .projectName { + visibility: hidden; + } +} + +.account-btn { + position: absolute; + right: 13px; + padding: 4px 10px; + border: 1px solid transparent; + border-radius: 1px; + transition: all 0.2s ease-in-out; +} + +.account-btn:hover { + border-bottom: 1px solid white; + text-decoration: none; +} + +.user-field { + display: inline-block; + max-width: 11rem; + white-space: nowrap; + text-overflow: ellipsis; + text-align: right; +} + +@media (max-width: 991px) { + .user-field { + visibility: hidden; + } +} + +.signIn-btn { + color: var(--text-primary); +} + +.cur-user, +.signIn-btn { + color: #fff; +} + +.signIn-btn:hover { + color: var(--text-primary); + text-decoration: none; +} + +.logo { + background: url(./assets/logo.svg) center/cover; + height: 30px; + width: 105px; + display: inline-block; + margin-right: 36px; +} + +/* dropdown-menu styles */ + +.dropdown > ul { + border-radius: 5px; + text-align: center; + position: absolute; + left: 50%; + transform: translate(-50%, 13px); +} + +.draggable-panel-css { + border-radius: 5px; + z-index: 70; + transition: background 0.5s ease-out; + position: fixed; +} + +@supports (backdrop-filter: blur()) { + .dropdown > ul { + backdrop-filter: blur(5px); + } +} + +.mw-override { + min-width: 110px; +} + +.dropdown > ul::before { + background-color: transparent; + content: ''; + width: 10px; + display: inline-block; + height: 10px; + position: absolute; + transform: translate(-50%, -13px) rotate(-45deg); +} + +.dropdown > ul::after { + content: ''; + width: 11.5px; + display: inline-block; + height: 10px; + position: absolute; + transform: translate(-50%, -15.5px); + top: 14.5px; +} + +.dropdown-menu > li > a { + padding: 7px 0; + width: 90%; + margin: auto; + transition: all 0.2s ease-in-out; + text-align: left; + padding-left: 10px; +} + +.dropdown-menu > li > a:hover { + border-radius: 7px; + opacity: 1; +} + +@media (max-width: 991px) { + .navbar-nav .dropdown-menu { + position: absolute !important; + float: none; + } +} + +#contextMenu { + width: 150px; + visibility: hidden; + position: fixed; + z-index: 1000; + opacity: 0; + top: 100; + left: 100; + cursor: pointer; + padding-bottom: 7px; + padding-top: 7px; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + border-radius: 5px; +} + +#contextMenu ul { + margin: 0; + padding: 0; +} + +#contextMenu ul li { + list-style: none; + padding: 8px; + padding-left: 20px; + width: 90%; + margin: auto; +} + +#contextMenu ul li:hover { + border-radius: 7px; + opacity: 1; +} + +@supports (backdrop-filter: blur()) { + #contextMenu { + backdrop-filter: blur(5px); + } + #contextMenu ul li:hover { + backdrop-filter: blur(50px); + -webkit-backdrop-filter: blur(50px); + } +} + +/** ce-panel styling starts */ + +.ce-panel { + font: inherit; + width: 240px; + top: 90px; + left: 10px; +} + +.accordion > :last-child { + margin-bottom: 15px; +} + +.draggable-panel-css .panel-header { + border-radius: 5px; + border-top-right-radius: 5px; + padding-top: 15px; + padding: 10px; + padding-top: 15px; + padding-left: 17px; + font-weight: bold; + font-size: 16px; + text-transform: uppercase; + text-align: left; + cursor: move; +} + +.draggable-panel-css .panel-header::before { + content: ''; + width: 34px; + border-radius: 2px; + position: absolute; + left: 50%; + transform: translateX(-50%); + top: 6px; +} + +.draggable-panel-css .panel-body { + padding-top: 10px; +} + +.draggable-panel-css .panel { + padding: 0em; + margin: 0; + border-radius: 0; + margin-bottom: 0em; + display: grid; + grid-template-columns: 1fr 1fr 1fr; + max-height: 185px; + border-radius: 2px; + overflow: auto; +} + +.ui-accordion-header { + background-color: transparent; + margin: 0em; + padding: 0em; + outline: none; +} + +.ui-accordion-header.ui-accordion-header-active.ui-state-active { + outline: none; +} + +.ui-accordion-header.ui-state-hover { + outline: none; +} + +.ui-accordion-header-icon.ui-icon { + display: none; +} + +.accordion { + width: 90%; + margin: auto; + position: relative; +} + +/* expansion panel styles - start */ +.v-expansion-panel { + background-color: transparent; + color: var(--text-panel); +} +.v-expansion-panel--active > .v-expansion-panel-title { + min-height: 48px; +} +.v-expansion-panel-title__overlay { + border-radius: 3px; + outline: none; + background-color: #ededed; + font-weight: 400; +} + +.v-expansion-panel__shadow { + box-shadow: none; +} + +.v-expansion-panel-title { + cursor: pointer; + position: relative; + margin: 2px 0 0; + padding: 0 0.5em 0 0.7em; + font-size: 100%; + font-weight: 400; + line-height: 1.3; +} + +.v-expansion-panel-text { + background-color: var(--text-panel); + color: black; +} +.v-expansion-panel-text__wrapper { + padding: 0; +} +/* expansion panel styles - ends */ + +.panelHeader { + border: none; + border-radius: 0; + transition: all 0.2s ease-in-out; +} + +.panelHeader:hover { + border-radius: 3px; +} + +.panelHeader:after, +.panelHeader:before { + content: ''; + height: 8px; + display: inline-block; + right: 15px; + position: absolute; + border-radius: 5px; + top: 50%; + transform: translateY(-50%) rotate(132deg); + transition: 0.2s ease-out; + background-color: white; +} + +.panelHeader:after { + transform: translate(260%, -50%) rotate(226deg); +} + +.ui-accordion-header-active:before { + transition: 0.2s ease-out; + transform-origin: left; + transform: translate(29%, -40%) rotate(50deg); + top: 46%; +} + +.ui-accordion-header-active:after { + transform-origin: bottom; + transform: translate(420%, -50%) rotate(310deg); + transition: 0.2s ease-out; + top: 46%; +} + +.ui-accordion-header-active:hover { + background-color: transparent; +} + +.ui-accordion .ui-accordion-content { + border: none; + padding: 0; +} + +.icon { + position: relative; + width: 50px; + margin: 5px; + display: inline-block; + text-align: center; + font-size: 8px; +} + +img { + display: none; +} + +div.icon img { + -webkit-user-drag: none; + -khtml-user-drag: none; + -moz-user-drag: none; + -o-user-drag: none; + width: 100%; + display: inline-block; +} + +.custom-tooltip-styling { + box-shadow: none; + border-radius: 3px; + font: inherit; + font-size: 14px; + font-weight: 100; +} + +.icon:hover { + border-radius: 3px; +} + +/*! ce-panel styling ends */ + +/** custom scroll styling starts here */ + +.search-results { + scrollbar-width: thin; /* for firefox */ +} + +.search-results::-webkit-scrollbar { + margin-right: 3px; + width: 6px; +} + +/*! custom scroll styling starts ends here */ + +/*! ce-panel styling ends */ + +/** tab bar styling starts */ + +#tabsBar { + width: 100%; + /* height: 23.5px; */ + display: block; + align-items: center; + z-index: 99; + /* position: absolute; + top: 47px; */ +} + +.embed-tabs { + background-color: transparent !important; +} + +#tabsBar .placeholder { + justify-content: space-between; + padding: 1px; + display: inline-block; + margin: 2px; + text-align: center; + /* min-width: 110px; */ + font-size: 14px; + transition: all 0.2s ease-in-out; +} + +.placeholder::before { + display: inline-block; + padding: 2px 5px; + content: '|'; +} + +#tabsBar .circuits { + justify-content: space-between; + border-radius: 3px; + padding: 1px; + display: inline-flex; + align-items: center; + margin: 2px; + text-align: center; + /* min-width: 110px; */ + font-size: 14px; + transition: all 0.2s ease-in-out; +} + +#tabsBar .circuits > span { + display: inline-block; + padding: 2px 5px; +} + +.circuitName { + cursor: pointer; +} + +#tabsBar button { + order: 99; /* could have better solution */ + width: 20px; + align-items: center; + display: inline; + font-size: 20px; + text-align: center; + padding-bottom: 5px; + text-decoration: none; + outline: none; + border-radius: 1px; + transition: all 0.1s ease-in-out; + border-radius: 4px; + margin-left: 1px; +} + +#tabsBar button:focus { + outline: none !important; + box-shadow: none !important; +} +#tabsBar button:active { + outline: none !important; + box-shadow: none !important; +} + +/*! tab bar styling ends */ +/** Module property styling starts here */ + +.moduleProperty { + font: inherit; + width: 250px; + top: 90px; + right: 10px; +} + +.layoutElementPanel { + width: 220px; + font: inherit; + display: none; + top: 90px; + left: 10px; +} + +.timing-diagram-panel { + border-radius: 5px; + z-index: 70; + transition: background 0.5s ease-out; + position: fixed; + cursor: pointer; + left: 300px; + top: 90px; +} + +.timing-diagram-panel .panel-header { + border-radius: 5px; + border-top-right-radius: 5px; + padding: 3px; + font-weight: bold; + font-size: 16px; + text-transform: uppercase; + text-align: left; + cursor: move; +} + +/* Testbench UI Styling begin */ + +.testbench-manual-panel { + border-radius: 5px; + z-index: 100; + transition: background 0.5s ease-out; + position: fixed; + cursor: pointer; + left: 10px; + top: 470px; +} + +.testbench-manual-panel .panel-header { + border-radius: 5px; + border-top-right-radius: 5px; + padding: 3px; + font-weight: bold; + font-size: 16px; + text-transform: uppercase; + text-align: left; + cursor: move; +} + +.tb-case-arrow { + border: solid var(--text-panel); + border-width: 0 3px 3px 0; + display: inline-block; + padding: 3px; +} + +.tb-case-arrow-right { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); +} + +.tb-case-arrow-left { + transform: rotate(135deg); + -webkit-transform: rotate(135deg); +} + +.testbench-manual-panel .panel-body { + width: 700px; +} + +.testbench-manual-panel b { + font-weight: bold; +} + +.tb-manual-test-data { + /*text-align: center;*/ + margin-top: 10px; + border-bottom: 1px solid var(--br-secondary); + padding-left: 8px; + padding-right: 8px; +} + +.tb-manual-test-data .tb-data { + margin-right: 10px; +} + +.tb-data span { + vertical-align: middle; + display: inline-block; + max-width: 200px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.tb-data#data-title { + float: left; +} + +.tb-data#data-type { + float: right; +} + +.tb-manual-table { + position: relative; + display: inline-block; + margin-top: 10px; + color: var(--text-panel); + max-width: 650px; + overflow-x: auto; + white-space: nowrap; +} + +.tb-manual-table td, +.tb-manual-table th { + padding-left: 15px; + padding-right: 15px; + padding-top: 12px; + padding-bottom: 12px; + text-align: center; + min-width: 80px; +} + +.tb-manual-table th { + background: var(--table-head-dark); + height: 50px; +} + +.testbench-manual-panel-buttons { + position: relative; + display: table-cell; + flex-wrap: wrap; + right: 0px; + text-align: left; + width: 200px; +} + +.testbench-runall-label { + display: none; +} + +.tb-dialog-button { + display: inline; + margin: 8px; + border-radius: 5px !important; + padding-left: 8px !important; + padding-right: 8px !important; + padding-top: 4px !important; + padding-bottom: 4px !important; +} + +.tb-manual-test-buttons { + display: flex; + margin-top: 20px; + margin-left: 30px; + margin-right: 30px; + height: 25px; + overflow: auto; +} + +.tb-manual-test-buttons .tb-case-button-left { + border-bottom-left-radius: 5px; + border-top-left-radius: 5px; + width: 24px; +} + +.tb-manual-test-buttons .tb-case-button-right { + border-bottom-right-radius: 5px; + border-top-right-radius: 5px; + width: 24px; +} + +.tb-manual-test-buttons .tb-test-label { + position: relative; + top: 0px; + line-height: 25px; + height: 25px; + margin: 0px; + padding-left: 2px; + padding-right: 2px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + background: #c4c4c4; + color: black; +} + +.tb-manual-test-buttons .tb-test-label.group-label { + text-align: center; + width: 100px; +} + +.tb-manual-test-buttons .tb-test-label.case-label { + text-align: center; + width: 40px; +} + +.tb-group-buttons { + float: left; +} + +.tb-case-buttons { + float: right; +} + +.tb-test-null { + width: 350px !important; +} + +.validation-ui-table td, +.validation-ui-table th { + padding-left: 15px; + padding-right: 15px; + padding-top: 12px; + padding-bottom: 12px; + text-align: center; + min-width: 80px; + color: white; +} + +/* Testbench UI styling end */ + +#plotArea { + padding: 3px; + width: 100%; +} + +#verilogEditorPanel { + width: 220px; + font: inherit; + display: none; + top: 90px; + right: 300px; +} + +#moduleProperty-toolTip { + padding: 10px; +} + +#moduleProperty-inner { + width: 85%; + margin: auto; +} + +#moduleProperty-header { + font-size: 1.1em; + text-transform: uppercase; + margin-bottom: 20px; + text-align: left; +} + +#moduleProperty-inner > p span { + display: inline-block; + font-weight: bold; +} + +#moduleProperty-inner > div span { + display: inline-block; + font-weight: bold; +} + +#moduleProperty-inner > p button { + border-radius: 2px; + margin: 3px; +} + +#moduleProperty-inner > div button { + border-radius: 2px; + margin: 3px; +} + +#moduleProperty-inner:last-child { + margin-bottom: 15px; +} + +.moduleProperty select { + background-color: transparent; + border: none; + margin-left: 2px; + outline: none; +} + +.moduleProperty input, +.moduleProperty textarea { + background-color: transparent; + margin-top: 7px; + outline: none; + padding: 5px 5px; + width: 100%; +} + +.moduleProperty textarea { + text-align: left; +} + +.moduleProperty select, +.moduleProperty input, +.moduleProperty textarea { + border-radius: 7px !important; +} + +.moduleProperty input:focus, +.moduleProperty select:focus, +.moduleProperty textarea { + outline-width: 0; + outline: none; + box-shadow: none; +} + +.input-group-prepend button { + margin-right: 5px; +} +.input-group-append button { + margin-left: 5px; +} + +.input-group-prepend button:hover { + border-radius: 3px !important; +} +.input-group-append button:hover { + border-radius: 3px !important; +} + +/* toogle */ + +.switch { + position: relative; + width: 43px; + height: 17px; + margin-bottom: 0px; + float: right; +} + +.switch input { + display: none; +} + +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + -webkit-transition: 0.2s all ease; + transition: 0.2s all ease; + border-radius: 25px; + width: 35px; +} + +.slider:before { + position: absolute; + content: ''; + height: 20px; + width: 20px; + left: -3px; + top: 50%; + transform: translateY(-51%); + -webkit-transition: 0.2s all ease-in-out; + transition: 0.2s all ease-in-out; + border-radius: 50%; +} + +input:checked + .slider:before { + transform: translate(21px, -51%); +} + +/** custom button styling */ + +.custom-btn--primary { + border-radius: 1px; +} + +.custom-btn--secondary { + background-color: transparent; + border-radius: 1px; + width: 90%; + display: inline-block; + line-height: inherit; +} + +.custom-btn--secondary:hover { + /* color: white; */ + transition: all 0.3s ease; +} + +.custom-btn--tertiary { + border-radius: 1px; +} +/* Used to force auto width on secondary button */ +.custom-btn--basic { + border-radius: 1px; + border: solid 1px; + background-color: transparent; + display: inline-block; + background: var(--table-head-dark); +} + +.custom-btn--basic:focus { + border: solid 1px; +} + +#HelpButton { + background-color: transparent; + border: 2px solid white; + width: 90%; + margin-bottom: 15px; + margin-top: 15px; + font-weight: bold; +} + +.btn-parent { + width: 100%; + display: flex; + justify-content: center; + margin: 0; +} + +/* custom spin button */ + +/*! Module property styling starts here */ + +/** selects styling starts here */ + +.moduleProperty select { + text-align: center; + width: 81px; + height: 20px; + float: right; + font-size: 17px; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +/*! selects styling end here */ + +/** layout dialog styling starts here */ + +.layout-body { + text-align: center; + padding: 10px; + padding-bottom: 17px; + font-weight: bold; +} + +#layoutDialog { + /* display: none; */ + right: 10px; + top: 90px; + width: 220px; +} + +.layout-title span { + display: block; + font-weight: bold; + margin: 8px; +} + +.layout-title--enable { + display: flex; + justify-content: space-between; + margin: 15px 0; + padding: 0 8px; +} + +.Layout-btn { + width: 48%; + height: 30px; + line-height: inherit; +} + +.zoomButton-up { + /* background: url(./assets/layout-panel/up.svg) center/cover no-repeat; */ + display: inline-block; + height: 35px; + width: 35px; +} +.zoomButton-down { + /* background: url(./assets/layout-panel/down.svg) center/cover no-repeat; */ + display: inline-block; + height: 35px; + width: 35px; +} +.zoomButton-left { + /* background: url(./assets/layout-panel/left.svg) center/cover no-repeat; */ + display: inline-block; + height: 35px; + width: 35px; +} +.zoomButton-right { + /* background: url(./assets/layout-panel/right.svg) center/cover no-repeat; */ + display: inline-block; + height: 35px; + width: 35px; +} + +/*! layout dialog styling ends here */ + +/** download dialog styling starts here */ + +.ui-dialog { + /*this also affects all dialog created using jquery UI, needs to be more universe */ + font: inherit; + border-radius: 5px; + width: 600px; + height: 320px; + padding: 10px 17px; + padding-bottom: 0; + /* border: none !important; */ +} + +@supports (backdrop-filter: blur()) { + .ui-dialog { + backdrop-filter: blur(5px); + } +} + +.ui-widget-header { + background: transparent; + border: none; + border-radius: 0; +} + +.option { + display: inline-flex; + border-radius: 7px; + align-items: center; + justify-content: space-around; + padding: 0 7px; + position: relative; + cursor: pointer; + margin: 2px 3px; +} + +.option input[type='radio'] { + visibility: hidden; +} + +.download-dialog-section-2 .btn { + color: var(--text-lite); +} +.download-dialog-section-2 .btn:hover { + color: var(--text-lite); +} + +.download-dialog-section-2 .option { + background: transparent; +} + +.custom-radio span { + height: 20px; + width: 20px; + border-radius: 50%; + display: block; + position: absolute; + left: 2px; + top: 50%; + transform: translateY(-50%); +} + +.custom-radio span:after { + content: ''; + height: 8px; + width: 8px; + border-radius: 50%; + display: block; + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%) scale(0); + transition: 300ms ease-in-out 0s; +} + +.custom-radio input[type='radio']:checked ~ span:after { + transform: translate(-50%, -50%) scale(1); +} + +#saveImageDialog { + border-radius: 2px; + padding: 13px; + margin: 0; + margin-top: 15px; + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + min-height: 188px !important; +} + +.download-dialog-section-2 .option { + padding: 0; +} + +.download-dialog-section-1 > label { + height: 30px; + width: 85px; +} + +.download-dialog-section-2 { + background: transparent; + width: 100%; + display: inline-flex; + justify-content: space-around; +} + +.btn-group-toggle { + background-color: transparent; + overflow: hidden; +} +.download-dialog-section-2 .active-btn { + box-shadow: none; +} + +.download-dialog-section-2 .btn input[type='radio']:disabled { + background: red !important; + color: red !important; +} + +.download-dialog-section-2_2 { + display: flex; + align-items: center; + justify-content: center; +} + +.download-dialog-section-3 { + border-radius: 2px; + display: flex; + justify-content: space-between; + align-items: center; + padding: 6px 10px; + width: 320px; + position: inherit; +} + +.download-dialog-section-3 > label { + width: 60px; + height: 25px; + margin-bottom: 0; +} + +.ui-dialog-buttonpane { + background: transparent; +} + +.ui-dialog .ui-dialog-titlebar { + padding: 0; + padding-bottom: 8px; + font: inherit; + line-height: inherit; + font-weight: bold; +} + +.ui-dialog-titlebar-close { + border: none; + color: white; + position: absolute; + top: 15px; + right: 15px; + visibility: hidden; +} + +.ui-dialog-titlebar-close::after { + content: ''; + display: block; + position: absolute; + background: url(./assets/small-components/close.svg) center/cover no-repeat; + height: 15px; + width: 15px; + visibility: visible; + right: 0; + top: 0; +} + +.ui-dialog-titlebar-close::hover { + border: none; +} + +.ui-dialog .ui-dialog-buttonpane { + border: none; + padding: 0; + margin: 0; + display: flex; + justify-content: center; + align-items: center; + margin: 12px; +} + +.ui-dialog .ui-dialog-buttonpane button { + background: transparent; + color: white; + line-height: inherit; + border-radius: 1px; + font: inherit; +} + +.ui-dialog .ui-dialog-buttonpane button:hover { + transition: all 0.3s ease; + border: 1px solid transparent; +} + +.render-btn { + height: 35px; + border-radius: 1px; +} +.navbar { + transition: background 0.5s ease-out; +} + +.navbar .nav.pull-right { + float: right; + margin-right: 10px; + min-width: 85px; +} + +@media (max-width: 991px) { + .navbar .nav.pull-right { + display: none; + } +} + +@media (max-width: 991px) { + .nav-dropdown { + text-align: center; + padding-top: 20px; + } +} + +/*! download dialog styling end here */ + +/** combinationalAnalysis dialog styling starts here */ + +.ui-dialog[aria-describedby='combinationalAnalysis'] { + width: 460px; + min-height: 210px; + border: none; +} + +#combinationalAnalysis { + margin-top: 10px; +} + +#combinationalAnalysis p input { + border: 1px solid white; + background: transparent; + font: inherit; + text-align: center; +} + +.ui-dialog input::placeholder { + /* Chrome, Firefox, Opera, Safari 10.1+ */ + color: white; + opacity: 0.7; /* Firefox */ +} + +#combinationalAnalysis table { + width: 460px; +} + +#booleanTable { + width: 200px; +} + +.content-table { + border-collapse: collapse; + font-size: 0.9em; + min-width: 400px; +} + +.content-table tr th { + font-weight: bold; +} + +.content-table th, +.content-table td { + padding: 5px 15px; + margin: 0 3px; + width: 20%; + border-radius: 2px; +} + +.content-table tbody tr { + text-align: center; + display: flex; + margin-bottom: 4px; +} + +.content-table tbody { + display: table-row-group; + overflow: auto !important; + margin-left: 52px; +} + +.output { + cursor: pointer; +} + +/*! combinationalAnalysis dialog styling end here */ + +#setTestbenchData input { + border: 1px solid white; + background: transparent; + text-align: center; + font: inherit; + color: white; +} + +#setTestbenchData p { + font: inherit; + color: white; +} + +/** openProjectDialog styling starts here */ + +#openProjectDialog { + display: grid; + /* grid-template-columns: 1fr 1fr 1fr; */ + /* grid-gap: 0 10px; */ + align-items: center; +} + +#openProjectDialog > label { + margin: 4px; + padding: 10px; + background: transparent; + border-radius: 1px; + width: 100%; +} + +/*! openProjectDialog styling ends here */ + +#insertSubcircuitDialog { + display: block; + padding-bottom: 0; + overflow: visible; +} + +#insertSubcircuitDialog > p { + margin-bottom: 0; +} + +#insertSubcircuitDialog > label { + height: 30px; + border-radius: 3px; + margin: 0 5px; + margin-bottom: 4px; + justify-content: center; + padding-left: 10px; +} + +#miniMap { + position: fixed; + z-index: 3; + bottom: 20px; + right: 40px; + overflow-y: scroll; + opacity: 0.5; + overflow: hidden; + border: none; +} + +.disable::after { + content: ''; + position: absolute; + height: 100%; + width: 100%; + cursor: not-allowed; + left: 0; +} + +.ui-dialog .ui-dialog-buttonpane button { + margin-left: 0.4em; +} + +.ui-dialog-titlebar-close:hover { + border: none; +} + +.radio-green { + background: #42b983; +} + +.search-input { + margin: 0 10px; + padding: 3px 10px; + width: 90%; + border-radius: 13px; + margin-bottom: 10px; + background: transparent !important; +} + +.search-input:focus { + outline: none !important; +} + +.search-close { + position: absolute; + right: 19px; + top: 6px; + cursor: pointer; +} + +.search-results { + padding: 15px; + transition: all 0.5s ease; + max-height: 340px; + overflow-y: scroll; + padding-right: 0; +} + +.search-results div { + border-radius: 3px; +} + +.draggable-panel-css .minimize { + position: absolute; + right: 15px; + cursor: pointer; +} + +.panel-button-icon { + cursor: pointer; +} + +.panel-button { + cursor: pointer; + padding: 2px; +} + +.draggable-panel-css .maximize { + position: absolute; + right: 15px; + cursor: pointer; + display: none; +} + +.ce-hidden, +.prop-hidden { + font-weight: bold; + padding: 10px; + font-size: 16px; + text-transform: uppercase; + border-radius: 5px; +} + +.largeButton.btn { + width: 100%; + margin-bottom: 5px; + margin-left: 0 !important; +} + +.objectPropertyAttributeChecked { + margin-left: 0 !important; +} + +#exitViewBtn { + position: fixed; + z-index: 1000000000; + right: 2%; + top: 3%; + box-shadow: 0px 0px 10Xpx #4545457f; + padding: 10px 15px; + border-radius: 5px; +} + +.ce-hidden, +.prop-hidden { + cursor: move; +} + +#canvasArea, +#backgroundArea, +#simulationArea, +canvas { + /* cursor: wait !important; */ +} + +/** Color them dialog styles starts here*/ + +.ui-dialog[aria-describedby='colorThemesDialog'] { + min-width: 760px; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.colorThemesDialog { + height: 390px !important; + display: grid; + grid-template-columns: 1fr 1fr 1fr; + overflow-y: auto; + margin-top: 10px; + border: 1px solid white !important; +} + +.colorThemesDialog input { + margin: 15px; +} + +.colorThemesDialog label { + margin-bottom: 0; +} + +.theme { + color: white; + width: 202.5px; + line-height: 30px; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + margin: 15px; + border-radius: 1.5px; + transition: all 0.1s ease-out; + position: relative; + overflow-x: hidden; + height: 154px; +} + +.themeNameBox { + display: block; + width: 100%; + cursor: pointer; +} + +.themeSel { + background: transparent; + display: block; + width: 100%; + height: 100%; + position: absolute; +} + +/*! Color them dialog styles ends here*/ + +/*! Custom Color theme dialog styles starts here*/ + +.ui-dialog[aria-describedby='CustomColorThemesDialog'] { + min-width: 760px; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +#CustomColorThemesDialog { + height: 400px !important; + background: none; + overflow: auto; +} + +#CustomColorThemesDialog label { + color: var(--text-panel); + width: 60%; + height: 30px; +} + +#CustomColorThemesDialog input { + cursor: pointer; + width: 30%; + height: 30px; +} + +/*! Custom Color theme dialog styles ends here*/ + +.code-window .CodeMirror { + height: calc(100vh - 78px); + overflow: scroll; +} + +.code-window-embed .CodeMirror { + height: 100%; + overflow: scroll; +} + +.code-window-embed { + position: absolute; + top: 28px; + height: 100%; + width: 100%; + overflow: scroll; + z-index: 3; + display: none; +} + +.code-window { + display: none; +} + +#verilogOutput { + font-size: 12px; +} + +.embed-fullscreen-btn { + border-radius: 3px; + width: auto; +} + +#plot { + width: 800px; +} + +.timing-diagram-toolbar { + padding-left: 4px; + padding: 2px; + cursor: default; +} + +.timing-diagram-toolbar input { + width: 80px; + background: transparent !important; +} + +#timing-diagram-log { + font-size: 12.5px; + padding: 3px; + margin-left: 5px; + /* margin-bottom: 5px; */ + border-radius: 3px; +} + +/* CustomColorInput Styles Starts Here */ +.customColorInput { + cursor: pointer; + width: 30%; + height: 30px; + overflow: visible; + position: relative; + top: 8px; + appearance: auto; + background-color: buttonface; + color: buttontext; + border-width: 1px; + border-style: solid; + border-color: buttonborder; + border-image: initial; + padding: 1px 2px; +} +.customColorLabel { + width: 60%; + height: 30px; +} + +/* Vue Dialog Box Styles STARTS */ + +.inputField { + width: 100%; + padding: 10px 10px; + margin: 8px 0; + box-sizing: border-box; + border-radius: 5px; + border: 1px solid #c5c5c5; + color: white; + outline: none; +} + +.cAinput { + width: 30%; + padding: 0 5px; + margin: 8px 0; + box-sizing: border-box; + border-radius: 5px; + border: 1px solid #c5c5c5; + color: white; + outline: none; +} + +.combinationalAnalysisInput:first-child { + padding-top: 20px; +} + +.combinationalAnalysisInput { + display: flex; + flex-direction: row; + justify-content: space-evenly; + align-items: baseline; +} + +.inputField:focus { + border: 2px solid #c5c5c5; +} + +.v-card-actions { + width: fit-content; + display: flex; + flex-direction: row; + justify-content: center; + margin: auto; +} + +.v-input__details { + margin-bottom: 0.5rem; +} + +/* +.ProseMirror ul { + list-style-type: disc; +} + +.ProseMirror ol { + list-style-type: decimal; +} */ + +.ProseMirror { + height: 12rem; + overflow-y: auto; + padding-left: 0.5em; + padding-right: 0.5em; + outline: none; +} + +.fullscreen .ProseMirror { + height: 75vh; +} + +/* .ProseMirror ul, +.ProseMirror ol, +.ProseMirror li { + margin: 0; + padding: 0; + list-style: inherit; +} */ + +.messageBoxContent { + height: auto; + width: 760px; + justify-content: center; + margin: auto; + backdrop-filter: blur(5px); + border-radius: 5px; + border: 0.5px solid var(--br-primary) !important; + background: var(--bg-primary-moz) !important; + background-color: var(--bg-primary-chr) !important; + color: white; +} + +/* media query for .messageBoxContent */ +@media screen and (max-width: 991px) { + .messageBoxContent { + width: 100%; + } +} + +.tabsbarInput { + align-items: center; +} + +.messageBtn { + width: fit-content; + min-width: 50px; + border: 1px solid #c5c5c5; + padding: 5px 5px; +} + +.messageBtn:hover { + background: #c5c5c5; + color: black; +} + +.dialogHeader { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + margin-bottom: 10px; +} +.dialogClose { + position: absolute; + top: 5px; + right: 5px; + color: white; + background: none; + font-size: x-small; + box-shadow: none; +} +.dialogClose:hover { + font-weight: bold; + background: white; + opacity: 0.5; + color: black; +} + +.dialogHeader { + font-weight: bold; + margin-bottom: 25px; +} + +.downloadCheckbox { + width: 5px; + height: 5px; +} +/* STYLE ENDS */ diff --git a/v0/src/styles/css/plugin-stylesheets/checkBo.min.css b/v0/src/styles/css/plugin-stylesheets/checkBo.min.css new file mode 100644 index 00000000..199f3c9b --- /dev/null +++ b/v0/src/styles/css/plugin-stylesheets/checkBo.min.css @@ -0,0 +1,386 @@ +/* + * checkBo lightweight jQuery plugin v0.1.4 by @ElmahdiMahmoud + * Licensed under the MIT license - https://github.com/elmahdim/checkbo/blob/master/LICENSE + * + * Custom checkbox and radio + * Author URL: elmahdim.com + */ + +.cb-checkbox .cb-inner, +.cb-checkbox i { + width: 18px; + height: 18px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +.cb-checkbox.cb-sm .cb-inner, +.cb-checkbox.cb-sm i { + width: 14px; + height: 14px; +} +.cb-checkbox.cb-md .cb-inner, +.cb-checkbox.cb-md i { + width: 24px; + height: 24px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; +} +.cb-checkbox.cb-lg .cb-inner, +.cb-checkbox.cb-lg i { + width: 30px; + height: 30px; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + border-radius: 6px; +} +.cb-radio .cb-inner { + width: 18px; + height: 18px; +} +.cb-radio.cb-sm .cb-inner { + width: 14px; + height: 14px; +} +.cb-radio.cb-md .cb-inner { + width: 24px; + height: 24px; +} +.cb-radio.cb-lg .cb-inner { + width: 30px; + height: 30px; +} +.cb-checkbox, +.cb-radio { + padding: 3px 0; + color: inherit; + cursor: pointer; + overflow: hidden; + font-size: inherit; + font-weight: 400; + display: inline-block; + line-height: 18px; +} +.cb-checkbox input[type='checkbox'], +.cb-radio input[type='radio'], +.cb-switcher input[type='checkbox'], +.cb-switcher input[type='radio'] { + /* display: none; */ +} +.cb-checkbox.disabled, +.cb-checkbox.disabled *, +.cb-radio.disabled, +.cb-radio.disabled *, +.cb-switcher.disabled, +.cb-switcher.disabled * { + cursor: default; +} +.cb-checkbox.disabled, +.cb-checkbox.disabled .cb-inner { + color: #ddd; +} +.cb-checkbox.disabled:hover .cb-inner { + border-color: #ddd; +} +.cb-checkbox.disabled.checked .cb-inner { + background-color: #ddd; + border-color: #ddd; +} +.cb-radio.disabled { + color: #ddd; +} +.cb-radio.disabled .cb-inner { + border-color: #ddd; +} +.cb-radio.disabled i { + background-color: transparent; +} +.cb-radio.disabled.checked .cb-inner { + border-color: #ddd; +} +.cb-radio.disabled.checked .cb-inner i { + background-color: #ddd; +} +.cb-radio.disabled:hover .cb-inner { + border-color: #ddd; +} +.cb-checkbox .cb-inner { + float: left; + overflow: hidden; + margin: 0 5px 0 0; + position: relative; + background: transparent; + display: inline-block; + border: 1px solid #d6d6d6; + /* -moz-transition: all 0.5s ease; + -o-transition: all 0.5s ease; + -webkit-transition: all 0.5s ease; + transition: all 0.5s ease; */ +} +.cb-checkbox i { + top: 1px; + left: 2px; + display: block; + position: absolute; +} +.cb-checkbox i:after, +.cb-checkbox i:before { + height: 0; + width: 2px; + content: ''; + display: block; + position: absolute; + background-color: #fff; + /* -moz-transition: all 0.2s ease; + -o-transition: all 0.2s ease; + -webkit-transition: all 0.2s ease; + transition: all 0.2s ease; */ +} +.cb-checkbox i:before { + top: 0; + left: 0; + -moz-transform: rotate(-45deg); + -ms-transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); +} +.cb-checkbox i:after { + left: 7px; + bottom: 5px; + /* -moz-transition-delay: 0.3s; + -o-transition-delay: 0.3s; + -webkit-transition-delay: 0.3s; + transition-delay: 0.3s; */ + -moz-transform: rotate(30deg); + -ms-transform: rotate(30deg); + -webkit-transform: rotate(30deg); + transform: rotate(30deg); +} +.cb-radio .cb-inner { + float: left; + overflow: hidden; + margin: 0 5px 0 0; + position: relative; + display: inline-block; + border: 1px solid #d7d7d7; + background-color: transparent; + -moz-border-radius: 100%; + -webkit-border-radius: 100%; + border-radius: 100%; + -moz-transition: all 0.1s ease; + -o-transition: all 0.1s ease; + -webkit-transition: all 0.1s ease; + transition: all 0.1s ease; +} +.cb-radio i { + top: 50%; + left: 50%; + width: 6px; + height: 6px; + margin-top: -3px; + margin-left: -3px; + position: absolute; + background-color: transparent; + -moz-border-radius: 100%; + -webkit-border-radius: 100%; + border-radius: 100%; + -moz-transform: scale(0.05, 5); + -ms-transform: scale(0.05, 5); + -webkit-transform: scale(0.05, 5); + transform: scale(0.05, 5); + -moz-transition: all 0.2s ease; + -o-transition: all 0.2s ease; + -webkit-transition: all 0.2s ease; + transition: all 0.2s ease; +} +.cb-checkbox.cb-sm, +.cb-radio.cb-sm { + line-height: 14px; +} +.cb-checkbox.cb-md, +.cb-radio.cb-md { + line-height: 24px; +} +.cb-checkbox.cb-lg, +.cb-radio.cb-lg { + line-height: 30px; +} +.cb-checkbox.cb-sm i:before { + top: 4px; + left: 1px; +} +.cb-checkbox.cb-sm i:after { + left: 5px; +} +.cb-checkbox.cb-md i:before { + top: 10px; + left: 5px; +} +.cb-checkbox.cb-md i:after { + bottom: 6px; + left: 11px; +} +.cb-checkbox.checked .cb-inner { + border-color: transparent; + background-color: transparent; +} +.cb-checkbox.checked.cb-sm i:before { + top: 4px; + left: 1px; +} +.cb-checkbox.checked.cb-sm i:after { + height: 9px; +} +.cb-checkbox.checked.cb-md i:before { + top: 10px; + left: 4px; + height: 8px; +} +.cb-checkbox.checked.cb-md i:after { + bottom: 6px; + left: 11px; + height: 16px; +} +.cb-checkbox.checked.cb-lg i:before { + top: 11px; + left: 6px; + height: 12px; +} +.cb-checkbox.checked.cb-lg i:after { + left: 14px; + bottom: 7px; + height: 20px; +} +.cb-checkbox.checked i:before { + top: 6px; + left: 2px; + height: 6px; +} +.cb-checkbox.checked i:after { + height: 12px; +} +.cb-radio.checked .cb-inner { + background: #fff; + box-shadow: 0 0 3px #efefef; +} +.cb-radio.checked i { + -moz-transform: scale(1.1, 1.1); + -ms-transform: scale(1.1, 1.1); + -webkit-transform: scale(1.1, 1.1); + transform: scale(1.1, 1.1); + background-color: transparent; +} +.cb-checkbox:hover .cb-inner, +.cb-radio:hover .cb-inner { + border-color: white; +} +.cb-switcher { + display: inline-block; + border: 1px solid #eee; + background-color: #fff; + width: 95px; + height: 35px; + position: relative; + -moz-border-radius: 20px; + -webkit-border-radius: 20px; + border-radius: 20px; + -moz-transition: background 0.4s ease; + -o-transition: background 0.4s ease; + -webkit-transition: background 0.4s ease; + transition: background 0.4s ease; +} +.cb-switcher, +.cb-switcher * { + cursor: pointer; +} +.cb-switcher ::-moz-selection { + background-color: transparent; +} +.cb-switcher ::selection { + background-color: transparent; +} +.cb-switcher .cb-state { + z-index: 1; + text-align: center; + font-size: 12px; +} +.cb-switcher .cb-state, +.cb-switcher:before { + width: 34px; + height: 34px; + line-height: 34px; + position: absolute; + left: 0; + top: -1px; + -moz-border-radius: 100%; + -webkit-border-radius: 100%; + border-radius: 100%; + -moz-transition: all 0.4s ease; + -o-transition: all 0.4s ease; + -webkit-transition: all 0.4s ease; + transition: all 0.4s ease; +} +.cb-switcher:before { + content: ''; + background-color: #eee; + -moz-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + -webkit-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); +} +.cb-switcher.checked { + background-color: transparent; +} +.cb-switcher.checked .cb-state, +.cb-switcher.checked:before { + left: 60px; + color: transparent; +} +.cb-switcher.checked:before { + background-color: #fff; + -moz-box-shadow: -1px 1px 1px rgba(0, 0, 0, 0.1); + -webkit-box-shadow: -1px 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: -1px 1px 1px rgba(0, 0, 0, 0.1); +} +.cb-switcher.checked .inner-switcher:before { + border-top-color: transparent; +} +.cb-switcher.checked .inner-switcher:after { + border-bottom-color: transparent; +} +.cb-switcher .inner-switcher:after, +.cb-switcher .inner-switcher:before { + content: ''; + position: absolute; + left: 50%; + width: 0; + height: 0; + z-index: 2; + margin-left: -20px; + border-left: 20px solid transparent; + border-right: 20px solid transparent; + -moz-transition: border 0.4s ease; + -o-transition: border 0.4s ease; + -webkit-transition: border 0.4s ease; + transition: border 0.4s ease; +} +.cb-switcher .inner-switcher:before { + border-top: 17px solid #fff; + top: 0; +} +.cb-switcher .inner-switcher:after { + border-bottom: 17px solid #fff; + bottom: 0; +} +.cb-state { + color: #ccc; + display: inline-block; +} +.cb-switcher-group .cb-state { + position: relative; + top: 7px; +} +.is-hidden { + display: none !important; + visibility: hidden !important; +} diff --git a/v0/src/styles/css/restrictedElements.css b/v0/src/styles/css/restrictedElements.css new file mode 100644 index 00000000..68c21493 --- /dev/null +++ b/v0/src/styles/css/restrictedElements.css @@ -0,0 +1,20 @@ +.display--none { + display: none; +} + +.circuit-element-category { + border-bottom: 1px solid #026e57; + font-weight: 500; + margin: 20px 0 5px; + padding-bottom: 5px; +} + +.restricted-elements-list { + margin: 10px 0 25px; +} + +.form-check-label { + font-size: 16px; + margin-bottom: 6px; + margin-top: 6px; +} diff --git a/v0/src/styles/css/shortcut.panel.css b/v0/src/styles/css/shortcut.panel.css new file mode 100644 index 00000000..a2be4f72 --- /dev/null +++ b/v0/src/styles/css/shortcut.panel.css @@ -0,0 +1,146 @@ +.ui-dialog[aria-describedby='customShortcutDialog'] { + min-width: 680px; +} + +#edit { + display: none; + position: absolute; + width: 490px; + height: 150px; + background: #2d302e; + border-radius: 5px; + z-index: 10000; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + animation: none; +} + +#edit > span { + margin-top: 10px; + position: absolute; + text-align: center; + width: 100%; +} + +#pressedKeys { + text-align: center; + position: absolute; + top: 50%; + width: 100%; +} + +#warning { + position: absolute; + bottom: 5px; + width: 100%; + text-align: center; + font-size: 14px; + color: #dc5656; +} + +#customShortcutDialog { + align-items: center; + color: white; + flex-direction: column; + max-height: 430px !important; + overflow: hidden !important; +} + +#closeDialog { + font-size: 25px; + color: white; + transform: rotate(45deg); + position: absolute; + top: 0%; + right: 2%; + cursor: pointer; + user-select: none; + -moz-user-select: none; +} + +#dialogTitle { + position: absolute; + top: 2%; + left: 3%; + user-select: none; + -moz-user-select: none; +} + +#heading { + display: flex; + justify-content: space-between; + align-items: center; + font-weight: bold; + width: 100%; + height: 35px; + user-select: none; + padding-bottom: 10px; +} + +#heading > span { + padding: 0 20px; +} + +#preference { + max-width: 600px; + height: 350px; + overflow-y: auto; +} + +#preference div { + display: inline-flex; + justify-content: space-between; + align-items: center; + height: 35px; + cursor: pointer; + user-select: none; + -moz-user-select: none; + width: 100%; + padding-left: 5px; + padding-right: 7px; +} + +/* #preference div:not('#edit-icon') > span { + padding: 0 30px; +} */ + +#preference > div:hover { + background-color: #7474743f; +} + +#preference > div:hover span { + visibility: visible; +} + +#edit-icon { + background: url(../../assets/img/edit_icon.png) no-repeat; + background-size: 15px 15px; + display: inline-block; + visibility: hidden; + width: 15px; + height: 15px; +} + +@keyframes shake { + 10%, + 90% { + transform: translate(-50.5%, -50%); + } + + 20%, + 80% { + transform: translate(-49.5%, -50%); + } + + 30%, + 50%, + 70% { + transform: translate(-50.5%, -50%); + } + + 40%, + 60% { + transform: translate(-49.5%, -50%); + } +} diff --git a/v0/src/styles/css/testCreator.css b/v0/src/styles/css/testCreator.css new file mode 100644 index 00000000..47877b3c --- /dev/null +++ b/v0/src/styles/css/testCreator.css @@ -0,0 +1,141 @@ +.tb-test-title { + text-align: center; + margin-top: 50px; +} + +.lower-button { + height: 40px; + width: auto; + min-width: 40px; + background-color: #ffffff; + border: 2px solid black; + color: black; + /*padding: 20px;*/ + text-align: center; + text-decoration: none; + display: inline-block; + /*font-size: 16px;*/ + margin: 4px 2px; + border-radius: 4px; +} + +.table-button { + height: 20px; + width: 20px; + background-color: #ffffff; + border: 2px solid black; + color: black; + text-decoration: none; + display: inline-block; + margin: 4px 4px; + padding: 0px; + border-radius: 5px; +} + +.plus-button { + font-size: 25px; +} + +.tb-minus { + color: red; +} + +.save-buton { + background-color: #42b983; + color: white; + border: 1px solid gray; + min-width: 70px; +} + +.latest-button { + float: left; +} + +.buttons-alignment { + display: flex; + flex-direction: row; + align-items: flex-start; +} + +.tablink { + background-color: #555; + color: white; + float: left; + border: 1px solid white; + border-radius: 5px; + outline: none; + cursor: pointer; + padding: 14px 16px; + font-size: 17px; + width: 50%; +} + +/* Change background color of buttons on hover */ +.tablink:hover.tablink-no-override { + background-color: #a5dfc5; +} + +.tablink-hover-override { +} + +.tablink.tab-selected { + background-color: #42b983; + color: #fff; + outline: none; +} + +.data-group { + margin-top: 2%; +} + +.tb-table { + table-layout: fixed; + width: 100%; + height: 20px; + border-spacing: 5px; +} + +.tb-table th, +td { + border: 2px solid black; + border-collapse: collapse; + padding: 15px; + text-align: center; + transition: transform 0.2s; +} + +.tb-table th { + text-align: center; +} + +.tb-table tr th:first-child, +tr td:first-child { + width: 250px; +} + +.label-table { + margin-top: 100px; +} + +.test-title { + display: flex; + width: 100%; + font-size: 25px; + margin-top: 20px; + margin-bottom: 10px; +} + +.test-title #test-title-label { + width: 80%; + border: 1px solid; + border-radius: 5px; +} + +.tb-handle { + padding: 0px !important; + border: 0px !important; +} + +body { + overflow: scroll; +} diff --git a/v0/src/styles/css/typeahead.min.css b/v0/src/styles/css/typeahead.min.css new file mode 100644 index 00000000..01891f6d --- /dev/null +++ b/v0/src/styles/css/typeahead.min.css @@ -0,0 +1,186 @@ +.has-warning .twitter-typeahead .tt-hint, +.has-warning .twitter-typeahead .tt-input { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .twitter-typeahead .tt-hint:focus, +.has-warning .twitter-typeahead .tt-input:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; +} +.has-error .twitter-typeahead .tt-hint, +.has-error .twitter-typeahead .tt-input { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .twitter-typeahead .tt-hint:focus, +.has-error .twitter-typeahead .tt-input:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} +.has-success .twitter-typeahead .tt-hint, +.has-success .twitter-typeahead .tt-input { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .twitter-typeahead .tt-hint:focus, +.has-success .twitter-typeahead .tt-input:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; +} +.input-group .twitter-typeahead:first-child .tt-hint, +.input-group .twitter-typeahead:first-child .tt-input { + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; + width: 100%; +} +.input-group .twitter-typeahead:last-child .tt-hint, +.input-group .twitter-typeahead:last-child .tt-input { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; + width: 100%; +} +.input-group.input-group-sm .twitter-typeahead .tt-hint, +.input-group.input-group-sm .twitter-typeahead .tt-input { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group.input-group-sm .twitter-typeahead .tt-hint, +select.input-group.input-group-sm .twitter-typeahead .tt-input { + height: 30px; + line-height: 30px; +} +select[multiple].input-group.input-group-sm .twitter-typeahead .tt-hint, +select[multiple].input-group.input-group-sm .twitter-typeahead .tt-input, +textarea.input-group.input-group-sm .twitter-typeahead .tt-hint, +textarea.input-group.input-group-sm .twitter-typeahead .tt-input { + height: auto; +} +.input-group.input-group-sm + .twitter-typeahead:not(:first-child):not(:last-child) + .tt-hint, +.input-group.input-group-sm + .twitter-typeahead:not(:first-child):not(:last-child) + .tt-input { + border-radius: 0; +} +.input-group.input-group-sm .twitter-typeahead:first-child .tt-hint, +.input-group.input-group-sm .twitter-typeahead:first-child .tt-input { + border-radius: 3px 0 0 3px; +} +.input-group.input-group-sm .twitter-typeahead:last-child .tt-hint, +.input-group.input-group-sm .twitter-typeahead:last-child .tt-input { + border-radius: 0 3px 3px 0; +} +.input-group.input-group-lg .twitter-typeahead .tt-hint, +.input-group.input-group-lg .twitter-typeahead .tt-input { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} +select.input-group.input-group-lg .twitter-typeahead .tt-hint, +select.input-group.input-group-lg .twitter-typeahead .tt-input { + height: 46px; + line-height: 46px; +} +select[multiple].input-group.input-group-lg .twitter-typeahead .tt-hint, +select[multiple].input-group.input-group-lg .twitter-typeahead .tt-input, +textarea.input-group.input-group-lg .twitter-typeahead .tt-hint, +textarea.input-group.input-group-lg .twitter-typeahead .tt-input { + height: auto; +} +.input-group.input-group-lg + .twitter-typeahead:not(:first-child):not(:last-child) + .tt-hint, +.input-group.input-group-lg + .twitter-typeahead:not(:first-child):not(:last-child) + .tt-input { + border-radius: 0; +} +.input-group.input-group-lg .twitter-typeahead:first-child .tt-hint, +.input-group.input-group-lg .twitter-typeahead:first-child .tt-input { + border-radius: 6px 0 0 6px; +} +.input-group.input-group-lg .twitter-typeahead:last-child .tt-hint, +.input-group.input-group-lg .twitter-typeahead:last-child .tt-input { + border-radius: 0 6px 6px 0; +} +.twitter-typeahead { + width: 100%; + float: left; +} +.input-group .twitter-typeahead { + display: table-cell !important; +} +.twitter-typeahead .tt-hint { + color: #999; +} +.twitter-typeahead .tt-input { + z-index: 2; +} +.twitter-typeahead .tt-input[disabled], +.twitter-typeahead .tt-input[readonly], +fieldset[disabled] .twitter-typeahead .tt-input { + cursor: not-allowed; + background-color: #eee !important; +} +.tt-dropdown-menu, +.tt-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + min-width: 160px; + width: 100%; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 14px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; +} +.tt-dropdown-menu .tt-suggestion, +.tt-menu .tt-suggestion { + display: block; + padding: 3px 20px; + clear: both; + font-weight: 400; + line-height: 1.42857143; + color: #333; +} +.tt-dropdown-menu .tt-suggestion.tt-cursor, +.tt-dropdown-menu .tt-suggestion:hover, +.tt-menu .tt-suggestion.tt-cursor, +.tt-menu .tt-suggestion:hover { + cursor: pointer; + text-decoration: none; + outline: 0; + background-color: #f5f5f5; + color: #262626; +} +.tt-dropdown-menu .tt-suggestion.tt-cursor a, +.tt-dropdown-menu .tt-suggestion:hover a, +.tt-menu .tt-suggestion.tt-cursor a, +.tt-menu .tt-suggestion:hover a { + color: #262626; +} +.tt-dropdown-menu .tt-suggestion p, +.tt-menu .tt-suggestion p { + margin: 0; +} diff --git a/v0/src/styles/simulator.scss b/v0/src/styles/simulator.scss new file mode 100644 index 00000000..af0fe667 --- /dev/null +++ b/v0/src/styles/simulator.scss @@ -0,0 +1,39 @@ +$fa-font-path: '../../node_modules/@fortawesome/fontawesome-free/webfonts'; +@import '../../node_modules/@fortawesome/fontawesome-free/scss/fontawesome.scss'; +@import '../../node_modules/@fortawesome/fontawesome-free/scss/solid.scss'; + +.subcircuitdialog { + display: none; + overflow-x: hidden; + overflow-y: auto; +} + +.side { + width: 330px; + max-width: 500px; + min-width: 200px; + overflow-x: hidden; + overflow-y: scroll; +} + +.report-sidebar a { + color: #fff; + font-size: 13px; + padding: 10px; + position: fixed; + right: -119px; + text-decoration: none; + bottom: 30px; + transition: 0.3s; + width: 160px; + z-index: 999; +} + +.report-sidebar span { + font-size: 1.2em; + padding-right: 20px; +} + +.report-sidebar a:hover { + right: 0; +} diff --git a/v0/src/styles/tutorials.scss b/v0/src/styles/tutorials.scss new file mode 100644 index 00000000..59c4db7b --- /dev/null +++ b/v0/src/styles/tutorials.scss @@ -0,0 +1,52 @@ +@import '/node_modules/driver.js/dist/driver.min.css'; + +#driver-highlighted-element-stage { + background-color: transparent !important; +} + +.driver-disabled { + border: 1.5px solid #ddd !important; +} + +.driver-btn-group button { + font-family: 'Nunito', sans-serif !important; + font-size: 14px !important; + border: 1.5px solid #42b983 !important; + text-shadow: none !important; + border-radius: 0px !important; +} + +.driver-btn-group button:hover { + font-family: 'Nunito', sans-serif !important; + background: #42b983 !important; + color: white !important; +} + +.driver-close-btn { + font-family: 'Nunito', sans-serif !important; + font-size: 14px !important; + border: none !important; + border-radius: 0px !important; + text-shadow: none !important; + background: #dc5656 !important; + color: white !important; + margin: auto 3px !important; +} + +.driver-popover-description, +.driver-popover-title { + font-family: 'Nunito', sans-serif !important; +} + +.bug-guide .right { + top: 114px !important; +} + +.tourHelpStep.driver-popover-title { + display: none !important; +} + +.driver-next-btn { + color: white !important; + background-color: #42b983 !important; +} diff --git a/v1/src/App.vue b/v1/src/App.vue new file mode 100644 index 00000000..39422761 --- /dev/null +++ b/v1/src/App.vue @@ -0,0 +1,21 @@ + + + diff --git a/v1/src/assets/constants/Navbar/NAVBAR_DATA.json b/v1/src/assets/constants/Navbar/NAVBAR_DATA.json new file mode 100644 index 00000000..98d70a94 --- /dev/null +++ b/v1/src/assets/constants/Navbar/NAVBAR_DATA.json @@ -0,0 +1,236 @@ +[ + { + "id": "1", + "text": "project", + "spanClass": "caret", + "dropdownItems": [ + { + "id": "1", + "item": "new_project", + "itemid": "newProject", + "attributes": [] + }, + { + "id": "2", + "item": "save_online", + "itemid": "save", + "attributes": [] + }, + { + "id": "3", + "item": "save_offline", + "itemid": "saveOffline", + "attributes": [] + }, + { + "id": "4", + "item": "open_offline", + "itemid": "createOpenLocalPrompt", + "attributes": [] + }, + { + "id": "5", + "item": "export_as_file", + "itemid": "ExportProject", + "attributes": [] + }, + { + "id": "6", + "item": "import_project", + "itemid": "ImportProject", + "attributes": [] + }, + { + "id": "7", + "item": "clear_project", + "itemid": "clearProject", + "attributes": [] + }, + { + "id": "8", + "item": "recover_project", + "itemid": "recoverProject", + "attributes": [] + }, + { + "id": "9", + "item": "preview_circuit", + "itemid": "fullViewOption", + "attributes": [] + }, + { + "id": "10", + "item": "view_previous_ui", + "itemid": "", + "attributes": [ + { + "name": "onclick", + "value": "old_ui_redirect()" + } + ] + } + ] + }, + { + "id": "2", + "text": "circuit", + "spanClass": "caret", + "dropdownItems": [ + { + "id": "1", + "item": "new_circuit", + "itemid": "createNewCircuitScope", + "attributes": [] + }, + { + "id": "2", + "item": "new_verilog_module_html", + "itemid": "newVerilogModule", + "attributes": [] + }, + { + "id": "3", + "item": "insert_subcircuit", + "itemid": "createSubCircuitPrompt", + "attributes": [] + } + ] + }, + { + "id": "3", + "text": "tools", + "spanClass": "caret", + "dropdownItems": [ + { + "id": "1", + "item": "combinational_analysis_html", + "itemid": "createCombinationalAnalysisPrompt", + "attributes": [] + }, + { + "id": "2", + "item": "hex_bin_dec_converter_html", + "itemid": "bitconverter", + "attributes": [] + }, + { + "id": "3", + "item": "download_image", + "itemid": "createSaveAsImgPrompt", + "attributes": [] + }, + { + "id": "4", + "item": "themes", + "itemid": "colorThemes", + "attributes": [] + }, + { + "id": "5", + "item": "custom_shortcut", + "itemid": "customShortcut", + "attributes": [] + }, + { + "id": "6", + "item": "export_verilog", + "itemid": "generateVerilog", + "attributes": [] + } + ] + }, + { + "id": "4", + "text": "help", + "spanClass": "caret", + "dropdownItems": [ + { + "id": "1", + "item": "tutorial_guide", + "itemid": "showTourGuide", + "attributes": [] + }, + { + "id": "2", + "item": "user_manual", + "itemid": "", + "attributes": [ + { + "name": "href", + "value": "https://docs.circuitverse.org" + }, + { + "name": "target", + "value": "_blank" + }, + { + "name": "role", + "value": "button" + }, + { + "name": "aria-haspopup", + "value": "true" + }, + { + "name": "aria-expanded", + "value": "false" + } + ] + }, + { + "id": "3", + "item": "learn_digital_logic", + "itemid": "", + "attributes": [ + { + "name": "href", + "value": "https://learn.circuitverse.org" + }, + { + "name": "target", + "value": "_blank" + }, + { + "name": "role", + "value": "button" + }, + { + "name": "aria-haspopup", + "value": "true" + }, + { + "name": "aria-expanded", + "value": "false" + } + ] + }, + { + "id": "4", + "item": "discussion_forum", + "itemid": "", + "attributes": [ + { + "name": "href", + "value": "https://circuitverse.org/forum" + }, + { + "name": "target", + "value": "_blank" + }, + { + "name": "role", + "value": "button" + }, + { + "name": "aria-haspopup", + "value": "true" + }, + { + "name": "aria-expanded", + "value": "false" + } + ] + } + ] + } +] diff --git a/v1/src/assets/constants/Navbar/USER_DATA.json b/v1/src/assets/constants/Navbar/USER_DATA.json new file mode 100644 index 00000000..4d317d1e --- /dev/null +++ b/v1/src/assets/constants/Navbar/USER_DATA.json @@ -0,0 +1,71 @@ +[ + { + "id": "1", + "item": "dashboard", + "itemid": "", + "attributes": [ + { + "name": "href", + "value": "/users/${:id}" + }, + { + "name": "role", + "value": "button" + }, + { + "name": "aria-haspopup", + "value": "true" + }, + { + "name": "aria-expanded", + "value": "false" + } + ] + }, + { + "id": "2", + "item": "my_groups", + "itemid": "", + "attributes": [ + { + "name": "href", + "value": "/users/${:id}/groups" + }, + { + "name": "role", + "value": "button" + }, + { + "name": "aria-haspopup", + "value": "true" + }, + { + "name": "aria-expanded", + "value": "false" + } + ] + }, + { + "id": "3", + "item": "notifications", + "itemid": "", + "attributes": [ + { + "name": "href", + "value": "/users/${:id}/notifications" + }, + { + "name": "role", + "value": "button" + }, + { + "name": "aria-haspopup", + "value": "true" + }, + { + "name": "aria-expanded", + "value": "false" + } + ] + } +] diff --git a/v1/src/assets/constants/Panels/TimingDiagramPanel/buttons.json b/v1/src/assets/constants/Panels/TimingDiagramPanel/buttons.json new file mode 100644 index 00000000..357a00fa --- /dev/null +++ b/v1/src/assets/constants/Panels/TimingDiagramPanel/buttons.json @@ -0,0 +1,79 @@ +[ + { + "title": "Decrease Size", + "icon": "fa-chevron-left", + "class": "timing-diagram-smaller", + "type": "primary", + "click": "smaller" + }, + { + "title": "Increase Size", + "icon": "fa-chevron-right", + "class": "timing-diagram-larger", + "type": "primary", + "click": "larger" + }, + { + "title": "Decrease Height", + "icon": "fa-chevron-up", + "class": "timing-diagram-small-height", + "type": "primary", + "click": "smallHeight" + }, + { + "title": "Increase Height", + "icon": "fa-chevron-down", + "class": "timing-diagram-large-height", + "type": "primary", + "click": "largeHeight" + }, + { + "title": "Download As Image", + "icon": "fa-download", + "class": "timing-diagram-download", + "type": "primary", + "click": "download" + }, + { + "title": "Reset Timing Diagram", + "icon": "fa-undo", + "class": "timing-diagram-reset", + "type": "tertiary", + "click": "reset" + }, + { + "title": "Autocalibrate Cycle Units", + "icon": "fa-magic", + "class": "timing-diagram-calibrate", + "type": "tertiary", + "click": "calibrate" + }, + { + "title": "Zoom In", + "icon": "fa-search-plus", + "class": "timing-diagram-zoom-in", + "type": "primary", + "click": "zoomIn" + }, + { + "title": "Zoom Out", + "icon": "fa-search-minus", + "class": "timing-diagram-zoom-out", + "type": "primary", + "click": "zoomOut" + }, + { + "title": "Resume auto-scroll", + "icon": "fa-play", + "class": "timing-diagram-resume", + "type": "primary", + "click": "resume" + }, + { + "title": "Pause auto-scroll", + "icon": "fa-pause", + "class": "timing-diagram-pause", + "type": "primary", + "click": "pause" + } +] diff --git a/v1/src/assets/constants/Panels/VerilogEditorPanel/THEMES.json b/v1/src/assets/constants/Panels/VerilogEditorPanel/THEMES.json new file mode 100644 index 00000000..4319f822 --- /dev/null +++ b/v1/src/assets/constants/Panels/VerilogEditorPanel/THEMES.json @@ -0,0 +1,24 @@ +[ + { + "label": "Light Themes", + "options": [ + { "value": "default" }, + { "value": "solarized" }, + { "value": "elegant" }, + { "value": "neat" }, + { "value": "idea" }, + { "value": "neo" } + ] + }, + { + "label": "Dark Themes", + "options": [ + { "value": "blackboard" }, + { "value": "cobalt" }, + { "value": "night" }, + { "value": "the-matrix" }, + { "value": "midnight" }, + { "value": "monokai" } + ] + } +] diff --git a/v1/src/assets/img/ALU.png b/v1/src/assets/img/ALU.png new file mode 100644 index 0000000000000000000000000000000000000000..fa8094251a57c08ed6cdb85f8ad0b9a63a8a1236 GIT binary patch literal 57481 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

(DOe@ec`5}uQ@%Enyd(PG0tYsbGB-|l{)lZ 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 literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/ALU.svg b/v1/src/assets/img/ALU.svg new file mode 100644 index 00000000..0db7c17a --- /dev/null +++ b/v1/src/assets/img/ALU.svg @@ -0,0 +1 @@ +BACTRCarryAnsALU \ No newline at end of file diff --git a/v1/src/assets/img/Adder.svg b/v1/src/assets/img/Adder.svg new file mode 100644 index 00000000..9249cff0 --- /dev/null +++ b/v1/src/assets/img/Adder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/AndGate.svg b/v1/src/assets/img/AndGate.svg new file mode 100644 index 00000000..6273b83b --- /dev/null +++ b/v1/src/assets/img/AndGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/Arrow.svg b/v1/src/assets/img/Arrow.svg new file mode 100644 index 00000000..c25f20a1 --- /dev/null +++ b/v1/src/assets/img/Arrow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/AsyncCounter.jpeg b/v1/src/assets/img/AsyncCounter.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..88a40590e4f870e3024108f534cc902b5a7d03b6 GIT binary patch literal 5872 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 \ No newline at end of file diff --git a/v1/src/assets/img/Buffer.svg b/v1/src/assets/img/Buffer.svg new file mode 100644 index 00000000..bf867043 --- /dev/null +++ b/v1/src/assets/img/Buffer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/Button.svg b/v1/src/assets/img/Button.svg new file mode 100644 index 00000000..6c16a24e --- /dev/null +++ b/v1/src/assets/img/Button.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/Clock.svg b/v1/src/assets/img/Clock.svg new file mode 100644 index 00000000..653d29e0 --- /dev/null +++ b/v1/src/assets/img/Clock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/ConstantVal.svg b/v1/src/assets/img/ConstantVal.svg new file mode 100644 index 00000000..dcc41214 --- /dev/null +++ b/v1/src/assets/img/ConstantVal.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v1/src/assets/img/Control Sequencer.png b/v1/src/assets/img/Control Sequencer.png new file mode 100644 index 0000000000000000000000000000000000000000..2189f0a7554381e4dff78bc664855567d53cbc6a GIT binary patch literal 271641 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ξ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 z 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 C?GeWS literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/ControlledInverter.svg b/v1/src/assets/img/ControlledInverter.svg new file mode 100644 index 00000000..927dc8c8 --- /dev/null +++ b/v1/src/assets/img/ControlledInverter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/Counter.svg b/v1/src/assets/img/Counter.svg new file mode 100644 index 00000000..ee2aa77b --- /dev/null +++ b/v1/src/assets/img/Counter.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v1/src/assets/img/Decoder.svg b/v1/src/assets/img/Decoder.svg new file mode 100644 index 00000000..9a48c394 --- /dev/null +++ b/v1/src/assets/img/Decoder.svg @@ -0,0 +1 @@ +01 \ No newline at end of file diff --git a/v1/src/assets/img/Demultiplexer.svg b/v1/src/assets/img/Demultiplexer.svg new file mode 100644 index 00000000..61cad635 --- /dev/null +++ b/v1/src/assets/img/Demultiplexer.svg @@ -0,0 +1 @@ +01 \ No newline at end of file diff --git a/v1/src/assets/img/DflipFlop.svg b/v1/src/assets/img/DflipFlop.svg new file mode 100644 index 00000000..49f4ab5f --- /dev/null +++ b/v1/src/assets/img/DflipFlop.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v1/src/assets/img/DigitalLed.svg b/v1/src/assets/img/DigitalLed.svg new file mode 100644 index 00000000..a9259c2f --- /dev/null +++ b/v1/src/assets/img/DigitalLed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/Dlatch.svg b/v1/src/assets/img/Dlatch.svg new file mode 100644 index 00000000..8aef7671 --- /dev/null +++ b/v1/src/assets/img/Dlatch.svg @@ -0,0 +1 @@ +3 \ No newline at end of file diff --git a/v1/src/assets/img/EEPROM.svg b/v1/src/assets/img/EEPROM.svg new file mode 100644 index 00000000..504f61b0 --- /dev/null +++ b/v1/src/assets/img/EEPROM.svg @@ -0,0 +1 @@ +EPROMADIWDO \ No newline at end of file diff --git a/v1/src/assets/img/Flag.svg b/v1/src/assets/img/Flag.svg new file mode 100644 index 00000000..87ef27f4 --- /dev/null +++ b/v1/src/assets/img/Flag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/FlipFlop.jpeg b/v1/src/assets/img/FlipFlop.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..5c3d87cea34b60ff4158c2222ca06425f065213d GIT binary patch literal 6224 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 literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/ForceGate.svg b/v1/src/assets/img/ForceGate.svg new file mode 100644 index 00000000..28b50f3f --- /dev/null +++ b/v1/src/assets/img/ForceGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/Ground.svg b/v1/src/assets/img/Ground.svg new file mode 100644 index 00000000..70f453f6 --- /dev/null +++ b/v1/src/assets/img/Ground.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/HexDisplay.svg b/v1/src/assets/img/HexDisplay.svg new file mode 100644 index 00000000..10c89e13 --- /dev/null +++ b/v1/src/assets/img/HexDisplay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/ImageAnnotation.svg b/v1/src/assets/img/ImageAnnotation.svg new file mode 100644 index 00000000..8fbd9f75 --- /dev/null +++ b/v1/src/assets/img/ImageAnnotation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/Input.svg b/v1/src/assets/img/Input.svg new file mode 100644 index 00000000..42a626ff --- /dev/null +++ b/v1/src/assets/img/Input.svg @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/v1/src/assets/img/JKflipFlop.svg b/v1/src/assets/img/JKflipFlop.svg new file mode 100644 index 00000000..9e723197 --- /dev/null +++ b/v1/src/assets/img/JKflipFlop.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v1/src/assets/img/Keyboard.jpeg b/v1/src/assets/img/Keyboard.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..9922daff6949b554cde6f755ece5ce349e18761f GIT binary patch literal 12636 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 aQjzDO9w$(jdf- \ No newline at end of file diff --git a/v1/src/assets/img/LSB.svg b/v1/src/assets/img/LSB.svg new file mode 100644 index 00000000..31148b47 --- /dev/null +++ b/v1/src/assets/img/LSB.svg @@ -0,0 +1 @@ +LSBEN \ No newline at end of file diff --git a/v1/src/assets/img/MSB.svg b/v1/src/assets/img/MSB.svg new file mode 100644 index 00000000..21997b94 --- /dev/null +++ b/v1/src/assets/img/MSB.svg @@ -0,0 +1 @@ +MSBEN \ No newline at end of file diff --git a/v1/src/assets/img/Main.png b/v1/src/assets/img/Main.png new file mode 100644 index 0000000000000000000000000000000000000000..3bb25dac12eca21bc94afd0e87439830545b6b4a GIT binary patch literal 2061 zcmai!dpOgN9>>2f%l(kDQYlI5$0DReX}SE$vzSxT^lNRo-{w+8C7T^15<7k@N~}_& zWE%-Znqv?YFquI^Lqk%jw7a`|VPQcglW{nl!NEZj6B9>AM;#rV zrKKfHOUsFgiTU~YA3uKB+1a_fyR%rV+}vD0KR+KIpS88Mix)4#;c&6^i~e0)5c%?=C< zB#}r(MMa&Rovp2{XU=S-ZBd*$1*dG&O;bftca5QJ8Q2SN-@fhZ>nkiQ6p2JRIXTtU z)e?y$BqSs=GxN)rFP}euuBfQs^ZC=$(`II75fKr+y}gllgz!^6WPBO_ccx2dV= z`Sa&>b#-NBWjr3QxVShyJ>A~k{^re_&z?OK3WaTLZExPZiHnP))9FYgGA%7FDJh9e zCJzh@)YsS7)YQbp#56QCgoT9xI6$FLjE#*^sZ<7op^8_PE97FS7==Os2tZd?*UHLj zd**h)3jh)TnOrtJHw>r1(P(sbcJ{h_{qW(#c~A26^z?{CBI_GVJw=^4&g_}$K~Yg? z8hTJP2qi7;SCs{EqzA$=0l_EMsG1-85Y$lgX3tI{BT8 ztBX_Lr;56Y*4EcX#iQnV<_Yx)zU99BMgIA+^B+b&;2ZG<83qHh17}OlHcvFy4c8rg zeAJj|oWaT%5)FME`I0%~s{KdWG)YPzbf1Y-(@JUF%Oo;eEqlx(Yo z_`r+m_a1bMUF`#RSNE_(C3O(C&lT|fT2p_nrEQCeB^SY+T`A29fASbp7j%!;yt7u8 zq#&7=!%@bfevOWs5}DgdYAedN#revF&Sb5X~O)sl1RJcP*W8PgmFa$`~htT@o3{Ip3y+O(J{)%>)KMAc)>Rs=}0{& zAu4w9x zJ;N_ukTC_0+oYJ4iU){08ePu&%1fVOnTuW0!G??(nuBeuR6l<{UY>@q2NHHUB`7zV zz@kNRJ^X9`fC}r~kJc}_8GMM1t&QP_oG~&oMRUo@q1n6rUVd;Po7>4BS(ARxJDJ;j zQ04ynyTOUNowiNAr3b057e2e3M&znO9%M-VIJAdTiE!vcZAhMdIWjnfMX5w2n%{Tx z#?vyg6;=yn5O5$JLSj`S{LV8f?~nLyWyhax?gF zQ_x8rf8VIre#r(4j5#IJb|ozcjj8++q?9o~PlJ>ZwO zah<2B3p%$oFZH|J3^1Qm7hLpKu~ zhm}IS%AdxCpH&A3VEV2iIlOj$rCF_ZcU{GJx3ln z@KVF4f6KC-kjQsTgp>_mzC^D2daT2Eys-c4DF>8KQuWankwCP5#(s)*v;I&N9X7{Y z`1q~w*>3d7aI){U{0qG&O9Bcp!s*-2bT*aJf`I>HO>*^-sOZxX!i`T>y`xwEsi;smdn>VI2~-{Kbc8WmS_}i2JeK5!c6Fvfr0`sR~^>d`KncX{O>O8%=So~Ax~&ZV3{ zc(Y|S&a1`N1&E3EHSzKspptByF+no~xgtx#RpUD62AovKsb#EosR}Vum;FduzHNGV zI%d_7U8>BcuWb+a;Tl(k+2I_E%6g)KZD0t32GNOlLE+xQgrY5WO|I|U29AtJH{wBB zKX?DfSaiyf59$29YC01 \ No newline at end of file diff --git a/v1/src/assets/img/NandGate.svg b/v1/src/assets/img/NandGate.svg new file mode 100644 index 00000000..04cddce2 --- /dev/null +++ b/v1/src/assets/img/NandGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/NorGate.svg b/v1/src/assets/img/NorGate.svg new file mode 100644 index 00000000..55e9abc2 --- /dev/null +++ b/v1/src/assets/img/NorGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/NotGate.svg b/v1/src/assets/img/NotGate.svg new file mode 100644 index 00000000..a0d40ad4 --- /dev/null +++ b/v1/src/assets/img/NotGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/OrGate.svg b/v1/src/assets/img/OrGate.svg new file mode 100644 index 00000000..741ba9fe --- /dev/null +++ b/v1/src/assets/img/OrGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/Output.svg b/v1/src/assets/img/Output.svg new file mode 100644 index 00000000..7d4298f6 --- /dev/null +++ b/v1/src/assets/img/Output.svg @@ -0,0 +1 @@ +x \ No newline at end of file diff --git a/v1/src/assets/img/Power.svg b/v1/src/assets/img/Power.svg new file mode 100644 index 00000000..a4619920 --- /dev/null +++ b/v1/src/assets/img/Power.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/PriorityEncoder.svg b/v1/src/assets/img/PriorityEncoder.svg new file mode 100644 index 00000000..417325c6 --- /dev/null +++ b/v1/src/assets/img/PriorityEncoder.svg @@ -0,0 +1 @@ +010EN \ No newline at end of file diff --git a/v1/src/assets/img/RAM.svg b/v1/src/assets/img/RAM.svg new file mode 100644 index 00000000..92fd8293 --- /dev/null +++ b/v1/src/assets/img/RAM.svg @@ -0,0 +1 @@ +RAMADIWDO \ No newline at end of file diff --git a/v1/src/assets/img/RGBLed.svg b/v1/src/assets/img/RGBLed.svg new file mode 100644 index 00000000..299657c8 --- /dev/null +++ b/v1/src/assets/img/RGBLed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/RGBLedMatrix.svg b/v1/src/assets/img/RGBLedMatrix.svg new file mode 100644 index 00000000..cbb52e83 --- /dev/null +++ b/v1/src/assets/img/RGBLedMatrix.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/Random.svg b/v1/src/assets/img/Random.svg new file mode 100644 index 00000000..4da0fa99 --- /dev/null +++ b/v1/src/assets/img/Random.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v1/src/assets/img/Rectangle.svg b/v1/src/assets/img/Rectangle.svg new file mode 100644 index 00000000..f2ac9773 --- /dev/null +++ b/v1/src/assets/img/Rectangle.svg @@ -0,0 +1 @@ +Rectangle \ No newline at end of file diff --git a/v1/src/assets/img/RippleCarry.jpeg b/v1/src/assets/img/RippleCarry.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c1fbf61f06e9431bcebe1c2fe0af1c5cb53b6f52 GIT binary patch literal 17664 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 zNdaFxc$AYEzKVb~GKFuOXNpU;*W3*!w^G`(Qd&4(LW9oClADEn000000000000000000000000000000000004080c \ No newline at end of file diff --git a/v1/src/assets/img/SAP.jpeg b/v1/src/assets/img/SAP.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..79b76da052540ec1a57e295476003e558cc8f4af GIT binary patch literal 41613 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 UQA${o`xShw_t{w%TKs(JfBtH#PXGV_ literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/SRflipFlop.svg b/v1/src/assets/img/SRflipFlop.svg new file mode 100644 index 00000000..c41ff746 --- /dev/null +++ b/v1/src/assets/img/SRflipFlop.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v1/src/assets/img/SevenSegDisplay.svg b/v1/src/assets/img/SevenSegDisplay.svg new file mode 100644 index 00000000..bb3d2ae8 --- /dev/null +++ b/v1/src/assets/img/SevenSegDisplay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/SixteenSegDisplay.svg b/v1/src/assets/img/SixteenSegDisplay.svg new file mode 100644 index 00000000..ad05274b --- /dev/null +++ b/v1/src/assets/img/SixteenSegDisplay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/Splitter.svg b/v1/src/assets/img/Splitter.svg new file mode 100644 index 00000000..fa4a969d --- /dev/null +++ b/v1/src/assets/img/Splitter.svg @@ -0,0 +1 @@ +0:11:2 \ No newline at end of file diff --git a/v1/src/assets/img/SquareRGBLed.svg b/v1/src/assets/img/SquareRGBLed.svg new file mode 100644 index 00000000..7900e614 --- /dev/null +++ b/v1/src/assets/img/SquareRGBLed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/Stepper.svg b/v1/src/assets/img/Stepper.svg new file mode 100644 index 00000000..f18aa4fa --- /dev/null +++ b/v1/src/assets/img/Stepper.svg @@ -0,0 +1 @@ +5f \ No newline at end of file diff --git a/v1/src/assets/img/T-clock.png b/v1/src/assets/img/T-clock.png new file mode 100644 index 0000000000000000000000000000000000000000..66442d9e3ada92704aaf5c3e6bd5005242b240c2 GIT binary patch literal 47639 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%0Dv>aXGAiYQ4=zns+wkgne** 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 literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/TB_Input.svg b/v1/src/assets/img/TB_Input.svg new file mode 100644 index 00000000..c1c42ead --- /dev/null +++ b/v1/src/assets/img/TB_Input.svg @@ -0,0 +1 @@ +Test1 [INPUT] Case:0 \ No newline at end of file diff --git a/v1/src/assets/img/TB_Output.svg b/v1/src/assets/img/TB_Output.svg new file mode 100644 index 00000000..b62e1993 --- /dev/null +++ b/v1/src/assets/img/TB_Output.svg @@ -0,0 +1 @@ +Test1 [OUTPUT] Paired \ No newline at end of file diff --git a/v1/src/assets/img/TTY.svg b/v1/src/assets/img/TTY.svg new file mode 100644 index 00000000..208e42b9 --- /dev/null +++ b/v1/src/assets/img/TTY.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/Text.svg b/v1/src/assets/img/Text.svg new file mode 100644 index 00000000..db86087a --- /dev/null +++ b/v1/src/assets/img/Text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/TflipFlop.svg b/v1/src/assets/img/TflipFlop.svg new file mode 100644 index 00000000..50925f80 --- /dev/null +++ b/v1/src/assets/img/TflipFlop.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v1/src/assets/img/TriState.svg b/v1/src/assets/img/TriState.svg new file mode 100644 index 00000000..d251882c --- /dev/null +++ b/v1/src/assets/img/TriState.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/Tunnel.svg b/v1/src/assets/img/Tunnel.svg new file mode 100644 index 00000000..ff5b95bb --- /dev/null +++ b/v1/src/assets/img/Tunnel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/TwoComplement.svg b/v1/src/assets/img/TwoComplement.svg new file mode 100644 index 00000000..6baa7056 --- /dev/null +++ b/v1/src/assets/img/TwoComplement.svg @@ -0,0 +1 @@ +2' \ No newline at end of file diff --git a/v1/src/assets/img/VariableLed.svg b/v1/src/assets/img/VariableLed.svg new file mode 100644 index 00000000..e2829407 --- /dev/null +++ b/v1/src/assets/img/VariableLed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/XnorGate.svg b/v1/src/assets/img/XnorGate.svg new file mode 100644 index 00000000..4a8bae40 --- /dev/null +++ b/v1/src/assets/img/XnorGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/XorGate.svg b/v1/src/assets/img/XorGate.svg new file mode 100644 index 00000000..639b4c0b --- /dev/null +++ b/v1/src/assets/img/XorGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/assignment.png b/v1/src/assets/img/assignment.png new file mode 100644 index 0000000000000000000000000000000000000000..c27df5bc834f3a776bb4bb97f903d45c1d4650c7 GIT binary patch literal 33699 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 literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/caret.jpg b/v1/src/assets/img/caret.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a382f8daa86f7cb0127faaf81dc53abd0e760535 GIT binary patch literal 11217 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 literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/circuitverse2.svg b/v1/src/assets/img/circuitverse2.svg new file mode 100644 index 00000000..23dd6118 --- /dev/null +++ b/v1/src/assets/img/circuitverse2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/circuitverse_black.svg b/v1/src/assets/img/circuitverse_black.svg new file mode 100644 index 00000000..eba77c2a --- /dev/null +++ b/v1/src/assets/img/circuitverse_black.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/circuitverse_logo.svg b/v1/src/assets/img/circuitverse_logo.svg new file mode 100644 index 00000000..27202ecb --- /dev/null +++ b/v1/src/assets/img/circuitverse_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/cross.png b/v1/src/assets/img/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..bb7126e2a8083eee1f63ee7d714db1d45edec46a GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAIz3$+LnI_w4>kre88WaO&~9K< zh($ literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/cvlogo.svg b/v1/src/assets/img/cvlogo.svg new file mode 100644 index 00000000..ce4f7e59 --- /dev/null +++ b/v1/src/assets/img/cvlogo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/assets/img/default.png b/v1/src/assets/img/default.png new file mode 100644 index 0000000000000000000000000000000000000000..8e183a8a21dda36485b94de239e6e8a7911f982b GIT binary patch literal 7548 zcmeHMcT`hZw~wD=nGyRq3`KzvML+=|0uc}el_pJ5q{}EJAVi4tDvY2aMUWN(h=`~N zh;#@EMQU;>p(i1s-p~Vt4#K-Pes9)$Z>?{=zrMfTbFG+j_u2io_de%_=SBuv`+pJq z1%W{9*U`Ru6M@);Lm+mB?A-}bnuQYips$}CuIOJuAPS=QZQAaFo<;9#-_%DSd`}|~ z!G9qT>kuh;9D(qVLm(#aArKdn5D5N9_zGiH1Y*a6(G8Pp6SMP^oQ0`5?&$c`zzEnk zFxb^cZ|~{_I=U$Boh@xtN=H{)S1+}vzlYAG4~`6h6YObDKXa&w(pKM0scmQ`)iqSr ze5)kYmRD7m5l9uJT0(Ulv9`XZzUf;Nxslx3)z26NC#L5Y$!*jMVohyhOCzOiaFjj4 zSr`}^t!r#)2HJZWEY=8E*F*-VW{GtT4J`n31Y``35JXZTW=}R!T3Ms)j_y7JsjjS& zSpBWBhc-~t&`e_ulfE^U6G+|tjDg{?va0I-fx*GC@yR)EXD_X_vxiXgjXg8h($-O3 z-_*w(>gefjAh!b4?$SykwU<`kLSYP#P0cS3433OXbEY^8q}uw4*@e-Gsj0bzv8h?c z&}e0KU2|)DMO95RrLDcYZ){?^mD=6j-CIGb>0_`u`{>;?Mpf-MaB^mZJy}Vt85{w> zHMWdS&VW-h4b7C1iD?FFxPn++T2Tc~bEw^Yls0NdPv77edtzpeJvCcZTmP+@!W?CH z_0n3}JG*HEKxfY|I8on3Zf@-uVo%mJG&i;Y&&5D|%Zr1VS)e=js&`Z`#bjT9ELVZM7|M zMC5BhZgJMY@q&w%&WMvof9pT<+xb|H>YFov$i4aFk?yFCweRCoO%U`5nonAp$U=J4eOh>7Z`=|MM+_U{3X{%-tf-!n}(b9c#hIrB^AVxD=df`IX zC-zyV%gnQvjF08p+H~D@U45%bY#}ttV|NH!%-;@IMM+saEqgip*-(UXEda_UD$mt0#WfJFOBIFZ;EDC<<0ykvKhyn{SU1&E6tPtl_WqUReF

HVKS4XshDWUUmAKLiwZUQ~US& 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 uRJHLYk`Hn1^92J2%T#NSMxOPh5QFS(@^IC literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/drag.mp4 b/v1/src/assets/img/drag.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b211439caec8d453b07c34376e6f4b8c212504d2 GIT binary patch literal 43892 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 literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/edit_icon.png b/v1/src/assets/img/edit_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..32f99fb15b2e2ade3dd74e7370f97c9659c3fe4c GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU0wmSG7d!(}Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4Z?C=OJ)|JO_CWfepiCq08;-sUysy~SUEnQY zzIj40q4~P}R`sh*Pu~e$zA?SNpz=^ShfDM|S&KUi42VR^8v`vqM-a zW@^fzt>@)-eL=gtB8NVUW@q9i4;B-JXpC>2OC7#SED=o%X8 z8XJTd8CaQ`TNxT^8yHv_7<}FR?+S{B-29Zxv`X9>TAsOO05vdpy85}Sb4q9e03pzz A@&Et; literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/embed.png b/v1/src/assets/img/embed.png new file mode 100644 index 0000000000000000000000000000000000000000..520cee0bca855e2fff6ec240b31bc182a28095e9 GIT binary patch literal 27061 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 BDwzNP literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/facebook_signin.png b/v1/src/assets/img/facebook_signin.png new file mode 100644 index 0000000000000000000000000000000000000000..e78185f0b4515999078505863203d212633ec7c1 GIT binary patch literal 5050 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 F@IN^8HJ<qi;4hrLdZ!j<%!~HJ4 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%0D$Jp-c7dz7cAH|o2zAp~sfQE*? zt}gFX_}XpYVVAdF^Y)_%5oNJ|?D7n>PdsRpdT0WpGEw`N>P~K0+J~9*UAoodcu?9> zstPfS?F|INpVZ&me;?S(d7`nQ6Wcm9Zy|!s%exB|>rP6+Z6Qws^rXIlL19Pj#=uP? zBBD5jWZuw0XlfBqtNgjC4Ls>i+Hnw9rDIP9gp>dG^`Sp~?s~c9i%*{c z=m$i+-tXTF(~c11Ap1COObk|r!GQ3X)vxS@(7Tm{iW(Z>TZx}p0PQXDjw4~YYu5@6 z@2)Rjo|RJrm=Fk_{W(!w@&*1pY8d80ab{KQ4P#^5U$k)?;I>XF_lP7uYGTLaW~fK+ zfiuz-b?8DfBJkM(q%!y=%{diH+41lO`uqD=R7eVHR02N_$WE8-R{^9CrX|?98q)N0 zv$Mbp?3i`FLVo-l*~s_r8}8ttjO(>P#55FAY6dUg2sRTnpwDmYD zWh4*&hsww%Hj5I()OQsA14!Q<5e(HGVEe#F!r{5WH4jK>M}-u(H${|@2;dAgvEgqC zb^I)D1TbHws2j}uRu;`^u>=TOEZrC28<9`!tAZnq$TF8EDmCzhUj}+3;FoTPm%=x} z7vqUVsRaN1HUAC+et9^CKyQQKf5rg6#M7Prb6@=Q{?8j>gMf;J|C%5P{21`ero-{d z9*z*E6#%ya!qx-QAt6OPH3|j{e}4h~)Zt3u5dZnw^91!Qf$d_J0bGy@{4Y28uJe0f+h^*)v(G4{^ldSWn3$lwQHDzBAiIhb7fMNO z*OCuIT!<S==K+^8zRDJZ_usOmz?ph$A?gGv{eaS|mZkuKCx0Yw^B49rEY z1!N>qNN69`{6ACvgU4dZnBGI3mZyjG;b-WuR43LO&4ohLWe^X(a9F#1@^~pSD+wI% zpuwV(t?uw6Y?rEE01b3|JXVF~hD|jjcflJC`iqyt1QjD!LIaue%cU_=SVQun{=?$l zAI-3cL)+!{No8=L4_YBqlonAVq>rbkllJ5O-}|pbEZtr8xL!?HXYYfT1zj>u#lF-$ zod`FMQ`Y`>DZjlf?9{oRUg%V?v9k89-cPD-HPh14SJ|hzq>jtjIMFx2b?t&?Iqee$ zokfG>^`09&)=szHz5DeLjeM}hzwMOi;Rx9jgm6tE-c+u-6nXBDYUoHm@_CW$wU}R74v9bR+!+hK9{YsD3e=t}YEVwb(Xz=Q!;F z9_@y>lgwF(P2?ul2a$tnH?i-1d2I+yhca6qITYp)P^f>Hm>S$F*k5(U*BCV{s8*q# zg7D1Yn{bMX?hpV2UZmh}%Itm18elMvii&buoDfpbb%daKYeehhK!{aF>tFzw^I{(FIpX;3sO458j|sgJHzd-VSdI z^h2$`da5Z*Td152t`NHnVv4}UO3y}lF!^I|HYK1$Sc2qkJNxoYOURy*4W3G@Pi502 zk{Og%9=yE_C1{nzhZT!y@6jbycvpP~@18?^2LFIb!9{Qk>m}m_@!?@p((b!<{D2r6 zGtQ|TnDod$9XY8mOU(YyeJ4(26(_~T%{}p^s}EA*FkLLVy1L-Y+!;Lq*Hu`*FX#2^ zH8#W#S1s2x@)B*GNIMIv*M~J8JDWWdwYXrjK=x!JM;cU}Ra>iL6Y}Y$ZWx2Wfn{tT zTcUh6l`y`fq~yHH9Kp~eq*Q5lM0!uuMAhk)vAaK1w}o4}JWC0mA@mi4a-Ij=LQSPL zJJ2jq+s@wpRP+$La*TjR7Frq*6bKE>_S#4_06SjTRc6! zxw&})I5mv4ww44)i#pF_Ri5De!V7nr;8|{A?C1MLzPS5?`>RQon~XUx40V72`edWT z+$n+Z*;l)MhF`v?T150JSQl;dMc&&oSbRR0ONF57kOc`g9#~pf%=97?qiL3D6;#=6 zmE+<+dGRl6^nIv$kaC7f^XhqA#)(gH(9lkYo}vsy2VDX^WOKNlzJBhfZLC|X6TQUXg^WP>b>on8Lm>{9>!>qIV_u zZecH~bA%*@Si$=KW5vlK+I8&o9- zwlfHZM27YCq!8DSa&mGI_+(MxLzu<)%ZrQ>jqq)`j4{l1E!yEMuOGG198vRg%ZD3W$~d#~8SY-(EU5FZz3r#4uF6l`Ss z`S^5nbgXoAoT{=GIb$L(YS^1|g*cfq!8F@6uLspD`S zK2qHodk|Ctl_RV!?+SG~l3QTR>6RG`gzY=2sq40eYU4z6=FH*5W_guIqz`ZcWi$~X ztWBl`Si_DX1<~VEhTy~ix>$6OT}L`Pg_FneZ+A6f#YW&N*n2h-vdxI(3Ip781ILG1 zl?B1R%Za3Dn9QL1r$p~!9ag!jIaAm8vz3N$$5|TvZa5pn%y80kz-njC zbRaXW=H*`9vWT!D#b7`yJBk(uXsdFa6Y!H!!q#jAb}{L!W7pkNGlQ>Y zseYch4UN9SI7JaM{1I1fD+pIjJzTYo0ee8-~`dua=)5TU*b@8L*;`LZR4i2w|nLTLEQ7_M|ClS zq$N=O{`=F)upi2>Ob`Z2G-=grQO#W zDp<48uE30$h~^4XdG`JQ4u^Bh0TRNamN|=ZGLjl@?{cCdAL%cc$h+I+r!0@bKvGLh zU%zABd+pWn#PsYu3{L6g$fm=A@BpA}1Z%ijV#w_F?&a=;O{ihE>U*+%>tlG%`$BHO zDE{y|@ez``$oZ7zfb%kBXT9-4qs#oITPKJ(2Ye<;Nv%~$dWC5VzKKbJ2vU8dpR1hN zbx|+XMQ%ve>MaM_3a2+-s<9k8XTJRD>go^Zsw=X4)gr=d5F??H+ft(ZNleU(jPS zyg4#ZGm(>6!LZV=PMC_R5(ezz0zExtn4N9iyZ7!=ePd%GLx#l{P8lrHaZ2;1FdOxW zcRFI1rqb^=RZ`@CX1H@v_P_zt@ZO;I@+5tmJ660yk8e(gNn`W5loTD!Li782yr;y> z-|ZVM`)RhcC2w9Mr97`{*pe--3N~{?A$*yzH~HaQpufM}x&c_W+o`;t4LQTR?MNdK zbmfH;+m&aTFRV((PnyAQZ!0@v!KC!>ImN4>8}l2l;_5&Humfgf>gwv@g)q19QH!WX zW2C~OUBMj8-s?SMB7!RCV48bs9ZaN7q}CuQ7gS(Y#^doGO%Sar_lVgawP;@o0$vqr z2ICG{5Qp0QJe8d5FHAEWcyMjIo+s`I2Q0P6c4xFdKr{e|eK+T5ivdcs9-YeJCzvBCwIVYOM zCnlyVR&>d~h0z6u_YZeqBuFwnoO0*RicnQ@Cako8b2ed5_(5qoay|GmZ$Xi}Y2(4SmYo-pE!@jt2zT9dubO7n>hbD&;DJN# z`Vu}U4>}p(T40a#v;5)VVOTcI(A^l-Z$BQ?8X~7$46qE!&dyGupDKf#=@jB868}c6 zc7QIucCEp;21+YAOMU$FE}FsCMEh-qZ*$&Z6Tw~;}#>XOpZsVb06aI==Oe9r+7 z8pOo8I5>^-tERTQ+|=MN{O$qm=55B()C@SFKJ`9E!MI+dEEzkjx5y{rWY0 zeZO~aVYYqytpxY=3WuwGlOQv60EB>rb>`%#AcM`%gpE(Bgl(ejD?5JcXh`8U)AvX1 zf3K?0qyEXaiE29k3(0E#H^n5p;5rL~q9#&fi6xpmD>^J0oADV8E}@Hoes$N6hGIWnf%gz_vAObpDfjoN z#8fzAtZ=|PFe)&!>LJ)6n1MZc$19XZF9HIQ1HAm94aZdY!TSLme_ZqsJogk|`v-Ke z)_@2~O3FiAT}s@@=qVt;?n(;%>2&Nmqa^;lI-|{gjqTg*e7lYW`Dmd(K^?oDf3J?E z`4KIQtsjuL^3&5Q2rz?paXB*rPkvgOx(GX~VN35}Nh2ZTn^e~oCA&^OUbZjOz9Y&Luo{n&)Q$%b#EACnC(lAex@{(oSD zq^Dz}{~y>e%KI_VkKX*((2q^%|6P~=MIqw5>VH8W=HpsK?oW%OvFEyfve>9xRP)GwZMe8Y^opvBNj8AxKJ6);h@SX=C}RmQ1w5O8Yf-_ia2* F{0A7tQg8qO literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/google.png b/v1/src/assets/img/google.png new file mode 100644 index 0000000000000000000000000000000000000000..2accb4e6e56d6f5bda516a6e81594602d7a77ce9 GIT binary patch literal 16985 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 T!G!MXh^3;asZjpLD&YSB7m+7j literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/grading.png b/v1/src/assets/img/grading.png new file mode 100644 index 0000000000000000000000000000000000000000..166ee57eb22c34019d2f4ab1561a99bbca71ce8a GIT binary patch literal 26275 zcmb4rcRbbo`@in?KwHCT2%$p}*|$oPm1H}J?0xKc8cGq$I%E~uD~@%}F^VKk$UNEe z*z=f&gWq-3=llKqe*gW>{YX0J^?r?OJg?_?mkdvVDRK(V0hxkz_12yJsD$Q za1mr+m@r~s5RYPDU~!1Wt4YEKdyEz3Z!>Js|NBsu8V2v|cetzL#K6E*MgOy-#y;&a z1B0o%!fn}y?w!*;9_|m9KF-ZMt+y`gc6HS+qpa=MJJ*&C?Df*KeFO^Rb{A@PJIYn# zA7)(O{fGC$sdF~xIS>ECdHC)=g(q(rZ~k-s@r$Xm@aOzvRkOa)pV2EJ&;1?q-v+() zn;oS}Nk<9knKk&?GgVO8zV3(3^m`t2r=Ohx&r1J^WP%^R$n;;wQ1HX3+l@-2H~Q837P8a-FZ707{34Hai;oH*DWNz z-{#;LnN1?@VED3YhSJlP&dFwiIz&wqqc6hs7$fBK;%YQk0ev;2L|3t^HBm~>5qlXJ zoW-8YVs^rgViD$o^j-Xm5jy28#=!7_IF8!$|2yOt`Ox+J>XiL~FW) z>s0?qkPk$y7x{5c{OPW^#+`Vd}!U})&#zGopJszq`60PwVxX zjgxSjNt6rhF5hg|v+wa3jiWDgN&so+_UfZcbe$HvVuyBjixGx(?*#Uh-1p%z%9k%+ zyk^Ua)6(un$5G&+-Fx=nU2&4xa;~FsZd}~lgnEa1a~XzDpz3$~NVj;-wQ4W@;#B9p}J<%Z>MRvFVcK27Qm5UNI?56pb;9 zjz~x5tCf3pSO1e;f4nV<^mxqm?t`RqYt82O3-2QXU(S4(XjQ?spH~p^cQ@$5r=5F< zYgs|9jJUR)nm$=OUht~uKz*|6fs1Jxc<+aJT5GyGT{@vnwY9bOWlNgg-lffCkoLVm zQd`><-GaL_?!^d}U5{qEaUl2{%*So*)FcwgGS;?S&wEgsZSE;Ul@d5FZ@yzouGl8K z`pFCh>&!7>Yq{EYttgdp&%xxQYN)Ykv!HtIUr0>5=2bpR<)m_=QSq3~h?Q+udV7B0 zOS{@}$z0nAYhTB&zBtn45?iV+u_68a6jNUPC$skwNNHZA!NZ3I7EKpSc>_b}FI5yO zznPq)hZO3`CL+6fmj2qq^>IpU!x=TyZINLfWUpnrudXw7Y$-Ff*ihJca@wq~?lzS# z*L>RMm)nHRNMUjw3M1iFf8V~w~Z zKSt$qGdZc5T*na*5Wwy=l{Y**EM4W@uH)HgqQ>;L1^n?BIjN5BCfaMD9=UwWy5gR*O+_zH0ipM6ch9K{^m3&3iLzKKTi6r$%P?`_4du9=m>tYS(P`Ld&Qx{V>#bv*LY;i71+gv!!#zmpPy}W) z?Pt{0ThdlDXWA*cBRMb1K%IYfF7E7s4pUg0qI@}+%FjgTk~~Se`UW8|mV=e}Hn%2J z*Zvvb;w*-g#v^BnJ_K~lqsWtWu_sNB(Ln<#%}$_!-%oP|bs1lNSDjXaf+neyFx#CK1;%XoMij);#;R}nb81*2sG3}MydeTJmLO1t&@mL=+YjkmMhD_w zWRoT``0?%QBd4cMQs?igmC!BD3QrGV z2X~gq@QP2(tIWj1qU`3(e5p*PzqUtg<6tZx`xAi0)6Ud>r8x2H=g&W)-S)V7vl4ul zdKyq4*`^!@5xCw%PJ58(U9Uh)JSr!HkUsU812 z_{(L5qiViBEwuOS*I|=~K$wD86T2;hkJgY#*W-TO{1bwnJSUfI`v3gT3WpxgyE{x9 z82+8sS!^5o{~Yx1m|x`WQDZ|BY-Q`oBT$3+EInscFpNhC6;w`pxj9wvQaj`MOLyyS-@w1p}}hu_~!3`FkJq_)o&N_tHZ% zG6$pQ;a)HP10j0qP$;JuD^r}x=$cw5r=Mm`R)rKTn3Pk&m4M7_<1Mzqb_^@S@8zE zKg`%*P5rh0MUSi(#u3tH<;{1lgP3|VQdO6fl$2&>+qg4tSf>VW z1WFiLp3`HemHse?MI@%auC3k-i&}bGTvyD+Qcr-Z?@9)`Dl;(F7SrzL35yGidr1YKz z?L8%qG4&#E5VNzDJMGEt+lm%^O6YdUDVnsIl7#@C_i5!lH|4==iujeX(L8PblM10f z&9Hi+*23>M?dCG{{;0|5rYny2TEX=7Ez`E}^Da1=tdiPsBuTQ#LYVUKq}Zz->6P^1 z!mmbSJ@u3qwjwbUh5KQ(oan^G|CwOW1xNXMpU{Iqdp;2PguqLn^j=- z;M!{?g;1~n-E7ymGc%qB=fO-k=4P-lNP#KZL^EQieexd-IFiVxvQvZqnxzV$)9^vM zg>v1*NU$=I7b8!B?+iKI7~8f=BWJw6bO^JhbSqDB*Yrkq@!dc6aBBut9Aa-QIE?jY z^2Hzgvo|~|34KN!DIGlCc1=ii_cmUuU{t#i_JL6sOK>L3&&sMN9JiJQwO$DL4lnaD zd(~xCABoVKkgQQZJmM$1VB+@|{kWAdjk@g7p`o50x4r6d$ipeQ4eTWO4`(Y4-(Tq7 zjCH%I5d&shtik0@|I}8hxv+%MOuh~_SK`YqO*^qk%j>7F?^RB>jPTDXT4Gn$)2b4jJU9yOKp_^eI#UbfS+P@G4bH!Mo{_4YlZSxlZyWRdY5JuW-<(@{Lmc7LE*J%vw%E=F3z zWth}(rC|mo9yei=D{8)B7T{2`D5jV+IbF3LOb4_v)GzW*HxH*(R@tb9?$|C4oqo0> zZ0zr{UB%q!=vrjYCe7XbZ5Qdx^;kHkI*PFT0kuRnV@xpQ_E~D;RX+v_?Sgm z%lJ=&EBjOhv<02oV|<$~r|%yinyDV~8<(y-KU*~Bp}y@f~)v>3_r>1b;c5lGlI-J6<(uD4q+a2Gs`%&Fc z;PYYofu-?hf<1&`O8ZpXv$%j&Ke~>FRg?EGFXi65Jt49H%!tzGN z6y@^4qxf>#&4?|2*{J-7`yI{6!8*?byJz<{(G8FB^AqM5$Ui(9;z3M*UIlLB=(s3B^XHmIzGp{rGw#qyI9j5d8S}>X`J$& zU)^^h)Xl0(i$Jp@uNKn|OYVN8V&Q`>j{H1V*BwQd=lx$=0-Yx}W6za5TqUCwUO5n2 z-g(Od<)TaNtN3fJZs{(UcxRAU@p~Jlgp2!%Rb#GCp2u8OkM{3zi#N-ixqh*G!+4}9 z)Xza?mOT42dg&Lrll@_JXZ_M8ivF2LYj|U)ir2Bzm-XYPe08);U6tMzlLkdO-d~>- zRo^v`iJXx}mtCRZat$^nkkZ|=ueRO3h7nz=Z|k~lV=RM|UT3qn7g%|BU#J^FGWTi- zmx;su?jp)aUM1vnS~MKyE0T6@h&}Yf2mNcYrze+bnAcp5dbt5`^^h~PRa08 zc+Urjrb}Y72UBoa9oOD?@L%e6JE(3zA?9dhwoMcbzS@mVQLZ3t1=t39TY~wadt~sR z4CwfmtZ(4%_<4cY)|7j&vVhz~8NYe!z7KnT;`ls{U+cCv%>rR{18d}jyO_38D&Gsq!)Pe~%EQ|cZjJTbW zFLQlouzX$XxULBQidBoU$&0K(jXq4&zrH3PXUCdEl#eLS4GCb1>B({xGaWUGs-P82 z%+37DVsERFIn#G!J0M60s7c2sw0%qgbE5~eZMs*>@`qH@ZSX(8QU8Ih|M_^EI>76?RRVVLc?Bf#O)h%cZHU z&9vB1C${17H5V6`!lI((#l@)l8S6U6(uhB?Fvkf)XtpXeN$7t*g$k=}?dV8v8DBKK zcIpsB=UywpQ=MI1OP*!b#=yp=r>D8X6mTIeL>7-zNoraYBi}h*os)w|YD)8#%Oyc1|FP25r-_gC z-T{L8@@)nsRs#g0-Yl$q*x^Q&W~Tlqo$=*V8^05?IO@NelHmm{|W z`R56MBhGYwrPJfF@$svt4vEL*l$DiXu`Nb|JT(o-kYM6%wW*nzNbbzV;s^w{Aw8@J z<`MMwTPJ5n-0J6zxQDRM*5otK;|Vy)LfPSRX>zYvNVOT(#nrV=%q~xR(bLDvi*PL) z4oXmVd?#TbUEce@XZ4#!k^iwn_O`SnIpa#xRdX;LN*KNDc90JBcPZ+it*tGkj<+l| zp5W?%29Z;C(>bZ=eT?Dtul~ipxbAjJ^$mkRbesWS+K0d}oAD*=VCz9(WcKs!6;D0W zytIeBaVqA5r{3I2YO-jZT(T;B|7W=|%GJa+t87i{1l72DvzE!FKMC8v80KepdXh+s zQ3X8OV9p-eqY%o9ywDn zVcNrnCtljRb1?i#K>o!T#(Do*%Q*H>pP*kJ5K7^VsJlMXbJH;SL2XR~z*sZcPEFbm zA!_O0L%taO?Sj+BIsQL-dt(MQ9qisdGU{JG`I?B@u~5$1xGMpPoC-b--y`jBH#n1c zIG&xCqiW&xGmE3{ta`t%H~V9jC0t19Rw%q-2pWY)Cqb8+w-VH)htIxSBF&IK6SFT) zQwDsD|3(6&^zZ8r)?y9qgwK#wZ8O>?)TU7WRUcVzfI+Yd{K;g&<_g#YCDpslu#CR! zf%lRpq(bBjNYyqXd<#VKIHKw@l3w{?kPu-odH^XSPRTrXiAa7AUb)^fBvch=mBeteIe<7ojvtt`A_D$v; za@(N96DKiUFE<|N`~Ih7QJR`6A1^!Oc>_Sb7{}AF*~s@8+p*_H?pwOH-Vt1I&4YK6 z96v*GZo%hFVdoJg)6>12urNJ3I4mpOv(gAbooqZGH{0@Q@~TyRl{h)I$Btup=s#*x zeNbl;`E+LwEdt;*dgWB1tN)EwbCkQ#-vWlw13&K64D$?p7g z*89C;sBnR5%3qjcY$ew{bt+4#`80iXa`@`~@EGTwJK3=#&uNF!V8sRng}+V!-Gg^c z=`K#gyn|HG#IbUy^{TId_@|~o2*UHP^+`0JY(dO7& zBVo%%Ku@+SMn~0-D=bW&ASdz|)a?5RnFd6|@*l@^(-!jhDc0gXFA#fwLzCy&jry8% z$F6>F6#4VqlX>>@&SLJ0e|krBw0m_J&sutEyNg8MD#Pu4NT%MS@b5qSW4Hhru|2*2 z^hZw&M{Z)C7w>|9|Jl|PSp2IVbl~9O?GBLNFLM7C=q^EgriaLLH^)$Ok^Kt)?}V;4 z|JM+DY=n@t-PNM+h#tZIdk6Hh{MU**{y!dvS-}M$4s8QJZ1cb7f+fB{jDp~^eRdf0 zUlYT6bW#83;4tRDHVMar%G-ZV4P*X$$Ml2v+Wxi?0dT84`;N2LI1jKYwPoDlMz~DK zu&baWl;2|NxhjGac>vl5%2E<}c#EGa+zRCc0=e}Yib+s?I$r%~)~t$vpi7eatF^7I z3|c4li}_wFc0hC#n$x-!Wo2beO_S@*&i;G>C6jn5uU_AETT;z2cJ`bH>7k*aot>Qk z!w|~#_4Of!GlYCjPakhlm2p`wS4oi0hB0Ab5)u;flZ2|b&d$z{A3qkpeqDz@^39t! z6bj0;=5vP)l}fFyu7-x93rkOdW!Pk3iTnJZda6nriNtd9WKmI39Y)M&t$;SVIVd42 z>PD`M$SKCUPIoppH^b_%hxmAQgZGn_cEws+TC*M4nwA!)s+Wue*J)k>0jTJR#~~01 z6^}gW)&A#i-@bkMa!+xwt(%*hyL-tb5pVSM8N3SiEiDb}J+3`U-79BcVBq8=lzW`6&599m35k{2K91w`*CK79Q2>b-78DfZ;o-S> zvFh=)p!TwF)z!(VsX&^(>T73f3g{MC&^P8b%e3}DMJ4!7Qb)Oum$EW&(=$O_0s{8^ zeXRHH-5Y64m>n8AHauAQ;vf=42aThgpb*$IQOlauQGJ^_hQqHGOoPpIB zR&-olUESSRaZaPdxj!frie`>J&aOwCEGOyE|F4{!oT(}K-9>qXeo4Qxcvoj9FCU)< zuLj!93fpnv;zf*r;mqi0YIj3Zl6*`|%)tW(jvhU_=aq=Q1e5;|jk<9D{Q14i?2?{~ z7T(^pkGK4x2Hy^^jt(5`WcR_7KLj)_EG!%xKC^b`6#x4Ddu(!Yy_P$HN5I;`VhpPH z2!m30%5d$QH-}PNIzTbdcH7~*bW|>{q-1p{L}qz;S<`N`|Lb!ynam>sZUQ&uluT~5ZY=5DUFM|dRW&-yD|eqJv}~jj~P}cTN4*@Nnv7YDk~>v zW@6%~T$6F$kFCwgcCtv!^k8*hTU#4%M1~tHq?lwPCP4<>JKYxy`9m|n+L=Rp)Q(3e zTn3(6US6J@Ea#DS>Cz=oH)K9`#koxu-4J5i;IJYhA`oP$XWwlNbPYKCh!GbTza!1O zcc(Ly;u~vg_a8jS$IlNbMh>QtNIZD(U}jE^D!wX{@yd#UzF z_>5}2Bo1^=PZ##Sx|3vSWd(^GOxD!YboJ`hdtXT;lE0tdx0)J)G&LwF=+UD`(b3U% z#oawU+4Oyio(Y1?DmvU)@YI>JXF=0sjP~(rFeMq8ir$L&!h(VlSICThjXQ&w;rY7Y zjGti;m|(}*+1a#`ZD>sDpo?|5HVkyHeD7Ysn>XDAw_M4mw?jWQH$Q-xN=izgX(J~u z&mrN;FC^4roCh6)Z{NN_KN)^TMMWLsR`K)qhfeJ4#Ia8Dl`B_ZpY!wcmoH!5%fx!a zWg>j?(+gQw4|DTTFj+hve`wDwV`F3JjCzN7El+`@!$#8%r4XlGz0Aza?%ut7^XAQm z4YDwoZ$e9io|n-?#I{2qocE(g?wOrU~R&}1sNIlLOH25)#>V~ z;HAfo9ee)#c~wK&D8PG4VvvL7U1F< z0jI|xki5LS2M!$IMIc-^0yVQW(X{y*1qFqOh=|d~1dM=XaTk(M`tjqV9z5MxAW!Vb zH-%|EJUjp~DShwdgIU3Nz@6CH*>!YuMk_cu;@zexaL<9dzMgQyF%b+oKmXc=3&yj( zWnf_NRD#d4&h6W`9UUES-MXcz*}gp8rLL~7kf%0F8L9~xC6ggez=Y$@_+Gl7bphVh zhH;Zw)Z$-r1|(WzMn^~eU%ZHuL6?8{@P$MY<>#O3#yJ%h76OC-hW`BV)_(p} zqPkjHSq&S`Mj#-Ff#kc2Y$X7Pp-`Zq(Kb-!zcSU~G~S#H@k~G%)f+V`F2o4c$BGaf&02n5{Y4o~;)G*IsC4D0n1-Pb*#qEq&=ybxn;t_1C8ko8_e? z#{K)D!Lzx!38q{(-vIHiY-@8JGzyhM4UIyNg^~7lP19aQP))hddaG5THAcXo^oFFQ zBxnUZ`O1~-f`V4#yhRc@!JASG*dLysn~~93;%MUIIJThWN=*e-$ zRU3oZ+S}Mp~?eBq@<(-Y{tmwLvgVi+%S<0G3_h&G4!6Vo(Egyknvp{YXU8N`SLII z1eiU{ghr#Orpl_S0#~kFk5<}np&N&>i3vHMMJ_Kf5iIL7^d=xC1`3qF3J3_bhud00 zV7pMW8b`&cxD9@LP2bM1a!!T%`g-s*iv3cIsC~oFpW$xIgdT$j5Asckktr!$28MKM zDBX;J1emUd7YA9whaM#IczSr4nw#(4wX0+q-!lH@^=rUVYkPY`kTvi-)Cp`yDNw4) z%9|vFjLSspS^LsF-wn?`fo$Ev3D}c`wY9pZ7U00zc&d3rtfifu9jMIKHX?OlnMCH( z%E?MgyFa6qOY-va($dg4ar}4|lCTW^mrXA&=F|`ib*J$zlf&|9-Z9{6fcId~z@{KR z*Rd`J2M61B6}7dt&RI4c!8;7x1RQ`}8RYhrdMv=f9;mBBSOo+Wx^`_Xwg&j=OjZ^@ zRnErR8d_RR{z(-G%+?3}G7uy$Zw7n>=*7wT2{5!gE;yJetaiAQY-&meC@|GJ7d<^a z;B5)<@xH)J=H?toa$+bH3gV1*ipj$t2}dn$ZR;BwW!&dJBqa2KLSa0tEwi~gbjzRV z#ful<6WMyjIVB~(r~7yyn!<-egM;D4INDHR1%mnDK}A(nt(@N8UUn81%=`Dcpd8DV zl)*t`>K&-BlF=$^ct8#0rcwq98K;5?4?hmhKTx?FjozYjVs$5{1@JKaihs6M`4a)L z8zjts<%)(e$vDs5)AQuXlP~@KIc_+7xgMXGmmd5>+0^Qs4y`y zYA~V2S%bm#K+X_w=bi;i)*-i`Kk&V}dKz3hFK_q_u+ioCAky?fq1J^~QXwX}*Y zni8x0nXQG-D1>HdP68i)_WU_Hnz@waWs?DA!K_dhI3*K@bazwJK#@vflSTMwY)Q77 z)V~;@Ftz^Qk%aD+79kN4&G?L*CJRtG6PtJ|5L^e0sHmuQVJFC4?#>-JkwlzISgkW{ zb$(-gMN~v2<RO* zD8b=6Tzqk{)xhq~1ev`>#)pSYMLEqoc(~j(&LYu znwkQ~s;h|auqgsU3H~rRI0&YF-MW3Mt5`L&4Y~?t258E#0^D)(kpE{pys2S`U)dl} z1Q)xaS7g&!V7b0L-OSc&b66O7a;9eX0VXDqGeK-@Y+wiAqwvW7 zefwSo271BO#$hTMSO5pG9bg||GeSZ_Za`4bTboJpAv3*Y5*IEcCMQ=fopVMb?XVsH z?A)o9tqacJ0`#)bnpB6}oUh>^awsk>Ea+AEZj98&EKn%?Cl%3?d8dNDgJ*$bj;ziP zfg?c>0kQ|~1bcv>3(IM`^^2qI-pORS(IWK17E7_H3oK+L8rFT;n};^LLfjdddMvaYV4b_Gbsdf_o3?vuQJ z8!oszNw0%~ka%ZHh?<(3k&~m+KHlD7f5Qnja3FAJuCVk9#O&16Ax6fHDQsgfyOge$ zmfP@;Bal^q+}79D>Nrlry&}j?CP}${h1OaY7HPS;xfl!yj*D_~(os4_uO~700WZ`) zhRe>L202pi*} zx1-}SI*&l;vJpv;@)D7f+E^TKf&0F|#ZY>afWO0|qnT}1#TQ#bIW;si*d$z)HoqA- zI_4SV0#E@?|E#Z<@>z4%*Y5_778no!6@E^Io}L~G_m}Q+We?>7KR-XnyRaSI9UXA{ z185Aq!V(g4Nt2fptZZx+DU>?!{2xE)=olP~;NvrKdGQFYHaIOnG5~N7uLB1UlAm{o z#AE~Z;cz;&EDE8JXlv`}jC(2-Kw^oF-pm12 zf@BPAT2n)#maiLfM|ct9^X{g!j6*1d5LAt@b>n$vzw_7WZ~oGh2-AJ3G00uDAPH}svrXr5NI?K{2_y=tE=-A zD0!Tx4F?To6}ym|)z{V*5gmORWCp=CCWepWTyAFO!oq?C$QKHHszDa^a@y4z*(CQ|#1mgezg=y~?f!(kqu0nm@1XrQ&l0JRujR z;Tn5m1fTN2gQKO4vr{r><(SV^G_Kyd5GGm(Grpt;asuB(tJKW~O4#IpGOGhW6{OuLVdHFt;0;A6d6&1A`{ z55%YYTgbEJ>oXD;Mc79~MXz74*YGybKvTghI&Qm?h`F5FzVZ z?y|3Nx>7d({p?D&Q{zE_(z!SoL{8|S5{T| zZv;s${1l>30lZG0ViPOr(L8;=HnUJa$?)2-V{x;kLd{3mq=wgFeKu-5lnAB2SGWZY zH#NkF&OY7C?oO%Y_V+mm=bzk2E6}xtH0Yc7S97NYo+%f0c4z1aEB!`nb&|@t-e}LZ z#pPl)x%U6a#M}*CTu9i`FUbivC2|$luzT4IH`3FennpKa^d@bRFzW8%5ky`gcowQ3 zz9SyVf10vk2e<~KAeF75;KUvJzby5LZY~#BCYwU zk$!`93}vM622pxz`8<9+C5Fom19)w=ehNQb)MfV*fnJ|3_FvQAm~pE(+lZ8Qo9WK$ zc4GIQ`#K4vZav0nefeWhY6ANULnW9zi>`a9(muKABnM#FG2SH`Xv~-;zdHb^+X}*3B*T(m1y($(~U^>!-wG$!sFUd zSSSH4Jv`~@5p)v+l)xd4#JF!?NjY+}@}SB4)30B@4l5+i;;ny>vNIB)XJJHf^$1Dl zUeq6J4pWqooF7QZQjS1IFxAS!^3a9SY|?E}cT#YxUKQ;MhEv%#GP|d{1lUB)#`q z0@T((W6NOB3%gwJd1)kqG-Qy#CcPegtC8~|_p8vmurE^U9~tp z29fYDGDjryV%>#!85-@_-uP9osXnqyR)eZr z-~4;@<*oXQ_M6uib929!iwl_bCJls?do0!qu{6@vDo7>hn?AU5SKGmG&S$-0MuOy< zlaV=bd-^qO3vJZ5lN?9R;ahAXJ5%4{^{tz}Kdk1b5B}k!UYhD1Nzn<+d4WjaLE06? zm}D5o2YSzJ49#-4acMYf4ja@h)y{jY^|zdDuyK&GlAfTC!p2}Rsr>W2XFn3<{IxqYsNdg-#*44E4g^%0vY95cCHvPgmmS||CN>F(rk#cMFl*E>(s!8l z&d_#U!`-r^$B|5PNS;ovV5V&Zw4ONGbQ7dkHA&%8ZsD#?pb2dzl;g@l&brY>p>zrQ zf~?kS`p^qMV$8c5c`Fj!PKiqjNhQ4Y=1NB>L{ErJAbU+F_VY5mXAx=?YHY)nTWSr9xYXmsuZO=i9!&Yjo5V$MbrYt91QK`Cd;Y zL$R|jdLC`@ld+bvE#imRLe(dPoxu*e7r!Z2UVJvU<(CrARV&up=-gsE!Gzeq`L&y4 zU&y{n;g4xWKWudyt~bL@_!tS(OI?2QyB^`+YQ7&?JJ`tBMm`hBMGzx^nnGuq`L5== zfAT7E!L=s_NpP$Xsw|r(+|!*kZP7X z$%W95DCaG^TGqI~!{=J(oAIFW5L?|#lKJ;b`b^##W_-1J%X#^u_yD!4(Y~?IF3-?I zjWzUQvNX9mjin5mD|scU7u+Yk6f0SAsX~r4h#3_XwaU@Mz=paRwz*ZB4ZH5STABXOc>i z9H8HVP^v_TcD_L~ZcOg2ks0gBx~g$iW@Uql3w8?Sw3Wopv*@Ac1u{3~<_`OX_+b(a zbfZe|1mb8|QG{pa@uzDVYd%&4EZ>i*P~Wx8CVeOQ?;U&rBCRfM{npG@d#C+=_Gfc>bGN@8+lyekE1F{1 zH=s4(h92AKGgz_xdh4+Ck@y2X8I8{ilMo=)`Bybtwi^}nXVT~VZP8I2GKL)qed25F zhRd6By=!HReFT}|&0L!xwDtGi(|yP-q{pPs*A<){oBPj@1T;8&U(Xy8=8g1mGy9@G z&NwdOf2D+T71R}?!Qtc;J4$G*@R^zp36*}3lCMu_^f_bmQkqa&lD!%crRDp1e(y8? zbKYFtg=9pfwH?yoZg66tl51{bfs4s0g-DmxGmrU=X3H=x> zzWHn1_N*Qzv0J;?-2qPoM}Ng`&22Knhnn5O)k8Bqas;-}qLsiggb0W9X6D9b$SkQRB*f#~zn>S|oGse&6075$TCE*P z&~G(hea#bGh*{!s(tW(?)jZi|8_f-i4%G)$Sq0TP|$m9Iax$o=i zU7e;@FBGR0>G#e5OWWC}zphMH+b|kpu2ifU6rPQbj>ja?@WHb=TRB>h7`cKe-tMJ) zKlv^%UA7Cs%J$5CooDVUFN`+Bk`qP z`1%H@y)0&K=G4^LbjEZ{l6Pn@*vukn1MPA**lBu{y?1M_;aS{_*R!_6D3RfKT;{`<|KNPuYHm zSuAms_5IMYep%#7r^_s5+&`5dmGPu9FUq)lcsSINqM{R@-_5J*#xfm$_PS`gNbR(v z=E_5XyV`SV&GKw7gD2a_J6`Ot3-MSR7&rNBU;2JMqiaJNy-Ee$AI&(%H=nW-QPoMs!;{s2$JWFXypV&t50;JtB+uWM6&Ec=yNbUu(IF;JV9%i1K zjwFt*McYtyy!9v&>S5@@X|3LlUOiOtn^DKc94|XvA9Bf(K=Ee2PM72!fnW3(m@*oX zl)Yt6+)AIwIAf12hgRj4Th5TC276)zl=N5QT>8}FGrL6kim)j2*U7_c!ERxF8@(@Q zFNatKtb{)&@2%-?>u@(qn!MW2VZSzS?U;LceIZayVAElUIU-wzvewjRvXx`wb9pV9 z!xP!znMulCFdku~#9f0>N`8Hs{aOEc+OJ9fa5poyGYi`1+LHS9<*1kXn3NF>RoT#yiq6 z_v0L<+f8s*7%f)~1P~V3`w26fn0HN4SNG(q*{V(heM71&m{v-~%qrw4vOixhOT(2+ zwdTXgqvs}LVNHSL_>lvuG^{`qzQNutbTVIN)xp|Bmgf$p{(G636z$dR<-tCf4v->+kiva zRR`T8Z)-2cW?nmvq96xI-$auF_&2H zifvEK)*{J(pQ@_*=(Zt~3oUFDm3z^LG^@r_T3Svj9fJ)ZZ{GF3o4~z`&E!tZ)s+V` zw-O{dm5%wPKeLaT?bmvJwewACjEa3-=b{3I8{ki&P=Oa~^_FzKLuvPw-Kw6Fmtk<< z{>+_P1caY)e#`;AgDa6!OZD@NVrNlB8(EV(AA@Y)&I(6p20q?}*DYO(|jYh-v#_PxB;g$PRx+|e! z8B>*lozPvpauzEheU@rtrk>KCc)dfJ5^r+k%89rW_Osr4QC#~fST@UPv(F9DW}I1x zOE*_ugxr)q3a91pOOUZ&;F}A2)n)7}Yqvf!ZvZo;6Ge+}N!Tj$8qI3_#`+Rt zzOM(i$iuX=PQH@eV_@zeF!nX=Zzf>RUL}K{znYz*Z3H(i5%-Q!R7^&55|ILO6~{Ht zw2xL^uNp&TS_EaiqRoBtUoal+8E~ta-HG0Mu&5ZQ!e2)SAH`cMzh5E}lzY4aRwP-d z-RgT2fa2OWd=yjV@a_~P6)Us|udcIcjjr1?6;AQ|p8xsLoX+OsOlC`27bsJ69Ypm= zEoaS=ct@L7g1+-B4-6$TncwTmOrgv)wFOX_GJZ?70<+rtl(I8tL+WX}05Garm)hLw zG7$-zWxl4|(o;)=Lq|dclnul`F(-7N8(kOfe1m!=b7pg_tESg?a!e0IQNg-_vbvQq znRkMIr<==`UcSr7$@o(F<$AQWW^yj2e!kw~=a`S*>YXuEw%od0CkyjS>5@xsioMCD z0Sy74IzPDumn{@;pounhtTeTS{jFr(KoR^k&qsrm>(6G_=TkVmK6&vZjGldj>0(=c z^ZgCmZV7LccX%Gw$Xr7!V)8t-wuww>BBwG-mn{xA595dPgY$t1Yn;xEzcF{)=uv+^ zX^d41IRh8X-yp#cq{XB&g*5GNU*3fF}9W2Z73PzWsb#J|& ztUxM3EA@3zR-g`qkg}r-_mni0EWIpc6=h*k?7K$a@WrP7koS;lz}#07lRqSXk?BJN z4ZnWc`kwnfI5>(Qr_)7) zKo6TE3y&T`O_1CtDMZup&!=tg1X?&sDfv$0z29=(!xT^Gk<4;@BnRi;d_P3iIuj&^ zO?7XCcrSh5)#$DIlwB+WBgX09WCr^6k(Svu{!IkO?@zNR|6%RuBFex9Gr%%_Q`yMv zw`hFF4WY*)K((L8@=HI(>)UFY3!D8gCwp^IqFqu+I2YXatk>BA8%tglC)rQ>jaPnc zeO|WJV|2|0QeM>z<@fW{Lj#XwSF!y*U)D363fV%3Ko4U6Be%olN~FagDnG3LDRzUq zgwy?PSZj?rhWQPGM1#1w$`)sJ^whl#BL3x#4Q@18WcuV-W_{kRno~ZgT)f|s&CH%i_TQq7ypDPYe?ulbOGvSh3 z{o4TN)4r*L(Rxk29d%56G$ZUucA|^Z@(6_aTAMoOu7`k^qE<8bmdQQT9ls`f$y@6c z4b_4EA~R)f$MLio!YuoQ>ZiRN-VQW3+}L5&wggYezh$ds?P7GDukf{K0#;64>PbFZ zN<=Rvou75dt)SO+=w+67QCY~G;)w)s`mkYD&s>`*m#dRAUkFK=iOQ}mLG5I~6=X2V zquwlcwp44a*F|Q%vG6Q2yVtKJ?*y6d)vC<+*%lkoT$!>>2y-Kbb#7hGf%SrExQ=;pg5=zxDS3g)+W^^>W&F{Os`G+ zi&1Srh-xzmu=);E9pi94P3RU$Zcp8mo?GFzQaywcseC*^@n4aday2VQN79^*x={ri zRxFERAY+(Y`CVZyYEH1_o#gSlG;*R*sgYfs8R=`{N`2jVOqI>s3Zjf%Oy{Dl^|f}% zW7MB=({kJ2L3w&Mj|ks+5Dki|H;ds>CB4OWk9@u&hI5q+*mx#^V<<}r%Se% z!t8yi8U$LjjVwwLboWQ`2KMd+v&j9>zY6@;-Fm;;a^2<{dlyT=7|g z49&ZndZSq5qDpJLJA#7yF!(_h!Q)$om*lR&S+?Aj_gtGJ(4f}1a36j6a)Q#SM&!&} zR^UxeNh3M+`ja9DXS`RaZpV6&Z$JNQ&enRlk;@R{<_ZP7VsmCBTvI$&M6?&ag$yBU zFXchuVL72|c1QRRxai?~*ZUE*2iJQV7u34R;Op@p0v zn}pTj!RYfss;%)3Qd@(MCs1KMoCy&NwL4XFl=O63)RVAd;p$ss*=tak=&Rp~o8y*^ z;=P@68z1Lj6$-3GhXu<{Ta+D8edbWye{4i3s#Z}P8mo=7e=^7WE$SxuF%u76fER|y zNshz}b$OW`M@mQ03v`5!Wd_K;(NS>#HND%44{V!(WO$1X^gN6FC#nATqp??6ue>1+ z&$4=@%JvBUSWl+k@pYzhj#HrN7o+ri?T49yUai;b*?Oh~DH-2Qs2)T)Su|XH6tWAm z%lha0uYI$-CLl6PY5UG4eF`xM@!Fu55-Mc3)}e3!BwWAQU{L&$N&ga&o5OU2!YsY| z0f+Mt)JoSP*+bnS{kbZ{i8^}43JQfC16b1Itn~5paif_mF+Yf4(wOp@!F2S%6k9^R;^N z4Z+`s>^O#Eyphs(MQtz#pE=a9x!J%?uD6yDE3*^ZjD!~5T$S*&jQ`Z{&R%zun+OmM zE}f?hjB?9jh_@9W9B~mW?^a|t!T)7o2cEVjq&UKBtr2;7^3AwXdh)~BU(A~y3hS~0 zcmh`koMeu(ANTXxH9&YaCvZ!`N?OtiE1rLWlDgo_E6KADeZ09bnK^d~y7&dTk8KOC zk3=stL^T|b36!W-X}TO-cV#kr4Y-3BrjHMXx9lF^em3Va5G*ls3P{PoRc%Hnw=m~= zXuID(yvgal%i|C#k5)?}--(&GS?>UfP>&zU_Rt%>Q|~f~0-pTqfuQ}U)s#I5oRd3dR>tw?uzE)F|25H$|%_X`zt@a>HJ#=vnK& zwNAm{_skl16@Ew&W~kra+wWt4_E~$CXFjRdoVjdfyTq^RKgLqAT3s?h@znEqgD@j_ zuAgj+{MV&lZKLUs`uB4yK~LrX)%bGj5wnl^hTAS?*;VZlGFh*jx?s;Vlt#UuEc!{t zXKtKcO!1Cys#%tf>*zBp0tmsAh7Hv#HYTh&9k_lBdq938Sm+k%uLEhZW zFGF+5Rk^G_>Y)uC#Myq-zhhuJ@E1 z_3oQ6gsNx?QO#GmVFfo+N0qK1&u6FSDwRR^V_3MtRlc4SZvcg-?JCpP?;N{M?rA3b zxO&{y`9|hhIlPN`AZD_h+MfqihgkJ3p0%1{QC~e=pI&=U{yE35rz90E8UIgt*B#Yl zw(XgxGNU4PK^;M_3WyjWA`JaH3Kp7lDFKn*f>Nd102L6WMOqkx6oC*SK!6BQP>_To zHIzU^3=o2VL<~Lmd?C!`t#{vAZ|+;`{qxphEy$PCzJ1Q#XP>>#?}sZYi*{~@+Wj=@ z;1Z{T#3mf!rSOf33dG1|r7@0DIQ?s3YSeOtx`~LVw!s4=(sBsg|?)9kTsgDJ{4#7Ejm7gHKv6g!# zuYPNRaY<%o4yn8k0!qTbf!1;@mQRcE85|r(ZhVhN=9d7XRfe@9~9519lkp~ z>@LR8&t*5gKMnaTAW$Krws*$F(0wN~epEmr7aaRQKqO__nWUMk_~P-~EbL^F&8?6j zum|hTEsxMM^OWTUIsJJ^Yj5vHhJr1ORyovCoI-`*u!yh-t&+~G?*91!~&Rc`_Aj{Ai>K7C+YHk6+sT<~kwWU6T`+!QJ8X zOD%WzO3mjf!8AJ|G3;v?x%No}BxTznrj|imvx=Nzn?Fd%NdBz36O>gLxz%mt9^Nj$?tZ|En z(D9vj81qiD*lV$q`E>GI;P@yp+F!{v^*ob2;ZSA~TJd>0|GQ~sZdgr$i+NU6o8RM# zzQV`(F-GNzc?W}959d-O-BBR-QW~iMx@|Sqq^A+UNX1DZ=MY9y2b!+_aMb9(4-37vWqC9*Va~V4Ik#F zrJ2z|`hv?`%)~{!{?R+$TI4Z+pC+u3s$HA)?nX^#YH;T{Pe?@1Y6=%N|K+Ua>^!sJ z2o7e2Z~A&-;agm|F3R9B3?$ggStl3U%Ht-tS8(aw+_cw;L&HRI+p55qtnQRMrx|6| zVPms(7XmaFlCWXo&0ErE2ezRIEraU84_kK;)SbbVB_$^m7c}_m_;yS$-r1H8<7RT_ z#i5OMX>Glm8zKdbtYL5-+ovh@IXt!eC$z6wl4g z6^AqdAWNu5j8ZpgC`j?67jE%~%#;PWJG_t^#p<@|9)$a_bsbq&tic74r@1i@L?2mP zSPTO<`va#|XDRyg6N6fBuuB_Mz@`kQdq2^CUa`?kFxUWa`jX;W$~ z%QP;}IrE}fS>b{{+o~EFI{e|FbAQp&y-V8m^{1b>il;xDxeQ)_UF#V}sxhJ=_kAJxKbfi!OY6 z%D!;xGBiuR(D}pBJi8u~@*PU^XPwLfA(q*ToF1zZ4(11@KS&1TBw6~n1VR$yUqkF=LLI?|ewjOJfDZCDW=K%+cgQD;HtrDwS!EA$pKr<54~t*q>*Uef zpkq9bE`way7mnl-H&3nDQN?S@eprEINITCB2Uv|e#gjASBC_OmwfVR#?sW5PwI|yX zgiu!fbbbNFP%DQ(hpe1p5T&AENfQGM^&Iqrk_TRD-?t5EfGtj;AoY0ec}SD@V2mgB z5j$d;Ga7;C!{15t-m-*ve*U0Dbu%9AL+E58CNrnFwkzCOeo}Y){kuR7ijHy3S4N5*L{HaG=6wx zRcjR-UU+=$Ts-_?#4xDH1PIRxGsGl{#VPP4RY497aPLZ$>nGW|A(Ok8hkPr;$^GYAB3)z-RGZ>D`4?l9#8x8ZbaqTS zsqg#9xUCwfo{Ue%_vTFehtJt8Y@4)2;6J6iudM`x>KhuxNeR;}9L12ShZ_uJ)GK{G zNBYEk;#htbBmlV;*m1;H`Nk13W4d>YWFe?f^99NNCkVUy z6K`P%10bv%v+8w^k+sL9{YCxNR|I_mwlr)$*1Mx(TiXeq&Oilo5NM=stDMt^b1Pfc z25djT5Y9c1lPK{JwZwJ}mQ>D(Db zPV~1{iC)XE*eJg!Mrc-(Q8#@Gu{W6LNh!nz0f~TS9d<0$AIu6Cn zZ4H-jO=yp0QiJZh{BA80ySaU11{{6h-lAg+_vXa_7h({x#A{>T1~<>Lr4Zg50}n6Q zJseRp*;Hlgu?%n4+@;p8?t$?Xs_EV3)2Pv`q1=2=;cRb?N1B7Z`0Wm6A-+qCg<&Xc zzw&dsLOQTGftC;!St1Zc*xv^N_Q;^m5<@%B&V~POY|znD7=1mtiIF@bWUrknk9}v2 z@fo`sw+SAIMavkQrOKb8r_*8Oc(JXJ0328|*L8~3-ZKgr6AUBN`O#S`5@5jr-^BJX zLeqarga|dj!nq^Qn(?&{0_}00P(2`?RtV~SO{Oa38if1isfRbptG~QC`~k9xDFLx= zKv;5ZJmtb&ej9JCpueCc^_I9a5I_%gephIAQg-8iheAh#Z+L35hAUqWx`rBG2kqu9 z?saHxXmslV+NT0`CcKk9Im{%CEX{lTY>`BMP@$6rq;gSqEV z*GIsVxSqRV4Db-G=Wc+=CDwB{K-4(vxf>ulioeX=@Xzj{y>or{{~mRO0U(Ruzt3ue z>-7q-ORVQrfOfO>>PIN)Wo1j9v z@x0Fo4|w4q71hqXoUIZn;r>a=T-(m@VWR_PRWD<_6P+E<{->rooJ(44D?SdkJvVxp zDvOXlby7#C^+xsI4R1c|a$Ds^5r`26e6O}w@-_x&k1zpEg5jP47{D6ITIcEO>6pVT zEd0XuXbJ)95{R&ZR&nf7egV$hNcE)Z1#FvCTB&8mRwv`kVk(9@Y3n|Q$= zMq;BwOG{&ts;c_1uYo~aN#ivIC&$qjFLIL1O{5#%AHS6E<#I)(rnIz>^AtE5kiB^G zv9!GW#8Ysa{^+IlH&8kmu&I`K=mgcfV*P#1^g+{*n2}e2xW<ugAZ390d`2`)P^>bh3Fh&^E?kEEz8YU$Jn2a!EQnE1YH21h>ZgxHhioyZw!s;_G?6xScTWou{D}D+59WM6dZzNeiFA_DxZf||b>0{rADfu)lAi%@=>Q)cVVoR2 z0vC?kkuz#W!A@jkq$Us2 zLM|y2p8%fSsIy62zYI?NQ)bN<&=a&*Tzf_nzC+n<8Ka%Ray)j)=w%n#RU?Ugud0R5 zr6myapv&!)H0-9;E_qc+LSDs}rHHMYwBGMe$z8Nolt0S$b#@k66UQ^%oX_$24TaW& zbWyAVU>$-c4$xF&VCvd>dJ>b-@_&!W)JW(W9JDdEQW|&V)1Q6XlF(>kOMjA)z_J{C z>B@}IdXL3=V(Nx`RZQK=`kRuU=JEw|TjK$y?nm}u^bx>?7lTY)Wh)X8ecYz!!)H{< zN*;;OI=(hp=_6qB*FL0-fH|mk#(-LoE=4x}7u~%1$0tS6ShrZG9>YJ!7F7p`_z+i3 zXu*t`&eHGg?Qj6#ML^C2)Ch79Ku@*)EuetCRV3e2@gQFm-(Q;K1634!>`m1&*OdT7 z;5=z3X3;z=>;8g{js+qA_}3cxY5ToZav}jit@syJ3qi-r@FhN-2bu*$kgl$#?P_OE zRcGN7)>eZ=g0iZl`Q*g+m=3^%Z2om_AyP1V7|<02iCe7FLkS4!frY!Px2x++{4vC= zG$53*C_k<~TxzDOa#9lX1vw>3QUF!$xANMk2M|y^F@N1dE9?x>(cv@wUYncn4{q%B z@wORdi16r$0YH{@@W8@B>9RhiZ~mDBj>&;~o`?9-m;5bJGf=whPS!Yp zEC7QoAW$cHsXbzA*JZna0FKbiqix$_$z|H^oB1o`Q+-!kuX5-64|)pPZ+qppIj!wlhJ|^BMlf3oQ^p#xu)xu-5N3RPFIb_?&8P)cNT-U}HgI^< zt3TE0Ff!^5WAiEPtj1Y5;A!e~V<=>j=g3tW|)RB>a;IG#v<03{i!4;bs?zNIe+~k_rTnoY>|C?3FYMvg`+x{!0I7STWO<5_&eFc z;YY&#s36(M9)KgQTGPjCziBHq16e}sMKPACBKwl~zF?70Dpg5g?SpeFwTsF@KjhO` zi5?ZqGQ_qCsgn6sb^m8nPyY*d!NCQwQpT}e`v)d+qDS{b|3m{YL%;bp!`=Q)E$7%S zqvtU2;E1o*Ro`>oj&{DTUdY2HuAYtpa5=cViacCJPT?^8vkt5 zVCUULm-8byiCg-;Jvt&)_q+F#Q!V= z^7J_bvH=b~{Rx41UxYvw9z!5X@eqih+xyCUD&WMU>Cr${cPB8EPO#JEb8^&>3`ZEsK0&U8sF>FC!Ytu`gZ!X z<=nTkL*%+HOH{E>k!ShaAt!`bNjd*e4cr5K}HSDpg{8xRn{Qdy7M28n;kb&-khLqk3@Z3BYP+EqM~MJtjGEc{%4+Tk5y zB6OTJghV>y2;r!pk)a`Ik&gp&wJ*F|wU(X5=NF!d!j?1i0-T%(P3OoMZ^B@Ddz{56 zv)4y}i3{tFNe`kf%XU_A)CD*}456Vsh49(%E+o^vR};5Bx&nqY9v(8~^uJsYLz)if z{}}34$HE41$*W{Eh#)@2(wEB!gKqEghelqRV{#bAlI1(ou zFo(aivBx$rZ}Bg(y4PZ|kLD7QzY;7O)2zoN)Q+QuB1h}8Z=6ylLLgybAO;^VFAxX} zLV$u_dgX0*oW*!ftJ5Dd=Ykv8UzLD$RcB_}$)i|6Se$LAD0YjK{}0AmoXiX(Lth*x zBJ4?GQz?fAPQ~910JgcsABg;x$!d$q3G&;YR zOh(nN%$GX(A*kJIPUh=hk%upg1}@Lrc|@W!4behE>Os?)QCg?tZm0%M+mCpAYre@A zQ}gI|y#)DcxM@43C@t&OUew+sG0uFRE340Je8aI(eV=lpH#jqWaOsGOVFxSM zO061BROV$n51+BAWk-5?aux}wkvCI|`11+GS>K(GP6U_QDW?SU2`39qW=sxeTwAu* zfc+ow2Gai=!1mDK zC(5;4?cPBU@;OtZdTI_wsq@`xw4|QJ4uSba=2~%g_qr+eZ-d>t9MH-?!Mu!dwKwn) z@+Y2}@v*U#`B%u{QsuQw5>>h85n{Q&;3G5Fqzuk+a9xNToolQ4(+tt;Di8TO%*{eN zC&iN0QPi6Cd?s0$vth1F%J*DYwdkwqDmX^4f7TeUmv5Ft>mI+2AhZnyp;)gZ^pfui z-R`cX)o91b&aIOW2*iMdUOH>h2gyLmb*hUTroy1Jiy>keDSrV!uSI;gK%7!m#)xio zr>C0A(LfLZgg7yO>yaw@N`Cbs1kw`9RZ!928mW?xR3Cj#*Y4XHc&qUYcg0e2mo&ws zb{@Mw62kU$h*e(gYYIJudoA5kAJ?UW;KD$29j?@nK^5E zGe_DpSo75k9B0&@RcYZ2d3xz2$gS~GT|w&;<4odsxW|TdRS9$iY1IWS*0GS*Dj4qT zTS*NO)Af&1t}%|X*&yP0vU~G(FZIw5%w~r~3hQ>pxdP8!TZ=1FacZ;1+7!;(xNR)m+4ay*_unYqs{GB?f4;2rMTD~{fGQ7AFKdqoSApx&CFF#MUxItce-oviFgG9oj6<3tj=eWVX`+!#45hdw9JERYBN; z(kj7c!D+6@%AwgBoq2r01_RX4NkK?jFc5X>3J}QDHEvj*PwPsSx*&sHUPeYP+qjOF z7cTw9(elRzkQwGCCIKVOf)@;R7)l9feeGn+M4PGn(Y3WT=b-tSeuJ)M_l)~!6B83! zx-19LOQ@ZB1Q0t~p#0;~m zCmD+)_e7iWQ3$oZsm%N6B!+?8EQ`Np35rZwZPAQleaXyhCZC0TwLZ&r0AFWkB5jOT zo#sZI(2S!|sSzttVVuOhaWWP)Q#nT}n)Cf`3kj>Qe@AL4Dfg)b`FG)*U0iB_iPP@l zS)HyH9VKucV9md{I-NuWPSlUH8Vugnm*(a_ir_>YzF;`I)~uRkGyyU~R-{VMr^@o_ z6~(*`<*iw~Y7YXf?%uGn8sX9FUV}3>Hd3(brVGKLueF0JnRB|jC^{dI@IBXC4#_Hv zcf5NZQTl9qsH&=}y8n6)a5Nwwkn=8LiGcGtt-4HRPe=mT`t!5iyW{Rb01_=sOya0@ z`sZ=Fe5J*KOB);77W8qSjBua!nx)24LXbD*2_nNA(C7GbfJZ)k6;~NG^7B+<)OoD} z-{t;!KqoHE-y(4$8$mKytE&y7($h4%Di}CvY3UamHyz^6wyeI&&_Uz;SsNfjYx_rG zYP|J4Jv}ornSeHA9r_$C@H7bImAlDo!n*8{t&nTRoAVgZN6670C9WOxSv!UD>yVN-! z0H0B;uaDb(I+r1U2q^UyGkOCov9*=!EMtQPlFeQuN0P=NDR6}o=da+h&cx)zok26m zaU%=l`L*)^uOf5(ROajWS#!OBWc`8o6dN0>=z~JqCY0frT|8i_14P0z4y&aF#!5iS0l} z5i55>E~;(%ovS?KmF_Z(22wb&&uQqgNT91Lxgk;}juHIf7fB=+~pf{>_LXJB9<5+Pc{Vi}LaO(!!z%0*L-Xx-VWgtBw|B=odjMf~< zl<%vWAH@T!_Rh4+x&%3}t7$VurZ=cMVvwiLHu+2y7Y|=Iu}NYz%aj+q6)HX+wiqtg z0@STyG>HRH{){SZj8QW*IB5RaGl_agM9o8<7z`MV34ma3W(GnQsOMEzR}TzG7^tB$ znA&ohXaNwuJ5Fq3K^A2kBt$om@I3uUr#s+KHCiA^GB2acC=Vdz%ciE?ie(_0Sb*n< zUNww?^J4yZrIAWTy1}_=UOBo9#CGjC`{lR`M0r6|(?eLl1HxaQJa5}@Y`g2Ir;VVi(C z1|p1`)S^8KxhfEkmg$qZnq+`ZI`enfW{QnHzM#q&b@fnLFR6fMthuek!1K{kPHH+M zFdwiiBS7<|rsnOgkl1}=BO{e#V`IDN$6Oqo&6vSwvQVqCjBzUOKFCFlUohpo-EXLj zCU*n3xW(){@f%}>8^HLd}2t_Os$j(86hwMJ}>U_A2D-(M{H} zC#$`SOPYw=9;PB^%#fqejA!Umy9EBhRL8)ICj(X$QoNvEqOHpgNvP6X*;Fz&_y1I9 zB)PIqtbHw#f=68m=`5ibN8E?DwWkP%KykX5)s-8Zijv~ucJ5q;n|`>*PMvwtyKCyF zXCVmil_NQC&8c-EY`I=+0+n)#SAal}MF4n7Sp5R_;Cc&nMxc45*cHP?0s#jQBumcRvt!LT-vWgsBeHUo-YXj@Cw6nGK&D1h zj;KkJ%@y~N7m z)#J|HdeT`y@t=C(R6t#cP%^ubtEsA!XUU`mso&aq2xW!=)5Dx#LoAp5zl*h2If+ zvp0i#Ik!^M)YK&9_koi7$K!{a(0I7NXM3na@jM`|9Lph+X$qS`bWIDQa^KIE$<7`j z!@azuSgohB=9ah)<=9oFzS!57C!+G~xvG8*GhA^T2I>h=d}@67llO`BMpdfmgYCZw zpw`I4!%wUL(3zFHU5XQ&2Q?u*CKpr$SDx)~(>x}X(V0=J${BMSN_>fM$#5(9Tt1!I zjvVV>HIm_Ro2YN>PrH021wn#Vblf5m2m#cJ@ifGXU&Ui$yCpYQtn+C1*0jXNag-UJ z&5Ahgr+^D)HPiKc5IJbHOtawp!omj9X((L01tbyqO6=l{ zuk|{wuYtwkFr2S-+|)?y<1*id4DZyv0yrFwn@#%5#()=AOlN~A=N4)uJQnQqgl^Vs zS;FN>P^NBZ$Hj62ZANY?j~kT%gz~4AaTJM!(JM|=k~)#N&=w!*F3VwwsI#!L=Kk~;kYj3o<6*?wN%?0IzsG7&B zr;UY{{|j!-1EP0keN_te323`Z(I?-GmXnMeKEhZ8bw4XpozWP_VMj>m9jkM!!18mm zKXZb^y0>_Afgo#Ez0n$#+H8)aZt!!+kwq$!aWK{Rzqx6bJkaKBq_)^Lz{v+$64X!x zB9ZUe4^XRtssZFHXMgvVWKUAp>Nh$dqgcDnpyc0`;$PJo(5KwLI*wF^fh*+e9?MF3+I({t|G-lqD>11GV&;oK8QWM3VW7G?R zWRlo!5{X0$S)1**vOd);E(Cenvx#c=L9x1yB5gdne!meqzHuX>tV!^+p^D#v*TU)m z#~Y{KkML4!HdqHu5eI|aEk06#Kh!m<#+(2h=i(>h^rWyRJ}W*McuBOC!@sF zm;0V=#{kPESiRwce6`<9NBLTIb0glh$2%8$xSbzAU6hnoLA--z`H>vacJ~FB{o4WW zmFCdf4j`$=P?7ds;f)zO7+!eHYd5<3Q45p>-8I4oJ5r!c)wCNUnvXozr+}Gfz>FTXANv*-sdNO)wljP=K}Bpg&Oo>Mp4+q=CT@ipur_SimP#BnT3j1&771T|{DXa-6o-KI6&A;tHH?IRtt_&W;<4 zz|-{Ci^oCtqB=1Vj~rpF$_ZJCF@HDi1_x(^jzumr$;^g4&{5$g9#9jy0(o*l01TJ? zX<{;j!ztU`T?eg$#6&e^kJVvU3uZp}?D~9n5C!0gQ(dj}#>^qTeL-XH$}14a>HltO z|DV;Je{9S^@oJLPH*oojh()TZBws_k|CD5a7>4uHl`~g=AWj+bc!6v6zWxENc9tem zl72bN;WGD%oG5`fHOS)&n`hrW9=e!eSw-mOf#{q8q5D{A0}MQE`tlNANaHcc)2y4I zi=d- z1PNnYOkSYa=}mJq?6SG%Xp}DZbtzd?D>MF3z<4=0?Kn_*n|e!1MZYv>-UFejzxirt z&3QidE1*T0uIEeGz<)(5-e1gsu;j^nH0(c_mO)r8CB3+eCN(qi;W z=jUN-Hl}&$b{L^qiSE0IiHYHyj zeljcvqvGNb(Zt z3ylAn_)q(>B)UCxv65@JzDo5Ks||Inl~Q6WiZUw3KXz1WW~ys}$$!5lbSwjLJNlWG z#Ki0iJGqpv?=&B=D37OYnK^K;ewBxtYvJ}dL5Sjrkty*SUX@bo_5AWhJZp!P;&^OLNf?nr)s9VCZfBRyiK|G1ycI4 z;5EqOHZGL(MZtW;yKqYy0sGVN_oUIG#ug1i56@%AQ?hBUJFa`EVJ5ONB7p0YDhCpZ z@X?y%WL?B$oA;2?Gx1$6SE?vOeD0q2y047xdD}3#h$a1awzDh|o-BM8*GbWhlSenH z)qgkraj0;+;;v^O=KLQnV{XdUzMrx0j)2XK*D1(X-W@z6)A*-%i44_Do*bDp#jMX5 z?wB;;i+Ome6Rtnz!nSZ)up+Nv&ABmUExsA0ZgUk1nPZWoD3+c68z6GS+&- zZoN@Xkh~VAYVqyML9kA(&bRN2@pag8Rp?#S_rP9sU8fB>Qd`~MD|htwZx`tlTnK*t z*~?o>%0)eq*kQNV(6bG$e`=i#C8{voUcL}HejFWk73XX}npmaNOmA0xWygi(i+^pp z%V84C$KKfHY{OmN@W_>o8(*J`3}iV^;}-60iE973c9h#rUu~QX9_7-Es~q zzr_Xia`EErCv6kSDo2vcN8G%fnqbgKXn5{dw-we3C3ImduvP|b+VJCkmB~K%&g;t; z_$ur$&4f?TfVUbrN*KyruRdwe;$8(g{tq#6|5RJ@x=RXqRbv2v`OiV zodV8)Kdg;lc74CR{61FeLSioON(;PCCsLOg9fl>EFD{i)U_`UpD%JukPu+;=dj zhoZpZ&T7GwJF4-+Ry&7?x<^G+Z_CDOqm@g9-3WEj$BOWQWAf;Q#;^Mv9+EW~g64m} z$Yg0#sN~AnDvWU#)@5=2)yu*2U8_f|!|~B$PTK>r(iyu7tA8w;ZsVrPi)S~LXI+hd zepS{o)@4CwOn%EGlizW{^=wLCO_GS&`Fk*_Kf>kYZ916#rHuybGr+;ph8sj0WbvyFc4IfRV7uSsuN$v-Vt#mli?iyi~|H~OCI ze`;dGXtt~YVov_I*35}v1lm6!1XhLto26c5EDfx@xq?qsTl$^_<8t92QCK0Z5lW8 zXPm;ic)a(?KsFaZv#(V3h;HAFgP&0^S3erA`>IndTs}y)R8?rhu6@jL#QU;MHGcTZ za8y_reU|B2s8vRo9@tAD&N4F!3ras)&ee5^2b~y+%OBqhKn9h6d@nKtk>y>eSmDrR z?r}jRjuQd&&(3#PUjw&ijUx!erie~|z#F2UZ6+6M%y}bAm|ek#31c(Pr!5kf)vjLg zDa|C>d&K*GJi$ub8|=jUfGA?>OT&IND%2!wJX?*{>lRiY_6_W771W3&?n`e)6y~c2 z5ud4yuRgf}06#73gqF^8*(=<{lA3j@Me)3vdv=X10FqQc*UBBjI}a_rY|EZdw_3#P zQtCcS{D-!sc1{KxczlT+=v7?)L^29e~=8~|0?kZVrcA-voPKlHXOO|^O1zmKob+cx;e zEMu&=+1XikMVTb?Z2tKpqvO^iK*K{ z-j$b7-nQ!oyN(>H#`cNr8L~EXr7gEcBwgRX>eYy71QFQWT@ecuuXB1+@vZPa+ZV@T zpXt(mL~H87$HLUpRg=AwB5W;Op?D?8jfttjw%Ngy8gYt(?1L0xxm={m6(ZyDjYJ)~ zqki*`IU)x8J#ckGDj@42i}EATFi_cMcN+*$UC;lI8e_3E~VBLQXCxjC5 zJ;EtRi7rkK-B(5`HG>}XkkFxG!iru$1_V=>GtqiAB`d>GiR~3N=FGotc?8_?8MVx; z(N0rkNOaD7rPtUs&=>yVU#~}R)4cn>R^Zrt#qpjxud>oPu$4fl%Ro#CJr%=@yux1c zVD8ae;>%$DDSe8*d$Efxr!valP*A(WT{C`V!rN{=2(zLRUlpXvyQXZo6uOPOdsMUt zU+6*nCfPpM`Tm~i{dY=t>|_ivD>^2Fb5NMc8*0Vw)GvW!y%sLY-qN(y;+bF(C&8FF zTi?=Kk>t+~VzWo?s;I5LE6wy!I)W46Q?sc|ou70y z%?U==5%zl&bMe~ULZfz+=y9c1n|3+XEXJ~%W`JM3ydryU zIslh9;{l^1gSRD`v&@+X#wa?vDRV`$6|&99rgz)AWAgr~Cu^VFi) z-7BI-HK9G6eGxs4+^w>^gs`Ne_KY9tjWZ3I>gk@yDq>*M()rAF+sE(5Y4uqX%OC6+ z2?hdjvrCRXOluRf*!lN|qKNy#mg(KX?Qb7?qXK5w%M%uvUKB}hzfJ?^;flxSUSUp! zd@I2C6Gd*gFY$BUU1_SN&NbJXC*H_YCAXe3I*EJL0oS(uay7Pldk^W9WZUZ|S)BCw zN+RV{6f;Pz`3g?DpZvH^b{`P%+SOJ#FR=|3q@oSJs8rea0n%nu55*u5Uo9he?Feyou#GQXDc-VKaZk^#hHhP(rf5<%&2oI z$eFy4G~?BU7YlI>u&>)v)8kjxM-olAY>Z ztjiW84{v}w5DM~#HrnLRDE*v6!T4T=D01yP-Kj8LJr(cFHx~&D2n?DW?NuI3xf6}~ z)(oZ9c$~Gl-Knj>V~+4}sQ=d8n~v$@amEigNxsck&K-k)$@_@(?jglyRNlZn8jrg= zEsig3rrH=1V6YBRosY53YO*WR0JsfbKj=hpA7xTBAO9*9!9`GqEwaCWO z>-p!-s-1P#P?^BGw3_9cc2Qd6%qud_p&_;k9KRR&$&w#1x!+8n^k>~FHL3-by1xo4KizP)qfd#+uN9LZR}S;4E}cJY;Tuf%1>C?PxM^Z zbP4naPxt7fx8M#wCFI2TDJip()DuIf?)PKzoI{2`#_Rqt6Fxa-!NMXeP;xZ(7wu%O zJ)>h`WseUQ)mpkfi!cxJzGoB&^Ep4irNRy_rsAU+_&qkzFmqC(Bm;Ho{rY)QOO4Us zb8F1?{WrU7S3ApZC-06j=!>`&%yA%T&lQVwB-oLTI{3%G!DphVNmr|(cmc=V6H`mt zH%zetW&N(LEM@(S4|jdhNw^3{e8{7&b15HSW#!gQpOS|>7-er1C&b{eEu6Z;G3d1L;OkBp1!ks$yL%ONhpamUrg0j-0M>VD#NEigjvP?C`wt(R2CH10YHh zD*CxmArXT-TGls`6W6?ybl1@PgjzNs&pe>nO{lanUlHTwV{#&>@~jLlH$od$O#UoT zc6?b?)=Whq260P`rd-tJa)cKL z;%>*VmLHrjFBC5`Yku*kTuR4W0Z169^!*k7!jiHiFrKa*13c_sPB zo}dZ}9A3V{9V?!{$GoWX7%f!W`$w$Ez@*PTld59rqeC#LL(FtZXnL44T3Mhrc!zPp z8BpR7N5BnLFp{r)*ceO z>m1$ViQ5sRiBHOHBU1=;E~avwbNL?DrC!a}C+)1)_32={*_d=}K~6b0*$(6{s(2Q< z@lu+Q%IT6mi^3x$n8xhx3W~Pmbk(qnPM~!{`G=+FwwUvt9{TBB#7+gAbh4_C+Yn~& zRO13n^QydVDdXGJjRSLw64AB~Bf*~Fvmn^YuL1!f`cGkH;*QhRz&w7@P)T zc3P^KClg*R|v0P3S-PFdYz2vFUMRx!lkdpZhkTnwHR=<=#r-5v-Hu`yP369#BS)4Yg zIYqeQuYVcGXAB=h`Ptf!UOpb`Q4ai=HdvMCLa+Li|>1%#H)KmOb08 zF>cVCuQ{?-3B-Nscjnm3_5pcfCr1!jvtM)cWU8HP+l=|r zX)5}1BPEiS`lXX^KjB2x54LWsZR% zL)EIWkkl`h`vvP#`9a-*Ie#C0N(ZYXp_K4|3FO*Fn^?vA~+P6(%s5P=5G$`F9~L}SLMf2(%9 z&nYUsGw<|Weo&7*-VVC9R3jQ^u~iT)a@8|^KQu;yB%=^`TzQd}Vj$q>JoijT?ou(P z$T>*n()e~8%rW=_46_&7=d$BU6xL;bwJ_~zQ3$-0$Lc*XqLuvky38hLS_gra>O9o@ zQT!~eN=mI*+kfz4f*FG(7Ry)L;e-Qp@{XTqewW`)i?xxDf)+vImmY-kqdnTQ_Y}k# zZy8X5z6)e6em%EsN`+rdW?QF9tukXb)4%sg14UgzakgZS2YxR!;X7zG zJ(I)uI4Zc6?v;akCq86 ze3fbxR^!rJW6a}u5?XxfuQMIZ9p_B$JbVL#_Kpqqs=ut=hS+|{tQb+k+{ftzrBF-mDt^MfcH_A24M!O3+ zrqknJw7{pf_02SNed{c$xz1izTMx}2RakX}gql}hX39+lw|sJ~dFxFpF#Xg}o_^3n z(d^i`q(k@DaulaGM$@>L^hrRD0!%DVG<*;X|7+w@%Vtu$C>ZiQ+O0V{v(jucmB2tM z@l=yROUjrO5IqJpCB8u&wkDcp#GQp@y*pv6tMx{ElK>O8S3f^pxSrzGr*!E4;wQ2V zvhG`C!r4TrYiJze@yvIVy}7hRbEb>2h3Fb_fi4#K$ImOU-XX*!rF?h1jYH~i`P%+F zuU!I|TBqm8WnME;%;hR60MaM-rq9gGbNyg1)}{B`aA7B$m!oX>CiDh#p*t&JmFonS z;yCFKqy>p7kB-SAOiG7are}!*$I5eRGU>HNMpr_+!~9dyLaEPQAtyM>|FVpjRKg`t zC-BWjF0@3`zKJ}Xy|wM&{Y5V4>rd}Ilu8`vZmfO0VU)hZF#3e0qZ{^FoSJ?6n`ATP zg3F`_X-yG+LalYsMbrJL3tjB_9I=v2)c`v*OMW7hF@frB9*o-NE>>&Z1Qi`eO*GH+ zc0CvDK%N-{STh;+qr-tc4eq&qV0>*mHWf`2U~ck==eyT;7^1d=wH!r){Q25ENMYWb zyc{6v?}20A5HodjaCNE(oc-Pv7li(-;$HuF1M|_-RN#u`#)L?YUK%PS;p(A+w9nV@)MCKU3# zlO1z!oDl-L0goD**hlfFB*X=s?=G2&C~Y3mI5d8`F>yRFT?QeJGo$r>I;JT0uqmrN z_*0w@C+#FHQgKR1&-Tti-nYb^J?+W@adSZ`r|w+g^;>!+_jibDz_HB9eL=N$2Q#$z zp&Icse9^?6c%E2^(`<*Kz!s1*ollEsn1d*}c{ewOTcVu+g^92G&n{=4KY&1w@4qER z{AJ%4Wk-?}xl(gJnK9)&Czt1w=ouL8s~v>KmyF!4zFHeN{AX4mn>TaBqt*WtaX@x@ z=~8HW4f|)86mOWoSsdSegUXioiFn!*ZxhR!g?l2*#$PAh()qJh_hM2IMQec1@qH^JGTLXl$I?Or~*uKIB3;zy{zCI)vf zVh(h7q8Uvq>)Y}wMh7o1|2YQKj0k`J3fBySP-v4ME@`b2D z>Tj%Vxwd61#2WL&6tarT=7(&xfLuf8WbM2bnY#fwcMb9s7I$eO$92oaQl0vpCTm;% zd9xvHgXo~PZilqMGkvp_*J%Yw32R#~(yc38GO5Fd1|Ea+ zd)_=31d|;8QhFEnpqXQq%k$Ljj&oJC|Dro7@1YoEhy5RW_Cv&R$&+<1f%+m0UL)F5 z8A!du(jC!p2Y%}C)TkMEl<&_Eiv#hL6^ilegZ>5i5v(&`qGu2pEwS96oj=r=!YIR9e2~Ed0jZkE{D)celj+rx2^IKm>GPE-- zk2bv%;U-qUYOM@qe z&~?U+PG-X-q4TLr4#Ylk<3nl&Zk6CMHR>Hr#dP^b8IPBq<&-S#=8|y?%%Q0*38A zzp1x9wwSE4ZyG0~A|fIPL--?3K(6YhHNudxlG2k<(FnX*VRob?IC$dMS~_9S`PgA0 zs0$DQJTSCjk^z)may&OT7d##sESK5zGtZD~+lKfzzZ_N@jT;;s?CqWWEqY1GxA7y& zY-}D^?vD_#8|@mp{c|NDB4QuDlslMnE|~l5Y22oqhsD9&!WMXIYU$mPwzEMM4YRYh z$aZ-!{-e~23Pp#;hG%5k)J>iJ@}4}{5SabDaSqpd+&g-}a)Yq4>S{9|XRr)s69Sb= z1*P6Yv4)F#cW8loMMY+NzMFxyT!BJ0x5VE~OiHp+j?sI7&f$h9xY728_}0e{0vHv?-SXk%UcagCHn{f?#MlX_0LXC- zEeS4g0;s{=0fUtRhrk7!2qK7A;C=$UeahXX@O01^pw52{4KU^3hX%umb2kutC0a||7fBCvu*adn_l$)C@I(NxT5`|M;qhU{X?+vq9E)xPf6Q2 z!6R{p!7Ik#L5H6kb|vOvX?RqMsd?(!dh8k@<>*n9Y?J$9%M{W_9&2F}w3td@6}s@u z+iqOA?`aV`r?uG$RH*}Dtl?oM!DK|!&-mmV9H!$tQ|9Q&Y3r(vaeJUg&ZSv}!Qvbw zD4(k7$%FkNrlTUr(ouwa`A7+2N=i?RqD8Cm3+jKLJr)bi*(VxAo*Eq81N}$+ac`Uy z^(z)hf2lzG&Y{Y_6lK`NYZST@XpBfQU|HPKgL)A5$Sc3AYISu!w4lZ4Pq0WCQ@N*9r1|n?!#I0vr2>mjkoVQX>ImUM@1uab#Sk-2SFNPv z#ge&?YIA)(BW19GK#~%=9p|fbxd!VZMfsuw9?ZYT{ZfPb@&TO`>Vf3gl#R3xaEeL8 z>V&kbbVAhn0hvmg02dRmE*tj>7n1)*9sbAF+7I`dS3ANN>UocZ#=2sI3N}V#24gdt zJjudiH8zc(u;<$q-q{*M#mO+Ao{WZvJo-%$(u7#`t2rw4C0o^d$-_w+GLJF?{9!PE zw{__2@P!Sn+4v7n29g|7iprMh54C5zq_lT`=(}6dIZ<+2y1)&Wm@OqqN0TjL3&I+z zI!l8-a2G0)11p<>&F(3((rqj_lZxy|AHIT1F18KWxG_@X*jm+_R*%3XPW77omixg0 zY?;dWxG(GXW@o%i?i#Sqo!^yGO{umNyxnpFr@MeUv|3VQK>zt=^4tEEsrTwnNUraY zIu}1r{Me}2eaQ)16dV=xKGuG9bk@%(c=02dw4P|RJ95-;isv{`6uz(>&inAPhIFRm z<)vX(`$1mXCy__Czfn^s+?pmUX?wb>0Uro2r>hVZ^t!eG4({_V*wG13?Xj2lFT89i zJ(5r{7e6)dS#!)NdjB=fW1sexN=iy%=An(H*O}dE0mBL5yIr9H)meru@F-#%yzjG~ z>63H1ep~;+hl5Jzk3Gq2Us52N3#)6cq5HEiFS_BWstS7J0!ZG4SkGuFT)2iwnfg(r zn!#ddSb4l)`7ezbrC8`2$%+x=hLBx^c7Ej`Cfjrb{m~t??iL1w7dFjk*k4wE&$|O%2 zG`#9Xp4M1{lTH!-+o0FPpk%ZRPJ~pwJl_;ey)9{0q2pl;7;u}fSeG`(mTl3V(db(3lwR=M9EcNq+S}v;>o;pa zvA;6dM*~dy$vj>&<|9j=PSI!>tvbB;EIn~A2$1vN6Zf+4>v>||n#+$6vQI_%40cG} z^^FQu4N8n6K7&D1zvZg6?=horb;cb%4AWxq=v!&NXY|m6_~%%X*NC<>>FAj0e)Vd9 zDq`gjx;Dw+r|dqE?1N!GcWf}y1446615w9#S)t;;Rl+)$E(W~EO904mk6&MO+KH%y_ioSb{Q3`2F0ZPRhaM5S456& z&Y#eyw7As$*0jxqtL&RtLze`z@36AWwQ6bpSOJMH1J>0!t79P=)e;`=YY>T=rS@Q5FZR*YBwj{!+ko8@}H1 zk6T{0DZ*PaaFkB?oQzQ|=~aKBEyZUpHZH=Y#__M?YYDstY0C9$?V|C@03&wU0Zg;B z&ODP_oOI#7|C$(4!A=k>^IQ>^YZ`BI8Dm?5b(!y|&>n=1nc$xE{$9r|aAyPSLOMk* z-OAhldG3;JzT%i#Z{ORliq4hZ_aQTk7a+-AM<+F(t0mJNi+z4udBVq?fH=_sZ@=(} z=-T2l(z9-hN#}P_98!DT_cj~eKDtU)a2l|j2lK>Jv7}m)`(qv2+k0Iu+dBS$Zgmm_bBE4<;ll7X=HqYp5>A9g$l$+y?D-VYVgho`=uBMi6`K z`$&zuliE8amkdGx6TFUAo+-lHmv}RRDIC*EimLj>-zoKC4qio~u(RDs1edaqIoFYU z^r$CvAnX=eC|ub5$_7rW8GSE*JkY0J>7^d(`~&D%C4q;c@6|3)J5c-MMgw7Yv|ngV z+}x}OmwkZh)C?`;?5k=iok0u_dh(kQS;F15nO}yBY>=&Xt-*alQ)H5GmQ%o3V*q{#J-_ngtT`WVO_v&w9UuoO z(S2}r_S5t5ia}x5Zc4&!{X1f#WABi-1S`&{{>tiNkM#A6v*G^B+i@M|{krhJ4EFQg z?Tx%;gA!^VfR{WGngZMmOWHLDeBiflSqduF*gm>fKmGkZiKI93!>LJjpQgrl`0S{9 zSyk!j31UzI#>T@2)AKVSy!hb#WgTAA>EUqA>_?r);U6bxR~{XnDeRZ!^7SJ8{CnbA zwRGP`HHB@zJ;c9t<%Tv8bJ^T!wwYE^Q#MoAJNb5EmVNj#E}YswTbx0BF24|kXz$Ap zSAOQAvfP#UEzOrjDG~8a^Eayxn>EVWN9g~DG`PDvP5wcovn9`ODue)@nNN8CHu@X5 zJJVaCK5`#XsH!-iTISO?soZ{0)W{V5p(yCNvz;2tQ_X4Q?w_eC>pwo>2Ge-0J+DgB zPotw6US*!q-xD@y3{cs}-xd=!7@9dA$ma31J3UCU;d#jWue9t=Sxd_*-%%;OPF%fk*he}iUfI7@_19$Jw5XuC-HymX+XuQ7#M3M%9>twvI(&RazgYU`^6AryIA*ZbVIlPhKhuGV@H~L zt+lz|hGNxBv8Z7o{V~FNy~|AsgxBg+nnSK6b>=eNUPWlFWx@t)+heONEm$Tab=>GC zP9IhB_*TTni@yfXN+HH}C(8NsEbE%^58mO~^3h=l8-6HDWYY9-PZ&tMbZzb&iTGGuD7P#ndGyvu7 zulk6~h`1Hl|8{-!Ki1p-0K{gcv)M$6Aui-?DH#NL`G2auxVip63PV*h`GH3wDk{v+ zd67CTeDDSMx2o{}Nr(&a6giuWzdyqA_J8!i3x)_I3O zS!(g64xi@$bS=xB*4?H|`+O~mBIoX}Z}8f$HByDu=9Lfm*1=SLmfQyFMq_|-+0btJd&+OA~-;FwfszQG9YUD~J*Qx|po)xha7({pO| zv>Y>4$OLyjta~!YIj7gKlLUugs1(jh=>QS!{3@4UrAfZZ?q7bFFL=9B_eYe?FR zkurF|xBR@G{eo4i^uwf9PtPV01@LG}^%u??`q)dOTSfSLSIhidxT5nhI&lx50%LF+ zAi6RMFm`m>StXowWk7plMftl zdoe6h4JTLihkjk`hO?hjYuNwQ-gieewY6`0uLZGy*M^FK6|A7rOW;}&5m5m_dJzy3 z2t`5(5Cs(x0Rcg!BLY%F5eSeFA|fJPTBrdebO@m(Ktht)2iteQ_5FUc*36neX4be^ zE=bPVXSa91?|%04yk{W%b*6y23o8UN#O(^*BE`nG#!TBqgnRDO6e4~YtR+$PMbf(v#1^vr)C|BPcl^V-K71et^a-wcTCf?w|Pyd>~ z)`Zo6SklNtb62QQ_~S%$B{@H=RsZr{{+3631RRY|<)4@$Md_*BTr!<_0`zm*NDq)n z;m)O0zJy+d{NlHx<-yvvcLjt6Bt*5BO06ShPr}9|Hk)`)G(BxjQqN{-TFLAQ_FWzh zo!aa5sG07VWnZ^Nrj;Io8GNQJM)4A-ao&cxMjjuI5{#?ZEiI(#lY82SVANNPtpD)x zjK@|l!#+*#M{j05YkM=aS#m{cB<_+(p{ERm#(o(YwLLPsqdlIwVi!r~osP3ZcxWdb zAnX+`h3kx(aKLJ0SY8C|B{LH+r}Q1XS-2C`RufDkfT=)Y|I3gg|^geo6gU);{8pqH2Z{n@+ZXp?v%vCFGbLB`Z>{*1ZhdM zB?m7-mYSgV9J@u7?r+HmrIdzRxUvao_MuIv1~utFRIbxy$xmC zL^}+`%akFIZ{uSAw)W$765SL-w8Bn>)b15=9oU!_+DUMYvy5Lksnm+a>X||ulZh&V z@XhEBYwfHAJ!4hO63b0H%Zy2x1#{)ifM*QvW=UefTL5EZ#v70v+rqgDvNP0qTSCk+ z{rU!9=DLRF=%?Hc%kQ@p0vBZmmW$4w5%_^>F!7|pHJd`z{(@6%VLswjVxgDYGH#!jI?&x_Sc}?Sg^*uz zfjJT5@^WVfJ}_`YaVIB0RS@5@Kn=l;0Q4!;Uv!qoDJO5&8=mKO7!`S2c-9o2CL!Fl z+z_1!^U4{Os2c=e&;>$uteUkcd6>f{ph5s#GRV7&%G#%jpSV&ZeA0~Mh|(By|6bw{ z=Pz1MJsWt@)1}6*&vLoEw(1))w(qgWvBU0e0&c^>9#O@ zKrF^W>oM6U^hJtkKysRV!_&yXFdKsNBk`sE=L?TA{5ql78O*q+VzeiMj}DH=NyYw! zNfGf*9(cdjC_r?#BGK9Lgm4^j*aJPQwzY-da#+ zEH?>=c6>cvFvYzA&Bf|xW_v}&Q-gg(T%(rX@e*{Udk^^kf?3bl5^UufPDmaF>wQUU zubb7yninZ`nbeEpeVUXumeZA%7+ajOjQlaX`1Y^&GFs0+)f&?(x{j>Ltc>n>Eo|Q` z6I-c?I_#Us6(LeBA8`@#l)3?f5ixh>xO|_S0Xw9Yd~-=Pa2koDSGugp}ZwPP5*4lB?+*aYo;PiZYZQxXxIKV&S~>DblbL{Cnx zNAb1GJfmMmTL#Tnx-`Ey|CBQP+NtBbnB83L!>>4uMR~=T__h>;YW$w#pSXuOPe0^+ z_5K#Kc}Bu@iF>bBbJ8s8RLO}sjS$&y>2sdy`=k0L>MFu%_F#|qOdHpY(dR}}?OZ;5 zDH{UI#^ISf`ZQoQOr-nxHXH$}*+-OZC|!8xO#gM(Ywz-BBFvupLOWB1TTTJzy61Vu zFOy8u6c-I}F}MQ@0mB^m=x2#1QcG$jc5adA8B?nW_Yqxs;~fZk`(FUM4wcq8!dk*ZL%c<=HE*`D($HwVAn6#SZ8&& zzUOouY8zpyAf{9z*7t|h%=2(%X4+p5JwW`V$)ezU_Y_yxJ+=|aRx9f$eCI^ zYw0PHP3a)6-O=aH)U(Co_MR6jS8Imfto_US=OZH2K7QC!{JQFEbO|5@ipOR)y{t^C zP*|S-_m@sIg!tb7Tl0Y>)lyew-7vnMjl8P{4j{R}K;y`=*Cyx;{rS>wMVj z-%}p8x#@hV{NCt5XVZvQR#dwFB9LxZq;q(2e8UA3mM8+-Bnn39F41naX zJPE-oQR2(G;<=`JG+ffABr4=cx0Zp4yxZE|!8bdN1{cb)g}bE~omcLB12qG&sZ>xk zPiB|hJ1l_2>jwx{-HCcxnIYS!M-G!J<$s(SwfCJ#bH&9t5Ge-ouPVFc9Y27W$odFAX0iHzdWi&xtb!~Wvox<2N~_$Ib=xL zS`Z5}2Kx>47?`;vg)X^9*)kt;SAKMlOF5%jvi@@LK>_%WKgeX0k8>U- z_n8@W*RO-p_mr!hjs;BEXYA0CPX)1eQTIosLB->yD$H)ZjVE^O zSuZ{8pdzZa!_HiLx_I9{E1a-VjOB2~Cs++zzG%0X_h4P>TIt$a%=B<&7|8HNGy$h~ zFP&=u&@L?uSp{$_doU$a>3#UzmEhv@r+&Hi^s%TBXBIwaQa+6DFHfuHBbAkjqAT{I)36I#oq zZJ5Y6#4JqOi>IxMs;f08q9Xegiv|d*Yh{f+UC%;({Pxnv9TSgDlMpk4q9+V+-6UDh zapU-TjnT@QN7B%iv=(5-+qyS+H%-nO2<}bL6gt#xQds2GHfh{oiV-x1=;*Uh$OlES zCDOIfHWpyN@wKIt2gnR4z_m1rUC1dix|L^fH>9KAa^q6NVB~k_(ksF>ohyIt)8Go zsTIS<4vok~EDTHtMtzpM6T|6$FG0>RJd=Z2yQJJMhFpLruUO%|c978YQgRcs3tKx9 zDNghDk>k959fZU_DGcFvz1VmQaM9i;xfyDXaPO-7lmpLmDS35Fq#*5@s`1t?Cl9LM zYwH>I{g+Zb29d=DW?%xkziDDoX2dYyY|*AeUd1KbWqPvm(o)Y*jH2~U4}$Y zjgRuOR>L3l(A#VR3MYLFWE7>Mz=4}}xDCNhvOPsw2%*sPoY~;dqSUe$=uZiI7G!QY z6iX#N^l@*QA+ye5i-bWAz1&%PWb=drHlNpBb_1njOA|^)lC;`daE1(N9~J`w>8}=D5NwOe10Q= z7rIkKaXykr0Q|MuFV5h*sf+3Y4lrKR5p6D3M42V(d8l}yw?7{JEN{<3Z}-BNgGH!G z2>03W{Li1`~@81JjRhR?<)?=V$NuWo69H_QIpOba4h1_awzsrX> zhpC;mj5+|QXaDH;mHj)!pa7S3y;_51)I^r!9QY6Fn2F@W^*{RSXSZI2|A)SX$~`@W zW#Al=@lO!lsX^rbFq#r3a2T)uu~-?qS=x31!5#fD94esVifR<>^ReTWZ$9W#9w%i6 zl9Dl6QzLGRp;GPp+M<2*Gj7pud$QxP1SOD~>uXPeK0MCngo?}P*RPN!i{jS z8QXAu|HkWWy%ChNU)}SkW_N=A-QfJk)3zsrd1@V{xK;Y-U(+Wdw=f>#R56vArtFBa zRzix%6HsQbI7}$f+UyXNOhr-iI^kO|6C^iD6GJd%;zD^`2F@3<1rVs&GxD+UCo^d?B`n#VzOLl_`mnrj*D#+>1i&yL7LB5j3{)K_Y#qolEBhmC>^{4Mf)Vo>Y}6 z8czIbjFO(PjNl3EE{Dygw^jbaGHTC)uDP6hab=E%Z}>`cLRF)-;gS`1fX5nd6xAHZ_ie~#h?m;2BhBY36br~f{{H%Yi&DqC zgiCq1dV-6j1S!vz2e0(fvjK}T74b(Gm`z(iDn2#c``Z)KV`#mu+D;iDZCm2Z_1OfZ z()I$0vav$x^2e3Gr!-g#a5<_Jm(#u(x`>!r>oil5<%;tO@xpfQL>@>CwdO3Pa*$W> zHVG<*;K+#2>YS?9VH8>RndzTbhY}dNVn)b%?#`OcIK|DuGa$#e8kvH57f3e+dE&mf zBu^beVENeN+)(MSCcHB4IZ+?Cc&r<5mv*xqO<$Qc1 zVIW@}`1z~_cE&STzwQAYviBK0rkzG78OiP8mo(v*+$kM*fWDt*JBwF3bH!;4{7_0)=EK#_KVL`!69?V%lIFN~v8r-W&)rP1 zg?GsWTb^>fJO$3#kyIpW5sm#dI|3cB7?0(Y))p74jXT0W8oBIgVluEfcXJ%ppO>CD z=QZvMeQ(iMfSJ0>Zvc_lWv$#37?yHAjhb@C~3dCcNu&f<7dy0&nfj_#{&9ZF|oxnS=GFaLd`o39b0 zbG@&dKua@27bm0-os2=0R%I}LU4I z?-P<#A&KrlaksR_A&RD4w70CGxJ`tcq0Hl3&23Fvc#@HUF>l>v%-#w5^@HSwd|Yov zA(Y>bnVe)Wb;`j^WDqTZxGA_dSj+#)ZZIFc2l1&>;QNNp0THH2qJn z0OQ*+J?9oe_0CQfF{d*&VHqD*-xSh*MzqnVO=I1rep&}ea0a4;yY@DO)$$>wuxW{a z9EN&kb*Q)O=mx(;`FEx2KVy-pPeo)B*GappWtI>s@JaMJ%2IdBn$99w9wPw#7=E3d zrrKt7^V_h-s027wB-gw;wmkDAM9hq*Eo`lzBuq{cZz>?%W zU=)9=wj|c>U#@pspP}t|Y&*GhH~R0?xu_vj*S__@CkS>YruO7?^ZB#;X6FKC~+ zNNs&!)HS2{-RSzaXe6K9yL2zLE=(VMlEP-sakY@)@`WY7i33yTqc@$M4*10DewDrE)5rPpA^(+74k8?1tF_bdR}L5KS%nr~VzzDS zoa((NY$`EMoYrktdYngew&W?xr5{5TO$O`CEo8--^*!$x)NUqwU1g1{L@AfM)3Dp8qMMmrpTx z^mI)Om503bl6m}R{1+EpE8_d2)+GRnPHfMgC zcZ<8=GB>uz)yP(Z_S;u z_%-AaZwjxWjo?-F+2zD95nlAq4HICwqT1+>ySjF!mSU`4cX+2X2VyNG8;WvtVUYmE@hPWqMLDKs}B83HJUo*wZCX}ExyM>@|U%ddZCzD3yW}fa5@RPeQ~-i>13@XW;Ou*du&0YT6*5K z)C=*6B*z2vCK+WM%cWlOnAAz1ScD9$nF}T?ph~&8vNl64j2N z_4?-RU%ypux7gl^@kY_CKHhZGC$&(RYIEzBO+CWG3nL=((MsW5@9;vhRX0?1+uqdW zPeUvf+))yP>j?;*?^IfNethi$oNr>1z{gx@rg-An6!V45^EwIPY-YJgqmGRn#~kfs zkD30M@q(;m-5A^RYtf8dSu|hNqQs`m#$jG34TKg(+OWIh-zzA19P^+q_4EDqvs&=D zbV9EWWBzxD(OMU-{Q~x#Lt+F2A3*xJ9rl95(FZrix{lZ=^JNJAUgIyA{{#P9=Y^uts7RsvK>n z?y4%A;gmZLk#b=QeO)~JYLod|juF|oN4oW5pR0E67$s3Y&-EIuo97MXb|{j4=dEDj za?9jUiiKz~+s(-;*85ju!@oDS8imOPZKEX0GIuPjL*{5L=7iD&fBK8*5oNglzRR!d zGJnOOX9~!#$&!dsgb8ZAZE+pCGrb0X@A#o%MGJfLR+FjSchRA3S#>A7O+48kuE=xD z&dE%|_|I}^0Dah zbYuvZo>`P%mYiIcoSzI_<&>3H3Bo!bUOn_6tqaF=jWQ$y0T`S zi=kbjW@w+|*lk8-Yt3cpuX8*yW>1s)gSJ{bDAaPtz8{pkYvE+2S{yY`RM|mYBp)|i zA2#1M(;cF2A2nI6*iFfwWkR_J#c^>y^1{)fs<9}O%HvvRpW6t|cMQwf(X-Udl2bAg}$-O!9aUaO|X&=V=D(>Ml?VM~yD3bpero#DJA)BV3pdwQb90tYX9_<6S zA3oij2q!RHakW426(t40+da@N`?1MTI09c7 za$&v^_%rn%aLLaw0-S)u9j@Mm`}F_a`!aMj-+y}%he%&5ac!_&A45m8Y=M7IUcqrd z!+-4N^Z`O3Ctgq}2eHV$!x+E%VFi@{4}&PM>vmP0%8CJ0ySDB5&&0U z1%;eWD9xUWAK^WZD!y*j6n5S-ZW)4*2ClUN2)mPQE!P)zN9Q21rCflgivbrV`~*phYNLwL3i;Aa6q;6zxJ=u|+*UHON^J z-L?7-hCbw6Ggv`=Kv(~?hu;#h-y*J`tR9H>2Uvms6mdZi-G436ll(W?9i%ve z2rBN^q3t?ocK>(mMo9Y$;oz(Or~JboMgLbd1=_(Cv1HIcL|nfiUg$C4Ss8-&e+=J0 zY6^)0|3!AUqD=hXVoI*46o0IWTQt^t7w1%h1S(b8?$GtJrhSMpIK0 zys8nrH3_J6-QC@hNaRgOgL!J_=QQZlhhi5->n(Op1`61eloSG?+f3$<)Igy0HGun2 zKL@WUP4ADT69{PU?}}bP(?I0U0tM|NLHvV^Gq|QhbO>av`mGclY&WUeGYMWn_V%J6 zcr*czUv}GOUNbR1j`!twH5&$ice~}4c|C&^oA<$!fWCI-mzq~Yxa(8jE@3u2YMrpT z(tI1J*UUmi2t`#62q^v69${*GeHW`vwLWv#K|Tw@s4aolAwC9gocj!K z&-MY5T7MrmL_@1WkKl^-_O~2dM?!mZHoAjMmg_K=mz4$O(pt3Df(tuOC#>4C&cB@o ziqKZ$%y$*SwY0QADMm)!{pSMgMy>{5{H_(H8m~ypL7SbWpT=b65`gHr|E^T?glbp12b6h*Khw;oz^;(v}{LSx0RL7J4^T(TtR_M z)zYT>)hD@cLGT<;Q!@L&FQ*igWTdHAd9~o;!_dWdEbdt= zSwVMvzx3qkGbc|e=$@8VIwP-i=JfGXr<6{e;?wbmlJot(!2x;4&c<`4?0?*FTK@YD VF*o>azzwT3E?&Ekea_tPe*o)2^NIif literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/halfAdder.png b/v1/src/assets/img/halfAdder.png new file mode 100644 index 0000000000000000000000000000000000000000..7c9f3f0c1b59a3854f0deda28e7351b5a23b720d GIT binary patch literal 26281 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 Bzrz3k literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/help.png b/v1/src/assets/img/help.png new file mode 100644 index 0000000000000000000000000000000000000000..5c72dbb733500993cd3b7ca00792d5e5cc5b221c GIT binary patch literal 18810 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 literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/iDecoder.png b/v1/src/assets/img/iDecoder.png new file mode 100644 index 0000000000000000000000000000000000000000..d55e9bfa1923ca43ad918f91deef2e7a4533ba8c GIT binary patch literal 68782 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 literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/implemented.png b/v1/src/assets/img/implemented.png new file mode 100644 index 0000000000000000000000000000000000000000..6766aaf6bd9803ccea6e7f6353f438950f924cd0 GIT binary patch literal 14155 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

Nlj6MuMWu!=Vh&=o4a;lR*bT+xR?q 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≈Lx)S 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 Pe@xxdyo0Vp*@gcP>R*Q? literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/logixBanner.png b/v1/src/assets/img/logixBanner.png new file mode 100644 index 0000000000000000000000000000000000000000..b9dad5d557ba7bae511bbf9ed94157ab37852361 GIT binary patch literal 25633 zcmd43XH=9y(>4f*l0;z08D|DXK#~$gKpci4DX1jLQKICWlQQHPkenrF5Kurs6p)Od zf@DQ<&N+NN_&o3K_wBDeXMe0574K=ftE;Q4uDYsj(W;N+$w`?=@$m4-6;OyLcz6V3 zczF2h#0208DOK37#Pw z4-ZLz`wsU2dYhdGG}3Ay~{u(DF{MldB4$@ONk zjQ;)Jo1R`?RCP^F@flyge$7%{$Y|~9?Hxcp`P|-q#o5%_I=qmh`5GAAx<-BH&K*B9 z1|c>tatl9iZ-HC|Cr3vD7|E5OJ-*J>N=hol@;D}{c=r4 z66M^ovOa;UNvi^mUS7p_3vNACE=Y7(o+&T2N zXqZ@g{hH`TY)pg@MD~L<>}RtvJUTi$@o;H*SyWV1@LWY%`B#6M;gNC{<{L^Ca+L~U z@8+fny?5`Pm9n*UaoKW~YC&Z#(jp>~&KTcJ5PJ?rf3w7ARNm0c9_P&Nmb zfb16mRcqKX^ilp(p=f?=LPGwsgq8h_ee{x|CUF*q@-y?`-rn8{W_H%hG9e+sq{yjZ z!eV}YUa6v}$jZe%PoeKcd~W=beUmu>`<{+A8!3H`v8=|mq13fl6)P4M*L_V z9Uc9#H*#|Fad^3R<1Q6$$BB8C46o{cvs7*Id%d`1BImMyPHhsQz(EliK$$&Y6QN+i zHuej3_th1pFjeE^p#lrXOZayy@hg#J!s>il1ywYZa)p_{1JyNn`KLuXx(O({3CPIE zlrWd$_w|C!=(Xa_4Cc=xn@?^IH%MsP@w=_*N@b+R+8(R#(;r~ zo?e<;&?VrM{6E9Lyry{n`}Gm=51&kI1mArEoUignzLVN)rS20~IaPN?oZd5X>BYP7 zYZo6niCT0)Kak)&+=jqa_Ll@WCntIJ;p-IK$1QCRvYot_d8d+ z+hpObBR^K^*Z5OpH*+v=_ziJQWGIG9%xGTv^gM4&I7;unMvCa;#>0(}FZy_YYG}!O z$%~TQ`2`?&5riCVuZ^tbm%nF7uTHP!-4b0DYkbIQz;Yy;Qt8*mr`IrZnKGbuKmZ%n z7u7I7S-Q<$?H-f*iFEAV*m|;40_kf$R;v(&;IX0iUmm)={xR^~&Dr#1<(m-&{NqZagfUeauOIPX)SDI|m(mYm#}Ea;mbi>DNWg1Z|& zjD!(<0Bb=BrRqwGn{9o6_Y)u z%gxia8hx=Zl9?ktVuq)TPNO>{{6Ju^`o*>=kObiRgFh4w z{_`+K1olUh;XiX5!mkHm@W3n)gaX)&7L>o;wf_$Ox6H-vr7mVW$qw1R;p`hC2>CsQ zb0wSZk~Ic*4di((zjt$h`CI=E+<}~@npFDxkqNH$zVU1R16vs%vUBFku6sRu*5(Kc*yME!6Tn` z&Qo4K2(K*uYPCIAD9YYs|BH;{V{LX;-2-8tH;e{%+3tKoWs~A?qk{a4uM>kmX#4YWvaDK_J&1TDqe3D~`R#e#pCHTy812A|GLU@9sW2-XDXdTb*_PP?e!V1( z3Edz0sVfC%WI&4H#MV)m^=eBka1rHXj5aCtm;wRuTv%s>Fk?AoglLHI-zqO&@TnsS2xkIPKU|J1af)RKWDrwuju z;kluea-u-XC7`KMaDNqcT2P+5OS2QdFK%?B2<`yG+XkzAD@C5RU-C~CgczFgAR&wl zBTO50xN!Q;PY@Cj+(3czJ3t-axcf4s*UgB^8~2i(*7nBi0Q9E#^BMob>EK7edHM7| z7LbX1?i3_kuCA$3Nf9Z1oFRpebX*;+sjsi^Fc8BX5`$!{05)$ZPmM?Zu>8wa-_rMc zOOYwD;Wy_eC-}L!2SYxd?v3fYRv5R18N#&doh{GLPRGW^-unCjA^|xJ;d!ve7dt~r zg1c))fnfw5od?;QwZ#Wo4jCs>_xe|MAfa|)I%zBo$7yM4(UM!Cd~kmL^`)Q16IV^# zhhzJtj(LBfq|Q&a9|T=l>}e!~b4gVG;AgoAK@j3Ll>W#@m&((ZMUtA9DZqf<*sl~$ zygi9ic^a3|U{YpKw;_|I=s1Y7va&)(FjQI$K=r!gZ|gv6VA9eCA;v=`+N`Xsbd43* zfw%I0+r6UwlG{BMMqj`X*R}Dwsnaz#fO-t7OwmQX>GzK}zp}GS`<~=y_!f2D_uA8K za9y42O(`w?som_`IC_mmtfH{c^6ccW==|G5icVQ!E^~G`Go0 zlO>k3lX>ao)*tBYqvi7Bo34L8Uw*SN&gQc-(0saT7kfkH$>HAWSc3=9pv;`TQ4mIE z0h!I0h);H9rt!`2(11Co*^4eX%OU4s7qIg9;rRD%wPSpZr#cO_slT>1reA01Z0kl% zobFHg`AyWjc%Cd5mgj%C%(gS1C}@&HwuQxFA$oI@ja~o}s^{0%YP@}*US-%4`0(|$ zLPS{Rjhl~BRV!MydV72Mn+~#&z7@*AD`H6z43#ELoB)^>^06zF_JTsluWjV1mf`=(V$;}|zo4li- zsA!Pk@orF}eSt2g?~LJ8laFURySO7lm{wQ~ojy$=x$&tzl9>~qd*^m*|1m2Mowjz3 z)tjgit%W1`+sqk<2zEwVlz`mzd3i!D(#JpM3Vxt3Lr4QIP{r~rQPEGzVG*1<##tI z_`C(adfL*QfBT{(7%`vWr?1CQpBflQa4yJCyJ4Md&&4;*NofctEl9+`8DB-E!s%KL zV{bk#+Mho=ULRI)E&aCpth>A02c~A<)|Y=wf9)c4G73W~kG@&m>iE1B;@g3!q@<49 z@0$ExX7;8Vcs#D}PM(id+SS^zl6ke2L+9fK(U$5PUnrOtTFTcbLa1pvzvY(dH;%e$ zCqDSRxz){o%t@+NaH(yWX4yzhN*Jcbl51TzO(#MAj&!zJ6lt8l^c8iDU5dp9-a@~I zkAo31uObmW+-aO&80wuZrjmSS83BCLKGYeT5`xt^uMTR;H$QpqWx5LRHxATt+ug5I z_qi`_zyI@A?A=}jOxZ}AMzsh+Tt8`pGxl2B;i682cB{CfA)yjNSOeP>AH((~Jt#x6|E%<3v`wN6AZ5jm`2Ovey`ZwFDr) z=~wS<@T4;Gx1g@2OBd{qjteeF4HP3AK6o8%=bsK=hH>H$>?eMv=FfbW^aC+m5`%vF z=NWy+h1#giN@Io2`nSuWaTf@p*#eBT+=4{ROjNn;_Az~rLNFyW@5maq$=Ph{eiv^f zJm@asXMB1g>q$1JKPKmkk^rRf$8ek8q>hIztL=u>13Zrmz%Te&as!YHVR}2 zw(;rQDp45cH`uY%@VeiE?*=&CBP#fGQ~vn!fzS$+gM^;Pgq(;1`BFc)%YHUO8Vf=? zUyBgkX3P0#`#dB|>GfXXzACGJgGMJ;SU)uu`B8d3OsIEl5 zZ`9!6T&_O-beluNZslhNBvwrTLN7AHQut^@=_2%IeB6vZ!FtOfj`~)3V3n1yH}l-f zDa)mORb6I$YsfN&!Zl_y-_2-))Fy9<--$)Bagqt$i(X}-Fz3^8JjqawJXm~SGu{Xe zN*TfnJ%H%j3>Ai-LT6!deoo6NO&ItS0EgQ29>@i3m9mzS#{6<-2B=u!%D+VK$45d~ z(#ASTv+j;kB+a4~Tyw1Kxj9Jm_|}Fr%ipW0YY2Np2u-Z2gwB4zED*fQ8g6eBz^1O& zFpf&z%^YrT48_RQD;$pWYv=yvWI*2-_|=~jNmXh3R^v9Gkn66N`gg2FS2Pb(zJFM$ zO18@GR!#+z&72Vq-MDyfpPn_Eq;W>Tbv~iQifMo-7$Y00Chg^L3(ld^oA0d>J8bPH z^DG-d8VZR-(6DjE)o@vQR&?DgOGzBByHq%N*(I1WH-0a^;GFC-&i?wiUHFaeW0S_r zi|(}_8H4K|2z_OKncZ4UV?uS}*Wf}fNd)3uNi4xL-$YUzSQ5aZGSrvAK`W2kmAm6* z#-^Y531t)UXt+AhiX3-O4B-RP#S2~vT*xP`c{U1dkZ_FYl?a5Mxu{B=f*)Jay&Qar z_@=VsQHhs0jdGkA+->j8_0;Gz;l8xD=TleSaNC=oWD3P02~*Q8dhDCw|A7WKZ?J!9 znFZpd9E$4bDDl>c&+jxMC^i3PB>W)dlG+_Cj!*ayhg{XQY|IY0hZBQRiqD_8q&ZGJ z@Lc4{ujT!}rgxe!gnu76Mm z@MzIV@`9NJFtU=NU<8jDdRDc$8GP(y6JDYPX7{h zT8pZ?Se)SFvSb{lw2OD@gJg-r1qiNpEIoY=5W8)NE>86wBU25HFZMO`3c60_U!A|F z!iawYH)%SW7nj!nUBd}@UGDJ3BjT>+Pzbyu3W?DMtV;(sbfaCiOnL zs&z9jgjn&dwU;mjVJg@Z;{7ov9;X?4=@P=xH|Bll0c))xp)F;vXl%MXS>Kb$0NQ z5hf9a&H}Z!_0-n}j$`%457+hSj+;jEA-Mp~;;f@&ZZ^SSZRFhxb@ey4WjgQs#5FZE z=5oSmu%h6CAheRTj1dXV7IeQs`U*UDt$ zJ%0Yjv@|nX@600=hsq74ZGKe*Tq5ccnCs8LMQJ4insY8bJ~k=u486TIY;NDH1ns4Sn_M3TsYgrVOX?_y-4xsHxhD3e`9A(QLQ1fl~oEyelCt4$jnB z_%z@5blIR7K`v@Lnggln?eE`@K3{p)?|ZbE&!9m1;tf813o5g^&iTu_Ct#m61|t;KF$y|Z*@Yiy|ljLc&}dBsK`uH|4#z4q6B>Mw?GaSvNsZ-?_Y zZQM(Flqy!~IIEa8c(^_9qS2+CA=Ow}Nd;5*QzG;m%0QABrB#*kC*Qw@kdre>_lv;8 zDRSJ+ykFaks$atjYJHHsk(GhBETLU#9AbAp!)Grkqr9xF_M!IUNOI)nu{NA~2tNl? z^jLB;*jc{SSn%>QXXWP7BLhC&58rBrk@D`p1BiH6{!n1mCEHUKh(PN0L_aGnS1F;( z-FcLWw%CL_8C%b22p^dN!XO>z)7*|k<<8&ZoIvNT8vv`ZCB2o8_FZ2fFAO?T>_PeN z78{J1XNSP&ghfOI?U2|wO`E@yUhC@5kPk4?Qb(u&>cik`>A&{8`Vse~jx4k>*J{kV z>3D|ot)HsJa4N+w_%H2&1g9xKjO9NZq`tIT5dfVXFE6f1Gcudz{QJZyo2=Nq=Rh|Il&n_i`0wj zE#Y)9wQ*Tw_9WwMUe;mr9$ zS=&g7t*ve8@MYnFPgGNpd+Sr>b4*f>dn?-H%4+&BBbOWXlx<#X^TBqDs@E+Kc%JLnJ|Ak!;B+!u!2U~LsKgNMCM%M$n<8Ohv z{mS*iv$k-0>Sdmy>rWMilPe_Ru37lVELC9)54{Y0cGZ_R6@276exS=R@CITeK^8N5 z5&XqKg1D3vD|-u6Ebd+&5QC`DKmX{y8U36J0$W@H1|0kn-erPA#Br+9QM-(moT9rE z-Wx4MRk1W0!B^eJb+t}n!a=;O#}J;}dxA`{90|t+14lvm5o+2#Plp6-q^u~`-%sB1 zS4uL#xzkUS;7lmyraymdDLM{};U7~WDWW;}EsP|9hwW5sFlVk%ic=~tOttPudb>FI$u zQnpKZFyXdhqX^!gvWqo7iQ(ubnS*9G+#)!^0P!aT6n*h8JftyD=8b=k(E%8l#0#km z;a89Ze**sH2@DJhSJ3odZR0gc1m+&>pOuY=^Xb_F$_jqafExng1_KWJ6h%xF0&cCH z#4R?zcwtX}pl@`6S{X=4VAqY{!z4JT7=cI=_H9jk@z8$I0CTEGt}h@K>DLdqXdX{n z94!v$RBxxulqqr`@;?shLPZzb{ioIca%2}f`OkAO=HlEgp5c)4f7AnVoc}qB3qtFk z2L8XA_&@oX?)a@+Z&fHR@S$iZ{nyp~iAMJ?jDYlu{`%Go-V}B4WZLWs4n(PQV#@5o zju&6ufkd>*MY%gFMv_q9a0h%g8B!K%gcEzPSd*VZ0J}l}yN=O!-s_ffZ~4vK3-qGJ zJC`lDa!(?=H*OOTh9-`{QQuHJn2tx+1<`5GI|_rzBmcUA_~AiyVK>;25VRPXEYs3 z?evlF_1eCM9nb8Kc$nuW$ap^;U)qQRgefplt#w+M0y9G=53_!qWtR#_bZniL<_h`N z_I|9X`F7>q>gt~m94^;&&r}6TA~=l-HWKvDp8{CtKuiId`KLg954+hKmuhW=kt88{ zxBs0YD+8Edv}U$7{x!Yy$$0Yoplc(}V&RaBQ@te3!UYpttw?8*Cd8s1It6*U{wOtp z+$pnQd8`etUkeIVvLA-YA&)TqHvQoJM_;9hpAtMH&fc-%4S-BPc&ohgLdi?1xp_aO z)+|}r!~Rc@<#G)uXgJ`SIt<~)yIDV<#DvU}oyMSzuixNWf76(+*Ug>qCY4t$Z+<5| zIpS>ur-!nwi7nHA^oKL_|M#?u_Ho=qrODUW$5NoqbHUG>Mj-CK7uFPgmI3lZOF_tT z%_bUA9$6QfMvJ@3cr$sJ3iIL!gdn7}fX=%y3+HFSV?%hI4ZN1SbM9|SP`Rix2+E-7 z1K4Sy|JJFP3yUH|U^{W-u2eX?#Ottxp}#tHqP$r*bKwM!M`Y;L&|QMS@8fX{N4D1K zD)ObLKDnW!+sZwj`JWXofOS=i+{>#M7K1a;ga}jAN`pkU3RP2F&KmT>r^Iw4KX(k_ z0SuqS%lW77zw)UGVt@SK=!KwMIO2b#Oo*KMeHi3f-pl%KjiJ%1I=mrY+V8ni2a%Ej z7vBXP0328!6FM6PaP|4($Bg6<8g`!exRQJId}2=^VIVpHhXCA?2h8LBieBTp_G%dB z)!davN-YPfG09=)NBsC_RZHDJzW$Gt{+O9+%tCGx-x?^|S}$9CH&-!R*fWY9<>dEBl^YQS30PQQ5UIOShEs_bDG+WOZa z0!|DrA26Pr!kWdKb|>&=xB(TW>CSO7#$p9ETi10o=UM!#zn0mFkVIz}cLocyKF z=g+t%mbV1Y&B;}D6-%&zo-u9cjosKV**Cwg54li9Af`j|3NM3z@gec-)c8@J9UKj6 z%k~bMs%n|u*7C&!aFK}{!Y~qhDr+y`xi0EQhHy}K|C12zTZn<`Mb21_sdwAltLbf< zI9l4RE$k|~5v`Wju)Yy~8p?nk%`3(+2RMTPpwkmJ0B7=Y9AltT60!O@4K>k>Ru{gF z&O7;#?Lb=aYZN~EjQ??0am$rx*rCdbD8WIg z<9lIou3oih1P~(Np-e)^(H0!?Vh&0 zT*ej}8q{Zq?S-mH{^k#AGCZDeQrHr*%KN z4~V<%ET}ajUO51)SEM>KJFC~^Ju)TiFpc1$r=_Lk_5k$#DYmOi5ho0`CjbNY0&AOv zg@vU$*)^ZmCirKwf~tuhAW=ajD0ayY056}T9dWm{RD&n_`g{&`p1a%tS^%anIA?$T zvE%5+fJiuw?BW_689D5LMT^bXbGKb2uplc`P?0)bxx=X7{}PROEPQ=qpga`$&m$q9L=}h ze12B%vYbPYjd+pnfxJ$Av5yiFECwboLG}2N@s9#EoHpe^VFOeJ4Aj+gTS|kjkYiu` z7#cE$7hVFM<3=_NiHoBu4{34d;TRVe*Ku3l{Z9yv^!E|%s|ySa#Difx4v>zEgSoAB z;y@4vhR)qtzq5J2l^|cyJ-0Jeh}oq3IXTbz&*B972Lh1xYBq7l*60KrAwh9}C#Lk) z;7`<}G>KgQu;`T?1r5IhpkFNWV>a z5kLS6!QaG&at?*J=lk9IO7$9sGER9OsGWSFQ$Aj`^D7n$t2O~;x*`$J9Sd5kgnGMY zwm*y10bmA4qAPFSpKhBWWb~P^oQ%7=vFH_uU1}{7(8xh}eyI&O#SVhsh+Hz7(IJ@th>5LVGfYKj&oSKR7oizUvhCN`zv!jH2hP28Hg8 z{Rk>ZsV1OiO8^*Bc_>CGQCXhXWB9TL>e#osyW3I#Tk!Yu6##hzuy?<3Zw>kU{r*;- zLIZOSswg1D$DrUYLy1u{qVp#3;po@wzQ4}LDfQiPwP*$sfY9+^12oM0de3k*OKpXN zVE}^gkdBS2s;yFjf;egh%tC;71&Lk6Q+UFLgPGux;t^i_d+Wx3kRjN55=D&j?SG$M z#LKt%SpUzdIKxwSQGXbJ)xjZu#`qB^p5w^`N5XHhKy=w;K8n5Uf2C#A6Ha_4-axNs z+9%HT6?OGHm9!-_m?JbDL-^y3a*v3<_QQTm;s&uQuwA z8bA($2U~RY&tYCxIi-}4^^Al^TASv!2a`|>U=6jd_vRntk{RG|e&Z=HrLRdm;$u`O z*Kfof0_b`Imdo{VpqEylhS5JN_6khFl6CO6(<8=+oRs}gVV&Iv6DLFDY?7es1TSKy znYsLZtL2?oyS@E#(J#2Rj%v0fOey}qZJg;a24WC9hmjb8;|oRL_Iq*G{}3%$4@^P` zv$V2hs&R}9Z%E0Xl=K@uc~pKUvuY35bkNxbOdpI;V7@?pgP6%Xo>L%IcN<>eE8vPr zh~Q_kYY2;`-S1p~x83uIKj0wm!_O8J!$?=hkVPqm2=6)r`fSw%J~8u#ynOubY+jes zn_6*~?Pv6EURL{D(q`XjX6M%umo@n$RSSUkkwrrIqsDHB)3!rF&%`xmbhjSfCsC{+ z(AEE0Hr5@VO_<@C8Xb79uQNG0^0I-uPs3t3o?3@Z|763-I{ga@Y6w^8#zd+pYgfxM z0mHZkc7MfJOciMiqMxuYF&u}2c2^2?zQWCQ2gJZOTTp|wNVbbhpV=1l(&IF~zSu>h zYVqI(y&KQ9vJLs9g?_-l`}(bm+IHWy-unHSXt4$zh5;6uezexchZO1@u!iX_Ox?!A z*&EkShDlJZsj( zwOimI0~AK}PVq(E!MVx0r2pFwgK`t1H@zNK2F%+`>J`z=uUN0>8Lf{B`T9z-XgNYA ze{+iYhujK8^mP(%$l@ar_&0df2&v$|72%9VLxgB9M;Z>9j@_nd{*0yWh^X9jM)T*} z=fc7+M>~saivmtfhi_xWZdcBIOSW&1pT0dPZMDsH9ZROkZ@Sh$Q)4_8CM;*o#&C!i z^p3*JWEs8SlE;=sgGU<9g|XNvrwE+^)k44^Haag3-aZw5Ii4A-4v1FXSA4@|da5LRMGMM38pR4Uns1_ByrPJUk6%l4${M+Hz3lUSl<|@Ga{L;L3aO%CyoXTs~N5_#WL_@6a^x z;S_uF{-xeXt;65;+1Xk1*og)=CF!93mCdrGXKK)a)KW?k35ZaU+`@;KbZSsFDEb~N z$x}@bM;V?rxY}+{9gW#FtDsPsPM`eojZP%%>graU0EblLKEP4hPJt8I=`AZt{3{Sw7nSl?_ji+rqc&@4kTGJ$Ts8Y}awBj$4gH zu0yeE?UTf@!^0O;oDfc|*e>jFCid|aawd3*;hB2(x!qea!Ms#ebK$I*j~^wqz0Xhg z#ajWHIAQW58SqLhPTCcpGpRg4Q%IY4P*ZCOBunM-@!o2Pnt4y6p!0&N(_d2xKoi5m z_*|i3)U>!YWY`}v@lK}y9n}WMf`eNyl&jQs&mEKY z2tio>qcmzvI6Q~C$$d6^t4T7Z0dhL6m9!^LE4k)gV)-2!OAOBMQ`W$v% zw5jKR`zl5`T{1~wt?Lbs{gpFPy?W;?Cr~I^VNw6u8GAE{tnIG-&ccAl_8j9DF&qo} zTyCHW5xWjajNn1b6Wc}zx3iia zZ2Wm2@wMtz5|VEs?$%R4oYs0DIwD_A)W1o8Kjq6T`YVd{9yf*ye0kfIarXnc(Os<1 zpy)s@j8-V2zv0YiN?;%RHJR<}h(ONEjdE|1k-x75k6V`*Ecr&cPEij;pMZ8M+rqab60_Cnlu3y!7aFt8$TSz7Wpztp<%QCd<|E}%msHLSMaaU7Sl?f6bT#!_) z{&vT5FlT3HNBf<5Z-zAcRoNhdUw6hW*(YP^xMKRy9TJHgu!-Xk$!IOvI1HFrkWNI@USG=m; zA?+AI`&pvr#`IfNb?C@@y9~xy493XVqxA)~Nz546L*{k5y=KrcrK>#sLL{Vprs%Ub zfz?Ka10z*;G9zyvCs(YhHu}Z#!ob_v_m7|P<^*86ixJrfW9nU--Q=2g>ctv#T$`Vu zif{}R%RtWwsqCO!==QUIcy-$EQ$&Y1k|B!F;VO$*jQYsPNcH~uRDT@0-5A`k8{eMU zkfw;(VlA=wTkGSue+4nX{H8}%+0PH;=^PS;i}5&))H-EuE~p`NWLUl#oNXoaOP}jr zrT(c8I(gc)-%??CZs~tHaa1^C*yN>i{+njqVMx8Klu6FSzkuL);*V7d%OW3U>5a+5 ziQA0bQ-;S8+^}7qyyLa1Ivpa1^O|v}*29N6mf!PwOc^dG&Tm{7KE(k1+z_Vkg_RRB$LG9op7mdwz?{ZeF ze@pv)6hvg5Ly?mW_891z^XPfn>p?aMX(x9VfuhEmf#pD)r8h(>MBZqhcdtZrQA8~YvsPbJX7ze)C zL%y+93dcCoe81Fm10x0!LEO(X#WCG_RH|0f)z!Vg!*>hGkBv`3Hk^!YHN2X*95Tbw zW#sVvk4iSI@-X~|edxHui=dkMuo}(ceHi9fKMLnR`4Dn)XgDV)XH+PBXWJz;NZR?V zG9QM3Nf$Su;W{9g5_+3IiHxgI67?un}$6ElUKDMU~GLs;#HHv%goB>mX*Oeiaws3Af) zwuGWAC)ZmrU-j^gu{3U{g7b@|zIV7i{eHd^&X%Q&?7>VUp!}Q9X&X@ua;pqT#k-@c z3AOTB&^iSz7VMqYY56D3a;NiOCD-NqHTvZuZYy3pJ{;Z41V)pMc;ca^1{JLLoT5TQ zNP;WZKGl~HrP7{{bvE_4sN}R~G6nCZH#v@~z)|gGS0!~ksMwVKwz^E8-Fnm8%S3cy z+n0uPcEwGUodJ+a>+-k>6(@F~V&YrmL&2|xae^AmYGI+2w7Sk^1sl3Xoi&jDnjJ~W zRo`bZ2&0SL93`p8p?IC5n?r#$xY%-I8nMx>LBR=1J+GuRz#vWBmKEXLitzZluQ$O$ zShu_U_oXKmP}$v_=G5mrsE_L^I7=e+RgeG6jVU;YLP0-qD#F!F8Y~>pj4VW?knU@@ z^(&j8;4r=R8W(1Vw|#Y;kc6V#nAT))yOO;=`Zc~mLH#)2c5<3)NphihkFPpNDRwGi z$kU?ZP}z#`D9uXKb+o^G4_OWZVx5hcwp`ov{jt%!!wF&5HNMjNCa`s7C|<8rZ`NRq z{LO`Hc{Uw^lf(BWSe0MbSmRLc!4nOQTHtL!_|*Mi-|}U$Ouw<-Zc6Ii{1OuEaB^Fu zN^hrB#QSP91RVxZXssjsl1qSaH!!``*!$h%cFH^IJ>x24O$BGtF1Y`R0@hS;b`6L^wLcZ$0qXBun(=g zN3sv9K(9q`a4=wV;?+UDlugJKrS2wX(tb4*-f?CvX4_iFr)d8@Y-IWR11F^PYcXOvO(_mF9gX7ce`O$Ra|EIas9J;aX%ncu0(h-1 z$1<)8*pfbl*c(PiBtgj+;hKqZD)r2KYQ*QqD^+NnKFQ%+ik+jA69t>(!WzxKV>Ex% zvbyZJ1{(gPGE))mAOnwo@kL%71^TDm_f|$a*p+~Z<#6j_1vp#Opq1bSx&atyCs`^k z2OYsNEeql#zE7cOM(C!#@Z^_T;f5d1R=?_iQ8tCP_Hs6<#<=&FSWSsI3jU4J~ndDBZ*uEw+grVQKXG~ah0 z1c3!P)6Jd5?$<%j1L(Qr0& zjzP2U%FTQCj_v%8bwD=p?FAlZAk5tmuutJTfnY8iv^L>}LhNTk==JfWeszY?@+`1` zCgKGYXbC3@`JLGZ6%PqqMoHXz#2P?Bk2#r}Gsgby;C~qV8xiP5YAbtU3BPeeu@8FG zpCO%*ntIYo{kWpmZmQ|!?-*Nhl+RY@%^ePq|A@0|@v1Z*_SyxPX_P*n<%eR(O;S;;d`em z@8U&-T$Y|4?XQeHWTrFHf3XP|yR%t-KXKoa1CI34`>gpXe@_g6#3K((oku8*5*z z0;6~RxXRJD-mLTUIb9GX$w^DVw*>}&$^*PwI(~g+>2O*qbSljf%N4uv4^)OscP+jF z6tt*YWlB=df)}y}0NDu&F1RqFXtI`EM<)&0wNZy|dgZNinUa9g&B9c#yvXBGsYQe1 zGoF6BI)!#S#tc8nDK~@=$iPG~nQDe=GBco)Js&^0gZmll19DNJhV#v6zhD$0S@0Fp zyo6iq_pYS@R{OyN=pT`($8Z&`d2aUImfkk$QAr&mVu?;_4)(tQ+QX0$GENU4%OR?q z<{ypzkb{OpC9)zSu5y`zcL1FC7Qesfio3PbpDG@kIcxP8j+uHl5N=Tt2|?Sn5>2V% ztO9Gz`5C%KU#IZW+v|%P;`1Zd)ltsyxT;nMT>4Ud&w0VV|NcIuD}S-+mbpHKBK$*~ zF%+M`0tWg-=zj*z=0y7IA^q3Ioe5+5uO0&qX9<5Pk=st0gvunca0?+sf6Ht6+y^%hx-#%~qSqQy zS2GkJ!DCSVw5qQ#VwlkQ%Qcj|P>M^=pXUm+KZaWh(_CH{=u;x?+y4L7g7$KDfK7 zLS?6Ga%JllMz_hgZZ~kKy&|+`;AOat(0hgQ68-1HNHpSwBJL=;j=98zuf`#UMY%~C z2Op(NdYl|M#749dD-s-$NEa%EzEnc4;ttL2Gtu)6wr3Jy$QP ztepZisopDxC@cUxlwPU`zdln)!zGxEU6}p4W6-BjKF#4u=MhDvW&4S$cjWo3ZA0nW z-hQEPhd31Yf+ zr#rs<23FO$pDPzJy#=#0^Olc86@6Hp67PTHUOQCq+-%ltFvIO`^s)&21@Y?g?C^Wm zF>{tm5^9s5M?uTWDuw&`ZGKxDg_2dF5C!j02uYxy&hK@GG|x018cyu-dh?W|Rd5h8 z9Kg6kqi^-IC@bh)|^>Z>VnewaO!8kDC0}w)^wTQ{&HSh=#T* zdZ+GZ)QUB3`L4Ftfb`*~osaaU&1pIMT%EBvGDPl~JPu_-3Ro-WZAw+2W)ExM*SRd8 zy*RSu$4YVrUdkyf@m#B$M>QkGqTx22GNKXnq(3pg-s|o3LfId``Gld?|L;Z#L z>{yD;>3jOb;~xI)J9C3XJbb8c-&2V-iNCLD`t|{TwlDlWF6-%}@H=?OI9{Rm(Cy5a zE;nN^(KGFm+*?2LD8z2ko;2nvvq*%Nv19!u=(G128_S#{jx!DPjB7jHwW+(QQ%$Xw z=$!SSJGC@+7{Rw9(GX~z{jTiXnX*35Ua8j8>bU?6g@D+xs_QphKUclb_EAC{Vp7o1 zh>vLHU|KtQwZ%Ra5`@VU@ zkvN1=V0ImL&t-|`L;NG{Zh^)=kfYPFpvj=uFa7%65|n#zHkhk)iAXhlZa|)$Q(E5a zf~=$@p>;FETrIVbUon-biow5hrGqH*Lz>rB>O@lknA$0LgX(RqEz68e2EMR6^%iWxLo;$Dlr8K=loKJw2`jMEq;K`L8{L0zW;8>3;;rW(f-l zV)_8NxI5uC1p?!lKM#qx`Yl1&^H>=uK3TzoAhwXZEGW>hZ?--9q-g<72gz9}hP5kjKyDCu|796&wI+0Qxra12M%fx^(E=f5%$LZA#P zg(n}^2f9=TqxVS|HAg7Kf2%xKf5y*?^ch=v0M}37dtKN0k8bOdb3 zA`P_gBRjgVMoHMOhy4lDjTlsDR~C)H8;g$7wX(0_rSeNxo*K7DeD#O&-5Qvv9i>9= z&yRc=1v#C8u#bYGVjJRf7Y!%mSWgv-PFpY-h`al8JP`?eY_9xUze^y&R^?^Xd#KL? zVU~ad8goFLujg%~3y!NQCX|!6y)06M_e{NkLvFnxVobybXq5U=*RX-#?JES-YRcj= zQtbd-XV;WAhqm%vms(wed1^6_M}0ASpHDgHESA1*n0vYZ3MUq2hN3Rys()Jk4rj-& zudx;^lOa2@Er@@U%w0`YD$}i#&8H+$46Im2Auc^A{SEk6)I4|zj`O)z2VPs=^&s#< zUK8LmErhchY- z1*nmRq4WpWFe;)qBpd|ZnbMi(oi{U_bpzK!(oi|mWe1oJXv)bneKQAMJ`@W6Gl;B8 z(@sdznVMdOc&1E)exv8^@^C^}OZG>F$B(1;Y6VenHv87&?`-udHzOplbhi&ox%cid zoR+jI!jT8I4$M5e5Eh$iUbx9pTUq5k}>~46-p)8 z-`t>+o>EUc0b@Y4q6;tV9Qm9Q`a3ZGZ85Q^mmn_Z9#?s*HSG_>Lej!A+ z1l){jS*Qe_A?LosN&F^dewutrkL@5&aRNjE9@?7CL9((rd$CmIF#{bfE#?8C&lP6u zYx$~(V70p^LLU)<^kj@jBR9?bi9=VB@1Fi}%2@sBFW1pR>!+5{XaB3K>i}!2Y1S5yA|(kZRZ2La_hzFAgqVb)AYG*k zB7y=+5d_o-gla+u>7gppK@|e&&0qg! z$)ohrwz@g+bIojnN>si^(D#m3k+t?!)l#s9GbCm@i>bLP+hL~$)ZE2=GS+^r&J!;1 zR9xO!2{0?xd|p2lcPGedOALirM$ejR+1q^D1m;yXTKoOw;g4qr3yef~BIrYL?QMvHM&Q4TVOWt4aZ=hi~qm1@@?8vC*CCugy7$&g@3O;u1oi-GZgH^$>GmT4ZNu|wY ziMh>FmL0c#ue@V;7RCap@GK{!H@Yb)D*nE1QAoqiKTu-l8@bt>vywrKu#r*e$;4=Z ziCT0p_U6^r;-ST}O{~8XPOF?hB{NTb(%H~-0UQOM#a$+~wKemN^%XUlmUq~ODCiB8 zZZTi9Xeqq1YiEii3XyDyn_o0`12(!`zFGR)${hFES^9&qYul{i8~MTiy{10n`u&Cq zD>q<;c*}&{4YqbhAvCWzDW}IAfE6fD@{#~`#q2ohla!p?SqeguXF+_>BiMyJ$mz-~ zWg9r3lU+@Vmddbb4{*A>_04!(p24y;1=t0)br$-`d}hQ(R*L;$3iF{0{f0AVemB2& z5GI4@=eHP5Lc?K(J0R474j;n8qn&LrdG-v4hVe}GOvholx<+o}Dl*!}vtqnYx0De`dN!5V@{r-oHnUQb!+9joL&FZ2L@vcAE-_9>}G7mj_4-2rx1&4r} zX*7s%VVZ%H53sSP;;)|9Oj6L#CNJ3oUF!WdvO7$a+AM9Hiit+1R|E2aX#=M(!#8Pg zRpj~W0}SPik^@eSh09Pu`av=7YVBOR-_2COAX4p>^;wTeaA2`A+*IIT)sLA&!o&~X ze_o^Obx?p5ZFXv9E;B=|D8Y;AA$H&Cx&R6Rmfyw$kT=6ea0A?^v!y8IHp6gMjTndP zTGsVR^fi_uEepAyvBHRtA3Ek*A{yRM#Y*&drdV9G+?2C47x7Tmn;!oKkw+a)UNVoCIdmkM4ArtKZ>XG2J zf`vR!AD{rfnUlX>yvKXhq;kg+D?ROn;E@gBMvp={U{*6K6h0pTRRDyj& zBm^(MH7hO>!uO`O#dpyr0=9*7EJ54(CWKp{i7oj`4CwpOgve`IHaMU+QrI`aevBgf ziXfC(L$Iapb<{yU;9&ssG5UDoK#sg;TO`j>BpgNPo&`8hz)CCEz!_}*26Y${ngx<*z$6`S;LwJzXyh)k+)iWh2zcWPPZtSIbG#Rj*myV zAJrlfT>fKX;cFdDax(6CRz`I^mAi5YfPgEDGvWyX>(wWo4K_Z5(lTTA$AQ@VZeI%d zyiMeVB{z_v?W(k8Ia)(glB0nBOj(8=l?dHIbRY+47Q@RCFO&3BC`3eWb6||NX)Ns+ zVgaF~bko(ohNAft}=OQY^R3m_UKrnqvg@qyomn6ISZLA_c zNi%8OD5}4)s`d9Z6Evj1J9=x50`;Ow#R}NN38F}SH;r{1=y+gDC*7BlFSxDyf z#t#oVxNy3HHB~`0trMUHorskn`HCWpZu^QMmalIP9tBlUKnU=-#5w0P5L3@O8i*G!Ss-Nh=p6I%9~5Z3Q9u~ z%1HMkO(AzNkFam+AF63R&=5j|Z)E=|P$^0qfEe!RACilZAZ7e9!|M;Ql|c{w@zQ=?wP528q#)3EY>jK-!L z9v}WCzqh*h@3_XT6$A4)QTDPUNjXm_Od6k?I`qUGK*~8T3Yg0&Lzi#uwjAUIQg#tSI2bys+}L{PFME_s$aRhq9WHua!GNz z`Ap^A8gPW9O)}Hm$^yZeug^{2|NNSe4&>gcnck^9!E=Dh)7ig*)(<&QgW5$?qlZI}}Y5;b;@--;PO?)pv^yedM~K zy}6Jd=AOVmbrLs2uE?e(+};?Pv-u!_z(VF-&#(?3KSWLDnLd2tNP5lkz~QRNaQMKi zDx8TSJbdVL6?H^9*|Zr|Qnw0NzlSuG>;701jOp300*w3Qb5dNK3Gk(IvbTIVOsKkt zzJK)Icx_x&PSo}3`m`NZKGlu|4Zl@KrI$6=$5vapY&d%e>@`tfIW4Cmh(5w$7^m|q za8jagakw?*eYQ7?2#R-cO>ZLSJZTb=w*OQ}$jPLON}`cKC~%RM*>6$%d7y#jcjHwP2BOzPmZ54yhc+nrLey7Bg0LAtx1Dr=9& znujd>Z5Qh+HkGG(&VivQQ{}#D9khM>ItKvw7Q6v#CZpk#?p?(!^27Y-)P4v(Q4tT&{&6!f6BI{XA(;joj zdi46vojr>%M>qZ1`SNu)ZcYj#Mlkpe;6&`skyFjSmsrNmGg>)zW}RshWnz4;60|g0 zMpX)4yH9_3RBXrZGkf|!niR(mBevRtGLE0q-Y(@Je#JtekT(xm>*8N8Hq;QsH~H4$xG5X7pY9eQSuO5#H1z}A z;+*Do+-p2krVDw75&)!TAC8^X55Pgd%bmS@6P*v5j#Gii`z|xCoE1HK3LL9_82^Ol z=_emZfra}5gn#1!f+ z8e&haHAdEMUjoxQyS^#)Yw!ROeeDHpm`ya13h)L|xl40TRXHbx9GU=Fqs3Zh=8?b- zA=Y%{MV85jCl>i420}Rx(!3h40T)Urrp?r>EBw{kxNEin*n>@xg=&dlA&Qg2ywQ}0 z9LgN1gS2%42IsoO6f$PLJ5A~R_N$R!(fp*ap+h9jvoOs0V@!v5S7j9&-_1ViIgIA2L!oJdrFM8kdoR+nxkSX<2tK-0q=spZ~_RwzXLcLPXmu{@() zz+d|2BG8g@t~@kHD`WLl67c$gFD$(%lG@Tzc`fRd%I!1qLx9VEpGqc!{DC7KX9e#< z@q;%&=*Fmg2vPXZ5yoprk~<=mqz$2`2efYTzs_q82EKvXsv!P-?5SnNS1^*7ktALA zO9u*8efrhYbx*}(O^T#Qk=zQ}Yi|L(+*k!@W^xtF1+beJ3ZRkawd<{FqRI`ejv?NK ztUoulYnGYAfs9K^2lcU~JdZLmkxrH3A7*J4Kt$;TTKih85!22 zS(#}C${-N}XWPNTJuurR$cFOT{7kVbFqec8_sG|F`Sg6{yAZe^;nxU-;Q~V>bOg3; zB&7N#@x(ekxxKN0#W8eEasm&*kJP(tb-~(W^b#j5yTvuZ;WVx>G((Pld3G&EUI^1` z1(s>c>YL?vVQO)s&W}4He&;=+5R_0Qq5p_n$X<^^&W`NTN9D zhvu0b!5KGMNxXDnlF7<<`$phL%_CB8n{7~-eKn+Vrm09gJ&!gCo5$A@GNx@$Zo4zY z(FvFX8wf1jwrCDl@Gfc(>LBE4aY;+OCi5dD$2HH)vEdC2a@B!ti$bucApRFiMi7Db z(d>|}{GR_QIvguMe8O{6lUa!T%rKa(=WqmUUa!GGDk)HkWc!p<()DOi7$9vT2!#|{ z);i_VtQQrcIU)*?+GiRdA!Fo<=&$cXUO9g6&e60YokLVv2Zzr-4V2z^5F;TxDK3zEL+lBJzEU2vXsnj(U-vU4`{jG7ktvltgTQq zIeDoqsqAz?l9*h{t5Kt zT6DLY+orZBCpP4?Y`>2|GC3iT!eqAfL@cieIYrkK4K3bCrk~RA4qA`EmM0Uic(iel zB0&R1UJG*+kAUIkQhk?hTw%j0#lmnz?Dumajrr(7eo`scg*X505^o^`D^$2Ab4^TV z?k$4!P6TmO7y;N=XaGnH+xv!8Fp~I}1o;_|Osr7tUg;1qotXWil z2?q*W8JgWq<(K z`yjOT-WSP({r<(oJB3z9?}T5iw9QCe5BS}$3|1t`lMT98@p;Eh6tvq?RAKI| zT}zZ;XODuyo!>rEw_jD5BRhr3zmGv=^1EG=f{7p>N1D*dv>vamPaBS3*bJrU?(bu{ zcwe2#yUc*Hf8Cww-?!Wn2Q!u|;2SWU9mkz`f zJG*XDeJt!}yFP?obtJ{*R`zXO=ymv#`?EOe)*m$v(E3zrbjusF|7|4_0mlXGwH!_i zgEaQWCJc>62-1XN(MTjQhSnnp2`BMS=~yLr*5G&=eB!YH2tmM!#WrG#9r$BFF8beD z0&-de1~qHE*-Dy4fjm&x+wtj zeFvn41?}_fLnGn1k64{fR7d6 znN!)~EYsuFK8jA5s!*PnZPD}5^Yy9b6V>lWY5x5lqBXBP4z2X=>V84qIW@g7rf&Mn zw5YJ_1Ye2ZuG$YjFFh~8Y3!4iLCeFnUu_|Igd?82GZ!xe_R zESnuCPP^Z|wBUjBu=I7!3Q7plV|Xr==#OERCu@D}d}FA@i@eZ;4PgY)a`NN~L+5th zn5ga;&YyRVtACV+#0d5d<__V48|rb>zm&d<^;`uBkRXvlF*)lAJ5Vi%YjPM(F?VGV z;8s>v3HuZLbYI(;Ovy#gk>f)QU+9jj9uLngos_roJm)pN6S!&jrkPg>!A&F*aqDcp z%0&H>oHTi~T)++Q^)cGx!cr>g0tX}tC9=BM;%}#1Ou^YlTME7k6st9(jq>8MDn!n(p zS9;dVT_Py=_K2Upp>8zDFM&~X9hM$$i(NiFZfB&^2X$q z$2@mctpfZN{4loOnWH}&*YC-b%f}TrA^$rydX-*=9%f5Ym19cpW3Q>_ya&CPm6d(U zs-x4q^h8<0%!Th?X>2YktSX(T&g4(Y6%`Ny&r9IpH4gySCCEaxL z2&70MFo>DXQanUY8zTeLC?2Lr!rVa&$a|R6h6Q1EVb37Kl} zx^|>URh|r|qm3kPJw2VX|7Im0QzV5#L8p&N%2D6fdga$aNtvvbZd7MH$QDMrxwCv| ztf7HEvh?CXOg1S!{ciKgND4ck3)**b#JhlNrnm*j2K$)8+7SoDVg{MF=`sX=W@*jS Q{>=wY*AV?o+xGtd0N(%-x&QzG literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/logixBanner2.png b/v1/src/assets/img/logixBanner2.png new file mode 100644 index 0000000000000000000000000000000000000000..9e7b044a64ba1e37cfe733310ea9209377f413dd GIT binary patch literal 24713 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 literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/logix_banner_new.png b/v1/src/assets/img/logix_banner_new.png new file mode 100644 index 0000000000000000000000000000000000000000..13d7fc635243f79d707d0043c859f32e74204b1a GIT binary patch literal 143965 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%0Alub%GfMsI)aRm(Y(BnAQG75m|{H}_#bzx@2t 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 literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/multiselectionDrag.mp4 b/v1/src/assets/img/multiselectionDrag.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..6a193d8e5bcafd7010b4b8b533a39045b5250144 GIT binary patch literal 79933 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�aW!}f{*=(ph63# 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 literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/stats.png b/v1/src/assets/img/stats.png new file mode 100644 index 0000000000000000000000000000000000000000..700bd7fb9ec3c2af3f506ef24bdbe41e165c7139 GIT binary patch literal 4824 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 literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/students.png b/v1/src/assets/img/students.png new file mode 100644 index 0000000000000000000000000000000000000000..0be22e0ed593b83fcc85ef1aac523eddde932a7d GIT binary patch literal 62506 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 Y#Yem*#``$##Pyz%D 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 SHu%2_0F*5uo9n)2ANyAU%@NrE literal 0 HcmV?d00001 diff --git a/v1/src/assets/img/wire.mp4 b/v1/src/assets/img/wire.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..8b246df9b9cdd8ad32a17d4c35843ee1611b683f GIT binary patch literal 20226 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 U|Bpu3KUTjmcVNlu3#@Jb7u2@p#Q*>R literal 0 HcmV?d00001 diff --git a/v1/src/assets/themes/ColorBlind.svg b/v1/src/assets/themes/ColorBlind.svg new file mode 100644 index 00000000..93bdf57a --- /dev/null +++ b/v1/src/assets/themes/ColorBlind.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v1/src/assets/themes/DefaultTheme.svg b/v1/src/assets/themes/DefaultTheme.svg new file mode 100644 index 00000000..f7979326 --- /dev/null +++ b/v1/src/assets/themes/DefaultTheme.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v1/src/assets/themes/GnW.svg b/v1/src/assets/themes/GnW.svg new file mode 100644 index 00000000..9d095029 --- /dev/null +++ b/v1/src/assets/themes/GnW.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v1/src/assets/themes/HighContrast.svg b/v1/src/assets/themes/HighContrast.svg new file mode 100644 index 00000000..d025b140 --- /dev/null +++ b/v1/src/assets/themes/HighContrast.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v1/src/assets/themes/LitebornSpring.svg b/v1/src/assets/themes/LitebornSpring.svg new file mode 100644 index 00000000..81b2bce4 --- /dev/null +++ b/v1/src/assets/themes/LitebornSpring.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v1/src/assets/themes/NightSky.svg b/v1/src/assets/themes/NightSky.svg new file mode 100644 index 00000000..718859b5 --- /dev/null +++ b/v1/src/assets/themes/NightSky.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v1/src/components/ContextMenu/ContextMenu.css b/v1/src/components/ContextMenu/ContextMenu.css new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/components/ContextMenu/ContextMenu.vue b/v1/src/components/ContextMenu/ContextMenu.vue new file mode 100644 index 00000000..d060d4f6 --- /dev/null +++ b/v1/src/components/ContextMenu/ContextMenu.vue @@ -0,0 +1,82 @@ + + + diff --git a/v1/src/components/DialogBox/BooleanTable.vue b/v1/src/components/DialogBox/BooleanTable.vue new file mode 100644 index 00000000..528a6cd5 --- /dev/null +++ b/v1/src/components/DialogBox/BooleanTable.vue @@ -0,0 +1,23 @@ + + + diff --git a/v1/src/components/DialogBox/CombinationalAnalysis.vue b/v1/src/components/DialogBox/CombinationalAnalysis.vue new file mode 100644 index 00000000..3b4092a8 --- /dev/null +++ b/v1/src/components/DialogBox/CombinationalAnalysis.vue @@ -0,0 +1,708 @@ + + + + + + + diff --git a/v1/src/components/DialogBox/CustomShortcut.vue b/v1/src/components/DialogBox/CustomShortcut.vue new file mode 100644 index 00000000..ae67a842 --- /dev/null +++ b/v1/src/components/DialogBox/CustomShortcut.vue @@ -0,0 +1,275 @@ + + + + + + + diff --git a/v1/src/components/DialogBox/ExportProject.vue b/v1/src/components/DialogBox/ExportProject.vue new file mode 100644 index 00000000..0da58f88 --- /dev/null +++ b/v1/src/components/DialogBox/ExportProject.vue @@ -0,0 +1,117 @@ + + + + + + + + + diff --git a/v1/src/components/DialogBox/ExportVerilog.vue b/v1/src/components/DialogBox/ExportVerilog.vue new file mode 100644 index 00000000..d826ad35 --- /dev/null +++ b/v1/src/components/DialogBox/ExportVerilog.vue @@ -0,0 +1,98 @@ + + + diff --git a/v1/src/components/DialogBox/HexBinDec.vue b/v1/src/components/DialogBox/HexBinDec.vue new file mode 100644 index 00000000..e65ebf73 --- /dev/null +++ b/v1/src/components/DialogBox/HexBinDec.vue @@ -0,0 +1,253 @@ + + + + + diff --git a/v1/src/components/DialogBox/ImportProject.vue b/v1/src/components/DialogBox/ImportProject.vue new file mode 100644 index 00000000..caa1df60 --- /dev/null +++ b/v1/src/components/DialogBox/ImportProject.vue @@ -0,0 +1,250 @@ + + + + + + + + + + + diff --git a/v1/src/components/DialogBox/InsertSubcircuit.vue b/v1/src/components/DialogBox/InsertSubcircuit.vue new file mode 100644 index 00000000..f2c1b1a6 --- /dev/null +++ b/v1/src/components/DialogBox/InsertSubcircuit.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/v1/src/components/DialogBox/OpenOffline.vue b/v1/src/components/DialogBox/OpenOffline.vue new file mode 100644 index 00000000..7bd3b94f --- /dev/null +++ b/v1/src/components/DialogBox/OpenOffline.vue @@ -0,0 +1,99 @@ + + + diff --git a/v1/src/components/DialogBox/SaveImage.vue b/v1/src/components/DialogBox/SaveImage.vue new file mode 100644 index 00000000..9cfaba08 --- /dev/null +++ b/v1/src/components/DialogBox/SaveImage.vue @@ -0,0 +1,157 @@ + + + diff --git a/v1/src/components/DialogBox/Themes/ApplyThemes.vue b/v1/src/components/DialogBox/Themes/ApplyThemes.vue new file mode 100644 index 00000000..7d564509 --- /dev/null +++ b/v1/src/components/DialogBox/Themes/ApplyThemes.vue @@ -0,0 +1,288 @@ + + + diff --git a/v1/src/components/Dropdown/DropDown.css b/v1/src/components/Dropdown/DropDown.css new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/components/Dropdown/DropDown.vue b/v1/src/components/Dropdown/DropDown.vue new file mode 100644 index 00000000..89dc2b20 --- /dev/null +++ b/v1/src/components/Dropdown/DropDown.vue @@ -0,0 +1,58 @@ + + + diff --git a/v1/src/components/Extra.vue b/v1/src/components/Extra.vue new file mode 100644 index 00000000..e61d1597 --- /dev/null +++ b/v1/src/components/Extra.vue @@ -0,0 +1,323 @@ + + + \ No newline at end of file diff --git a/v1/src/components/Logo/Logo.css b/v1/src/components/Logo/Logo.css new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/components/Logo/Logo.vue b/v1/src/components/Logo/Logo.vue new file mode 100644 index 00000000..56130b8c --- /dev/null +++ b/v1/src/components/Logo/Logo.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/v1/src/components/MessageBox/messageBox.vue b/v1/src/components/MessageBox/messageBox.vue new file mode 100644 index 00000000..f008946f --- /dev/null +++ b/v1/src/components/MessageBox/messageBox.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/v1/src/components/Navbar/Hamburger/Hamburger.css b/v1/src/components/Navbar/Hamburger/Hamburger.css new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/components/Navbar/Hamburger/Hamburger.vue b/v1/src/components/Navbar/Hamburger/Hamburger.vue new file mode 100644 index 00000000..8c362ef8 --- /dev/null +++ b/v1/src/components/Navbar/Hamburger/Hamburger.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/v1/src/components/Navbar/Navbar.css b/v1/src/components/Navbar/Navbar.css new file mode 100644 index 00000000..acdaef1a --- /dev/null +++ b/v1/src/components/Navbar/Navbar.css @@ -0,0 +1,306 @@ +@import url('/src/styles/color_theme.scss'); + +.navbar { + background-color: var(--white); + position: relative; + top: 0; + width: 100%; + z-index: 100; +} +.header { + background: var(--bg-navbar); +} + +.logo { + display: block; + max-width: 100%; + margin-bottom: 0px; +} +.logo { + background: url(/src/assets/logo.svg) center/cover; + height: 30px; + width: 105px; + display: inline-block; + margin-right: 36px; +} + +.navbar-nav > li > a { + padding: 7px 15px; +} + +.navbar-logo { + height: 70px; + padding-top: 5px; +} + +.navbar-search-icon-container { + height: 40px; + position: relative; + width: 40px; +} +.navbar-search-icon-container.search-icon { + cursor: pointer; +} + +.navbar-search-icon-oncollapse { + display: none; + margin-right: 0; + padding-right: 0; + padding-top: 5px; + text-align: right; +} + +.fa-search { + color: var(--navbar-dark-grey); + font-size: 20px; + margin-right: 12px; + vertical-align: middle; +} +.fa-search:hover { + color: var(--primary-green); + cursor: pointer; +} + +.fa-search.active { + color: var(--secondary-green); +} + +.fa-search:focus { + outline: none; +} + +.navbar-simulator-text { + border: 2px solid var(--primary-green); + color: var(--navbar-dark-grey); + font-weight: 500; + transition: all 0.3s ease-in; +} + +.navbar-simulator-text:hover { + background: var(--primary-green); + color: var(--white); +} + +.navbar-dropdown-toggle-hidden.dropdown-toggle::after { + display: none; +} + +.dropdown-toggle.navbar-user-dropdown { + cursor: pointer; +} +.dropdown-toggle.navbar-user-dropdown::after { + margin-left: 0; + padding-left: 0; + vertical-align: 0.5em; +} + +.dropdown-item:hover { + background-color: var(--primary-green); + color: var(--white); +} + +.navbar-text { + color: var(--navbar-dark-grey); + font-weight: 500; +} + +.navbar-text:hover { + color: var(--primary-green); +} + +.navbar-text.active { + color: var(--secondary-green); +} + +.navbar-text:focus { + outline: none; + text-decoration: underline; +} + +.navbar-search-active { + background-color: var(--card-green); + display: none; + margin-top: 0; + padding: 20px; + position: fixed; + top: 96px; + width: 100%; + z-index: 90; +} + +#navbar-dropdown-1, +#navbar-dropdown-2 :hover { + color: var(--primary-green); +} + +#navbar-dropdown-1, +#navbar-dropdown-2 [aria-expanded='true'] { + color: var(--secondary-green); +} + +#navbar-dropdown-1, +#navbar-dropdown-2 :focus { + outline: none; + text-decoration: underline; +} + +.navbar-username-truncate { + display: inline-block; + max-width: 70px; + overflow: hidden; + text-overflow: ellipsis; +} + +.affix { + box-shadow: 0 8px 6px -6px var(--shadow-grey); +} + +.navbar-search-bar-form { + display: flex; + margin-left: auto; + margin-right: auto; + width: 70%; +} + +.navbar-search-bar-input { + border: 1px solid var(--primary-green); + margin: 5px; + min-width: 150px; + padding: 5px; + width: 100%; +} + +.navbar-search-bar-select { + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; + background-color: var(--card-green); + background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23000000%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E'), + linear-gradient(to bottom, var(--white) 0%, var(--white) 100%); + background-position: right 0.3em top 50%, 0 0; + background-repeat: no-repeat, repeat; + background-size: 0.45em auto, 100%; + border: 1px solid var(--primary-green); + cursor: pointer; + font-size: 18px; + height: 40px; + margin-right: 6px; + margin-top: 5px; + max-width: 100px; + min-width: 100px; + padding-left: 5px; +} + +@media (max-width: 991px) { + .navbar-search-icon-oncollapse { + display: block; + } + + .navbar-search-icon-onexpand { + display: none; + } +} + +@media (max-width: 768px) { + .navbar-search-bar-form { + width: 90%; + } + + .navbar-search-bar-button { + padding-left: 10px; + padding-right: 10px; + } + + .navbar-search-bar-select { + width: 50px; + } +} + +@media (max-width: 400px) { + .navbar-search-bar-form { + width: 100%; + } + + .navbar-search-container { + padding-left: 0; + padding-right: 0; + } + + .navbar-search-active { + padding-left: 10px; + padding-right: 10px; + } + + .navbar-logo { + height: 60px; + padding-top: 10px; + } +} + +/* dropdown-menu styles */ + +.dropdown > ul { + border-radius: 5px; + text-align: center; + position: absolute; + left: 50%; + transform: translate(-50%, 13px); +} + +.draggable-panel-css { + border-radius: 5px; + z-index: 70; + transition: background 0.5s ease-out; + position: fixed; +} + +@supports (backdrop-filter: blur()) { + .dropdown > ul { + backdrop-filter: blur(5px); + } +} + +.mw-override { + min-width: 110px; +} + +.dropdown > ul::before { + background-color: transparent; + content: ''; + width: 10px; + display: inline-block; + height: 10px; + position: absolute; + transform: translate(-50%, -13px) rotate(-45deg); +} + +.dropdown > ul::after { + content: ''; + width: 11.5px; + display: inline-block; + height: 10px; + position: absolute; + transform: translate(-50%, -15.5px); + top: 14.5px; +} + +.dropdown-menu > li > a { + padding: 7px 0; + width: 90%; + margin: auto; + transition: all 0.2s ease-in-out; + text-align: left; + padding-left: 10px; +} + +.dropdown-menu > li > a:hover { + border-radius: 7px; + opacity: 1; +} + +@media (max-width: 991px) { + .navbar-nav .dropdown-menu { + position: absolute; + float: none; + } +} diff --git a/v1/src/components/Navbar/Navbar.vue b/v1/src/components/Navbar/Navbar.vue new file mode 100644 index 00000000..caeec961 --- /dev/null +++ b/v1/src/components/Navbar/Navbar.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/v1/src/components/Navbar/NavbarLinks/NavbarLink/NavbarLink.css b/v1/src/components/Navbar/NavbarLinks/NavbarLink/NavbarLink.css new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/components/Navbar/NavbarLinks/NavbarLink/NavbarLink.vue b/v1/src/components/Navbar/NavbarLinks/NavbarLink/NavbarLink.vue new file mode 100644 index 00000000..7f61cd7e --- /dev/null +++ b/v1/src/components/Navbar/NavbarLinks/NavbarLink/NavbarLink.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/v1/src/components/Navbar/NavbarLinks/NavbarLinks.css b/v1/src/components/Navbar/NavbarLinks/NavbarLinks.css new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/components/Navbar/NavbarLinks/NavbarLinks.vue b/v1/src/components/Navbar/NavbarLinks/NavbarLinks.vue new file mode 100644 index 00000000..3c01a4dc --- /dev/null +++ b/v1/src/components/Navbar/NavbarLinks/NavbarLinks.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/v1/src/components/Navbar/QuickButton/QuickButton.css b/v1/src/components/Navbar/QuickButton/QuickButton.css new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/components/Navbar/QuickButton/QuickButton.vue b/v1/src/components/Navbar/QuickButton/QuickButton.vue new file mode 100644 index 00000000..aad07b93 --- /dev/null +++ b/v1/src/components/Navbar/QuickButton/QuickButton.vue @@ -0,0 +1,296 @@ + + + + + diff --git a/v1/src/components/Navbar/User/User.css b/v1/src/components/Navbar/User/User.css new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/components/Navbar/User/User.vue b/v1/src/components/Navbar/User/User.vue new file mode 100644 index 00000000..839dae5e --- /dev/null +++ b/v1/src/components/Navbar/User/User.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/v1/src/components/Panels/ElementsPanel/ElementsPanel.vue b/v1/src/components/Panels/ElementsPanel/ElementsPanel.vue new file mode 100644 index 00000000..e5c52896 --- /dev/null +++ b/v1/src/components/Panels/ElementsPanel/ElementsPanel.vue @@ -0,0 +1,240 @@ + + + + + diff --git a/v1/src/components/Panels/PropertiesPanel/LayoutProperty/LayoutProperty.vue b/v1/src/components/Panels/PropertiesPanel/LayoutProperty/LayoutProperty.vue new file mode 100644 index 00000000..49c7689f --- /dev/null +++ b/v1/src/components/Panels/PropertiesPanel/LayoutProperty/LayoutProperty.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/v1/src/components/Panels/PropertiesPanel/ModuleProperty/ElementProperty/ElementProperty.vue b/v1/src/components/Panels/PropertiesPanel/ModuleProperty/ElementProperty/ElementProperty.vue new file mode 100644 index 00000000..fec2c571 --- /dev/null +++ b/v1/src/components/Panels/PropertiesPanel/ModuleProperty/ElementProperty/ElementProperty.vue @@ -0,0 +1,121 @@ + + + diff --git a/v1/src/components/Panels/PropertiesPanel/ModuleProperty/ModuleProperty.vue b/v1/src/components/Panels/PropertiesPanel/ModuleProperty/ModuleProperty.vue new file mode 100644 index 00000000..92d0c9aa --- /dev/null +++ b/v1/src/components/Panels/PropertiesPanel/ModuleProperty/ModuleProperty.vue @@ -0,0 +1,43 @@ + + + diff --git a/v1/src/components/Panels/PropertiesPanel/ModuleProperty/ProjectProperty/ProjectProperty.vue b/v1/src/components/Panels/PropertiesPanel/ModuleProperty/ProjectProperty/ProjectProperty.vue new file mode 100644 index 00000000..1fc88e1f --- /dev/null +++ b/v1/src/components/Panels/PropertiesPanel/ModuleProperty/ProjectProperty/ProjectProperty.vue @@ -0,0 +1,241 @@ + + + + + + + diff --git a/v1/src/components/Panels/PropertiesPanel/ModuleProperty/SubcircuitProperty/SubcircuitProperty.vue b/v1/src/components/Panels/PropertiesPanel/ModuleProperty/SubcircuitProperty/SubcircuitProperty.vue new file mode 100644 index 00000000..6ac03ece --- /dev/null +++ b/v1/src/components/Panels/PropertiesPanel/ModuleProperty/SubcircuitProperty/SubcircuitProperty.vue @@ -0,0 +1,62 @@ + + + diff --git a/v1/src/components/Panels/PropertiesPanel/PropertiesPanel.vue b/v1/src/components/Panels/PropertiesPanel/PropertiesPanel.vue new file mode 100644 index 00000000..368c5b79 --- /dev/null +++ b/v1/src/components/Panels/PropertiesPanel/PropertiesPanel.vue @@ -0,0 +1,75 @@ + + + diff --git a/v1/src/components/Panels/Shared/DropdownSelect.vue b/v1/src/components/Panels/Shared/DropdownSelect.vue new file mode 100644 index 00000000..f1983987 --- /dev/null +++ b/v1/src/components/Panels/Shared/DropdownSelect.vue @@ -0,0 +1,29 @@ + + + diff --git a/v1/src/components/Panels/Shared/HelpButton.vue b/v1/src/components/Panels/Shared/HelpButton.vue new file mode 100644 index 00000000..9956010b --- /dev/null +++ b/v1/src/components/Panels/Shared/HelpButton.vue @@ -0,0 +1,21 @@ + + + \ No newline at end of file diff --git a/v1/src/components/Panels/Shared/InputGroups.vue b/v1/src/components/Panels/Shared/InputGroups.vue new file mode 100644 index 00000000..628da797 --- /dev/null +++ b/v1/src/components/Panels/Shared/InputGroups.vue @@ -0,0 +1,81 @@ + + + diff --git a/v1/src/components/Panels/Shared/PanelHeader.vue b/v1/src/components/Panels/Shared/PanelHeader.vue new file mode 100644 index 00000000..212d5eab --- /dev/null +++ b/v1/src/components/Panels/Shared/PanelHeader.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/v1/src/components/Panels/TimingDiagramPanel/TimingDiagramButtons.vue b/v1/src/components/Panels/TimingDiagramPanel/TimingDiagramButtons.vue new file mode 100644 index 00000000..e5b16ad4 --- /dev/null +++ b/v1/src/components/Panels/TimingDiagramPanel/TimingDiagramButtons.vue @@ -0,0 +1,26 @@ + + + diff --git a/v1/src/components/Panels/TimingDiagramPanel/TimingDiagramPanel.vue b/v1/src/components/Panels/TimingDiagramPanel/TimingDiagramPanel.vue new file mode 100644 index 00000000..70cbc244 --- /dev/null +++ b/v1/src/components/Panels/TimingDiagramPanel/TimingDiagramPanel.vue @@ -0,0 +1,107 @@ + + + + + + + diff --git a/v1/src/components/Panels/VerilogEditorPanel/VerilogEditorPanel.vue b/v1/src/components/Panels/VerilogEditorPanel/VerilogEditorPanel.vue new file mode 100644 index 00000000..5a2011fa --- /dev/null +++ b/v1/src/components/Panels/VerilogEditorPanel/VerilogEditorPanel.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/v1/src/components/ReportIssue/ReportIssue.vue b/v1/src/components/ReportIssue/ReportIssue.vue new file mode 100644 index 00000000..14a9c288 --- /dev/null +++ b/v1/src/components/ReportIssue/ReportIssue.vue @@ -0,0 +1,274 @@ + + + + + diff --git a/v1/src/components/ReportIssue/ReportIssueButton.vue b/v1/src/components/ReportIssue/ReportIssueButton.vue new file mode 100644 index 00000000..128b6288 --- /dev/null +++ b/v1/src/components/ReportIssue/ReportIssueButton.vue @@ -0,0 +1,24 @@ + + + diff --git a/v1/src/components/TabsBar/TabsBar.vue b/v1/src/components/TabsBar/TabsBar.vue new file mode 100644 index 00000000..68c22aa4 --- /dev/null +++ b/v1/src/components/TabsBar/TabsBar.vue @@ -0,0 +1,368 @@ + + + + + + + diff --git a/v1/src/components/helpers/Helper.vue b/v1/src/components/helpers/Helper.vue new file mode 100644 index 00000000..14934a66 --- /dev/null +++ b/v1/src/components/helpers/Helper.vue @@ -0,0 +1,28 @@ + + + diff --git a/v1/src/components/helpers/confirmComponent/ConfirmComponent.vue b/v1/src/components/helpers/confirmComponent/ConfirmComponent.vue new file mode 100644 index 00000000..f10fe442 --- /dev/null +++ b/v1/src/components/helpers/confirmComponent/ConfirmComponent.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/v1/src/components/helpers/createNewProject/TextEditor.vue b/v1/src/components/helpers/createNewProject/TextEditor.vue new file mode 100644 index 00000000..62811a4c --- /dev/null +++ b/v1/src/components/helpers/createNewProject/TextEditor.vue @@ -0,0 +1,445 @@ + + + + + diff --git a/v1/src/components/helpers/createNewProject/UpdateProjectDetail.vue b/v1/src/components/helpers/createNewProject/UpdateProjectDetail.vue new file mode 100644 index 00000000..94327f0b --- /dev/null +++ b/v1/src/components/helpers/createNewProject/UpdateProjectDetail.vue @@ -0,0 +1,264 @@ + + + + + + + diff --git a/v1/src/components/helpers/deleteCircuit/DeleteCircuit.vue b/v1/src/components/helpers/deleteCircuit/DeleteCircuit.vue new file mode 100644 index 00000000..04b7d478 --- /dev/null +++ b/v1/src/components/helpers/deleteCircuit/DeleteCircuit.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/v1/src/components/helpers/promptComponent/PromptComponent.vue b/v1/src/components/helpers/promptComponent/PromptComponent.vue new file mode 100644 index 00000000..fcedab76 --- /dev/null +++ b/v1/src/components/helpers/promptComponent/PromptComponent.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/v1/src/env.d.ts b/v1/src/env.d.ts new file mode 100644 index 00000000..76a98121 --- /dev/null +++ b/v1/src/env.d.ts @@ -0,0 +1,8 @@ +/// + +declare module '*.vue' { + import type { DefineComponent } from 'vue' + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types + const component: DefineComponent<{}, {}, any> + export default component +} diff --git a/v1/src/globalVariables.ts b/v1/src/globalVariables.ts new file mode 100644 index 00000000..34a7a546 --- /dev/null +++ b/v1/src/globalVariables.ts @@ -0,0 +1,27 @@ +/*global ...*/ +/*eslint no-undef: "error"*/ + +declare const window: any + +import jQuery from 'jquery' +window.$ = window.jQuery = jQuery + +import Array from './simulator/src/arrayHelpers.js' +window.Array = Array +window.isUserLoggedIn = false +window.logixProjectId = undefined + +window.restrictedElements = [] +window.globalScope = undefined +window.lightMode = false // To be deprecated +window.projectId = undefined +window.id = undefined +window.loading = false // Flag - all assets are loaded + +window.embed = false + +window.width = undefined +window.height = undefined +window.DPR = window.devicePixelRatio || 1 // devicePixelRatio, 2 for retina displays, 1 for low resolution displays + +window.elementHierarchy = [] diff --git a/v1/src/locales/en.json b/v1/src/locales/en.json new file mode 100644 index 00000000..6681330a --- /dev/null +++ b/v1/src/locales/en.json @@ -0,0 +1,162 @@ +{ + "simulator": { + "save_online": "Save Online", + "save_offline": "Save Offline", + "preview_circuit": "Preview Circuit", + "export_verilog": "Export Verilog", + "insert_subcircuit": "Insert SubCircuit", + "undo": "Undo", + "report_issue": "Report an issue", + "restricted_elements_used": "Restricted elements used:", + "made_with_circuitverse": "Made With CircuitVerse", + "nav": { + "untitled_project": "Untitled", + "sign_out": "Sign Out", + "sign_in": "Sign In", + "user_dropdown": { + "dashboard": "Dashboard", + "my_groups": "My Groups", + "notifications": "Notifications" + }, + "project": { + "heading": "Project", + "project_page": "Project Page", + "new_project": "New Project", + "open_offline": "Open Offline", + "export_as_file": "Export as File", + "import_project": "Import Project", + "save_online": "Save Online", + "save_offline": "Save Offline", + "preview_circuit": "Preview Circuit", + "clear_project": "Clear Project", + "recover_project": "Recover Project", + "view_previous_ui": "View Previous UI" + }, + "circuit": { + "heading": "Circuit", + "new_circuit": "New Circuit +", + "insert_subcircuit": "Insert SubCircuit", + "new_verilog_module_html": "New Verilog\nModule" + }, + "tools": { + "heading": "Tools", + "combinational_analysis_html": "Combinational\nAnalysis", + "hex_bin_dec_converter_html": "Hex-Bin-Dec\nConverter", + "download_image": "Download Image", + "themes": "Themes", + "export_verilog": "Export Verilog", + "custom_shortcut": "Custom Shortcut" + }, + "help": { + "heading": "Help", + "tutorial_guide": "Tutorial Guide", + "user_manual": "User Manual", + "learn_digital_logic": "Learn Digital Logic", + "discussion_forum": "Discussion Forum" + } + }, + "panel_header": { + "circuit_elements": "Circuit Elements", + "layout_elements": "Layout Elements", + "timing_diagram": "Timing Diagram", + "verilog_module": "Verilog Module", + "properties": "Properties", + "layout": "Layout", + "keybinding_preference": "Keybinding Preference", + "render_image": "Render Image", + "select_theme": "Select Theme", + "boolean_logic_table": "BooleanLogicTable", + "open_project": "Open Project", + "bit_converter": "Dec-Bin-Hex-Converter" + }, + "panel_body": { + "circuit_elements": { + "search": "Search...", + "search_result": "No elements found...", + "expansion_panel_title": { + "Input": "Input", + "Output": "Output", + "Gates": "Gates", + "Decoders & Plexers": "Decoders & Plexers", + "Sequential Elements": "Sequential Elements", + "Annotation": "Annotation", + "Misc": "Misc" + } + }, + "timing_diagram": { + "one_cycle": "1 Cycle =", + "units": "Units" + }, + "verilog_module": { + "reset_code": "Reset Code", + "save_code": "Save Code", + "module_in_experiment_notice": "This is an experimental module. The code is not saved unless the \"Save Code\" button is clicked.", + "apply_themes": "Apply Themes", + "select_theme": "Select a theme:" + }, + "layout": { + "width": "Width", + "height": "Height", + "reset_all_nodes": "Reset all nodes:", + "title": "Title", + "title_enabled": "Title Enabled:", + "save": "Save", + "cancel": "Cancel" + }, + "render_image": { + "full_circuit_view": "Full Circuit View", + "current_view": "Current View", + "transparent_background": "Transparent Background", + "resolution": "Resolution:" + }, + "context_menu": { + "paste": "Paste", + "copy": "Copy", + "cut": "Cut", + "delete": "Delete", + "new_circuit": "New Circuit", + "center_focus": "Center Focus" + }, + "bit_converter": { + "decimal_value": "Decimal Value", + "binary_value": "Binary value", + "octal_value": "Octal value", + "hexadecimal_value": "Hexadecimal value" + }, + "custom_shortcut": { + "esc_cancel": "Press Desire Key Combination & press Enter", + "command": "Command", + "keymapping": "Keymapping", + "reset_to_default": "Reset to Default", + "save": "Save" + }, + "report_issue": { + "describe_issue": "Describe your issue:", + "email": "Email", + "optional": " [Optional]", + "report_btn": "Report", + "cancel_btn": "Cancel", + "close_btn": "Close" + } + }, + "tooltip": { + "delete_selected": "Delete Selected", + "download_as_image": "Download as Image", + "fit_to_screen": "Fit to Screen", + "redo": "Redo", + "decrease_size": "Decrease Size", + "increase_size": "Increase Size", + "decrease_height": "Decrease Height", + "increase_height": "Increase Height", + "reset_timing_diagram": "Reset Timing Diagram", + "autocalibrate_cycle_units": "Autocalibrate Cycle Units", + "zoom_in": "Zoom In", + "zoom_out": "Zoom Out", + "resume_timing_diagram": "Resume Timing Diagram", + "pause_timing_diagram": "Pause Timing Diagram", + "decrease_width": "Decrease Width", + "increase_width": "Increase Width", + "reset": "Reset" + } + } +} diff --git a/v1/src/locales/hi.json b/v1/src/locales/hi.json new file mode 100644 index 00000000..39086a16 --- /dev/null +++ b/v1/src/locales/hi.json @@ -0,0 +1,162 @@ +{ + "simulator": { + "save_online": "ऑनलाइन सेव करें", + "save_offline": "ऑफलाइन सेव करें", + "preview_circuit": "सर्किट प्रीव्यू करें", + "export_verilog": "वेरिलोग एक्सपोर्ट करें", + "insert_subcircuit": "सब-सर्किट इन्सर्ट करें", + "undo": "पूर्ववत् करें", + "report_issue": "मामले की रिपोर्ट करें", + "restricted_elements_used": "प्रतिबंधित एलिमेंट्स जिनका इस्तेमाल किया गया:", + "made_with_circuitverse": "सर्किटवर्स में बनाया गया", + "nav": { + "untitled_project": "शीर्षकहीन", + "sign_out": "साइन आउट", + "sign_in": "साइन इन करें", + "user_dropdown": { + "dashboard": "डैशबोर्ड", + "my_groups": "मेरे समूह", + "notifications": "सूचनाएं" + }, + "project": { + "heading": "परियोजना", + "project_page": "परियोजना का पेज", + "new_project": "नयी परियोजना", + "open_offline": "ऑफ़लाइन खोलें", + "save_online": "ऑनलाइन सहेजें", + "save_offline": "ऑफ़लाइन सहेजें", + "export_as_file": "फ़ाइल में निर्यात करें", + "import_project": "फ़ाइल से आयात करें", + "preview_circuit": "पूर्वावलोकन सर्किट", + "clear_project": "परियोजना क्लियर करें", + "recover_project": "परियोजना पुनर्प्राप्त करें", + "view_previous_ui": "पिछला UI देखें" + }, + "circuit": { + "heading": "सर्किट", + "new_circuit": "नया सर्किट +", + "insert_subcircuit": "सब-सर्किट डालें", + "new_verilog_module_html": "नया वेरिलोग\nमॉड्यूल" + }, + "tools": { + "heading": "उपकरण", + "combinational_analysis_html": "कॉम्बिनेशनल\nएनालिसिस", + "hex_bin_dec_converter_html": "Hex-Bin-Dec\nकनवर्टर", + "download_image": "छवि डाउनलोड करें", + "themes": "थीम", + "export_verilog": "निर्यात Verilog", + "custom_shortcut": "कस्टम शॉर्टकट" + }, + "help": { + "heading": "सहायता", + "tutorial_guide": "ट्यूटोरियल गाइड", + "user_manual": "उपयोगकर्ताओं के लिए मैन्युअल", + "learn_digital_logic": "डिजिटल लॉजिक सीखें", + "discussion_forum": "चर्चा के लिए मंच" + } + }, + "panel_header": { + "circuit_elements": "सर्किट के एलिमेंट्स", + "layout_elements": "लेआउट के एलिमेंट्स", + "timing_diagram": "टाइमिंग डायग्राम", + "verilog_module": "वेरिलोग मॉड्यूल", + "properties": "प्रॉपर्टीज", + "layout": "लेआउट", + "keybinding_preference": "कीबाइंडिंग परेफरेंस", + "render_image": "छवि प्रस्तुत करें", + "select_theme": "थीम चुनें", + "boolean_logic_table": "बूलियन लॉजिक टेबल", + "open_project": "परियोजना खोलें", + "bit_converter": "Dec-Bin-Hex-कनवर्टर" + }, + "panel_body": { + "circuit_elements": { + "search": "खोजें...", + "search_result": "कोई तत्व नहीं मिला...", + "expansion_panel_title": { + "Input": "इनपुट", + "Output": "उत्पादन", + "Gates": "गेट्स", + "Decoders & Plexers": "डिकोडर्स और प्लेक्सर्स", + "Sequential Elements": "अनुक्रमिक तत्व", + "Annotation": "टिप्पणी", + "Misc": "विविध" + } + }, + "timing_diagram": { + "one_cycle": "1 साइकिल =", + "units": "यूनिट्स" + }, + "verilog_module": { + "reset_code": "कोड रिसेट करें", + "save_code": "कोड सेव करें", + "module_in_experiment_notice": "यह एक प्रायोगिक मॉड्यूल है। कोड तब तक सेव नहीं होगा जब तक \"कोड सेव करें\" बटन क्लिक नहीं किया जाता।", + "apply_themes": "थीम लागू करें", + "select_theme": "थीम चुनें:" + }, + "layout": { + "width": "चौड़ाई", + "height": "ऊंचाई", + "reset_all_nodes": "सभी नोड्स रीसेट करें:", + "title": "शीर्षक", + "title_enabled": "शीर्षक इनेबल किया गया:", + "save": "सेव करें", + "cancel": "रद्द करें" + }, + "render_image": { + "full_circuit_view": "सर्किट का पूर्ण दृश्य देखें", + "current_view": "वर्तमान का दृश्य", + "transparent_background": "बैकग्राउंड ट्रांसपेरेंट करें", + "resolution": "रेजोलुएशन" + }, + "context_menu": { + "paste": "पेस्ट करें", + "copy": "कॉपी करें", + "cut": "कट करें", + "delete": "हटाएं", + "new_circuit": "नया सर्किट", + "center_focus": "सेंटर फोकस" + }, + "bit_converter": { + "decimal_value": "डेसीमल वैल्यू", + "binary_value": "बाइनरी वैल्यू", + "octal_value": "ऑक्टल वैल्यू", + "hexadecimal_value": "हेक्साडेसिमल वैल्यू" + }, + "custom_shortcut": { + "esc_cancel": "वांछित कुंजी संयोजन दबाएं और स्टोर करने के लिए enter दबाएं", + "command": "कमांड", + "keymapping": "कीमैपिंग", + "reset_to_default": "डिफ़ॉल्ट पर रीसेट करें", + "save": "सेव करें" + }, + "report_issue": { + "describe_issue": "अपनी समस्या का वर्णन करें:", + "email": "ईमेल", + "optional": " [वैकल्पिक]", + "report_btn": "रिपोर्ट करें", + "cancel_btn": "रद्द करें", + "close_btn": "बंद करें" + } + }, + "tooltip": { + "delete_selected": "चयनित हटाए", + "download_as_image": "छवि के रूप में डाउनलोड करें", + "fit_to_screen": "स्क्रीन में फिट", + "redo": "फिर से करें", + "decrease_size": "आकार घटाएं", + "increase_size": "आकार बढ़ाएँ", + "decrease_height": "ऊंचाई घटाएं", + "increase_height": "ऊँचाई बढ़ाएँ", + "reset_timing_diagram": "टाइमिंग डायग्राम रिसेट करें", + "autocalibrate_cycle_units": "साइक्ल यूनिट्स को ऑटोकैलिब्रेट करें", + "zoom_in": "ज़ूम इन", + "zoom_out": "ज़ूम आउट", + "resume_timing_diagram": "टाइमिंग डायग्राम को रिज्यूम करें", + "pause_timing_diagram": "टाइमिंग डायग्राम को पॉज करें", + "decrease_width": "चौड़ाई घटाएं", + "increase_width": "चौड़ाई बढ़ाएँ", + "reset": "रिसेट करें" + } + } +} diff --git a/v1/src/locales/i18n.ts b/v1/src/locales/i18n.ts new file mode 100644 index 00000000..d82d9d3f --- /dev/null +++ b/v1/src/locales/i18n.ts @@ -0,0 +1,16 @@ +import { createI18n } from 'vue-i18n' +import en from './en.json' +import hi from './hi.json' + +const i18n = createI18n({ + legacy: false, + locale: 'en', + globalInjection: true, + // messages + messages: { + en, + hi, + }, +}) + +export default i18n diff --git a/v1/src/main.ts b/v1/src/main.ts new file mode 100644 index 00000000..3f92ae32 --- /dev/null +++ b/v1/src/main.ts @@ -0,0 +1,29 @@ +import { useActions } from './store/SimulatorStore/actions' +import { createApp } from 'vue' +import App from './App.vue' +import vuetify from './plugins/vuetify' +import router from './router/index' +import { createPinia } from 'pinia' +import { loadFonts } from './plugins/webfontloader' +import i18n from './locales/i18n' + +import 'bootstrap' + +import './globalVariables' + +import './styles/css/main.stylesheet.css' +import '../node_modules/bootstrap/scss/bootstrap.scss' +import './styles/color_theme.scss' +import './styles/simulator.scss' +import './styles/tutorials.scss' +import '@fortawesome/fontawesome-free/css/all.css' + +loadFonts() + +const app = createApp(App) + +app.use(createPinia()) +app.use(vuetify) +app.use(router) +app.use(i18n) +app.mount('#app') diff --git a/v1/src/pages/embed.vue b/v1/src/pages/embed.vue new file mode 100644 index 00000000..18a68a24 --- /dev/null +++ b/v1/src/pages/embed.vue @@ -0,0 +1,317 @@ + + + + + diff --git a/v1/src/pages/simulator.vue b/v1/src/pages/simulator.vue new file mode 100644 index 00000000..98c3e17e --- /dev/null +++ b/v1/src/pages/simulator.vue @@ -0,0 +1,27 @@ + + + diff --git a/v1/src/pages/simulatorHandler.vue b/v1/src/pages/simulatorHandler.vue new file mode 100644 index 00000000..d9e935ed --- /dev/null +++ b/v1/src/pages/simulatorHandler.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/v1/src/plugins/vuetify.ts b/v1/src/plugins/vuetify.ts new file mode 100644 index 00000000..d58e9e51 --- /dev/null +++ b/v1/src/plugins/vuetify.ts @@ -0,0 +1,9 @@ +// Styles +import '@mdi/font/css/materialdesignicons.css' +import 'vuetify/styles' + +// Vuetify +import { createVuetify } from 'vuetify' + +export default createVuetify() +// https://vuetifyjs.com/en/introduction/why-vuetify/#feature-guides diff --git a/v1/src/plugins/webfontloader.ts b/v1/src/plugins/webfontloader.ts new file mode 100644 index 00000000..f3287331 --- /dev/null +++ b/v1/src/plugins/webfontloader.ts @@ -0,0 +1,17 @@ +/** + * plugins/webfontloader.js + * + * webfontloader documentation: https://github.com/typekit/webfontloader + */ + +export async function loadFonts() { + const webFontLoader = await import( + /* webpackChunkName: "webfontloader" */ 'webfontloader' + ) + + webFontLoader.load({ + google: { + families: ['Roboto:100,300,400,500,700,900&display=swap'], + }, + }) +} diff --git a/v1/src/router/index.ts b/v1/src/router/index.ts new file mode 100644 index 00000000..730aea09 --- /dev/null +++ b/v1/src/router/index.ts @@ -0,0 +1,41 @@ +import { createRouter, createWebHistory } from 'vue-router' +import simulatorHandler from '../pages/simulatorHandler.vue' +import Embed from '../pages/embed.vue' + +const routes = [ + { + path: '/', + redirect: '/simulatorvue', // @TODO: update later back to /simulator + }, + { + path: '/simulatorvue', // @TODO: update later back to /simulator + name: 'simulator', + component: simulatorHandler, + children: [ + { + path: 'edit/:projectId', + name: 'simulator-edit', + component: simulatorHandler, + props: true, + }, + ], + }, + { + path: '/simulatorvue/:projectId', + name: 'simulator-view', + component: Embed, + props: true, + }, + { + path: '/simulatorvue/embed/:projectId', + name: 'simulator-embed', + component: Embed, + props: true, + }, +] +const router = createRouter({ + history: createWebHistory(), + routes, +}) + +export default router diff --git a/v1/src/shims-vuetify.d.ts b/v1/src/shims-vuetify.d.ts new file mode 100644 index 00000000..e4a5d5c5 --- /dev/null +++ b/v1/src/shims-vuetify.d.ts @@ -0,0 +1,3 @@ +declare module 'vuetify' +declare module 'vuetify/lib/components' +declare module 'vuetify/lib/directives' diff --git a/v1/src/simulator/spec/circuits/Decoders-plexers-circuitdata.json b/v1/src/simulator/spec/circuits/Decoders-plexers-circuitdata.json new file mode 100644 index 00000000..bf601345 --- /dev/null +++ b/v1/src/simulator/spec/circuits/Decoders-plexers-circuitdata.json @@ -0,0 +1,1109 @@ +{ + "name": "Decoders and Plexers", + "timePeriod": 500, + "clockEnabled": true, + "projectId": "RVvp1Qq4hf3eVcfUO7sE", + "focussedCircuit": 11597572508, + "orderedTabs": ["11597572508"], + "scopes": [ + { + "layout": { + "width": 100, + "height": 280, + "title_x": 50, + "title_y": 13, + "titleEnabled": true + }, + "verilogMetadata": { + "isVerilogCircuit": false, + "isMainCircuit": false, + "code": "// Write Some Verilog Code Here!", + "subCircuitScopeIds": [] + }, + "allNodes": [ + { + "x": -10, + "y": -10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [14] + }, + { + "x": -10, + "y": 10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [5] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [6] + }, + { + "x": 0, + "y": 20, + "type": 0, + "bitWidth": 1, + "label": "Control Signal", + "connections": [24] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [14] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [1] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [2] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [15] + }, + { + "x": -10, + "y": -10, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [12] + }, + { + "x": -10, + "y": 10, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [13] + }, + { + "x": 0, + "y": 20, + "type": 0, + "bitWidth": 1, + "label": "Control Signal", + "connections": [11] + }, + { + "x": 80, + "y": 510, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [10, 25] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [8] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [9] + }, + { + "x": -30, + "y": 130, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [0, 4, 15] + }, + { + "x": -30, + "y": 340, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [7, 14] + }, + { + "x": -20, + "y": 0, + "type": 0, + "bitWidth": 2, + "label": "Input", + "connections": [20] + }, + { + "x": 20, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "Output", + "connections": [19] + }, + { + "x": 0, + "y": 20, + "type": 0, + "bitWidth": 1, + "label": "Bit Selector", + "connections": [26] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [17] + }, + { + "x": 20, + "y": 0, + "type": 1, + "bitWidth": 2, + "label": "", + "connections": [16] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [22] + }, + { + "x": -180, + "y": 160, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [21, 23] + }, + { + "x": -180, + "y": 220, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [22, 24, 25] + }, + { + "x": 90, + "y": 220, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [3, 23] + }, + { + "x": -180, + "y": 510, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [11, 23, 27] + }, + { + "x": 70, + "y": 700, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [18, 27] + }, + { + "x": -180, + "y": 700, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [25, 26] + }, + { + "x": -10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [33] + }, + { + "x": 20, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [32] + }, + { + "x": 20, + "y": 20, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [31] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [30] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [29] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [28] + }, + { + "x": -10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [39] + }, + { + "x": 20, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [37] + }, + { + "x": 20, + "y": 20, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [38] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [35] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [36] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [34] + }, + { + "x": -10, + "y": -10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [46] + }, + { + "x": -10, + "y": 10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [47] + }, + { + "x": 30, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [45] + }, + { + "x": 10, + "y": 30, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [44] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [43] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [42] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [40] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [41] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [53] + }, + { + "x": -10, + "y": -10, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [51] + }, + { + "x": -10, + "y": 10, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [52] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [49] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [50] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [48] + } + ], + "id": 11597572508, + "name": "Main", + "Input": [ + { + "x": -70, + "y": 130, + "objectType": "Input", + "label": "inp1", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 4 + }, + "values": { + "state": 1 + }, + "constructorParamaters": [ + "RIGHT", + 1, + { + "x": 0, + "y": 60, + "id": "cZW4OLLsTA1aBoRSmHxv" + } + ] + } + }, + { + "x": -70, + "y": 150, + "objectType": "Input", + "label": "inp2", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 5 + }, + "values": { + "state": 1 + }, + "constructorParamaters": [ + "RIGHT", + 1, + { + "x": 0, + "y": 20, + "id": "OhBFKFzir02JVzBVOV44" + } + ] + } + }, + { + "x": -30, + "y": 630, + "objectType": "Input", + "label": "", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 20 + }, + "values": { + "state": 3 + }, + "constructorParamaters": [ + "RIGHT", + 2, + { + "x": 0, + "y": 120, + "id": "Tci49l79hiLHSfxqSPhk" + } + ] + } + }, + { + "x": -360, + "y": 160, + "objectType": "Input", + "label": "s", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 21 + }, + "values": { + "state": 0 + }, + "constructorParamaters": [ + "RIGHT", + 1, + { + "x": 0, + "y": 40, + "id": "2jYcmNNFpmoq6jcELh8X" + } + ] + } + }, + { + "x": -10, + "y": 840, + "objectType": "Input", + "label": "", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 33 + }, + "values": { + "state": 0 + }, + "constructorParamaters": [ + "RIGHT", + 1, + { + "x": 0, + "y": 80, + "id": "wUbTZgbmrEStf17qxgOw" + } + ] + } + }, + { + "x": 0, + "y": 1030, + "objectType": "Input", + "label": "", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 39 + }, + "values": { + "state": 1 + }, + "constructorParamaters": [ + "RIGHT", + 1, + { + "x": 0, + "y": 100, + "id": "hiFGtGajuArxucFOfydA" + } + ] + } + }, + { + "x": -550, + "y": 310, + "objectType": "Input", + "label": "", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 46 + }, + "values": { + "state": 1 + }, + "constructorParamaters": [ + "RIGHT", + 1, + { + "x": 0, + "y": 140, + "id": "6br60gi40FN03qZRFG9W" + } + ] + } + }, + { + "x": -550, + "y": 330, + "objectType": "Input", + "label": "", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 47 + }, + "values": { + "state": 1 + }, + "constructorParamaters": [ + "RIGHT", + 1, + { + "x": 0, + "y": 160, + "id": "EcNRmJVcoyFZdMUmGwQw" + } + ] + } + }, + { + "x": -600, + "y": 680, + "objectType": "Input", + "label": "", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 53 + }, + "values": { + "state": 1 + }, + "constructorParamaters": [ + "RIGHT", + 1, + { + "x": 0, + "y": 180, + "id": "eAluIwGbrt2vmFD37xUb" + } + ] + } + } + ], + "Output": [ + { + "x": 250, + "y": 140, + "objectType": "Output", + "label": "out1", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 6 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 40, + "id": "PQtMRkU1V36zoiUZaKnC" + } + ] + } + }, + { + "x": 340, + "y": 330, + "objectType": "Output", + "label": "out3", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 12 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 20, + "id": "rl7YenrdGRoBr9BXA2Ee" + } + ] + } + }, + { + "x": 340, + "y": 350, + "objectType": "Output", + "label": "out4", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 13 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 60, + "id": "gPrg5glyUDxsQmGldTow" + } + ] + } + }, + { + "x": 260, + "y": 630, + "objectType": "Output", + "label": "", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 19 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 80, + "id": "qqnDrlsm0T8y1dyyiGlL" + } + ] + } + }, + { + "x": 270, + "y": 860, + "objectType": "Output", + "label": "", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 31 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 120, + "id": "2smYfkmptbhEZ2gFBMmf" + } + ] + } + }, + { + "x": 270, + "y": 840, + "objectType": "Output", + "label": "", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 32 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 100, + "id": "45NWNA9b3l54VZE5cFYS" + } + ] + } + }, + { + "x": 220, + "y": 1030, + "objectType": "Output", + "label": "", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 37 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 140, + "id": "COIaU2CIfnmcZ8h0Nxpq" + } + ] + } + }, + { + "x": 220, + "y": 1050, + "objectType": "Output", + "label": "", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 38 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 160, + "id": "bJ7CLsYt9Johbanua2d4" + } + ] + } + }, + { + "x": -460, + "y": 400, + "objectType": "Output", + "label": "", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 44 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 180, + "id": "Of7qPmfBvyW9mhiLkfpN" + } + ] + } + }, + { + "x": -290, + "y": 320, + "objectType": "Output", + "label": "", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 45 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 200, + "id": "LLwXovDSOe6rplHPIDhv" + } + ] + } + }, + { + "x": -310, + "y": 670, + "objectType": "Output", + "label": "", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 51 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 220, + "id": "Yo4Zo5P6gClWQJZWt5DF" + } + ] + } + }, + { + "x": -310, + "y": 690, + "objectType": "Output", + "label": "", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 52 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 240, + "id": "T86CxN5DtKbZtDaZXSMx" + } + ] + } + } + ], + "Multiplexer": [ + { + "x": 90, + "y": 140, + "objectType": "Multiplexer", + "label": "multiplexer", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "constructorParamaters": ["RIGHT", 1, 1], + "nodes": { + "inp": [0, 1], + "output1": 2, + "controlSignalInput": 3 + } + } + } + ], + "BitSelector": [ + { + "x": 70, + "y": 630, + "objectType": "BitSelector", + "label": "", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "nodes": { + "inp1": 16, + "output1": 17, + "bitSelectorInp": 18 + }, + "constructorParamaters": ["RIGHT", 2, 1] + } + } + ], + "Demultiplexer": [ + { + "x": 80, + "y": 340, + "objectType": "Demultiplexer", + "label": "demultiplexer", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 10, + "customData": { + "constructorParamaters": ["LEFT", 1, 1], + "nodes": { + "output1": [8, 9], + "input": 7, + "controlSignalInput": 10 + } + } + } + ], + "MSB": [ + { + "x": 70, + "y": 840, + "objectType": "MSB", + "label": "", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "nodes": { + "inp1": 28, + "output1": 29, + "enable": 30 + }, + "constructorParamaters": ["RIGHT", 1] + } + } + ], + "LSB": [ + { + "x": 70, + "y": 1030, + "objectType": "LSB", + "label": "", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "nodes": { + "inp1": 34, + "output1": 35, + "enable": 36 + }, + "constructorParamaters": ["RIGHT", 1] + } + } + ], + "PriorityEncoder": [ + { + "x": -480, + "y": 320, + "objectType": "PriorityEncoder", + "label": "", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "nodes": { + "inp1": [40, 41], + "output1": [42], + "enable": 43 + }, + "constructorParamaters": ["RIGHT", 1] + } + } + ], + "Decoder": [ + { + "x": -480, + "y": 680, + "objectType": "Decoder", + "label": "", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 10, + "customData": { + "constructorParamaters": ["LEFT", 1], + "nodes": { + "output1": [49, 50], + "input": 48 + } + } + } + ], + "restrictedCircuitElementsUsed": [], + "nodes": [11, 14, 15, 22, 23, 24, 25, 26, 27] + } + ] +} diff --git a/v1/src/simulator/spec/circuits/gates-circuitdata.json b/v1/src/simulator/spec/circuits/gates-circuitdata.json new file mode 100644 index 00000000..a5c96609 --- /dev/null +++ b/v1/src/simulator/spec/circuits/gates-circuitdata.json @@ -0,0 +1,710 @@ +{ + "name": "gates-circuitdata", + "timePeriod": 500, + "clockEnabled": true, + "projectId": "hCqg1Ns4JVckHsnyKQDi", + "focussedCircuit": 11597572508, + "orderedTabs": ["11597572508"], + "scopes": [ + { + "layout": { + "width": 100, + "height": 280, + "title_x": 50, + "title_y": 13, + "titleEnabled": true + }, + "verilogMetadata": { + "isVerilogCircuit": false, + "isMainCircuit": false, + "code": "// Write Some Verilog Code Here!", + "subCircuitScopeIds": [] + }, + "allNodes": [ + { + "x": -10, + "y": -10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [29] + }, + { + "x": -10, + "y": 10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [31] + }, + { + "x": 20, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [22] + }, + { + "x": -10, + "y": -10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [30] + }, + { + "x": -10, + "y": 10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [32] + }, + { + "x": 20, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [23] + }, + { + "x": -10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [35] + }, + { + "x": 20, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [25] + }, + { + "x": -20, + "y": -10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [38] + }, + { + "x": -20, + "y": 10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [40] + }, + { + "x": 20, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [27] + }, + { + "x": -10, + "y": -10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [33] + }, + { + "x": -10, + "y": 10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [34] + }, + { + "x": 30, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [24] + }, + { + "x": -10, + "y": -10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [37] + }, + { + "x": -10, + "y": 10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [39] + }, + { + "x": 30, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [28] + }, + { + "x": -20, + "y": -10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [36] + }, + { + "x": -20, + "y": 10, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [41] + }, + { + "x": 30, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [26] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [29] + }, + { + "x": 10, + "y": 0, + "type": 1, + "bitWidth": 1, + "label": "", + "connections": [31] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [2] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [5] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [13] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [7] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [19] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [10] + }, + { + "x": 10, + "y": 0, + "type": 0, + "bitWidth": 1, + "label": "", + "connections": [16] + }, + { + "x": 260, + "y": -10, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [0, 20, 30] + }, + { + "x": 260, + "y": 130, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [29, 3, 33] + }, + { + "x": 210, + "y": 10, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [1, 21, 32] + }, + { + "x": 210, + "y": 150, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [31, 4, 34] + }, + { + "x": 260, + "y": 300, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [30, 11, 35] + }, + { + "x": 210, + "y": 320, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [32, 12, 41] + }, + { + "x": 260, + "y": 460, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [33, 6, 36] + }, + { + "x": 260, + "y": 600, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [35, 17, 38] + }, + { + "x": 260, + "y": 820, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [38, 14] + }, + { + "x": 260, + "y": 740, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [36, 37, 8] + }, + { + "x": 210, + "y": 840, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [15, 40] + }, + { + "x": 210, + "y": 760, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [39, 9, 41] + }, + { + "x": 210, + "y": 620, + "type": 2, + "bitWidth": 1, + "label": "", + "connections": [34, 40, 18] + } + ], + "id": 11597572508, + "name": "Main", + "Input": [ + { + "x": -30, + "y": -10, + "objectType": "Input", + "label": "inp1", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 20 + }, + "values": { + "state": 1 + }, + "constructorParamaters": [ + "RIGHT", + 1, + { + "x": 0, + "y": 20, + "id": "55mKFwVFnZeU6ucfO8am" + } + ] + } + }, + { + "x": -30, + "y": 10, + "objectType": "Input", + "label": "inp2", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 0, + "customData": { + "nodes": { + "output1": 21 + }, + "values": { + "state": 1 + }, + "constructorParamaters": [ + "RIGHT", + 1, + { + "x": 0, + "y": 40, + "id": "2O2YfZk7yuqLrtiRb429" + } + ] + } + } + ], + "Output": [ + { + "x": 500, + "y": 0, + "objectType": "Output", + "label": "out1", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 22 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 20, + "id": "RarwxCcQgRygZftUFlMr" + } + ] + } + }, + { + "x": 510, + "y": 140, + "objectType": "Output", + "label": "out2", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 23 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 40, + "id": "N0agpzN04aqy9nLexP98" + } + ] + } + }, + { + "x": 520, + "y": 310, + "objectType": "Output", + "label": "out3", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 24 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 60, + "id": "2yO9fxrqrjPk1urH47Fc" + } + ] + } + }, + { + "x": 520, + "y": 460, + "objectType": "Output", + "label": "out4", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 25 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 80, + "id": "IN7sNsKhkByzBHRShVdu" + } + ] + } + }, + { + "x": 520, + "y": 610, + "objectType": "Output", + "label": "out5", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 26 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 100, + "id": "Dfr4VEfv27q3AOwkLqpx" + } + ] + } + }, + { + "x": 520, + "y": 750, + "objectType": "Output", + "label": "out6", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 27 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 120, + "id": "FGeZ7ip5nJo9MUlEyJ35" + } + ] + } + }, + { + "x": 530, + "y": 830, + "objectType": "Output", + "label": "out7", + "direction": "LEFT", + "labelDirection": "RIGHT", + "propagationDelay": 0, + "customData": { + "nodes": { + "inp1": 28 + }, + "constructorParamaters": [ + "LEFT", + 1, + { + "x": 100, + "y": 140, + "id": "oYVAxzNmrQgKjC7I3xOg" + } + ] + } + } + ], + "NotGate": [ + { + "x": 340, + "y": 460, + "objectType": "NotGate", + "label": "NOT GATE", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "constructorParamaters": ["RIGHT", 1], + "nodes": { + "output1": 7, + "inp1": 6 + } + } + } + ], + "OrGate": [ + { + "x": 330, + "y": 140, + "objectType": "OrGate", + "label": "OR GATE", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "constructorParamaters": ["RIGHT", 2, 1], + "nodes": { + "inp": [3, 4], + "output1": 5 + } + } + } + ], + "AndGate": [ + { + "x": 320, + "y": 0, + "objectType": "AndGate", + "label": "AND GATE", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "constructorParamaters": ["RIGHT", 2, 1], + "nodes": { + "inp": [0, 1], + "output1": 2 + } + } + } + ], + "NorGate": [ + { + "x": 330, + "y": 830, + "objectType": "NorGate", + "label": "NOR", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "constructorParamaters": ["RIGHT", 2, 1], + "nodes": { + "inp": [14, 15], + "output1": 16 + } + } + } + ], + "NandGate": [ + { + "x": 340, + "y": 310, + "objectType": "NandGate", + "label": "NAND GATE", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "constructorParamaters": ["RIGHT", 2, 1], + "nodes": { + "inp": [11, 12], + "output1": 13 + } + } + } + ], + "XorGate": [ + { + "x": 330, + "y": 750, + "objectType": "XorGate", + "label": "XOR", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "constructorParamaters": ["RIGHT", 2, 1], + "nodes": { + "inp": [8, 9], + "output1": 10 + } + } + } + ], + "XnorGate": [ + { + "x": 330, + "y": 610, + "objectType": "XnorGate", + "label": "XNOR GATE", + "direction": "RIGHT", + "labelDirection": "LEFT", + "propagationDelay": 10, + "customData": { + "constructorParamaters": ["RIGHT", 2, 1], + "nodes": { + "inp": [17, 18], + "output1": 19 + } + } + } + ], + "restrictedCircuitElementsUsed": [], + "nodes": [29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41] + } + ] +} diff --git a/v1/src/simulator/spec/data.spec.js b/v1/src/simulator/spec/data.spec.js new file mode 100644 index 00000000..f91a08c8 --- /dev/null +++ b/v1/src/simulator/spec/data.spec.js @@ -0,0 +1,121 @@ +/** + * @jest-environment jsdom + */ + +import CodeMirror from 'codemirror' +import { setup } from '../src/setup' +import load from '../src/data/load' +import gatesCircuitData from './circuits/gates-circuitdata.json' +import decoderCircuitData from './circuits/Decoders-plexers-circuitdata.json' +import { checkIfBackup, scheduleBackup } from '../src/data/backupCircuit' +import undo from '../src/data/undo' +import redo from '../src/data/redo' +import save from '../src/data/save' +import { + clearProject, + newProject, + recoverProject, + saveOffline, + openOffline, +} from '../src/data/project' +import createSaveAsImgPrompt from '../src/data/saveImage' + +jest.mock('codemirror') + +describe('data dir working', () => { + CodeMirror.fromTextArea.mockReturnValueOnce({ setValue: () => {} }) + window.confirm = jest.fn(() => true) + setup() + + test('load gates_circuitData without throwing error', () => { + expect(() => load(gatesCircuitData)).not.toThrow() + }) + + test('should load another circuit data decoder_circuitData', () => { + expect(() => load(decoderCircuitData)).not.toThrow() + }) + + test('schedule backup working', () => { + // toggle states of inputs a dn then run schedule backup + globalScope.Input.forEach((input) => { + input.state = input.state === 1 ? 0 : 1 + expect(() => scheduleBackup()).not.toThrow() + }) + }) + + test('check if backup performed', () => { + expect(() => checkIfBackup(globalScope)).toBeTruthy() + }) + + test('undo working', () => { + const beforeUndo = { + backups: globalScope.backups.length, + history: globalScope.history.length, + } + for (let i = 1; i < beforeUndo.backups; i++) { + undo() + const afterUndo = { + backups: globalScope.backups.length + i, + history: globalScope.history.length - i, + } + expect(afterUndo).toEqual(beforeUndo) + } + }) + + test('redo working', () => { + const beforeRedo = { + backups: globalScope.backups.length, + history: globalScope.history.length, + } + for (let i = 1; i < beforeRedo.history; i++) { + redo() + const afterRedo = { + backups: globalScope.backups.length - i, + history: globalScope.history.length + i, + } + expect(afterRedo).toEqual(beforeRedo) + } + }) + + test('save updated circuit_data', () => { + // save project + window.logixProjectId = decoderCircuitData.projectId + expect(() => save()).not.toThrow() + }) + + test('project working', () => { + // create new project + expect(() => newProject(true)).not.toThrow() + }) + + test('clear Project working', () => { + // clear project + expect(() => clearProject()).not.toThrow() + }) + + test('recover Project working', () => { + // recover project from localstorage + localStorage.setItem('recover', JSON.stringify(gatesCircuitData)) + expect(() => recoverProject()).not.toThrow() + }) + + test('SaveOffline working', () => { + // save offline gate project + expect(() => saveOffline()).not.toThrow() + }) + + test('OpenOffline working', () => { + // open dialog + openOffline() + // click on first input + $('#openProjectDialog input')[0].click() + // click on open button + $('#Open_offline_btn')[0].click() + // it should load the offline saved project + expect(globalScope.id).toBe(11597572508) + }) + + test('saveImage working', () => { + expect(() => createSaveAsImgPrompt()).not.toThrow() + }) +}) diff --git a/v1/src/simulator/spec/gates.spec.js b/v1/src/simulator/spec/gates.spec.js new file mode 100644 index 00000000..90c7b1bd --- /dev/null +++ b/v1/src/simulator/spec/gates.spec.js @@ -0,0 +1,57 @@ +/** + * @jest-environment jsdom + */ + +import CodeMirror from 'codemirror' +import { setup } from '../src/setup' + +import load from '../src/data/load' +import circuitData from './circuits/gates-circuitdata.json' +import testData from './testData/gates-testdata.json' +import { runAll } from '../src/testbench' + +jest.mock('codemirror') + +describe('Simulator Gates Testing', () => { + CodeMirror.fromTextArea.mockReturnValueOnce({ setValue: (text) => {} }) + setup() + + test('load circuitData', () => { + expect(() => load(circuitData)).not.toThrow() + }) + + test('AND gate testing', () => { + const result = runAll(testData.AndGate) + expect(result.summary.passed).toBe(4) + }) + + test('NAND gate testing', () => { + const result = runAll(testData.nandGate) + expect(result.summary.passed).toBe(4) + }) + + test('NOR gate testing', () => { + const result = runAll(testData.norGate) + expect(result.summary.passed).toBe(4) + }) + + test('NOT gate testing', () => { + const result = runAll(testData.notGate) + expect(result.summary.passed).toBe(2) + }) + + test('OR gate testing', () => { + const result = runAll(testData.OrGate) + expect(result.summary.passed).toBe(4) + }) + + test('XNOR gate testing', () => { + const result = runAll(testData.xnorGate) + expect(result.summary.passed).toBe(4) + }) + + test('XOR gate testing', () => { + const result = runAll(testData.xorGate) + expect(result.summary.passed).toBe(4) + }) +}) diff --git a/v1/src/simulator/spec/testData/gates-testdata.json b/v1/src/simulator/spec/testData/gates-testdata.json new file mode 100644 index 00000000..3152253b --- /dev/null +++ b/v1/src/simulator/spec/testData/gates-testdata.json @@ -0,0 +1,200 @@ +{ + "AndGate": { + "type": "comb", + "title": "AND Gate", + "groups": [ + { + "label": "Group 1", + "inputs": [ + { + "label": "inp1", + "bitWidth": 1, + "values": ["0", "0", "1", "1"] + }, + { + "label": "inp2", + "bitWidth": 1, + "values": ["0", "1", "0", "1"] + } + ], + "outputs": [ + { + "label": "out1", + "bitWidth": 1, + "values": ["0", "0", "0", "1"] + } + ], + "n": 4 + } + ] + }, + "OrGate": { + "type": "comb", + "title": "OR Gate", + "groups": [ + { + "label": "Group 1", + "inputs": [ + { + "label": "inp1", + "bitWidth": 1, + "values": ["0", "0", "1", "1"] + }, + { + "label": "inp2", + "bitWidth": 1, + "values": ["0", "1", "0", "1"] + } + ], + "outputs": [ + { + "label": "out2", + "bitWidth": 1, + "values": ["0", "1", "1", "1"] + } + ], + "n": 4 + } + ] + }, + "nandGate": { + "type": "comb", + "title": "NAND Gate", + "groups": [ + { + "label": "Group 1", + "inputs": [ + { + "label": "inp1", + "bitWidth": 1, + "values": ["0", "0", "1", "1"] + }, + { + "label": "inp2", + "bitWidth": 1, + "values": ["0", "1", "0", "1"] + } + ], + "outputs": [ + { + "label": "out3", + "bitWidth": 1, + "values": ["1", "1", "1", "0"] + } + ], + "n": 4 + } + ] + }, + "xorGate": { + "type": "comb", + "title": "XOR Gate", + "groups": [ + { + "label": "Group 1", + "inputs": [ + { + "label": "inp1", + "bitWidth": 1, + "values": ["0", "0", "1", "1"] + }, + { + "label": "inp2", + "bitWidth": 1, + "values": ["0", "1", "0", "1"] + } + ], + "outputs": [ + { + "label": "out6", + "bitWidth": 1, + "values": ["0", "1", "1", "0"] + } + ], + "n": 4 + } + ] + }, + "norGate": { + "type": "comb", + "title": "NOR Gate", + "groups": [ + { + "label": "Group 1", + "inputs": [ + { + "label": "inp1", + "bitWidth": 1, + "values": ["0", "0", "1", "1"] + }, + { + "label": "inp2", + "bitWidth": 1, + "values": ["0", "1", "0", "1"] + } + ], + "outputs": [ + { + "label": "out7", + "bitWidth": 1, + "values": ["1", "0", "0", "0"] + } + ], + "n": 4 + } + ] + }, + "notGate": { + "type": "comb", + "title": "NOT GAte", + "groups": [ + { + "label": "Group 1", + "inputs": [ + { + "label": "inp1", + "bitWidth": 1, + "values": ["0", "1"] + } + ], + "outputs": [ + { + "label": "out4", + "bitWidth": 1, + "values": ["1", "0"] + } + ], + "n": 2 + } + ] + }, + "xnorGate": { + "type": "comb", + "title": "XNOR GAte", + "groups": [ + { + "label": "Group 1", + "inputs": [ + { + "label": "inp1", + "bitWidth": 1, + "values": ["0", "0", "1", "1"] + }, + { + "label": "inp2", + "bitWidth": 1, + "values": ["0", "1", "0", "1"] + } + ], + "outputs": [ + { + "label": "out5", + "bitWidth": 1, + "values": ["1", "0", "0", "1"] + } + ], + "n": 4 + } + ] + } +} diff --git a/v1/src/simulator/src/Verilog2CV.js b/v1/src/simulator/src/Verilog2CV.js new file mode 100644 index 00000000..83e7641e --- /dev/null +++ b/v1/src/simulator/src/Verilog2CV.js @@ -0,0 +1,264 @@ +import { + createNewCircuitScope, + switchCircuit, + changeCircuitName, +} from './circuit' +import SubCircuit from './subcircuit' +import simulationArea from './simulationArea' +import CodeMirror from 'codemirror/lib/codemirror.js' +import 'codemirror/lib/codemirror.css' + +// Importing CodeMirror themes +import 'codemirror/theme/3024-day.css' +import 'codemirror/theme/solarized.css' +import 'codemirror/theme/elegant.css' +import 'codemirror/theme/neat.css' +import 'codemirror/theme/idea.css' +import 'codemirror/theme/neo.css' +import 'codemirror/theme/3024-night.css' +import 'codemirror/theme/blackboard.css' +import 'codemirror/theme/cobalt.css' +import 'codemirror/theme/the-matrix.css' +import 'codemirror/theme/night.css' +import 'codemirror/theme/monokai.css' +import 'codemirror/theme/midnight.css' + +import 'codemirror/addon/hint/show-hint.css' +import 'codemirror/mode/verilog/verilog.js' +import 'codemirror/addon/edit/closebrackets.js' +import 'codemirror/addon/hint/anyword-hint.js' +import 'codemirror/addon/hint/show-hint.js' +import 'codemirror/addon/display/autorefresh.js' +import { showError, showMessage } from './utils' +import { showProperties } from './ux' + +var editor +var verilogMode = false + +export async function createVerilogCircuit() { + const returned = await createNewCircuitScope( + undefined, + undefined, + true, + true + ) + if (returned) verilogModeSet(true) +} + +export function saveVerilogCode() { + var code = editor.getValue() + globalScope.verilogMetadata.code = code + generateVerilogCircuit(code) +} + +export function applyVerilogTheme(theme) { + localStorage.setItem('verilog-theme', theme) + editor.setOption('theme', theme) +} + +export function resetVerilogCode() { + editor.setValue(globalScope.verilogMetadata.code) +} + +export function hasVerilogCodeChanges() { + return editor.getValue() != globalScope.verilogMetadata.code +} + +export function verilogModeGet() { + return verilogMode +} + +export function verilogModeSet(mode) { + if (mode == verilogMode) return + verilogMode = mode + if (mode) { + document.getElementById('code-window').style.display = 'block' + document.querySelector('.elementPanel').style.display = 'none' + document.querySelector('.timing-diagram-panel').style.display = 'none' + document.querySelector('.quick-btn').style.display = 'none' + document.getElementById('verilogEditorPanel').style.display = 'block' + if (!embed) { + simulationArea.lastSelected = globalScope.root + showProperties(undefined) + showProperties(simulationArea.lastSelected) + } + resetVerilogCode() + } else { + document.getElementById('code-window').style.display = 'none' + document.querySelector('.elementPanel').style.display = '' + document.querySelector('.timing-diagram-panel').style.display = '' + document.querySelector('.quick-btn').style.display = '' + document.getElementById('verilogEditorPanel').style.display = 'none' + } +} + +import yosysTypeMap from './VerilogClasses' + +class verilogSubCircuit { + constructor(circuit) { + this.circuit = circuit + } + + getPort(portName) { + var numInputs = this.circuit.inputNodes.length + var numOutputs = this.circuit.outputNodes.length + + for (var i = 0; i < numInputs; i++) { + if (this.circuit.data.Input[i].label == portName) { + return this.circuit.inputNodes[i] + } + } + + for (var i = 0; i < numOutputs; i++) { + if (this.circuit.data.Output[i].label == portName) { + return this.circuit.outputNodes[i] + } + } + } +} + +export function YosysJSON2CV( + JSON, + parentScope = globalScope, + name = 'verilogCircuit', + subCircuitScope = {}, + root = false +) { + var parentID = parentScope.id + var subScope + if (root) { + subScope = parentScope + } else { + subScope = newCircuit(name, undefined, true, false) + } + var circuitDevices = {} + + for (var subCircuitName in JSON.subcircuits) { + var scope = YosysJSON2CV( + JSON.subcircuits[subCircuitName], + subScope, + subCircuitName, + subCircuitScope + ) + subCircuitScope[subCircuitName] = scope.id + } + + for (var device in JSON.devices) { + var deviceType = JSON.devices[device].type + if (deviceType == 'Subcircuit') { + var subCircuitName = JSON.devices[device].celltype + circuitDevices[device] = new verilogSubCircuit( + new SubCircuit( + 500, + 500, + undefined, + subCircuitScope[subCircuitName] + ) + ) + } else { + circuitDevices[device] = new yosysTypeMap[deviceType]( + JSON.devices[device] + ) + } + } + + for (var connection in JSON.connectors) { + var fromId = JSON.connectors[connection]['from']['id'] + var fromPort = JSON.connectors[connection]['from']['port'] + var toId = JSON.connectors[connection]['to']['id'] + var toPort = JSON.connectors[connection]['to']['port'] + + var fromObj = circuitDevices[fromId] + var toObj = circuitDevices[toId] + + var fromPortNode = fromObj.getPort(fromPort) + var toPortNode = toObj.getPort(toPort) + + fromPortNode.connect(toPortNode) + } + + if (!root) { + switchCircuit(parentID) + return subScope + } +} + +export default function generateVerilogCircuit( + verilogCode, + scope = globalScope +) { + var params = { code: verilogCode } + fetch('/api/v1/simulator/verilogcv', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(params), + }) + .then((response) => { + if (!response.ok) { + throw response + } + return response.json() + }) + .then((circuitData) => { + scope.initialize() + for (var id in scope.verilogMetadata.subCircuitScopeIds) + delete scopeList[id] + scope.verilogMetadata.subCircuitScopeIds = [] + scope.verilogMetadata.code = verilogCode + var subCircuitScope = {} + YosysJSON2CV( + circuitData, + globalScope, + 'verilogCircuit', + subCircuitScope, + true + ) + changeCircuitName(circuitData.name) + showMessage('Verilog Circuit Successfully Created') + document.getElementById('verilogOutput').innerHTML = '' + }) + .catch((error) => { + if (error.status == 500) { + showError('Could not connect to Yosys') + } else { + showError('There is some issue with the code') + error.json().then((errorMessage) => { + document.getElementById('verilogOutput').innerHTML = + errorMessage.message + }) + } + }) +} + +export function setupCodeMirrorEnvironment() { + var myTextarea = document.getElementById('codeTextArea') + + CodeMirror.commands.autocomplete = function (cm) { + cm.showHint({ hint: CodeMirror.hint.anyword }) + } + + editor = CodeMirror.fromTextArea(myTextarea, { + mode: 'verilog', + autoRefresh: true, + styleActiveLine: true, + lineNumbers: true, + autoCloseBrackets: true, + smartIndent: true, + indentWithTabs: true, + extraKeys: { 'Ctrl-Space': 'autocomplete' }, + }) + + if (!localStorage.getItem('verilog-theme')) { + localStorage.setItem('verilog-theme', 'default') + } else { + const prevtheme = localStorage.getItem('verilog-theme') + editor.setOption('theme', prevtheme) + } + + editor.setValue('// Write Some Verilog Code Here!') + setTimeout(function () { + editor.refresh() + }, 1) +} diff --git a/v1/src/simulator/src/VerilogClasses.js b/v1/src/simulator/src/VerilogClasses.js new file mode 100644 index 00000000..253748af --- /dev/null +++ b/v1/src/simulator/src/VerilogClasses.js @@ -0,0 +1,1507 @@ +import AndGate from './modules/AndGate' +import NandGate from './modules/NandGate' +import Multiplexer from './modules/Multiplexer' +import XorGate from './modules/XorGate' +import XnorGate from './modules/XnorGate' +import SevenSegDisplay from './modules/SevenSegDisplay' +import SixteenSegDisplay from './modules/SixteenSegDisplay' +import HexDisplay from './modules/HexDisplay' +import OrGate from './modules/OrGate' +import Stepper from './modules/Stepper' +import NotGate from './modules/NotGate' +import Text from './modules/Text' +import TriState from './modules/TriState' +import Buffer from './modules/Buffer' +import ControlledInverter from './modules/ControlledInverter' +import Adder from './modules/Adder' +import verilogMultiplier from './modules/verilogMultiplier' +import verilogDivider from './modules/verilogDivider' +import verilogPower from './modules/verilogPower' +import verilogShiftLeft from './modules/verilogShiftLeft' +import verilogShiftRight from './modules/verilogShiftRight' +import TwoComplement from './modules/TwoComplement' +import Splitter from './modules/Splitter' +import Ground from './modules/Ground' +import Power from './modules/Power' +import Input from './modules/Input' +import Output from './modules/Output' +import BitSelector from './modules/BitSelector' +import ConstantVal from './modules/ConstantVal' +import NorGate from './modules/NorGate' +import DigitalLed from './modules/DigitalLed' +import VariableLed from './modules/VariableLed' +import Button from './modules/Button' +import RGBLed from './modules/RGBLed' +import SquareRGBLed from './modules/SquareRGBLed' +import Demultiplexer from './modules/Demultiplexer' +import Decoder from './modules/Decoder' +import Flag from './modules/Flag' +import MSB from './modules/MSB' +import LSB from './modules/LSB' +import PriorityEncoder from './modules/PriorityEncoder' +import Tunnel from './modules/Tunnel' +import ALU from './modules/ALU' +import Rectangle from './modules/Rectangle' +import Arrow from './modules/Arrow' +import Counter from './modules/Counter' +import Random from './modules/Random' +import RGBLedMatrix from './modules/RGBLedMatrix' +import simulationArea from './simulationArea' +import TflipFlop from './sequential/TflipFlop' +import DflipFlop from './sequential/DflipFlop' +import Dlatch from './sequential/Dlatch' +import SRflipFlop from './sequential/SRflipFlop' +import JKflipFlop from './sequential/JKflipFlop' +import TTY from './sequential/TTY' +import Keyboard from './sequential/Keyboard' +import Clock from './sequential/Clock' +import RAM from './sequential/RAM' +import verilogRAM from './sequential/verilogRAM' +import EEPROM from './sequential/EEPROM' +import Rom from './sequential/Rom' +import TB_Input from './testbench/testbenchInput' +import TB_Output from './testbench/testbenchOutput' +import ForceGate from './testbench/ForceGate' +import { newCircuit, switchCircuit, changeCircuitName } from './circuit' +import SubCircuit from './subcircuit' + +function getBitWidth(bitsJSON) { + if (Number.isInteger(bitsJSON)) { + return bitsJSON + } else { + var ans = 1 + for (var i in bitsJSON) { + ans = Math.max(ans, bitsJSON[i]) + } + return ans + } +} + +class verilogUnaryGate { + constructor(deviceJSON) { + this.bitWidth = 1 + if (deviceJSON['bits']) { + this.bitWidth = getBitWidth(deviceJSON['bits']) + } + } + + getPort(portName) { + if (portName == 'in') { + return this.input + } + if (portName == 'out') { + return this.output + } + } +} + +class verilogInput extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + if (deviceJSON['net'] == 'clk' || deviceJSON['net'] == 'clock') { + this.element = new Clock(0, 0) + } else { + this.element = new Input(0, 0, undefined, undefined, this.bitWidth) + } + this.output = this.element.output1 + this.element.label = deviceJSON['net'] + } +} + +class verilogOutput extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new Output(0, 0, undefined, undefined, this.bitWidth) + this.input = this.element.inp1 + this.element.label = deviceJSON['net'] + } +} + +class verilogClock extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new Clock(0, 0) + this.output = this.element.output1 + } +} + +class verilogButton extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new Button(0, 0) + this.output = this.element.output1 + } +} + +class verilogLamp extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new DigitalLed(0, 0) + this.input = this.element.inp1 + } +} + +class verilogNotGate extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new NotGate(0, 0, undefined, undefined, this.bitWidth) + this.input = this.element.inp1 + this.output = this.element.output1 + } +} + +class verilogRepeaterGate extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new Buffer(0, 0, undefined, undefined, this.bitWidth) + this.input = this.element.inp1 + this.output = this.element.output1 + } +} + +class verilogConstantVal extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.bitWidth = deviceJSON['constant'].length + this.state = deviceJSON['constant'] + if (this.state[0] == 'x') { + this.state = undefined + } + this.element = new ConstantVal( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.state + ) + this.input = this.element.inp1 + this.output = this.element.output1 + } +} + +class verilogReduceAndGate extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.bitWidthSplit = [] + for (var i = 0; i < this.bitWidth; i++) { + this.bitWidthSplit.push(1) + } + + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.bitWidthSplit + ) + this.andGate = new AndGate(0, 0, undefined, undefined, this.bitWidth, 1) + + for (var i = 0; i < this.bitWidth; i++) { + this.splitter.outputs[i].connect(this.andGate.inp[i]) + } + + this.input = this.splitter.inp1 + this.output = this.andGate.output1 + } +} + +class verilogReduceNandGate extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.bitWidthSplit = [] + for (var i = 0; i < this.bitWidth; i++) { + this.bitWidthSplit.push(1) + } + + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.bitWidthSplit + ) + this.nandGate = new NandGate( + 0, + 0, + undefined, + undefined, + this.bitWidth, + 1 + ) + + for (var i = 0; i < this.bitWidth; i++) { + this.splitter.outputs[i].connect(this.nandGate.inp[i]) + } + + this.input = this.splitter.inp1 + this.output = this.nandGate.output1 + } +} + +class verilogReduceOrGate extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.bitWidthSplit = [] + for (var i = 0; i < this.bitWidth; i++) { + this.bitWidthSplit.push(1) + } + + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.bitWidthSplit + ) + this.orGate = new OrGate(0, 0, undefined, undefined, this.bitWidth, 1) + + for (var i = 0; i < this.bitWidth; i++) { + this.splitter.outputs[i].connect(this.orGate.inp[i]) + } + + this.input = this.splitter.inp1 + this.output = this.orGate.output1 + } +} + +class verilogReduceNorGate extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.bitWidthSplit = [] + for (var i = 0; i < this.bitWidth; i++) { + this.bitWidthSplit.push(1) + } + + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.bitWidthSplit + ) + this.norGate = new NorGate(0, 0, undefined, undefined, this.bitWidth, 1) + + for (var i = 0; i < this.bitWidth; i++) { + this.splitter.outputs[i].connect(this.norGate.inp[i]) + } + + this.input = this.splitter.inp1 + this.output = this.norGate.output1 + } +} + +class verilogReduceXorGate extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.bitWidthSplit = [] + for (var i = 0; i < this.bitWidth; i++) { + this.bitWidthSplit.push(1) + } + + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.bitWidthSplit + ) + this.xorGate = new XorGate(0, 0, undefined, undefined, this.bitWidth, 1) + + for (var i = 0; i < this.bitWidth; i++) { + this.splitter.outputs[i].connect(this.xorGate.inp[i]) + } + + this.input = this.splitter.inp1 + this.output = this.xorGate.output1 + } +} + +class verilogReduceXnorGate extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.bitWidthSplit = [] + for (var i = 0; i < this.bitWidth; i++) { + this.bitWidthSplit.push(1) + } + + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.bitWidthSplit + ) + this.xnorGate = new XnorGate( + 0, + 0, + undefined, + undefined, + this.bitWidth, + 1 + ) + + for (var i = 0; i < this.bitWidth; i++) { + this.splitter.outputs[i].connect(this.xnorGate.inp[i]) + } + + this.input = this.splitter.inp1 + this.output = this.xnorGate.output1 + } +} + +class verilogBusSlice extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.bitWidth = deviceJSON['slice']['total'] + + this.start = deviceJSON['slice']['first'] + this.count = deviceJSON['slice']['count'] + if (this.start == 0) { + if (this.count == this.bitWidth) { + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [this.bitWidth] + ) + } else { + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [this.count, this.bitWidth - this.count] + ) + } + + this.input = this.splitter.inp1 + this.output = this.splitter.outputs[0] + } else { + if (this.start + this.count == this.bitWidth) { + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [this.start, this.count] + ) + } else { + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [ + this.start, + this.count, + this.bitWidth - this.start - this.count, + ] + ) + } + this.input = this.splitter.inp1 + this.output = this.splitter.outputs[1] + } + } +} + +class verilogZeroExtend extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.inputBitWidth = deviceJSON['extend']['input'] + this.outputBitWidth = deviceJSON['extend']['output'] + + var extraBits = this.outputBitWidth - this.inputBitWidth + + var zeroState = '' + for (var i = 0; i < extraBits; i++) { + zeroState += '0' + } + + this.zeroConstant = new ConstantVal( + 0, + 0, + undefined, + undefined, + extraBits, + zeroState + ) + + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.outputBitWidth, + [this.inputBitWidth, extraBits] + ) + + this.zeroConstant.output1.connect(this.splitter.outputs[1]) + this.input = this.splitter.outputs[0] + this.output = this.splitter.inp1 + } +} + +class verilogNegationGate extends verilogUnaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.inputBitWidth = deviceJSON['bits']['in'] + + this.notGate = new NotGate(400, 0, undefined, undefined, this.bitWidth) + this.adder = new Adder(300, 0, undefined, undefined, this.bitWidth) + + if (this.inputBitWidth != this.bitWidth) { + var extraBits = this.bitWidth - this.inputBitWidth + this.splitter = new Splitter( + 600, + 600, + undefined, + undefined, + this.bitWidth, + [this.inputBitWidth, extraBits] + ) + + var zeroState = '' + for (var i = 0; i < extraBits; i++) { + zeroState += '0' + } + + this.zeroConstant = new ConstantVal( + 550, + 550, + undefined, + undefined, + extraBits, + zeroState + ) + + this.zeroConstant.output1.connect(this.splitter.outputs[1]) + this.splitter.inp1.connect(this.notGate.inp1) + + this.input = this.splitter.outputs[0] + } else { + this.input = this.notGate.inp1 + } + + var oneVal = '' + for (var i = 0; i < this.bitWidth - 1; i++) { + oneVal += '0' + } + oneVal += '1' + + this.oneConstant = new ConstantVal( + 0, + 0, + undefined, + undefined, + this.bitWidth, + oneVal + ) + + this.notGate.output1.connect(this.adder.inpA) + this.oneConstant.output1.connect(this.adder.inpB) + + this.output = this.adder.sum + } +} + +class verilogBinaryGate { + constructor(deviceJSON) { + this.bitWidth = 1 + if (deviceJSON['bits']) { + this.bitWidth = getBitWidth(deviceJSON['bits']) + } + } + + getPort(portName) { + if (portName == 'in1') { + return this.input[0] + } else if (portName == 'in2') { + return this.input[1] + } else if (portName == 'out') { + return this.output + } + } +} + +class verilogAndGate extends verilogBinaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new AndGate( + 0, + 0, + undefined, + undefined, + undefined, + this.bitWidth + ) + this.input = [this.element.inp[0], this.element.inp[1]] + this.output = this.element.output1 + } +} + +class verilogNandGate extends verilogBinaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new NandGate( + 0, + 0, + undefined, + undefined, + undefined, + this.bitWidth + ) + this.input = [this.element.inp[0], this.element.inp[1]] + this.output = this.element.output1 + } +} + +class verilogOrGate extends verilogBinaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new OrGate( + 0, + 0, + undefined, + undefined, + undefined, + this.bitWidth + ) + this.input = [this.element.inp[0], this.element.inp[1]] + this.output = this.element.output1 + } +} + +class verilogNorGate extends verilogBinaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new NorGate( + 0, + 0, + undefined, + undefined, + undefined, + this.bitWidth + ) + this.input = [this.element.inp[0], this.element.inp[1]] + this.output = this.element.output1 + } +} + +class verilogXorGate extends verilogBinaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new XorGate( + 0, + 0, + undefined, + undefined, + undefined, + this.bitWidth + ) + this.input = [this.element.inp[0], this.element.inp[1]] + this.output = this.element.output1 + } +} + +class verilogXnorGate extends verilogBinaryGate { + constructor(deviceJSON) { + super(deviceJSON) + this.element = new XnorGate( + 0, + 0, + undefined, + undefined, + undefined, + this.bitWidth + ) + this.input = [this.element.inp[0], this.element.inp[1]] + this.output = this.element.output1 + } +} + +class verilogMathGate extends verilogBinaryGate { + constructor(deviceJSON, includeOutBitWidth) { + super(deviceJSON) + + this.bitWidth = Math.max( + deviceJSON['bits']['in1'], + deviceJSON['bits']['in2'] + ) + + if (includeOutBitWidth) { + this.bitWidth = Math.max(deviceJSON['bits']['out'], this.bitWidth) + } + + if (!Number.isInteger(deviceJSON['bits'])) { + this.in1BitWidth = deviceJSON['bits']['in1'] + this.in2BitWidth = deviceJSON['bits']['in2'] + } + + this.input = [] + + var extraBits = this.bitWidth - this.in1BitWidth + + if (extraBits != 0) { + this.in1Splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [this.in1BitWidth, extraBits] + ) + + var zeroState = '' + for (var i = 0; i < extraBits; i++) { + zeroState += '0' + } + this.in1ZeroConstant = new ConstantVal( + 0, + 0, + undefined, + undefined, + extraBits, + zeroState + ) + this.in1ZeroConstant.output1.connect(this.in1Splitter.outputs[1]) + } else { + this.in1Splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [this.bitWidth] + ) + } + + var extraBits = this.bitWidth - this.in2BitWidth + if (extraBits != 0) { + this.in2Splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [this.in2BitWidth, extraBits] + ) + var zeroState = '' + for (var i = 0; i < extraBits; i++) { + zeroState += '0' + } + + this.in2ZeroConstant = new ConstantVal( + 0, + 0, + undefined, + undefined, + extraBits, + zeroState + ) + this.in2ZeroConstant.output1.connect(this.in2Splitter.outputs[1]) + } else { + this.in2Splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [this.bitWidth] + ) + } + + this.input = [this.in1Splitter.outputs[0], this.in2Splitter.outputs[0]] + } +} + +class verilogEqGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON, false) + + var bitWidthSplit = [] + + for (var i = 0; i < this.bitWidth; i++) { + bitWidthSplit.push(1) + } + + this.xnorGate = new XnorGate( + 0, + 0, + undefined, + undefined, + undefined, + this.bitWidth + ) + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + bitWidthSplit + ) + this.andGate = new AndGate(0, 0, undefined, undefined, this.bitWidth) + this.in1Splitter.inp1.connect(this.xnorGate.inp[0]) + this.in2Splitter.inp1.connect(this.xnorGate.inp[1]) + + this.xnorGate.output1.connect(this.splitter.inp1) + for (var i = 0; i < this.bitWidth; i++) { + this.splitter.outputs[i].connect(this.andGate.inp[i]) + } + + this.output = this.andGate.output1 + } +} + +class verilogNeGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON, false) + + var bitWidthSplit = [] + + for (var i = 0; i < this.bitWidth; i++) { + bitWidthSplit.push(1) + } + + this.xnorGate = new XnorGate( + 0, + 0, + undefined, + undefined, + undefined, + this.bitWidth + ) + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + bitWidthSplit + ) + this.nandGate = new NandGate(0, 0, undefined, undefined, this.bitWidth) + + this.in1Splitter.inp1.connect(this.xnorGate.inp[0]) + this.in2Splitter.inp1.connect(this.xnorGate.inp[1]) + + this.xnorGate.output1.connect(this.splitter.inp1) + for (var i = 0; i < this.bitWidth; i++) { + this.splitter.outputs[i].connect(this.nandGate.inp[i]) + } + + this.output = this.nandGate.output1 + } +} + +class verilogLtGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON, false) + this.constant7 = new ConstantVal(0, 0, undefined, undefined, 3, '111') + this.alu = new ALU(0, 0, undefined, undefined, this.bitWidth) + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [1] + ) + + this.in1Splitter.inp1.connect(this.alu.inp1) + this.in2Splitter.inp1.connect(this.alu.inp2) + + this.constant7.output1.connect(this.alu.controlSignalInput) + this.alu.output.connect(this.splitter.inp1) + + this.output = this.splitter.outputs[0] + } +} + +class verilogGtGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON, false) + this.constant7 = new ConstantVal(0, 0, undefined, undefined, 3, '111') + this.alu = new ALU(0, 0, undefined, undefined, this.bitWidth) + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [1] + ) + + this.in1Splitter.inp1.connect(this.alu.inp1) + this.in2Splitter.inp1.connect(this.alu.inp2) + + this.constant7.output1.connect(this.alu.controlSignalInput) + this.alu.output.connect(this.splitter.inp1) + + this.output = this.splitter.outputs[0] + } +} + +class verilogGeGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON, false) + this.constant7 = new ConstantVal(0, 0, undefined, undefined, 3, '111') + this.alu = new ALU(0, 0, undefined, undefined, this.bitWidth) + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [1] + ) + this.notGate = new NotGate(0, 0) + + this.in1Splitter.inp1.connect(this.alu.inp1) + this.in2Splitter.inp1.connect(this.alu.inp2) + + this.constant7.output1.connect(this.alu.controlSignalInput) + this.alu.output.connect(this.splitter.inp1) + this.splitter.outputs[0].connect(this.notGate.inp1) + + this.output = this.notGate.output1 + } +} + +class verilogLeGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON, false) + this.constant7 = new ConstantVal(0, 0, undefined, undefined, 3, '111') + this.alu = new ALU(0, 0, undefined, undefined, this.bitWidth) + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + [1] + ) + this.notGate = new NotGate(0, 0) + + this.in1Splitter.inp1.connect(this.alu.inp1) + this.in2Splitter.inp1.connect(this.alu.inp2) + + this.constant7.output1.connect(this.alu.controlSignalInput) + this.alu.output.connect(this.splitter.inp1) + this.splitter.outputs[0].connect(this.notGate.inp1) + + this.output = this.notGate.output1 + } +} + +class verilogAdditionGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON, false) + + this.outBitWidth = deviceJSON['bits']['out'] + + this.adder = new Adder(0, 0, undefined, undefined, this.bitWidth) + + this.in1Splitter.inp1.connect(this.adder.inpA) + this.in2Splitter.inp1.connect(this.adder.inpB) + + if (this.outBitWidth == this.bitWidth) { + this.output = this.adder.sum + } else if (this.outBitWidth == this.bitWidth + 1) { + this.outputSplitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.outBitWidth, + [this.bitWidth, 1] + ) + this.adder.sum.connect(this.outputSplitter.outputs[0]) + this.adder.carryOut.connect(this.outputSplitter.outputs[1]) + this.output = this.outputSplitter.inp1 + } + } +} + +class verilogMultiplicationGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.outBitWidth = deviceJSON['bits']['out'] + + this.verilogMultiplier = new verilogMultiplier( + 300, + 300, + undefined, + undefined, + this.bitWidth, + this.outBitWidth + ) + + this.in1Splitter.inp1.connect(this.verilogMultiplier.inpA) + this.in2Splitter.inp1.connect(this.verilogMultiplier.inpB) + + this.output = this.verilogMultiplier.product + } +} + +class verilogDivisionGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.outBitWidth = deviceJSON['bits']['out'] + + this.verilogDivider = new verilogDivider( + 300, + 300, + undefined, + undefined, + this.bitWidth, + this.outBitWidth + ) + + this.in1Splitter.inp1.connect(this.verilogDivider.inpA) + this.in2Splitter.inp1.connect(this.verilogDivider.inpB) + + this.output = this.verilogDivider.quotient + } +} + +class verilogPowerGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.outBitWidth = deviceJSON['bits']['out'] + + this.verilogPower = new verilogPower( + 300, + 300, + undefined, + undefined, + this.bitWidth, + this.outBitWidth + ) + + this.in1Splitter.inp1.connect(this.verilogPower.inpA) + this.in2Splitter.inp1.connect(this.verilogPower.inpB) + + this.output = this.verilogPower.answer + } +} + +class verilogModuloGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.outBitWidth = deviceJSON['bits']['out'] + + this.verilogDivider = new verilogDivider( + 300, + 300, + undefined, + undefined, + this.bitWidth, + this.outBitWidth + ) + + this.in1Splitter.inp1.connect(this.verilogDivider.inpA) + this.in2Splitter.inp1.connect(this.verilogDivider.inpB) + + this.output = this.verilogDivider.remainder + } +} + +class verilogShiftLeftGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.outBitWidth = deviceJSON['bits']['out'] + + this.verilogShiftLeft = new verilogShiftLeft( + 300, + 300, + undefined, + undefined, + this.bitWidth, + this.outBitWidth + ) + + this.in1Splitter.inp1.connect(this.verilogShiftLeft.inp1) + this.in2Splitter.inp1.connect(this.verilogShiftLeft.shiftInp) + + this.output = this.verilogShiftLeft.output1 + } +} + +class verilogShiftRightGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON) + + this.outBitWidth = deviceJSON['bits']['out'] + + this.verilogShiftRight = new verilogShiftRight( + 300, + 300, + undefined, + undefined, + this.bitWidth, + this.outBitWidth + ) + + this.in1Splitter.inp1.connect(this.verilogShiftRight.inp1) + this.in2Splitter.inp1.connect(this.verilogShiftRight.shiftInp) + + this.output = this.verilogShiftRight.output1 + } +} + +class verilogSubtractionGate extends verilogMathGate { + constructor(deviceJSON) { + super(deviceJSON, true) + + this.alu = new ALU(0, 0, undefined, undefined, this.bitWidth) + + this.controlConstant = new ConstantVal( + 0, + 0, + undefined, + undefined, + 3, + '110' + ) + this.alu.controlSignalInput.connect(this.controlConstant.output1) + + this.in1Splitter.inp1.connect(this.alu.inp1) + this.in2Splitter.inp1.connect(this.alu.inp2) + + this.output = this.alu.output + } +} + +class verilogDff { + constructor(deviceJSON) { + this.bitWidth = 1 + if (deviceJSON['bits']) { + this.bitWidth = getBitWidth(deviceJSON['bits']) + } + + this.dff = new DflipFlop(0, 0, undefined, undefined, this.bitWidth) + this.clockInput = this.dff.clockInp + this.arstInput = this.dff.reset + this.enableInput = this.dff.en + + this.clockPolarity = true + this.arstPolarity = true + this.enablePolarity = true + + if (deviceJSON['polarity']['clock'] != undefined) { + this.clockPolarity = deviceJSON['polarity']['clock'] + } + if (this.clockPolarity == false) { + this.notGateClock = new NotGate(0, 0) + this.notGateClock.output1.connect(this.dff.clockInp) + this.clockInput = this.notGateClock.inp1 + } + + if (deviceJSON['polarity']['enable'] != undefined) { + this.enablePolarity = deviceJSON['polarity']['enable'] + } + if (this.enablePolarity == false) { + this.notGateEnable = new NotGate(0, 0) + this.notGateEnable.output1.connect(this.dff.en) + this.enableInput = this.notGateEnable.inp1 + } + + if (deviceJSON['polarity']['arst'] != undefined) { + this.arstPolarity = deviceJSON['polarity']['arst'] + } + if (this.arstPolarity == false) { + this.notGateArst = new NotGate(0, 0) + this.notGateArst.output1.connect(this.dff.reset) + this.arstInput = this.notGateArst.inp1 + } + if (deviceJSON['arst_value'] != undefined) { + this.arst_value_constant = new ConstantVal( + 0, + 0, + undefined, + undefined, + this.bitWidth, + deviceJSON['arst_value'] + ) + this.arst_value_constant.output1.connect(this.dff.preset) + } + + this.dInput = this.dff.dInp + this.qOutput = this.dff.qOutput + } + + getPort(portName) { + if (portName == 'clk') { + return this.clockInput + } else if (portName == 'in') { + return this.dInput + } else if (portName == 'arst') { + return this.arstInput + } else if (portName == 'en') { + return this.enableInput + } else if (portName == 'out') { + return this.qOutput + } + } +} + +class verilogMultiplexer { + constructor(deviceJSON) { + this.bitWidth = 1 + this.selectBitWidth = undefined + if (deviceJSON['bits']['in'] != undefined) { + this.bitWidth = deviceJSON['bits']['in'] + } + + if (deviceJSON['bits']['sel'] != undefined) { + this.selectBitWidth = deviceJSON['bits']['sel'] + } + + this.multiplexer = new Multiplexer( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.selectBitWidth + ) + + this.input = this.multiplexer.inp + this.selectInput = this.multiplexer.controlSignalInput + this.output = this.multiplexer.output1 + } + + getPort(portName) { + if (portName == 'sel') { + return this.selectInput + } else if (portName == 'out') { + return this.output + } else { + var len = portName.length + var index = parseInt(portName.substring(2, len)) + + return this.input[index] + } + } +} + +class verilogMultiplexer1Hot { + constructor(deviceJSON) { + this.bitWidth = 1 + this.selectBitWidth = undefined + if (deviceJSON['bits']['in'] != undefined) { + this.bitWidth = deviceJSON['bits']['in'] + } + + if (deviceJSON['bits']['sel'] != undefined) { + this.selectBitWidth = deviceJSON['bits']['sel'] + } + + this.multiplexer = new Multiplexer( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.selectBitWidth + ) + this.lsb = new LSB(0, 0, undefined, undefined, this.selectBitWidth) + this.adder = new Adder(0, 0, undefined, undefined, this.selectBitWidth) + + var zeroState = '' + for (var i = 0; i < this.selectBitWidth - 1; i++) { + zeroState += '0' + } + this.zeroPadEnable = new ConstantVal( + 0, + 0, + undefined, + undefined, + this.selectBitWidth - 1, + zeroState + ) + + this.enbaleSplitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.selectBitWidth, + [1, this.selectBitWidth - 1] + ) + + this.lsb.enable.connect(this.enbaleSplitter.outputs[0]) + this.zeroPadEnable.output1.connect(this.enbaleSplitter.outputs[1]) + + this.adder.inpA.connect(this.lsb.output1) + this.adder.inpB.connect(this.enbaleSplitter.inp1) + + this.adder.sum.connect(this.multiplexer.controlSignalInput) + this.input = this.multiplexer.inp + this.selectInput = this.lsb.inp1 + this.output = this.multiplexer.output1 + } + + getPort(portName) { + if (portName == 'sel') { + return this.selectInput + } else if (portName == 'out') { + return this.output + } else { + var len = portName.length + var index = parseInt(portName.substring(2, len)) + + return this.input[index] + } + } +} + +class verilogBusGroup { + constructor(deviceJSON) { + this.bitWidth = 0 + this.bitWidthSplit = deviceJSON['groups'] + + for (var i = 0; i < this.bitWidthSplit.length; i++) { + this.bitWidth += this.bitWidthSplit[i] + } + + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.bitWidthSplit + ) + + this.input = this.splitter.outputs + this.output = this.splitter.inp1 + } + + getPort(portName) { + if (portName == 'out') { + return this.output + } else { + var len = portName.length + var index = parseInt(portName.substring(2, len)) + + return this.input[index] + } + } +} + +class verilogBusUngroup { + constructor(deviceJSON) { + this.bitWidth = 0 + this.bitWidthSplit = deviceJSON['groups'] + + for (var i = 0; i < this.bitWidthSplit.length; i++) { + this.bitWidth += this.bitWidthSplit[i] + } + + this.splitter = new Splitter( + 0, + 0, + undefined, + undefined, + this.bitWidth, + this.bitWidthSplit + ) + + this.input = this.splitter.inp1 + this.output = this.splitter.outputs + } + + getPort(portName) { + if (portName == 'in') { + return this.input + } else { + var len = portName.length + var index = parseInt(portName.substring(3, len)) + + return this.output[index] + } + } +} + +class verilogMemory { + constructor(deviceJSON) { + this.memData = deviceJSON['memdata'] + this.dataBitWidth = deviceJSON['bits'] + this.addressBitWidth = deviceJSON['abits'] + this.words = deviceJSON['words'] + + this.numRead = deviceJSON['rdports'].length + this.numWrite = deviceJSON['wrports'].length + + this.verilogRAM = new verilogRAM( + 0, + 0, + undefined, + undefined, + this.dataBitWidth, + this.addressBitWidth, + this.memData, + this.words, + this.numRead, + this.numWrite, + deviceJSON['rdports'], + deviceJSON['wrports'] + ) + + this.writeAddressInput = this.verilogRAM.writeAddress + this.readAddressInput = this.verilogRAM.readAddress + this.writeDataInput = this.verilogRAM.writeDataIn + this.writeEnableInput = this.verilogRAM.writeEnable + this.readDataOutput = this.verilogRAM.dataOut + this.readDffOut = this.verilogRAM.readDff + + for (var i = 0; i < this.numWrite; i++) { + var writeEnInput = new Input( + 0, + 0, + undefined, + undefined, + 1, + undefined + ) + writeEnInput.label = 'en' + i.toString() + writeEnInput.output1.connect(this.verilogRAM.writeEnable[i]) + } + } + + getPort(portName) { + var len = portName.length + var isPortAddr = portName.slice(len - 4, len) == 'addr' + var isPortData = portName.slice(len - 4, len) == 'data' + var isPortClk = portName.slice(len - 3, len) == 'clk' + var isPortEn = portName.slice(len - 2, len) == 'en' + if (portName.startsWith('rd')) { + if (isPortAddr) { + var portNum = portName.slice(2, len - 4) + portNum = parseInt(portNum) + + return this.readAddressInput[portNum] + } + if (isPortData) { + var portNum = portName.slice(2, len - 4) + portNum = parseInt(portNum) + return this.verilogRAM.readDffQOutput[portNum] + } + if (isPortClk) { + var portNum = portName.slice(2, len - 3) + portNum = parseInt(portNum) + + return this.verilogRAM.readDffClock[portNum] + } + if (isPortEn) { + var portNum = portName.slice(2, len - 2) + portNum = parseInt(portNum) + + return this.verilogRAM.readDffEn[portNum] + } + } else { + if (isPortAddr) { + var portNum = portName.slice(2, len - 4) + portNum = parseInt(portNum) + return this.writeAddressInput[portNum] + } + if (isPortData) { + var portNum = portName.slice(2, len - 4) + portNum = parseInt(portNum) + return this.writeDataInput[portNum] + } + if (isPortClk) { + var portNum = portName.slice(2, len - 3) + portNum = parseInt(portNum) + + return this.verilogRAM.writeDffClock[portNum] + } + if (isPortEn) { + var portNum = portName.slice(2, len - 2) + portNum = parseInt(portNum) + + return this.verilogRAM.writeDffEn[portNum] + } + } + } +} + +let yosysTypeMap = {} + +yosysTypeMap['Not'] = verilogNotGate +yosysTypeMap['Repeater'] = verilogRepeaterGate +yosysTypeMap['And'] = verilogAndGate +yosysTypeMap['Nand'] = verilogNandGate +yosysTypeMap['Or'] = verilogOrGate +yosysTypeMap['Nor'] = verilogNorGate +yosysTypeMap['Xor'] = verilogXorGate +yosysTypeMap['Xnor'] = verilogXnorGate +yosysTypeMap['Constant'] = verilogConstantVal +yosysTypeMap['Input'] = verilogInput +yosysTypeMap['Output'] = verilogOutput +yosysTypeMap['AndReduce'] = verilogReduceAndGate +yosysTypeMap['NandReduce'] = verilogReduceNandGate +yosysTypeMap['OrReduce'] = verilogReduceOrGate +yosysTypeMap['NorReduce'] = verilogReduceNorGate +yosysTypeMap['XorReduce'] = verilogReduceXorGate +yosysTypeMap['XnorReduce'] = verilogReduceXnorGate + +yosysTypeMap['Eq'] = verilogEqGate +yosysTypeMap['Ne'] = verilogNeGate + +yosysTypeMap['Lt'] = verilogLtGate +yosysTypeMap['Le'] = verilogLeGate +yosysTypeMap['Ge'] = verilogGeGate +yosysTypeMap['Gt'] = verilogGtGate + +yosysTypeMap['ZeroExtend'] = verilogZeroExtend +yosysTypeMap['Negation'] = verilogNegationGate + +yosysTypeMap['Dff'] = verilogDff +yosysTypeMap['Mux'] = verilogMultiplexer +yosysTypeMap['Mux1Hot'] = verilogMultiplexer1Hot +yosysTypeMap['BusSlice'] = verilogBusSlice +yosysTypeMap['BusGroup'] = verilogBusGroup +yosysTypeMap['BusUngroup'] = verilogBusUngroup + +yosysTypeMap['Addition'] = verilogAdditionGate +yosysTypeMap['Subtraction'] = verilogSubtractionGate +yosysTypeMap['Multiplication'] = verilogMultiplicationGate +yosysTypeMap['Division'] = verilogDivisionGate +yosysTypeMap['Modulo'] = verilogModuloGate +yosysTypeMap['Power'] = verilogPowerGate +yosysTypeMap['ShiftLeft'] = verilogShiftLeftGate +yosysTypeMap['ShiftRight'] = verilogShiftRightGate + +yosysTypeMap['Clock'] = verilogClock +yosysTypeMap['Lamp'] = verilogLamp +yosysTypeMap['Button'] = verilogButton + +yosysTypeMap['Memory'] = verilogMemory + +export default yosysTypeMap diff --git a/v1/src/simulator/src/app.js b/v1/src/simulator/src/app.js new file mode 100644 index 00000000..00b64e60 --- /dev/null +++ b/v1/src/simulator/src/app.js @@ -0,0 +1,213 @@ +import { setup } from './setup' +import Array from './arrayHelpers' + +document.addEventListener('DOMContentLoaded', () => { + setup() + var js = { + devices: { + dev0: { + type: 'Input', + net: 'clk', + order: 0, + bits: 1, + }, + dev1: { + type: 'Input', + net: 'addr', + order: 1, + bits: 4, + }, + dev2: { + type: 'Output', + net: 'data', + order: 2, + bits: 5, + }, + dev3: { + type: 'Input', + net: 'addr2', + order: 3, + bits: 4, + }, + dev4: { + type: 'Output', + net: 'data2', + order: 4, + bits: 5, + }, + dev5: { + type: 'Input', + net: 'wraddr', + order: 5, + bits: 4, + }, + dev6: { + type: 'Input', + net: 'wrdata', + order: 6, + bits: 5, + }, + dev7: { + type: 'Input', + net: 'wraddr2', + order: 7, + bits: 4, + }, + dev8: { + type: 'Input', + net: 'wrdata2', + order: 8, + bits: 5, + }, + dev9: { + label: 'mem', + type: 'Memory', + bits: 5, + abits: 4, + words: 16, + offset: 0, + rdports: [ + {}, + { + clock_polarity: true, + }, + ], + wrports: [ + { + clock_polarity: true, + }, + { + clock_polarity: true, + }, + ], + memdata: [13, '00001', 3, '11111'], + }, + }, + connectors: [ + { + to: { + id: 'dev9', + port: 'rd1clk', + }, + from: { + id: 'dev0', + port: 'out', + }, + name: 'clk', + }, + { + to: { + id: 'dev9', + port: 'wr0clk', + }, + from: { + id: 'dev0', + port: 'out', + }, + name: 'clk', + }, + { + to: { + id: 'dev9', + port: 'wr1clk', + }, + from: { + id: 'dev0', + port: 'out', + }, + name: 'clk', + }, + { + to: { + id: 'dev9', + port: 'rd0addr', + }, + from: { + id: 'dev1', + port: 'out', + }, + name: 'addr', + }, + { + to: { + id: 'dev2', + port: 'in', + }, + from: { + id: 'dev9', + port: 'rd0data', + }, + name: 'data', + }, + { + to: { + id: 'dev9', + port: 'rd1addr', + }, + from: { + id: 'dev3', + port: 'out', + }, + name: 'addr2', + }, + { + to: { + id: 'dev4', + port: 'in', + }, + from: { + id: 'dev9', + port: 'rd1data', + }, + name: 'data2', + }, + { + to: { + id: 'dev9', + port: 'wr0addr', + }, + from: { + id: 'dev5', + port: 'out', + }, + name: 'wraddr', + }, + { + to: { + id: 'dev9', + port: 'wr0data', + }, + from: { + id: 'dev6', + port: 'out', + }, + name: 'wrdata', + }, + { + to: { + id: 'dev9', + port: 'wr1addr', + }, + from: { + id: 'dev7', + port: 'out', + }, + name: 'wraddr2', + }, + { + to: { + id: 'dev9', + port: 'wr1data', + }, + from: { + id: 'dev8', + port: 'out', + }, + name: 'wrdata2', + }, + ], + subcircuits: {}, + } +}) + +window.Array = Array diff --git a/v1/src/simulator/src/arrayHelpers.js b/v1/src/simulator/src/arrayHelpers.js new file mode 100644 index 00000000..8d10917e --- /dev/null +++ b/v1/src/simulator/src/arrayHelpers.js @@ -0,0 +1,34 @@ +/* eslint-disable func-names */ +/* eslint-disable no-global-assign */ +/* eslint-disable no-extend-native */ +export default Array = window.Array + +Object.defineProperty(Array.prototype, 'clean', { + value: function (deleteValue) { + for (var i = 0; i < this.length; i++) { + if (this[i] === deleteValue) { + this.splice(i, 1) + i-- + } + } + return this + }, + enumerable: false, +}) + +Object.defineProperty(Array.prototype, 'extend', { + value: function (otherArray) { + /* you should include a test to check whether other_array really is an array */ + otherArray.forEach(function (v) { + this.push(v) + }, this) + }, + enumerable: false, +}) + +Object.defineProperty(Array.prototype, 'contains', { + value: function (value) { + return this.indexOf(value) > -1 + }, + enumerable: false, +}) diff --git a/v1/src/simulator/src/backgroundArea.js b/v1/src/simulator/src/backgroundArea.js new file mode 100644 index 00000000..49da21aa --- /dev/null +++ b/v1/src/simulator/src/backgroundArea.js @@ -0,0 +1,17 @@ +import { dots } from './canvasApi' + +var backgroundArea +export default backgroundArea = { + canvas: document.getElementById('backgroundArea'), + setup() { + this.canvas = document.getElementById('backgroundArea') + this.canvas.width = width + this.canvas.height = height + this.context = this.canvas.getContext('2d') + dots(true, false) + }, + clear() { + if (!this.context) return + this.context.clearRect(0, 0, this.canvas.width, this.canvas.height) + }, +} diff --git a/v1/src/simulator/src/canvas2svg.js b/v1/src/simulator/src/canvas2svg.js new file mode 100644 index 00000000..d6f5dc64 --- /dev/null +++ b/v1/src/simulator/src/canvas2svg.js @@ -0,0 +1,1433 @@ +/*!! + * Canvas 2 Svg v1.0.19 + * A low level canvas to SVG converter. Uses a mock canvas context to build an SVG document. + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/mit-license.php + * + * Author: + * Kerry Liu + * + * Copyright (c) 2014 Gliffy Inc. + */ + +/** + * CircuitVerse - Edited + * Latest npm package is 1.0.16 but we need 1.0.19 + */ + +'use strict' + +var STYLES, ctx, CanvasGradient, CanvasPattern, namedEntities + +//helper function to format a string +function format(str, args) { + var keys = Object.keys(args), + i + for (i = 0; i < keys.length; i++) { + str = str.replace( + new RegExp('\\{' + keys[i] + '\\}', 'gi'), + args[keys[i]] + ) + } + return str +} + +//helper function that generates a random string +function randomString(holder) { + var chars, randomstring, i + if (!holder) { + throw new Error( + 'cannot create a random attribute name for an undefined object' + ) + } + chars = 'ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz' + randomstring = '' + do { + randomstring = '' + for (i = 0; i < 12; i++) { + randomstring += chars[Math.floor(Math.random() * chars.length)] + } + } while (holder[randomstring]) + return randomstring +} + +//helper function to map named to numbered entities +function createNamedToNumberedLookup(items, radix) { + var i, + entity, + lookup = {}, + base10, + base16 + items = items.split(',') + radix = radix || 10 + // Map from named to numbered entities. + for (i = 0; i < items.length; i += 2) { + entity = '&' + items[i + 1] + ';' + base10 = parseInt(items[i], radix) + lookup[entity] = '&#' + base10 + ';' + } + //FF and IE need to create a regex from hex values ie   == \xa0 + lookup['\\xa0'] = ' ' + return lookup +} + +//helper function to map canvas-textAlign to svg-textAnchor +function getTextAnchor(textAlign) { + //TODO: support rtl languages + var mapping = { + left: 'start', + right: 'end', + center: 'middle', + start: 'start', + end: 'end', + } + return mapping[textAlign] || mapping.start +} + +//helper function to map canvas-textBaseline to svg-dominantBaseline +function getDominantBaseline(textBaseline) { + //INFO: not supported in all browsers + var mapping = { + alphabetic: 'alphabetic', + hanging: 'hanging', + top: 'text-before-edge', + bottom: 'text-after-edge', + middle: 'central', + } + return mapping[textBaseline] || mapping.alphabetic +} + +// Unpack entities lookup where the numbers are in radix 32 to reduce the size +// entity mapping courtesy of tinymce +namedEntities = createNamedToNumberedLookup( + '50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,' + + '5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,' + + '5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,' + + '5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,' + + '68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,' + + '6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,' + + '6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,' + + '75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,' + + '7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,' + + '7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,' + + 'sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,' + + 'st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,' + + 't9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,' + + 'tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,' + + 'u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,' + + '81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,' + + '8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,' + + '8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,' + + '8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,' + + '8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,' + + 'nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,' + + 'rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,' + + 'Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,' + + '80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,' + + '811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro', + 32 +) + +//Some basic mappings for attributes and default values. +STYLES = { + strokeStyle: { + svgAttr: 'stroke', //corresponding svg attribute + canvas: '#000000', //canvas default + svg: 'none', //svg default + apply: 'stroke', //apply on stroke() or fill() + }, + fillStyle: { + svgAttr: 'fill', + canvas: '#000000', + svg: null, //svg default is black, but we need to special case this to handle canvas stroke without fill + apply: 'fill', + }, + lineCap: { + svgAttr: 'stroke-linecap', + canvas: 'butt', + svg: 'butt', + apply: 'stroke', + }, + lineJoin: { + svgAttr: 'stroke-linejoin', + canvas: 'miter', + svg: 'miter', + apply: 'stroke', + }, + miterLimit: { + svgAttr: 'stroke-miterlimit', + canvas: 10, + svg: 4, + apply: 'stroke', + }, + lineWidth: { + svgAttr: 'stroke-width', + canvas: 1, + svg: 1, + apply: 'stroke', + }, + globalAlpha: { + svgAttr: 'opacity', + canvas: 1, + svg: 1, + apply: 'fill stroke', + }, + font: { + //font converts to multiple svg attributes, there is custom logic for this + canvas: '10px sans-serif', + }, + shadowColor: { + canvas: '#000000', + }, + shadowOffsetX: { + canvas: 0, + }, + shadowOffsetY: { + canvas: 0, + }, + shadowBlur: { + canvas: 0, + }, + textAlign: { + canvas: 'start', + }, + textBaseline: { + canvas: 'alphabetic', + }, + lineDash: { + svgAttr: 'stroke-dasharray', + canvas: [], + svg: null, + apply: 'stroke', + }, +} + +/** + * + * @param gradientNode - reference to the gradient + * @constructor + */ +CanvasGradient = function (gradientNode, ctx) { + this.__root = gradientNode + this.__ctx = ctx +} + +/** + * Adds a color stop to the gradient root + */ +CanvasGradient.prototype.addColorStop = function (offset, color) { + var stop = this.__ctx.__createElement('stop'), + regex, + matches + stop.setAttribute('offset', offset) + if (color.indexOf('rgba') !== -1) { + //separate alpha value, since webkit can't handle it + regex = + /rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d?\.?\d*)\s*\)/gi + matches = regex.exec(color) + stop.setAttribute( + 'stop-color', + format('rgb({r},{g},{b})', { + r: matches[1], + g: matches[2], + b: matches[3], + }) + ) + stop.setAttribute('stop-opacity', matches[4]) + } else { + stop.setAttribute('stop-color', color) + } + this.__root.appendChild(stop) +} + +CanvasPattern = function (pattern, ctx) { + this.__root = pattern + this.__ctx = ctx +} + +/** + * The mock canvas context + * @param o - options include: + * ctx - existing Context2D to wrap around + * width - width of your canvas (defaults to 500) + * height - height of your canvas (defaults to 500) + * enableMirroring - enables canvas mirroring (get image data) (defaults to false) + * document - the document object (defaults to the current document) + */ +ctx = function (o) { + var defaultOptions = { width: 500, height: 500, enableMirroring: false }, + options + + //keep support for this way of calling C2S: new C2S(width,height) + if (arguments.length > 1) { + options = defaultOptions + options.width = arguments[0] + options.height = arguments[1] + } else if (!o) { + options = defaultOptions + } else { + options = o + } + + if (!(this instanceof ctx)) { + //did someone call this without new? + return new ctx(options) + } + + //setup options + this.width = options.width || defaultOptions.width + this.height = options.height || defaultOptions.height + this.enableMirroring = + options.enableMirroring !== undefined + ? options.enableMirroring + : defaultOptions.enableMirroring + + this.canvas = this ///point back to this instance! + this.__document = options.document || document + + // allow passing in an existing context to wrap around + // if a context is passed in, we know a canvas already exist + if (options.ctx) { + this.__ctx = options.ctx + } else { + this.__canvas = this.__document.createElement('canvas') + this.__ctx = this.__canvas.getContext('2d') + } + + this.__setDefaultStyles() + this.__stack = [this.__getStyleState()] + this.__groupStack = [] + + //the root svg element + this.__root = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + 'svg' + ) + this.__root.setAttribute('version', 1.1) + this.__root.setAttribute('xmlns', 'http://www.w3.org/2000/svg') + this.__root.setAttributeNS( + 'http://www.w3.org/2000/xmlns/', + 'xmlns:xlink', + 'http://www.w3.org/1999/xlink' + ) + this.__root.setAttribute('width', this.width) + this.__root.setAttribute('height', this.height) + + //make sure we don't generate the same ids in defs + this.__ids = {} + + //defs tag + this.__defs = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + 'defs' + ) + this.__root.appendChild(this.__defs) + + //also add a group child. the svg element can't use the transform attribute + this.__currentElement = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + 'g' + ) + this.__root.appendChild(this.__currentElement) +} + +/** + * Creates the specified svg element + * @private + */ +ctx.prototype.__createElement = function (elementName, properties, resetFill) { + if (typeof properties === 'undefined') { + properties = {} + } + + var element = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + elementName + ), + keys = Object.keys(properties), + i, + key + if (resetFill) { + //if fill or stroke is not specified, the svg element should not display. By default SVG's fill is black. + element.setAttribute('fill', 'none') + element.setAttribute('stroke', 'none') + } + for (i = 0; i < keys.length; i++) { + key = keys[i] + element.setAttribute(key, properties[key]) + } + return element +} + +/** + * Applies default canvas styles to the context + * @private + */ +ctx.prototype.__setDefaultStyles = function () { + //default 2d canvas context properties see:http://www.w3.org/TR/2dcontext/ + var keys = Object.keys(STYLES), + i, + key + for (i = 0; i < keys.length; i++) { + key = keys[i] + this[key] = STYLES[key].canvas + } +} + +/** + * Applies styles on restore + * @param styleState + * @private + */ +ctx.prototype.__applyStyleState = function (styleState) { + var keys = Object.keys(styleState), + i, + key + for (i = 0; i < keys.length; i++) { + key = keys[i] + this[key] = styleState[key] + } +} + +/** + * Gets the current style state + * @return {Object} + * @private + */ +ctx.prototype.__getStyleState = function () { + var i, + styleState = {}, + keys = Object.keys(STYLES), + key + for (i = 0; i < keys.length; i++) { + key = keys[i] + styleState[key] = this[key] + } + return styleState +} + +/** + * Apples the current styles to the current SVG element. On "ctx.fill" or "ctx.stroke" + * @param type + * @private + */ +ctx.prototype.__applyStyleToCurrentElement = function (type) { + var currentElement = this.__currentElement + var currentStyleGroup = this.__currentElementsToStyle + if (currentStyleGroup) { + currentElement.setAttribute(type, '') + currentElement = currentStyleGroup.element + currentStyleGroup.children.forEach(function (node) { + node.setAttribute(type, '') + }) + } + + var keys = Object.keys(STYLES), + i, + style, + value, + id, + regex, + matches + for (i = 0; i < keys.length; i++) { + style = STYLES[keys[i]] + value = this[keys[i]] + if (style.apply) { + //is this a gradient or pattern? + if (value instanceof CanvasPattern) { + //pattern + if (value.__ctx) { + //copy over defs + while (value.__ctx.__defs.childNodes.length) { + id = value.__ctx.__defs.childNodes[0].getAttribute('id') + this.__ids[id] = id + this.__defs.appendChild( + value.__ctx.__defs.childNodes[0] + ) + } + } + currentElement.setAttribute( + style.apply, + format('url(#{id})', { + id: value.__root.getAttribute('id'), + }) + ) + } else if (value instanceof CanvasGradient) { + //gradient + currentElement.setAttribute( + style.apply, + format('url(#{id})', { + id: value.__root.getAttribute('id'), + }) + ) + } else if ( + style.apply.indexOf(type) !== -1 && + style.svg !== value + ) { + if ( + (style.svgAttr === 'stroke' || style.svgAttr === 'fill') && + value.indexOf('rgba') !== -1 + ) { + //separate alpha value, since illustrator can't handle it + regex = + /rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d?\.?\d*)\s*\)/gi + matches = regex.exec(value) + currentElement.setAttribute( + style.svgAttr, + format('rgb({r},{g},{b})', { + r: matches[1], + g: matches[2], + b: matches[3], + }) + ) + //should take globalAlpha here + var opacity = matches[4] + var globalAlpha = this.globalAlpha + if (globalAlpha != null) { + opacity *= globalAlpha + } + currentElement.setAttribute( + style.svgAttr + '-opacity', + opacity + ) + } else { + var attr = style.svgAttr + if (keys[i] === 'globalAlpha') { + attr = type + '-' + style.svgAttr + if (currentElement.getAttribute(attr)) { + //fill-opacity or stroke-opacity has already been set by stroke or fill. + continue + } + } + //otherwise only update attribute if right type, and not svg default + currentElement.setAttribute(attr, value) + } + } + } + } +} + +/** + * Will return the closest group or svg node. May return the current element. + * @private + */ +ctx.prototype.__closestGroupOrSvg = function (node) { + node = node || this.__currentElement + if (node.nodeName === 'g' || node.nodeName === 'svg') { + return node + } else { + return this.__closestGroupOrSvg(node.parentNode) + } +} + +/** + * Returns the serialized value of the svg so far + * @param fixNamedEntities - Standalone SVG doesn't support named entities, which document.createTextNode encodes. + * If true, we attempt to find all named entities and encode it as a numeric entity. + * @return serialized svg + */ +ctx.prototype.getSerializedSvg = function (fixNamedEntities) { + var serialized = new XMLSerializer().serializeToString(this.__root), + keys, + i, + key, + value, + regexp, + xmlns + + //IE search for a duplicate xmnls because they didn't implement setAttributeNS correctly + xmlns = + /xmlns="http:\/\/www\.w3\.org\/2000\/svg".+xmlns="http:\/\/www\.w3\.org\/2000\/svg/gi + if (xmlns.test(serialized)) { + serialized = serialized.replace( + 'xmlns="http://www.w3.org/2000/svg', + 'xmlns:xlink="http://www.w3.org/1999/xlink' + ) + } + + if (fixNamedEntities) { + keys = Object.keys(namedEntities) + //loop over each named entity and replace with the proper equivalent. + for (i = 0; i < keys.length; i++) { + key = keys[i] + value = namedEntities[key] + regexp = new RegExp(key, 'gi') + if (regexp.test(serialized)) { + serialized = serialized.replace(regexp, value) + } + } + } + + return serialized +} + +/** + * Returns the root svg + * @return svg + */ +ctx.prototype.getSvg = function () { + return this.__root +} +/** + * Will generate a group tag. + */ +ctx.prototype.save = function () { + var group = this.__createElement('g') + var parent = this.__closestGroupOrSvg() + this.__groupStack.push(parent) + parent.appendChild(group) + this.__currentElement = group + this.__stack.push(this.__getStyleState()) +} +/** + * Sets current element to parent, or just root if already root + */ +ctx.prototype.restore = function () { + this.__currentElement = this.__groupStack.pop() + this.__currentElementsToStyle = null + //Clearing canvas will make the poped group invalid, currentElement is set to the root group node. + if (!this.__currentElement) { + this.__currentElement = this.__root.childNodes[1] + } + var state = this.__stack.pop() + this.__applyStyleState(state) +} + +/** + * Helper method to add transform + * @private + */ +ctx.prototype.__addTransform = function (t) { + //if the current element has siblings, add another group + var parent = this.__closestGroupOrSvg() + if (parent.childNodes.length > 0) { + if (this.__currentElement.nodeName === 'path') { + if (!this.__currentElementsToStyle) + this.__currentElementsToStyle = { + element: parent, + children: [], + } + this.__currentElementsToStyle.children.push(this.__currentElement) + this.__applyCurrentDefaultPath() + } + + var group = this.__createElement('g') + parent.appendChild(group) + this.__currentElement = group + } + + var transform = this.__currentElement.getAttribute('transform') + if (transform) { + transform += ' ' + } else { + transform = '' + } + transform += t + this.__currentElement.setAttribute('transform', transform) +} + +/** + * scales the current element + */ +ctx.prototype.scale = function (x, y) { + if (y === undefined) { + y = x + } + this.__addTransform(format('scale({x},{y})', { x: x, y: y })) +} + +/** + * rotates the current element + */ +ctx.prototype.rotate = function (angle) { + var degrees = (angle * 180) / Math.PI + this.__addTransform( + format('rotate({angle},{cx},{cy})', { angle: degrees, cx: 0, cy: 0 }) + ) +} + +/** + * translates the current element + */ +ctx.prototype.translate = function (x, y) { + this.__addTransform(format('translate({x},{y})', { x: x, y: y })) +} + +/** + * applies a transform to the current element + */ +ctx.prototype.transform = function (a, b, c, d, e, f) { + this.__addTransform( + format('matrix({a},{b},{c},{d},{e},{f})', { + a: a, + b: b, + c: c, + d: d, + e: e, + f: f, + }) + ) +} + +/** + * Create a new Path Element + */ +ctx.prototype.beginPath = function () { + var path, parent + + // Note that there is only one current default path, it is not part of the drawing state. + // See also: https://html.spec.whatwg.org/multipage/scripting.html#current-default-path + this.__currentDefaultPath = '' + this.__currentPosition = {} + + path = this.__createElement('path', {}, true) + parent = this.__closestGroupOrSvg() + parent.appendChild(path) + this.__currentElement = path +} + +/** + * Helper function to apply currentDefaultPath to current path element + * @private + */ +ctx.prototype.__applyCurrentDefaultPath = function () { + var currentElement = this.__currentElement + if (currentElement.nodeName === 'path') { + currentElement.setAttribute('d', this.__currentDefaultPath) + } else { + console.error( + 'Attempted to apply path command to node', + currentElement.nodeName + ) + } +} + +/** + * Helper function to add path command + * @private + */ +ctx.prototype.__addPathCommand = function (command) { + this.__currentDefaultPath += ' ' + this.__currentDefaultPath += command +} + +/** + * Adds the move command to the current path element, + * if the currentPathElement is not empty create a new path element + */ +ctx.prototype.moveTo = function (x, y) { + if (this.__currentElement.nodeName !== 'path') { + this.beginPath() + } + + // creates a new subpath with the given point + this.__currentPosition = { x: x, y: y } + this.__addPathCommand(format('M {x} {y}', { x: x, y: y })) +} + +/** + * Closes the current path + */ +ctx.prototype.closePath = function () { + if (this.__currentDefaultPath) { + this.__addPathCommand('Z') + } +} + +/** + * Adds a line to command + */ +ctx.prototype.lineTo = function (x, y) { + this.__currentPosition = { x: x, y: y } + if (this.__currentDefaultPath.indexOf('M') > -1) { + this.__addPathCommand(format('L {x} {y}', { x: x, y: y })) + } else { + this.__addPathCommand(format('M {x} {y}', { x: x, y: y })) + } +} + +/** + * Add a bezier command + */ +ctx.prototype.bezierCurveTo = function (cp1x, cp1y, cp2x, cp2y, x, y) { + this.__currentPosition = { x: x, y: y } + this.__addPathCommand( + format('C {cp1x} {cp1y} {cp2x} {cp2y} {x} {y}', { + cp1x: cp1x, + cp1y: cp1y, + cp2x: cp2x, + cp2y: cp2y, + x: x, + y: y, + }) + ) +} + +/** + * Adds a quadratic curve to command + */ +ctx.prototype.quadraticCurveTo = function (cpx, cpy, x, y) { + this.__currentPosition = { x: x, y: y } + this.__addPathCommand( + format('Q {cpx} {cpy} {x} {y}', { cpx: cpx, cpy: cpy, x: x, y: y }) + ) +} + +/** + * Return a new normalized vector of given vector + */ +var normalize = function (vector) { + var len = Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1]) + return [vector[0] / len, vector[1] / len] +} + +/** + * Adds the arcTo to the current path + * + * @see http://www.w3.org/TR/2015/WD-2dcontext-20150514/#dom-context-2d-arcto + */ +ctx.prototype.arcTo = function (x1, y1, x2, y2, radius) { + // Let the point (x0, y0) be the last point in the subpath. + var x0 = this.__currentPosition && this.__currentPosition.x + var y0 = this.__currentPosition && this.__currentPosition.y + + // First ensure there is a subpath for (x1, y1). + if (typeof x0 == 'undefined' || typeof y0 == 'undefined') { + return + } + + // Negative values for radius must cause the implementation to throw an IndexSizeError exception. + if (radius < 0) { + throw new Error( + 'IndexSizeError: The radius provided (' + radius + ') is negative.' + ) + } + + // If the point (x0, y0) is equal to the point (x1, y1), + // or if the point (x1, y1) is equal to the point (x2, y2), + // or if the radius radius is zero, + // then the method must add the point (x1, y1) to the subpath, + // and connect that point to the previous point (x0, y0) by a straight line. + if ((x0 === x1 && y0 === y1) || (x1 === x2 && y1 === y2) || radius === 0) { + this.lineTo(x1, y1) + return + } + + // Otherwise, if the points (x0, y0), (x1, y1), and (x2, y2) all lie on a single straight line, + // then the method must add the point (x1, y1) to the subpath, + // and connect that point to the previous point (x0, y0) by a straight line. + var unit_vec_p1_p0 = normalize([x0 - x1, y0 - y1]) + var unit_vec_p1_p2 = normalize([x2 - x1, y2 - y1]) + if ( + unit_vec_p1_p0[0] * unit_vec_p1_p2[1] === + unit_vec_p1_p0[1] * unit_vec_p1_p2[0] + ) { + this.lineTo(x1, y1) + return + } + + // Otherwise, let The Arc be the shortest arc given by circumference of the circle that has radius radius, + // and that has one point tangent to the half-infinite line that crosses the point (x0, y0) and ends at the point (x1, y1), + // and that has a different point tangent to the half-infinite line that ends at the point (x1, y1), and crosses the point (x2, y2). + // The points at which this circle touches these two lines are called the start and end tangent points respectively. + + // note that both vectors are unit vectors, so the length is 1 + var cos = + unit_vec_p1_p0[0] * unit_vec_p1_p2[0] + + unit_vec_p1_p0[1] * unit_vec_p1_p2[1] + var theta = Math.acos(Math.abs(cos)) + + // Calculate origin + var unit_vec_p1_origin = normalize([ + unit_vec_p1_p0[0] + unit_vec_p1_p2[0], + unit_vec_p1_p0[1] + unit_vec_p1_p2[1], + ]) + var len_p1_origin = radius / Math.sin(theta / 2) + var x = x1 + len_p1_origin * unit_vec_p1_origin[0] + var y = y1 + len_p1_origin * unit_vec_p1_origin[1] + + // Calculate start angle and end angle + // rotate 90deg clockwise (note that y axis points to its down) + var unit_vec_origin_start_tangent = [-unit_vec_p1_p0[1], unit_vec_p1_p0[0]] + // rotate 90deg counter clockwise (note that y axis points to its down) + var unit_vec_origin_end_tangent = [unit_vec_p1_p2[1], -unit_vec_p1_p2[0]] + var getAngle = function (vector) { + // get angle (clockwise) between vector and (1, 0) + var x = vector[0] + var y = vector[1] + if (y >= 0) { + // note that y axis points to its down + return Math.acos(x) + } else { + return -Math.acos(x) + } + } + var startAngle = getAngle(unit_vec_origin_start_tangent) + var endAngle = getAngle(unit_vec_origin_end_tangent) + + // Connect the point (x0, y0) to the start tangent point by a straight line + this.lineTo( + x + unit_vec_origin_start_tangent[0] * radius, + y + unit_vec_origin_start_tangent[1] * radius + ) + + // Connect the start tangent point to the end tangent point by arc + // and adding the end tangent point to the subpath. + this.arc(x, y, radius, startAngle, endAngle) +} + +/** + * Sets the stroke property on the current element + */ +ctx.prototype.stroke = function () { + if (this.__currentElement.nodeName === 'path') { + this.__currentElement.setAttribute('paint-order', 'fill stroke markers') + } + this.__applyCurrentDefaultPath() + this.__applyStyleToCurrentElement('stroke') +} + +/** + * Sets fill properties on the current element + */ +ctx.prototype.fill = function () { + if (this.__currentElement.nodeName === 'path') { + this.__currentElement.setAttribute('paint-order', 'stroke fill markers') + } + this.__applyCurrentDefaultPath() + this.__applyStyleToCurrentElement('fill') +} + +/** + * Adds a rectangle to the path. + */ +ctx.prototype.rect = function (x, y, width, height) { + if (this.__currentElement.nodeName !== 'path') { + this.beginPath() + } + this.moveTo(x, y) + this.lineTo(x + width, y) + this.lineTo(x + width, y + height) + this.lineTo(x, y + height) + this.lineTo(x, y) + this.closePath() +} + +/** + * adds a rectangle element + */ +ctx.prototype.fillRect = function (x, y, width, height) { + var rect, parent + rect = this.__createElement( + 'rect', + { + x: x, + y: y, + width: width, + height: height, + }, + true + ) + parent = this.__closestGroupOrSvg() + parent.appendChild(rect) + this.__currentElement = rect + this.__applyStyleToCurrentElement('fill') +} + +/** + * Draws a rectangle with no fill + * @param x + * @param y + * @param width + * @param height + */ +ctx.prototype.strokeRect = function (x, y, width, height) { + var rect, parent + rect = this.__createElement( + 'rect', + { + x: x, + y: y, + width: width, + height: height, + }, + true + ) + parent = this.__closestGroupOrSvg() + parent.appendChild(rect) + this.__currentElement = rect + this.__applyStyleToCurrentElement('stroke') +} + +/** + * Clear entire canvas: + * 1. save current transforms + * 2. remove all the childNodes of the root g element + */ +ctx.prototype.__clearCanvas = function () { + var current = this.__closestGroupOrSvg(), + transform = current.getAttribute('transform') + var rootGroup = this.__root.childNodes[1] + var childNodes = rootGroup.childNodes + for (var i = childNodes.length - 1; i >= 0; i--) { + if (childNodes[i]) { + rootGroup.removeChild(childNodes[i]) + } + } + this.__currentElement = rootGroup + //reset __groupStack as all the child group nodes are all removed. + this.__groupStack = [] + if (transform) { + this.__addTransform(transform) + } +} + +/** + * "Clears" a canvas by just drawing a white rectangle in the current group. + */ +ctx.prototype.clearRect = function (x, y, width, height) { + //clear entire canvas + if (x === 0 && y === 0 && width === this.width && height === this.height) { + this.__clearCanvas() + return + } + var rect, + parent = this.__closestGroupOrSvg() + rect = this.__createElement( + 'rect', + { + x: x, + y: y, + width: width, + height: height, + fill: '#FFFFFF', + }, + true + ) + parent.appendChild(rect) +} + +/** + * Adds a linear gradient to a defs tag. + * Returns a canvas gradient object that has a reference to it's parent def + */ +ctx.prototype.createLinearGradient = function (x1, y1, x2, y2) { + var grad = this.__createElement( + 'linearGradient', + { + id: randomString(this.__ids), + x1: x1 + 'px', + x2: x2 + 'px', + y1: y1 + 'px', + y2: y2 + 'px', + gradientUnits: 'userSpaceOnUse', + }, + false + ) + this.__defs.appendChild(grad) + return new CanvasGradient(grad, this) +} + +/** + * Adds a radial gradient to a defs tag. + * Returns a canvas gradient object that has a reference to it's parent def + */ +ctx.prototype.createRadialGradient = function (x0, y0, r0, x1, y1, r1) { + var grad = this.__createElement( + 'radialGradient', + { + id: randomString(this.__ids), + cx: x1 + 'px', + cy: y1 + 'px', + r: r1 + 'px', + fx: x0 + 'px', + fy: y0 + 'px', + gradientUnits: 'userSpaceOnUse', + }, + false + ) + this.__defs.appendChild(grad) + return new CanvasGradient(grad, this) +} + +/** + * Parses the font string and returns svg mapping + * @private + */ +ctx.prototype.__parseFont = function () { + var regex = + /^\s*(?=(?:(?:[-a-z]+\s*){0,2}(italic|oblique))?)(?=(?:(?:[-a-z]+\s*){0,2}(small-caps))?)(?=(?:(?:[-a-z]+\s*){0,2}(bold(?:er)?|lighter|[1-9]00))?)(?:(?:normal|\1|\2|\3)\s*){0,3}((?:xx?-)?(?:small|large)|medium|smaller|larger|[.\d]+(?:\%|in|[cem]m|ex|p[ctx]))(?:\s*\/\s*(normal|[.\d]+(?:\%|in|[cem]m|ex|p[ctx])))?\s*([-,\'\"\sa-z0-9]+?)\s*$/i + var fontPart = regex.exec(this.font) + var data = { + style: fontPart[1] || 'normal', + size: fontPart[4] || '10px', + family: fontPart[6] || 'sans-serif', + weight: fontPart[3] || 'normal', + decoration: fontPart[2] || 'normal', + href: null, + } + + //canvas doesn't support underline natively, but we can pass this attribute + if (this.__fontUnderline === 'underline') { + data.decoration = 'underline' + } + + //canvas also doesn't support linking, but we can pass this as well + if (this.__fontHref) { + data.href = this.__fontHref + } + + return data +} + +/** + * Helper to link text fragments + * @param font + * @param element + * @return {*} + * @private + */ +ctx.prototype.__wrapTextLink = function (font, element) { + if (font.href) { + var a = this.__createElement('a') + a.setAttributeNS( + 'http://www.w3.org/1999/xlink', + 'xlink:href', + font.href + ) + a.appendChild(element) + return a + } + return element +} + +/** + * Fills or strokes text + * @param text + * @param x + * @param y + * @param action - stroke or fill + * @private + */ +ctx.prototype.__applyText = function (text, x, y, action) { + var font = this.__parseFont(), + parent = this.__closestGroupOrSvg(), + textElement = this.__createElement( + 'text', + { + 'font-family': font.family, + 'font-size': font.size, + 'font-style': font.style, + 'font-weight': font.weight, + 'text-decoration': font.decoration, + x: x, + y: y, + 'text-anchor': getTextAnchor(this.textAlign), + 'dominant-baseline': getDominantBaseline(this.textBaseline), + }, + true + ) + + textElement.appendChild(this.__document.createTextNode(text)) + this.__currentElement = textElement + this.__applyStyleToCurrentElement(action) + parent.appendChild(this.__wrapTextLink(font, textElement)) +} + +/** + * Creates a text element + * @param text + * @param x + * @param y + */ +ctx.prototype.fillText = function (text, x, y) { + this.__applyText(text, x, y, 'fill') +} + +/** + * Strokes text + * @param text + * @param x + * @param y + */ +ctx.prototype.strokeText = function (text, x, y) { + this.__applyText(text, x, y, 'stroke') +} + +/** + * No need to implement this for svg. + * @param text + * @return {TextMetrics} + */ +ctx.prototype.measureText = function (text) { + this.__ctx.font = this.font + return this.__ctx.measureText(text) +} + +/** + * Arc command! + */ +ctx.prototype.arc = function ( + x, + y, + radius, + startAngle, + endAngle, + counterClockwise +) { + // in canvas no circle is drawn if no angle is provided. + if (startAngle === endAngle) { + return + } + startAngle = startAngle % (2 * Math.PI) + endAngle = endAngle % (2 * Math.PI) + if (startAngle === endAngle) { + //circle time! subtract some of the angle so svg is happy (svg elliptical arc can't draw a full circle) + endAngle = + (endAngle + 2 * Math.PI - 0.001 * (counterClockwise ? -1 : 1)) % + (2 * Math.PI) + } + var endX = x + radius * Math.cos(endAngle), + endY = y + radius * Math.sin(endAngle), + startX = x + radius * Math.cos(startAngle), + startY = y + radius * Math.sin(startAngle), + sweepFlag = counterClockwise ? 0 : 1, + largeArcFlag = 0, + diff = endAngle - startAngle + + // https://github.com/gliffy/canvas2svg/issues/4 + if (diff < 0) { + diff += 2 * Math.PI + } + + if (counterClockwise) { + largeArcFlag = diff > Math.PI ? 0 : 1 + } else { + largeArcFlag = diff > Math.PI ? 1 : 0 + } + + this.lineTo(startX, startY) + this.__addPathCommand( + format( + 'A {rx} {ry} {xAxisRotation} {largeArcFlag} {sweepFlag} {endX} {endY}', + { + rx: radius, + ry: radius, + xAxisRotation: 0, + largeArcFlag: largeArcFlag, + sweepFlag: sweepFlag, + endX: endX, + endY: endY, + } + ) + ) + + this.__currentPosition = { x: endX, y: endY } +} + +/** + * Generates a ClipPath from the clip command. + */ +ctx.prototype.clip = function () { + var group = this.__closestGroupOrSvg(), + clipPath = this.__createElement('clipPath'), + id = randomString(this.__ids), + newGroup = this.__createElement('g') + + this.__applyCurrentDefaultPath() + group.removeChild(this.__currentElement) + clipPath.setAttribute('id', id) + clipPath.appendChild(this.__currentElement) + + this.__defs.appendChild(clipPath) + + //set the clip path to this group + group.setAttribute('clip-path', format('url(#{id})', { id: id })) + + //clip paths can be scaled and transformed, we need to add another wrapper group to avoid later transformations + // to this path + group.appendChild(newGroup) + + this.__currentElement = newGroup +} + +/** + * Draws a canvas, image or mock context to this canvas. + * Note that all svg dom manipulation uses node.childNodes rather than node.children for IE support. + * http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage + */ +ctx.prototype.drawImage = function () { + //convert arguments to a real array + var args = Array.prototype.slice.call(arguments), + image = args[0], + dx, + dy, + dw, + dh, + sx = 0, + sy = 0, + sw, + sh, + parent, + svg, + defs, + group, + currentElement, + svgImage, + canvas, + context, + id + + if (args.length === 3) { + dx = args[1] + dy = args[2] + sw = image.width + sh = image.height + dw = sw + dh = sh + } else if (args.length === 5) { + dx = args[1] + dy = args[2] + dw = args[3] + dh = args[4] + sw = image.width + sh = image.height + } else if (args.length === 9) { + sx = args[1] + sy = args[2] + sw = args[3] + sh = args[4] + dx = args[5] + dy = args[6] + dw = args[7] + dh = args[8] + } else { + throw new Error( + 'Inavlid number of arguments passed to drawImage: ' + + arguments.length + ) + } + + parent = this.__closestGroupOrSvg() + currentElement = this.__currentElement + var translateDirective = 'translate(' + dx + ', ' + dy + ')' + if (image instanceof ctx) { + //canvas2svg mock canvas context. In the future we may want to clone nodes instead. + //also I'm currently ignoring dw, dh, sw, sh, sx, sy for a mock context. + svg = image.getSvg().cloneNode(true) + if (svg.childNodes && svg.childNodes.length > 1) { + defs = svg.childNodes[0] + while (defs.childNodes.length) { + id = defs.childNodes[0].getAttribute('id') + this.__ids[id] = id + this.__defs.appendChild(defs.childNodes[0]) + } + group = svg.childNodes[1] + if (group) { + //save original transform + var originTransform = group.getAttribute('transform') + var transformDirective + if (originTransform) { + transformDirective = + originTransform + ' ' + translateDirective + } else { + transformDirective = translateDirective + } + group.setAttribute('transform', transformDirective) + parent.appendChild(group) + } + } + } else if (image.nodeName === 'CANVAS' || image.nodeName === 'IMG') { + //canvas or image + svgImage = this.__createElement('image') + svgImage.setAttribute('width', dw) + svgImage.setAttribute('height', dh) + svgImage.setAttribute('preserveAspectRatio', 'none') + + if (sx || sy || sw !== image.width || sh !== image.height) { + //crop the image using a temporary canvas + canvas = this.__document.createElement('canvas') + canvas.width = dw + canvas.height = dh + context = canvas.getContext('2d') + context.drawImage(image, sx, sy, sw, sh, 0, 0, dw, dh) + image = canvas + } + svgImage.setAttribute('transform', translateDirective) + svgImage.setAttributeNS( + 'http://www.w3.org/1999/xlink', + 'xlink:href', + image.nodeName === 'CANVAS' + ? image.toDataURL() + : image.getAttribute('src') + ) + parent.appendChild(svgImage) + } +} + +/** + * Generates a pattern tag + */ +ctx.prototype.createPattern = function (image, repetition) { + var pattern = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + 'pattern' + ), + id = randomString(this.__ids), + img + pattern.setAttribute('id', id) + pattern.setAttribute('width', image.width) + pattern.setAttribute('height', image.height) + if (image.nodeName === 'CANVAS' || image.nodeName === 'IMG') { + img = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + 'image' + ) + img.setAttribute('width', image.width) + img.setAttribute('height', image.height) + img.setAttributeNS( + 'http://www.w3.org/1999/xlink', + 'xlink:href', + image.nodeName === 'CANVAS' + ? image.toDataURL() + : image.getAttribute('src') + ) + pattern.appendChild(img) + this.__defs.appendChild(pattern) + } else if (image instanceof ctx) { + pattern.appendChild(image.__root.childNodes[1]) + this.__defs.appendChild(pattern) + } + return new CanvasPattern(pattern, this) +} + +ctx.prototype.setLineDash = function (dashArray) { + if (dashArray && dashArray.length > 0) { + this.lineDash = dashArray.join(',') + } else { + this.lineDash = null + } +} + +/** + * Not yet implemented + */ +ctx.prototype.drawFocusRing = function () {} +ctx.prototype.createImageData = function () {} +ctx.prototype.getImageData = function () {} +ctx.prototype.putImageData = function () {} +ctx.prototype.globalCompositeOperation = function () {} +ctx.prototype.setTransform = function () {} + +//add options for alternative namespace +// if (typeof window === "object") { +// window.C2S = ctx; +// } + +// CommonJS/Browserify +// if (typeof module === "object" && typeof module.exports === "object") { +// module.exports = ctx; +// } + +export default ctx diff --git a/v1/src/simulator/src/canvasApi.js b/v1/src/simulator/src/canvasApi.js new file mode 100644 index 00000000..08ee65d3 --- /dev/null +++ b/v1/src/simulator/src/canvasApi.js @@ -0,0 +1,624 @@ +/* eslint-disable no-param-reassign */ +import backgroundArea from './backgroundArea' +import simulationArea from './simulationArea' +import miniMapArea, { removeMiniMap, updatelastMinimapShown } from './minimap' +import { colors } from './themer/themer' + +var unit = 10 + +export function findDimensions(scope = globalScope) { + var totalObjects = 0 + simulationArea.minWidth = undefined + simulationArea.maxWidth = undefined + simulationArea.minHeight = undefined + simulationArea.maxHeight = undefined + for (var i = 0; i < updateOrder.length; i++) { + if (updateOrder[i] !== 'wires') { + for (var j = 0; j < scope[updateOrder[i]].length; j++) { + totalObjects += 1 + var obj = scope[updateOrder[i]][j] + if (totalObjects === 1) { + simulationArea.minWidth = obj.absX() + simulationArea.minHeight = obj.absY() + simulationArea.maxWidth = obj.absX() + simulationArea.maxHeight = obj.absY() + } + if (obj.objectType !== 'Node') { + if (obj.y - obj.upDimensionY < simulationArea.minHeight) { + simulationArea.minHeight = obj.y - obj.upDimensionY + } + if (obj.y + obj.downDimensionY > simulationArea.maxHeight) { + simulationArea.maxHeight = obj.y + obj.downDimensionY + } + if (obj.x - obj.leftDimensionX < simulationArea.minWidth) { + simulationArea.minWidth = obj.x - obj.leftDimensionX + } + if (obj.x + obj.rightDimensionX > simulationArea.maxWidth) { + simulationArea.maxWidth = obj.x + obj.rightDimensionX + } + } else { + if (obj.absY() < simulationArea.minHeight) { + simulationArea.minHeight = obj.absY() + } + if (obj.absY() > simulationArea.maxHeight) { + simulationArea.maxHeight = obj.absY() + } + if (obj.absX() < simulationArea.minWidth) { + simulationArea.minWidth = obj.absX() + } + if (obj.absX() > simulationArea.maxWidth) { + simulationArea.maxWidth = obj.absX() + } + } + } + } + } + simulationArea.objectList = updateOrder +} + +// Function used to change the zoom level wrt to a point +// fn to change scale (zoom) - It also shifts origin so that the position +// of the object in focus doesn't change +export function changeScale(delta, xx, yy, method = 1) { + // method = 3/2 - Zoom wrt center of screen + // method = 1 - Zoom wrt position of mouse + // Otherwise zoom wrt to selected object + + if (method === 3) { + xx = (width / 2 - globalScope.ox) / globalScope.scale + yy = (height / 2 - globalScope.oy) / globalScope.scale + } else if ( + xx === undefined || + yy === undefined || + xx === 'zoomButton' || + yy === 'zoomButton' + ) { + if ( + simulationArea.lastSelected && + simulationArea.lastSelected.objectType !== 'Wire' + ) { + // selected object + xx = simulationArea.lastSelected.x + yy = simulationArea.lastSelected.y + } else { + // mouse location + // eslint-disable-next-line no-lonely-if + if (method === 1) { + xx = simulationArea.mouseX + yy = simulationArea.mouseY + } else if (method === 2) { + xx = (width / 2 - globalScope.ox) / globalScope.scale + yy = (height / 2 - globalScope.oy) / globalScope.scale + } + } + } + + var oldScale = globalScope.scale + globalScope.scale = Math.max( + 0.5, + Math.min(4 * DPR, globalScope.scale + delta) + ) + globalScope.scale = Math.round(globalScope.scale * 10) / 10 + globalScope.ox -= Math.round(xx * (globalScope.scale - oldScale)) // Shift accordingly, so that we zoom wrt to the selected point + globalScope.oy -= Math.round(yy * (globalScope.scale - oldScale)) + // dots(true,false); + + // MiniMap + if (!embed && !lightMode) { + findDimensions(globalScope) + miniMapArea.setup() + $('#miniMap').show() + updatelastMinimapShown() + $('#miniMap').show() + setTimeout(removeMiniMap, 2000) + } +} +// fn to draw Dots on screen +// the function is called only when the zoom level or size of screen changes. +// Otherwise for normal panning, the canvas itself is moved to give the illusion of movement + +export function dots( + dots = true, + transparentBackground = false, + force = false +) { + const scale = unit * globalScope.scale + const ox = globalScope.ox % scale // offset + const oy = globalScope.oy % scale // offset + + const backgroundCtx = backgroundArea.context + if (!backgroundCtx) return + + const canvasWidth = backgroundArea.canvas.width // max X distance + const canvasHeight = backgroundArea.canvas.height // max Y distance + + backgroundArea.canvas.style.left = `${(ox - scale) / DPR}px` // adjust left position of canvas + backgroundArea.canvas.style.top = `${(oy - scale) / DPR}px` // adjust top position of canvas + + if (globalScope.scale === simulationArea.prevScale && !force) return + + simulationArea.prevScale = globalScope.scale // set the previous scale to current scale + + backgroundCtx.beginPath() + backgroundArea.clear() + + if (!transparentBackground) { + backgroundCtx.fillStyle = colors['canvas_fill'] + backgroundCtx.fillRect(0, 0, canvasWidth, canvasHeight) + } + + if (dots) { + backgroundCtx.fillStyle = colors['dot_fill'] + for (let i = 0; i < canvasWidth; i += scale) { + for (let j = 0; j < canvasHeight; j += scale) { + backgroundCtx.beginPath() + backgroundCtx.arc(i, j, scale / 10, 0, Math.PI * 2) + backgroundCtx.fill() + } + } + } + + backgroundCtx.strokeStyle = colors['canvas_stroke'] + backgroundCtx.lineWidth = 1 + + if (!embed) { + const correction = 0.5 * (backgroundCtx.lineWidth % 2) + for (let i = 0; i < canvasWidth; i += scale) { + backgroundCtx.moveTo(Math.round(i + correction) - correction, 0) + backgroundCtx.lineTo( + Math.round(i + correction) - correction, + canvasHeight + ) + } + for (let j = 0; j < canvasHeight; j += scale) { + backgroundCtx.moveTo(0, Math.round(j + correction) - correction) + backgroundCtx.lineTo( + canvasWidth, + Math.round(j + correction) - correction + ) + } + backgroundCtx.stroke() + } + + // Old Code + // function drawPixel(x, y, r, g, b, a) { + // var index = (x + y * canvasWidth) * 4; + // canvasData.data[index + 0] = r; + // canvasData.data[index + 1] = g; + // canvasData.data[index + 2] = b; + // canvasData.data[index + 3] = a; + // } + // if (dots) { + // var canvasData = ctx.getImageData(0, 0, canvasWidth, canvasHeight); + // + // + // + // for (var i = 0 + ox; i < canvasWidth; i += scale) + // for (var j = 0 + oy; j < canvasHeight; j += scale) + // drawPixel(i, j, 0, 0, 0, 255); + // ctx.putImageData(canvasData, 0, 0); + // } +} + +// Helper canvas API starts here +// All canvas functions are wrt to a center point (xx,yy), +// direction is used to abstract rotation of everything by a certain angle +// Possible values for direction = "RIGHT" (default), "LEFT", "UP", "DOWN" + +export function bezierCurveTo(x1, y1, x2, y2, x3, y3, xx, yy, dir) { + ;[x1, y1] = rotate(x1, y1, dir) + ;[x2, y2] = rotate(x2, y2, dir) + ;[x3, y3] = rotate(x3, y3, dir) + var { ox } = globalScope + var { oy } = globalScope + x1 *= globalScope.scale + y1 *= globalScope.scale + x2 *= globalScope.scale + y2 *= globalScope.scale + x3 *= globalScope.scale + y3 *= globalScope.scale + xx *= globalScope.scale + yy *= globalScope.scale + var ctx = simulationArea.context + ctx.bezierCurveTo( + Math.round(xx + ox + x1), + Math.round(yy + oy + y1), + Math.round(xx + ox + x2), + Math.round(yy + oy + y2), + Math.round(xx + ox + x3), + Math.round(yy + oy + y3) + ) +} + +export function moveTo(ctx, x1, y1, xx, yy, dir, bypass = false) { + var correction = 0.5 * (ctx.lineWidth % 2) + let newX + let newY + ;[newX, newY] = rotate(x1, y1, dir) + newX *= globalScope.scale + newY *= globalScope.scale + xx *= globalScope.scale + yy *= globalScope.scale + if (bypass) { + ctx.moveTo(xx + globalScope.ox + newX, yy + globalScope.oy + newY) + } else { + ctx.moveTo( + Math.round(xx + globalScope.ox + newX - correction) + correction, + Math.round(yy + globalScope.oy + newY - correction) + correction + ) + } +} + +export function lineTo(ctx, x1, y1, xx, yy, dir) { + let newX + let newY + + var correction = 0.5 * (ctx.lineWidth % 2) + ;[newX, newY] = rotate(x1, y1, dir) + newX *= globalScope.scale + newY *= globalScope.scale + xx *= globalScope.scale + yy *= globalScope.scale + ctx.lineTo( + Math.round(xx + globalScope.ox + newX - correction) + correction, + Math.round(yy + globalScope.oy + newY - correction) + correction + ) +} + +export function arc(ctx, sx, sy, radius, start, stop, xx, yy, dir) { + // ox-x of origin, xx- x of element , sx - shift in x from element + let Sx + let Sy + let newStart + let newStop + let counterClock + var correction = 0.5 * (ctx.lineWidth % 2) + ;[Sx, Sy] = rotate(sx, sy, dir) + Sx *= globalScope.scale + Sy *= globalScope.scale + xx *= globalScope.scale + yy *= globalScope.scale + radius *= globalScope.scale + ;[newStart, newStop, counterClock] = rotateAngle(start, stop, dir) + ctx.arc( + Math.round(xx + globalScope.ox + Sx + correction) - correction, + Math.round(yy + globalScope.oy + Sy + correction) - correction, + Math.round(radius), + newStart, + newStop, + counterClock + ) +} + +export function arc2(ctx, sx, sy, radius, start, stop, xx, yy, dir) { + // ox-x of origin, xx- x of element , sx - shift in x from element + let Sx + let Sy + let newStart + let newStop + let counterClock + var correction = 0.5 * (ctx.lineWidth % 2) + ;[Sx, Sy] = rotate(sx, sy, dir) + Sx *= globalScope.scale + Sy *= globalScope.scale + xx *= globalScope.scale + yy *= globalScope.scale + radius *= globalScope.scale + ;[newStart, newStop, counterClock] = rotateAngle(start, stop, dir) + var pi = 0 + if (counterClock) { + pi = Math.PI + } + ctx.arc( + Math.round(xx + globalScope.ox + Sx + correction) - correction, + Math.round(yy + globalScope.oy + Sy + correction) - correction, + Math.round(radius), + newStart + pi, + newStop + pi + ) +} + +export function drawCircle2(ctx, sx, sy, radius, xx, yy, dir) { + // ox-x of origin, xx- x of element , sx - shift in x from element + let Sx + let Sy + ;[Sx, Sy] = rotate(sx, sy, dir) + Sx *= globalScope.scale + Sy *= globalScope.scale + xx *= globalScope.scale + yy *= globalScope.scale + radius *= globalScope.scale + ctx.arc( + Math.round(xx + globalScope.ox + Sx), + Math.round(yy + globalScope.oy + Sy), + Math.round(radius), + 0, + 2 * Math.PI + ) +} + +export function rect(ctx, x1, y1, x2, y2) { + var correction = 0.5 * (ctx.lineWidth % 2) + x1 *= globalScope.scale + y1 *= globalScope.scale + x2 *= globalScope.scale + y2 *= globalScope.scale + ctx.rect( + Math.round(globalScope.ox + x1 - correction) + correction, + Math.round(globalScope.oy + y1 - correction) + correction, + Math.round(x2), + Math.round(y2) + ) +} + +export function drawImage(ctx, img, x1, y1, w_canvas, h_canvas) { + x1 *= globalScope.scale + y1 *= globalScope.scale + x1 += globalScope.ox + y1 += globalScope.oy + + w_canvas *= globalScope.scale + h_canvas *= globalScope.scale + ctx.drawImage(img, x1, y1, w_canvas, h_canvas) +} + +export function rect2(ctx, x1, y1, x2, y2, xx, yy, dir = 'RIGHT') { + var correction = 0.5 * (ctx.lineWidth % 2) + ;[x1, y1] = rotate(x1, y1, dir) + ;[x2, y2] = rotate(x2, y2, dir) + x1 *= globalScope.scale + y1 *= globalScope.scale + x2 *= globalScope.scale + y2 *= globalScope.scale + xx *= globalScope.scale + yy *= globalScope.scale + ctx.rect( + Math.round(globalScope.ox + xx + x1 - correction) + correction, + Math.round(globalScope.oy + yy + y1 - correction) + correction, + Math.round(x2), + Math.round(y2) + ) +} + +export function rotate(x1, y1, dir) { + if (dir === 'LEFT') { + return [-x1, y1] + } + if (dir === 'DOWN') { + return [y1, x1] + } + if (dir === 'UP') { + return [y1, -x1] + } + return [x1, y1] +} + +export function correctWidth(w) { + return Math.max(1, Math.round(w * globalScope.scale)) +} + +function rotateAngle(start, stop, dir) { + if (dir === 'LEFT') { + return [start, stop, true] + } + if (dir === 'DOWN') { + return [start - Math.PI / 2, stop - Math.PI / 2, true] + } + if (dir === 'UP') { + return [start - Math.PI / 2, stop - Math.PI / 2, false] + } + return [start, stop, false] +} + +export function drawLine(ctx, x1, y1, x2, y2, color, width) { + x1 *= globalScope.scale + y1 *= globalScope.scale + x2 *= globalScope.scale + y2 *= globalScope.scale + ctx.beginPath() + ctx.strokeStyle = color + ctx.lineCap = 'round' + ctx.lineWidth = correctWidth(width) //* globalScope.scale; + var correction = 0.5 * (ctx.lineWidth % 2) + var hCorrection = 0 + var vCorrection = 0 + if (y1 === y2) vCorrection = correction + if (x1 === x2) hCorrection = correction + ctx.moveTo( + Math.round(x1 + globalScope.ox + hCorrection) - hCorrection, + Math.round(y1 + globalScope.oy + vCorrection) - vCorrection + ) + ctx.lineTo( + Math.round(x2 + globalScope.ox + hCorrection) - hCorrection, + Math.round(y2 + globalScope.oy + vCorrection) - vCorrection + ) + ctx.stroke() +} + +// Checks if string color is a valid color using a hack +export function validColor(color) { + var $div = $('

') + $div.css('border', `1px solid ${color}`) + return $div.css('border-color') !== '' +} + +// Helper function to color "RED" to RGBA +export function colorToRGBA(color) { + var cvs + var ctx + cvs = document.createElement('canvas') + cvs.height = 1 + cvs.width = 1 + ctx = cvs.getContext('2d') + ctx.fillStyle = color + ctx.fillRect(0, 0, 1, 1) + return ctx.getImageData(0, 0, 1, 1).data +} + +export function drawCircle(ctx, x1, y1, r, color) { + x1 *= globalScope.scale + y1 *= globalScope.scale + ctx.beginPath() + ctx.fillStyle = color + ctx.arc( + Math.round(x1 + globalScope.ox), + Math.round(y1 + globalScope.oy), + Math.round(r * globalScope.scale), + 0, + Math.PI * 2, + false + ) + ctx.closePath() + ctx.fill() +} + +// To show message like values, node name etc +export function canvasMessage(ctx, str, x1, y1, fontSize = 10) { + if (!str || !str.length) return + + ctx.font = `${Math.round(fontSize * globalScope.scale)}px Raleway` + ctx.textAlign = 'center' + var width = ctx.measureText(str).width / globalScope.scale + 8 + var height = 13 + ctx.strokeStyle = 'black' + ctx.lineWidth = correctWidth(1) + ctx.fillStyle = 'yellow' + ctx.save() + ctx.beginPath() + rect(ctx, x1 - width / 2, y1 - height / 2 - 3, width, height) + ctx.shadowColor = '#999' + ctx.shadowBlur = 10 + ctx.shadowOffsetX = 3 + ctx.shadowOffsetY = 3 + ctx.stroke() + ctx.fill() + ctx.restore() + x1 *= globalScope.scale + y1 *= globalScope.scale + ctx.beginPath() + ctx.fillStyle = 'black' + ctx.fillText( + str, + Math.round(x1 + globalScope.ox), + Math.round(y1 + globalScope.oy) + ) + ctx.fill() +} + +export function fillText(ctx, str, x1, y1, fontSize = 20) { + x1 *= globalScope.scale + y1 *= globalScope.scale + ctx.font = `${Math.round(fontSize * globalScope.scale)}px Raleway` + ctx.fillText( + str, + Math.round(x1 + globalScope.ox), + Math.round(y1 + globalScope.oy) + ) +} + +export function fillText2(ctx, str, x1, y1, xx, yy, dir) { + var angle = { + RIGHT: 0, + LEFT: 0, + DOWN: Math.PI / 2, + UP: -Math.PI / 2, + } + x1 *= globalScope.scale + y1 *= globalScope.scale + ;[x1, y1] = rotate(x1, y1, dir) + xx *= globalScope.scale + yy *= globalScope.scale + + ctx.font = `${Math.round(14 * globalScope.scale)}px Raleway` + ctx.save() + ctx.translate( + Math.round(xx + x1 + globalScope.ox), + Math.round(yy + y1 + globalScope.oy) + ) + ctx.rotate(angle[dir]) + ctx.textAlign = 'center' + ctx.fillText( + str, + 0, + Math.round(4 * globalScope.scale) * (1 - 0 * +(dir === 'DOWN')) + ) + ctx.restore() +} + +export function fillText4( + ctx, + str, + x1, + y1, + xx, + yy, + dir, + fontSize = 14, + textAlign = 'center' +) { + var angle = { + RIGHT: 0, + LEFT: 0, + DOWN: Math.PI / 2, + UP: -Math.PI / 2, + } + x1 *= globalScope.scale + y1 *= globalScope.scale + ;[x1, y1] = rotate(x1, y1, dir) + xx *= globalScope.scale + yy *= globalScope.scale + + ctx.font = `${Math.round(fontSize * globalScope.scale)}px Raleway` + // ctx.font = 20+"px Raleway"; + ctx.textAlign = textAlign + ctx.fillText( + str, + xx + x1 + globalScope.ox, + yy + + y1 + + globalScope.oy + + Math.round((fontSize / 3) * globalScope.scale) + ) +} + +export function fillText3( + ctx, + str, + x1, + y1, + xx = 0, + yy = 0, + fontSize = 14, + font = 'Raleway', + textAlign = 'center' +) { + x1 *= globalScope.scale + y1 *= globalScope.scale + xx *= globalScope.scale + yy *= globalScope.scale + + ctx.font = `${Math.round(fontSize * globalScope.scale)}px ${font}` + ctx.textAlign = textAlign + ctx.fillText( + str, + Math.round(xx + x1 + globalScope.ox), + Math.round(yy + y1 + globalScope.oy) + ) +} + +export const oppositeDirection = { + RIGHT: 'LEFT', + LEFT: 'RIGHT', + DOWN: 'UP', + UP: 'DOWN', +} +export const fixDirection = { + right: 'LEFT', + left: 'RIGHT', + down: 'UP', + up: 'DOWN', + LEFT: 'LEFT', + RIGHT: 'RIGHT', + UP: 'UP', + DOWN: 'DOWN', +} diff --git a/v1/src/simulator/src/circuit.js b/v1/src/simulator/src/circuit.js new file mode 100644 index 00000000..f86429e3 --- /dev/null +++ b/v1/src/simulator/src/circuit.js @@ -0,0 +1,483 @@ +/* eslint-disable import/no-cycle */ +/* eslint-disable no-bitwise */ +/* eslint-disable guard-for-in */ +/* eslint-disable no-restricted-syntax */ +/* eslint-disable no-restricted-globals */ +/* eslint-disable consistent-return */ +/* eslint-disable func-names */ +/* eslint-disable array-callback-return */ +/* eslint-disable no-use-before-define */ +/* eslint-disable no-param-reassign */ +/* eslint-disable no-alert */ +import CircuitElement from './circuitElement' +import plotArea from './plotArea' +import simulationArea, { changeClockTime } from './simulationArea' +import { + stripTags, + uniq, + showMessage, + showError, + truncateString, +} from './utils' +import { findDimensions, dots } from './canvasApi' +import { updateRestrictedElementsList } from './restrictedElementDiv' +import { scheduleBackup } from './data/backupCircuit' +import { showProperties } from './ux' +import { + scheduleUpdate, + updateSimulationSet, + updateCanvasSet, + updateSubcircuitSet, + forceResetNodesSet, + changeLightMode, +} from './engine' +import { toggleLayoutMode, layoutModeGet } from './layoutMode' +import { setProjectName, getProjectName } from './data/save' +import { changeClockEnable } from './sequential' +import { changeInputSize } from './modules' +import { verilogModeGet, verilogModeSet } from './Verilog2CV' +import { updateTestbenchUI } from './testbench' +import { SimulatorStore } from '#/store/SimulatorStore/SimulatorStore' +import { toRef, toRefs } from 'vue' +import { provideCircuitName } from '#/components/helpers/promptComponent/PromptComponent.vue' +import { deleteCurrentCircuit } from '#/components/helpers/deleteCircuit/DeleteCircuit.vue' + +export const circuitProperty = { + toggleLayoutMode, + setProjectName, + changeCircuitName, + // changeClockTime, + deleteCurrentCircuit, + changeClockEnable, + changeInputSize, + changeLightMode, +} + +export var scopeList = {} +export function resetScopeList() { + const simulatorStore = SimulatorStore() + const { circuit_list } = toRefs(simulatorStore) + scopeList = {} + circuit_list.value = [] +} +/** + * Function used to change the current focusedCircuit + * Disables layoutMode if enabled + * Changes UI tab etc + * Sets flags to make updates, resets most of the things + * @param {string} id - identifier for circuit + * @category circuit + */ +export function switchCircuit(id) { + // TODO: fix tomorrow + const simulatorStore = SimulatorStore() + const { circuit_list } = toRefs(simulatorStore) + const { activeCircuit } = toRefs(simulatorStore) + + if (layoutModeGet()) { + toggleLayoutMode() + } + if (!scopeList[id].verilogMetadata.isVerilogCircuit) { + verilogModeSet(false) + } + + // globalScope.fixLayout(); + scheduleBackup() + if (id === globalScope.id) return + // $(`.circuits`).removeClass('current') + circuit_list.value.forEach((circuit) => + circuit.focussed ? (circuit.focussed = false) : null + ) + simulationArea.lastSelected = undefined + simulationArea.multipleObjectSelections = [] + simulationArea.copyList = [] + globalScope = scopeList[id] + if (globalScope.verilogMetadata.isVerilogCircuit) { + verilogModeSet(true) + } + if (globalScope.isVisible()) { + // $(`#${id}`).addClass('current') + const index = circuit_list.value.findIndex( + (circuit) => circuit.id == id + ) // TODO: add strict equality after typescript + circuit_list.value[index].focussed = true + activeCircuit.value.id = globalScope.id + activeCircuit.value.name = globalScope.name + } + updateSimulationSet(true) + updateSubcircuitSet(true) + forceResetNodesSet(true) + dots(false) + simulationArea.lastSelected = globalScope.root + if (!embed) { + showProperties(simulationArea.lastSelected) + updateTestbenchUI() + plotArea.reset() + } + updateCanvasSet(true) + scheduleUpdate() + + // to update the restricted elements information + updateRestrictedElementsList() +} + +export function getDependenciesList(scopeId) { + let scope = scopeList[scopeId] + if (scope == undefined) scope = scopeList[globalScope.id] + + let dependencies = '' + for (id in scopeList) { + if (id != scope.id && scopeList[id].checkDependency(scope.id)) { + if (dependencies === '') { + dependencies = scopeList[id].name + } else { + dependencies += `, ${scopeList[id].name}` + } + } + } + return dependencies +} + +// /** +// * Deletes the current circuit +// * Ensures that at least one circuit is there +// * Ensures that no circuit depends on the current circuit +// * Switched to a random circuit +// * @category circuit +// */ +// export function deleteCurrentCircuit(scopeId = globalScope.id) { +// const simulatorStore = SimulatorStore() +// const { circuit_list } = toRefs(simulatorStore) +// let scope = scopeList[scopeId] +// if (scope == undefined) scope = scopeList[globalScope.id] + +// if (scope.verilogMetadata.isVerilogCircuit) { +// scope.initialize() +// for (var id in scope.verilogMetadata.subCircuitScopeIds) +// delete scopeList[id] +// } +// // $(`#${scope.id}`).remove() +// const index = circuit_list.value.findIndex( +// (circuit) => circuit.id === scope.id +// ) +// circuit_list.value.splice(index, 1) +// delete scopeList[scope.id] +// if (scope.id == globalScope.id) { +// switchCircuit(Object.keys(scopeList)[0]) +// } +// showMessage('Circuit was successfully closed') +// } +/** + * Wrapper function around newCircuit to be called from + button on UI + */ +export async function createNewCircuitScope( + name, + id = undefined, + isVerilog = false, + isVerilogMain = false +) { + name = name ?? (await provideCircuitName()) + if (name instanceof Error) return // if user cancels the prompt + if (name.trim() == '') { + name = 'Untitled-Circuit' + } + simulationArea.lastSelected = undefined + newCircuit(name, id, isVerilog, isVerilogMain) + if (!embed) { + showProperties(simulationArea.lastSelected) + updateTestbenchUI() + plotArea.reset() + } + return true +} + +/** + * Function to create new circuit + * Function creates button in tab, creates scope and switches to this circuit + * @param {string} name - name of the new circuit + * @param {string} id - identifier for circuit + * @category circuit + */ +export function newCircuit(name, id, isVerilog = false, isVerilogMain = false) { + const simulatorStore = SimulatorStore() + const { circuit_list } = toRefs(simulatorStore) + const { activeCircuit } = toRefs(simulatorStore) + if (layoutModeGet()) { + toggleLayoutMode() + } + if (verilogModeGet()) { + verilogModeSet(false) + } + name = name || 'Untitled-Circuit' + name = stripTags(name) + if (!name) return + const scope = new Scope(name) + if (id) scope.id = id + scopeList[scope.id] = scope + let currCircuit = { + id: scope.id, + name: scope.name, // fix for tab name issue - vue - to be reviewed @devartstar + } + + circuit_list.value.push(currCircuit) + if (isVerilog) { + scope.verilogMetadata.isVerilogCircuit = true + // TODO: remove later if not required after fixing verilog code loading from saved file + circuit_list.value.forEach((circuit) => (circuit.isVerilog = false)) + circuit_list.value[circuit_list.value.length - 1].isVerilog = true + scope.verilogMetadata.isMainCircuit = isVerilogMain + } + globalScope = scope + // $('.circuits').removeClass('current') + circuit_list.value.forEach((circuit) => (circuit.focussed = false)) + circuit_list.value[circuit_list.value.length - 1].focussed = true + activeCircuit.value.id = scope.id + activeCircuit.value.name = scope.name + + if (!isVerilog || isVerilogMain) { + if (embed) { + // added calss - embed-tab using vue logic + // var html = `
${truncateString( + // name, + // 18 + // )}
` + // $('#tabsBar').append(html) + // $('#tabsBar').addClass('embed-tabs') + } else { + // logic implemented in vue + } + + // Remove listeners + //$('.circuits').off('click') + $('.circuitName').off('click') + //$('.tabsCloseButton').off('click') + + // switch circuit function moved inside vue component + + if (!embed) { + $('.circuitName').on('click', () => { + simulationArea.lastSelected = globalScope.root + setTimeout(() => { + // here link with the properties panel + document.getElementById('circname').select() + }, 100) + }) + } + // moved inside vue - component + // $('.tabsCloseButton').on('click', function (e) { + // e.stopPropagation() + // deleteCurrentCircuit(this.id) + // }) + + if (!embed) { + showProperties(scope.root) + } + dots(false) + } + return scope +} + +/** + * Used to change name of a circuit + * @param {string} name - new name + * @param {string} id - id of the circuit + * @category circuit + */ +export function changeCircuitName(name, id = globalScope.id) { + const simulatorStore = SimulatorStore() + const { circuit_list } = toRefs(simulatorStore) + // const { activeCircuit } = toRefs(simulatorStore) + name = name || 'Untitled' + name = stripTags(name) + scopeList[id].name = name + const index = circuit_list.value.findIndex((circuit) => circuit.id === id) + circuit_list.value[index].name = name + // activeCircuit.value.name = name // add later if necessary at current stage not important handled by projectProperty on switching circuit +} + +/** + * Class representing a Scope + * @class + * @param {string} name - name of the circuit + * @param {number=} id - a random id for the circuit + * @category circuit + */ +export default class Scope { + constructor(name = 'localScope', id = undefined) { + this.restrictedCircuitElementsUsed = [] + this.id = id || Math.floor(Math.random() * 100000000000 + 1) + this.CircuitElement = [] + this.name = name + + // root object for referring to main canvas - intermediate node uses this + this.root = new CircuitElement(0, 0, this, 'RIGHT', 1) + this.backups = [] + // maintaining a state (history) for redo function + this.history = [] + this.timeStamp = new Date().getTime() + this.verilogMetadata = { + isVerilogCircuit: false, + isMainCircuit: false, + code: '// Write Some Verilog Code Here!', + subCircuitScopeIds: [], + } + + this.ox = 0 + this.oy = 0 + this.scale = DPR + this.stack = [] + + this.initialize() + + // Setting default layout + this.layout = { + // default position + width: 100, + height: 40, + title_x: 50, + title_y: 13, + titleEnabled: true, + } + } + + isVisible() { + if (!this.verilogMetadata.isVerilogCircuit) return true + return this.verilogMetadata.isMainCircuit + } + + initialize() { + this.tunnelList = {} + this.pending = [] + this.nodes = [] // intermediate nodes only + this.allNodes = [] + this.wires = [] + + // Creating arrays for other module elements + for (let i = 0; i < moduleList.length; i++) { + this[moduleList[i]] = [] + } + } + + /** + * Resets all nodes recursively + */ + reset() { + for (let i = 0; i < this.allNodes.length; i++) { + this.allNodes[i].reset() + } + for (let i = 0; i < this.Splitter.length; i++) { + this.Splitter[i].reset() + } + for (let i = 0; i < this.SubCircuit.length; i++) { + this.SubCircuit[i].reset() + } + } + + /** + * Adds all inputs to simulationQueue + */ + addInputs() { + for (let i = 0; i < inputList.length; i++) { + for (var j = 0; j < this[inputList[i]].length; j++) { + simulationArea.simulationQueue.add(this[inputList[i]][j], 0) + } + } + + for (let i = 0; i < this.SubCircuit.length; i++) { + this.SubCircuit[i].addInputs() + } + } + + /** + * Ticks clocks recursively -- needs to be deprecated and synchronize all clocks with a global clock + */ + clockTick() { + for (let i = 0; i < this.Clock.length; i++) { + this.Clock[i].toggleState() + } // tick clock! + for (let i = 0; i < this.SubCircuit.length; i++) { + this.SubCircuit[i].localScope.clockTick() + } // tick clock! + } + + /** + * Checks if this circuit contains directly or indirectly scope with id + * Recursive nature + */ + checkDependency(id) { + if (id === this.id) return true + for (let i = 0; i < this.SubCircuit.length; i++) { + if (this.SubCircuit[i].id === id) return true + } + + for (let i = 0; i < this.SubCircuit.length; i++) { + if (scopeList[this.SubCircuit[i].id].checkDependency(id)) + return true + } + + return false + } + + /** + * Get dependency list - list of all circuits, this circuit depends on + */ + getDependencies() { + var list = [] + for (let i = 0; i < this.SubCircuit.length; i++) { + list.push(this.SubCircuit[i].id) + list.extend(scopeList[this.SubCircuit[i].id].getDependencies()) + } + return uniq(list) + } + + /** + * helper function to reduce layout size + */ + fixLayout() { + var maxY = 20 + for (let i = 0; i < this.Input.length; i++) { + maxY = Math.max(this.Input[i].layoutProperties.y, maxY) + } + for (let i = 0; i < this.Output.length; i++) { + maxY = Math.max(this.Output[i].layoutProperties.y, maxY) + } + if (maxY !== this.layout.height) { + this.layout.height = maxY + 10 + } + } + + /** + * Function which centers the circuit to the correct zoom level + */ + centerFocus(zoomIn = true) { + if (layoutModeGet()) return + findDimensions(this) + + var ytoolbarOffset = embed ? 0 : 60 * DPR // Some part ofcanvas is hidden behind the toolbar + + var minX = simulationArea.minWidth || 0 + var minY = simulationArea.minHeight || 0 + var maxX = simulationArea.maxWidth || 0 + var maxY = simulationArea.maxHeight || 0 + + var reqWidth = maxX - minX + 75 * DPR + var reqHeight = maxY - minY + 75 * DPR + + this.scale = Math.min( + width / reqWidth, + (height - ytoolbarOffset) / reqHeight + ) + + if (!zoomIn) { + this.scale = Math.min(this.scale, DPR) + } + this.scale = Math.max(this.scale, DPR / 10) + + this.ox = -minX * this.scale + (width - (maxX - minX) * this.scale) / 2 + this.oy = + -minY * this.scale + + (height - ytoolbarOffset - (maxY - minY) * this.scale) / 2 + } +} diff --git a/v1/src/simulator/src/circuitElement.js b/v1/src/simulator/src/circuitElement.js new file mode 100644 index 00000000..cd368c4d --- /dev/null +++ b/v1/src/simulator/src/circuitElement.js @@ -0,0 +1,1018 @@ +/* eslint-disable no-multi-assign */ +/* eslint-disable no-bitwise */ +import { scheduleUpdate } from './engine' +import simulationArea from './simulationArea' +import { + fixDirection, + fillText, + correctWidth, + rect2, + oppositeDirection, +} from './canvasApi' +import { colors } from './themer/themer' +import { layoutModeGet, tempBuffer } from './layoutMode' +import { fillSubcircuitElements } from './ux' +import { generateNodeName } from './verilogHelpers' + +/** + * Base class for circuit elements. + * @param {number} x - x coordinate of the element + * @param {number} y - y coordinate of the element + * @param {Scope} scope - The circuit on which circuit element is being drawn + * @param {string} dir - The direction of circuit element + * @param {number} bitWidth - the number of bits per node. + * @category circuitElement + */ +export default class CircuitElement { + constructor(x, y, scope, dir, bitWidth) { + // Data member initializations + this.x = x + this.y = y + this.hover = false + if (this.x === undefined || this.y === undefined) { + this.x = simulationArea.mouseX + this.y = simulationArea.mouseY + this.newElement = true + this.hover = true + } + this.deleteNodesWhenDeleted = true // FOR NOW - TO CHECK LATER + this.nodeList = [] + this.clicked = false + + this.oldx = x + this.oldy = y + + // The following attributes help in setting the touch area bound. They are the distances from the center. + // Note they are all positive distances from center. They will automatically be rotated when direction is changed. + // To stop the rotation when direction is changed, check overrideDirectionRotation attribute. + this.leftDimensionX = 10 + this.rightDimensionX = 10 + this.upDimensionY = 10 + this.downDimensionY = 10 + + this.label = '' + this.scope = scope + this.baseSetup() + + this.bitWidth = bitWidth || parseInt(prompt('Enter bitWidth'), 10) || 1 + this.direction = dir + this.directionFixed = false + this.labelDirectionFixed = false + this.labelDirection = oppositeDirection[dir] + this.orientationFixed = true + this.fixedBitWidth = false + + scheduleUpdate() + + this.queueProperties = { + inQueue: false, + time: undefined, + index: undefined, + } + + if (this.canShowInSubcircuit) { + this.subcircuitMetadata = { + showInSubcircuit: false, // if canShowInSubcircuit == true, showInSubcircuit determines wheter the user has added the element in the subcircuit + showLabelInSubcircuit: true, // determines whether the label of the element is to be showin the subcircuit + labelDirection: this.labelDirection, // determines the direction of the label of the element in the subcircuit + // coordinates of the element in the subcircuit relative to the subcircuit + x: 0, + y: 0, + } + } + } + + /** + * Function to flip bits + * @param {number} val - the value of flipped bits + * @returns {number} - The number of flipped bits + */ + flipBits(val) { + return ((~val >>> 0) << (32 - this.bitWidth)) >>> (32 - this.bitWidth) + } + + /** + * Function to get absolute value of x coordinate of the element + * @param {number} x - value of x coordinate of the element + * @return {number} - absolute value of x + */ + absX() { + return this.x + } + + /** + * Function to get absolute value of y coordinate of the element + * @param {number} y - value of y coordinate of the element + * @return {number} - absolute value of y + */ + absY() { + return this.y + } + + /** + * adds the element to scopeList + */ + baseSetup() { + this.scope[this.objectType].push(this) + } + + /** + * Function to copy the circuit element obj to a new circuit element + * @param {CircuitElement} obj - element to be copied from + */ + copyFrom(obj) { + var properties = ['label', 'labelDirection'] + for (let i = 0; i < properties.length; i++) { + if (obj[properties[i]] !== undefined) { + this[properties[i]] = obj[properties[i]] + } + } + } + + /** Methods to be Implemented for derivedClass + * saveObject(); //To generate JSON-safe data that can be loaded + * customDraw(); //This is to draw the custom design of the circuit(Optional) + * resolve(); // To execute digital logic(Optional) + * override isResolvable(); // custom logic for checking if module is ready + * override newDirection(dir) //To implement custom direction logic(Optional) + * newOrientation(dir) //To implement custom orientation logic(Optional) + */ + + // Method definitions + + /** + * Function to update the scope when a new element is added. + * @param {Scope} scope - the circuit in which we add element + */ + updateScope(scope) { + this.scope = scope + for (let i = 0; i < this.nodeList.length; i++) { + this.nodeList[i].scope = scope + } + } + + /** + * To generate JSON-safe data that can be loaded + * @memberof CircuitElement + * @return {JSON} - the data to be saved + */ + saveObject() { + var data = { + x: this.x, + y: this.y, + objectType: this.objectType, + label: this.label, + direction: this.direction, + labelDirection: this.labelDirection, + propagationDelay: this.propagationDelay, + customData: this.customSave(), + } + + if (this.canShowInSubcircuit) + data.subcircuitMetadata = this.subcircuitMetadata + return data + } + + /** + * Always overriden + * @memberof CircuitElement + * @return {JSON} - the data to be saved + */ + // eslint-disable-next-line class-methods-use-this + customSave() { + return { + values: {}, + nodes: {}, + constructorParamaters: [], + } + } + + /** + * check hover over the element + * @return {boolean} + */ + checkHover() { + if (simulationArea.mouseDown) return + for (let i = 0; i < this.nodeList.length; i++) { + this.nodeList[i].checkHover() + } + if (!simulationArea.mouseDown) { + if (simulationArea.hover === this) { + this.hover = this.isHover() + if (!this.hover) simulationArea.hover = undefined + } else if (!simulationArea.hover) { + this.hover = this.isHover() + if (this.hover) simulationArea.hover = this + } else { + this.hover = false + } + } + } + + /** + * This sets the width and height of the element if its rectangular + * and the reference point is at the center of the object. + * width and height define the X and Y distance from the center. + * Effectively HALF the actual width and height. + * NOT OVERRIDABLE + * @param {number} w - width + * @param {number} h - height + */ + setDimensions(width, height) { + this.leftDimensionX = this.rightDimensionX = width + this.downDimensionY = this.upDimensionY = height + } + + /** + * @memberof CircuitElement + * @param {number} w -width + */ + setWidth(width) { + this.leftDimensionX = this.rightDimensionX = width + } + + /** + * @param {number} h -height + */ + setHeight(height) { + this.downDimensionY = this.upDimensionY = height + } + + /** + * Helper Function to drag element to a new position + */ + startDragging() { + if (!layoutModeGet()) { + this.oldx = this.x + this.oldy = this.y + } else { + this.oldx = this.subcircuitMetadata.x + this.oldy = this.subcircuitMetadata.y + } + } + + /** + * Helper Function to drag element to a new position + * @memberof CircuitElement + */ + drag() { + if (!layoutModeGet()) { + this.x = + this.oldx + simulationArea.mouseX - simulationArea.mouseDownX + this.y = + this.oldy + simulationArea.mouseY - simulationArea.mouseDownY + } else { + this.subcircuitMetadata.x = + this.oldx + simulationArea.mouseX - simulationArea.mouseDownX + this.subcircuitMetadata.y = + this.oldy + simulationArea.mouseY - simulationArea.mouseDownY + } + } + + /** + * The update method is used to change the parameters of the object on mouse click and hover. + * Return Value: true if state has changed else false + * NOT OVERRIDABLE + */ + update() { + if (layoutModeGet()) { + return this.layoutUpdate() + } + let update = false + + update |= this.newElement + if (this.newElement) { + if (this.centerElement) { + this.x = + Math.round( + (simulationArea.mouseX - + (this.rightDimensionX - this.leftDimensionX) / 2) / + 10 + ) * 10 + this.y = + Math.round( + (simulationArea.mouseY - + (this.downDimensionY - this.upDimensionY) / 2) / + 10 + ) * 10 + } else { + this.x = simulationArea.mouseX + this.y = simulationArea.mouseY + } + + if (simulationArea.mouseDown) { + this.newElement = false + simulationArea.lastSelected = this + } else return update + } + + for (let i = 0; i < this.nodeList.length; i++) { + update |= this.nodeList[i].update() + } + + if (!simulationArea.hover || simulationArea.hover === this) { + this.hover = this.isHover() + } + + if (!simulationArea.mouseDown) this.hover = false + + if ((this.clicked || !simulationArea.hover) && this.isHover()) { + this.hover = true + simulationArea.hover = this + } else if ( + !simulationArea.mouseDown && + this.hover && + this.isHover() === false + ) { + if (this.hover) simulationArea.hover = undefined + this.hover = false + } + + if (simulationArea.mouseDown && this.clicked) { + this.drag() + if ( + !simulationArea.shiftDown && + simulationArea.multipleObjectSelections.contains(this) + ) { + for ( + let i = 0; + i < simulationArea.multipleObjectSelections.length; + i++ + ) { + simulationArea.multipleObjectSelections[i].drag() + } + } + + update |= true + } else if (simulationArea.mouseDown && !simulationArea.selected) { + this.startDragging() + if ( + !simulationArea.shiftDown && + simulationArea.multipleObjectSelections.contains(this) + ) { + for ( + let i = 0; + i < simulationArea.multipleObjectSelections.length; + i++ + ) { + simulationArea.multipleObjectSelections[i].startDragging() + } + } + simulationArea.selected = this.clicked = this.hover + + update |= this.clicked + } else { + if (this.clicked) simulationArea.selected = false + this.clicked = false + this.wasClicked = false + // If this is SubCircuit, then call releaseClick to recursively release clicks on each subcircuit object + if (this.objectType == 'SubCircuit') this.releaseClick() + } + + if (simulationArea.mouseDown && !this.wasClicked) { + if (this.clicked) { + this.wasClicked = true + if (this.click) this.click() + if (simulationArea.shiftDown) { + simulationArea.lastSelected = undefined + if ( + simulationArea.multipleObjectSelections.contains(this) + ) { + simulationArea.multipleObjectSelections.clean(this) + } else { + simulationArea.multipleObjectSelections.push(this) + } + } else { + simulationArea.lastSelected = this + } + } + } + + return update + } + + /** + * Used to update the state of the elements inside the subcircuit in layout mode + * Return Value: true if the state has changed, false otherwise + **/ + + layoutUpdate() { + var update = false + update |= this.newElement + if (this.newElement) { + this.subcircuitMetadata.x = simulationArea.mouseX + this.subcircuitMetadata.y = simulationArea.mouseY + + if (simulationArea.mouseDown) { + this.newElement = false + simulationArea.lastSelected = this + } else return + } + + if (!simulationArea.hover || simulationArea.hover == this) + this.hover = this.isHover() + + if ((this.clicked || !simulationArea.hover) && this.isHover()) { + this.hover = true + simulationArea.hover = this + } else if ( + !simulationArea.mouseDown && + this.hover && + this.isHover() == false + ) { + if (this.hover) simulationArea.hover = undefined + this.hover = false + } + + if (simulationArea.mouseDown && this.clicked) { + this.drag() + update |= true + } else if (simulationArea.mouseDown && !simulationArea.selected) { + this.startDragging() + simulationArea.selected = this.clicked = this.hover + update |= this.clicked + } else { + if (this.clicked) simulationArea.selected = false + this.clicked = false + this.wasClicked = false + } + + if (simulationArea.mouseDown && !this.wasClicked) { + if (this.clicked) { + this.wasClicked = true + simulationArea.lastSelected = this + } + } + + if (!this.clicked && !this.newElement) { + let x = this.subcircuitMetadata.x + let y = this.subcircuitMetadata.y + let yy = tempBuffer.layout.height + let xx = tempBuffer.layout.width + + let rX = this.layoutProperties.rightDimensionX + let lX = this.layoutProperties.leftDimensionX + let uY = this.layoutProperties.upDimensionY + let dY = this.layoutProperties.downDimensionY + + if (lX <= x && x + rX <= xx && y >= uY && y + dY <= yy) return + + this.subcircuitMetadata.showInSubcircuit = false + fillSubcircuitElements() + } + + return update + } + + /** + * Helper Function to correct the direction of element + */ + fixDirection() { + this.direction = fixDirection[this.direction] || this.direction + this.labelDirection = + fixDirection[this.labelDirection] || this.labelDirection + } + + /** + * The isHover method is used to check if the mouse is hovering over the object. + * Return Value: true if mouse is hovering over object else false + * NOT OVERRIDABLE + */ + isHover() { + var mX = simulationArea.mouseXf - this.x + var mY = this.y - simulationArea.mouseYf + + var rX = this.rightDimensionX + var lX = this.leftDimensionX + var uY = this.upDimensionY + var dY = this.downDimensionY + + if (layoutModeGet()) { + var mX = simulationArea.mouseXf - this.subcircuitMetadata.x + var mY = this.subcircuitMetadata.y - simulationArea.mouseYf + + var rX = this.layoutProperties.rightDimensionX + var lX = this.layoutProperties.leftDimensionX + var uY = this.layoutProperties.upDimensionY + var dY = this.layoutProperties.downDimensionY + } + + if (!this.directionFixed && !this.overrideDirectionRotation) { + if (this.direction === 'LEFT') { + lX = this.rightDimensionX + rX = this.leftDimensionX + } else if (this.direction === 'DOWN') { + lX = this.downDimensionY + rX = this.upDimensionY + uY = this.leftDimensionX + dY = this.rightDimensionX + } else if (this.direction === 'UP') { + lX = this.downDimensionY + rX = this.upDimensionY + dY = this.leftDimensionX + uY = this.rightDimensionX + } + } + + return -lX <= mX && mX <= rX && -dY <= mY && mY <= uY + } + + isSubcircuitHover(xoffset = 0, yoffset = 0) { + var mX = simulationArea.mouseXf - this.subcircuitMetadata.x - xoffset + var mY = yoffset + this.subcircuitMetadata.y - simulationArea.mouseYf + + var rX = this.layoutProperties.rightDimensionX + var lX = this.layoutProperties.leftDimensionX + var uY = this.layoutProperties.upDimensionY + var dY = this.layoutProperties.downDimensionY + + return -lX <= mX && mX <= rX && -dY <= mY && mY <= uY + } + + /** + * Helper Function to set label of an element. + * @memberof CircuitElement + * @param {string} label - the label for element + */ + setLabel(label) { + this.label = label || '' + } + + /** + * Method that draws the outline of the module and calls draw function on module Nodes. + * NOT OVERRIDABLE + */ + draw() { + // + var ctx = simulationArea.context + this.checkHover() + + if ( + this.x * this.scope.scale + this.scope.ox < + -this.rightDimensionX * this.scope.scale - 0 || + this.x * this.scope.scale + this.scope.ox > + width + this.leftDimensionX * this.scope.scale + 0 || + this.y * this.scope.scale + this.scope.oy < + -this.downDimensionY * this.scope.scale - 0 || + this.y * this.scope.scale + this.scope.oy > + height + 0 + this.upDimensionY * this.scope.scale + ) + return + + // Draws rectangle and highlights + if (this.rectangleObject) { + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + rect2( + ctx, + -this.leftDimensionX, + -this.upDimensionY, + this.leftDimensionX + this.rightDimensionX, + this.upDimensionY + this.downDimensionY, + this.x, + this.y, + [this.direction, 'RIGHT'][+this.directionFixed] + ) + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + } + if (this.label !== '') { + var rX = this.rightDimensionX + var lX = this.leftDimensionX + var uY = this.upDimensionY + var dY = this.downDimensionY + if (!this.directionFixed) { + if (this.direction === 'LEFT') { + lX = this.rightDimensionX + rX = this.leftDimensionX + } else if (this.direction === 'DOWN') { + lX = this.downDimensionY + rX = this.upDimensionY + uY = this.leftDimensionX + dY = this.rightDimensionX + } else if (this.direction === 'UP') { + lX = this.downDimensionY + rX = this.upDimensionY + dY = this.leftDimensionX + uY = this.rightDimensionX + } + } + + if (this.labelDirection === 'LEFT') { + ctx.beginPath() + ctx.textAlign = 'right' + ctx.fillStyle = colors['text'] + fillText(ctx, this.label, this.x - lX - 10, this.y + 5, 14) + ctx.fill() + } else if (this.labelDirection === 'RIGHT') { + ctx.beginPath() + ctx.textAlign = 'left' + ctx.fillStyle = colors['text'] + fillText(ctx, this.label, this.x + rX + 10, this.y + 5, 14) + ctx.fill() + } else if (this.labelDirection === 'UP') { + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = colors['text'] + fillText(ctx, this.label, this.x, this.y + 5 - uY - 10, 14) + ctx.fill() + } else if (this.labelDirection === 'DOWN') { + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = colors['text'] + fillText(ctx, this.label, this.x, this.y + 5 + dY + 10, 14) + ctx.fill() + } + } + + // calls the custom circuit design + if (this.customDraw) { + this.customDraw() + } + + // draws nodes - Moved to renderCanvas + // for (let i = 0; i < this.nodeList.length; i++) + // this.nodeList[i].draw(); + } + + /** + Draws element in layout mode (inside the subcircuit) + @param {number} xOffset - x position of the subcircuit + @param {number} yOffset - y position of the subcircuit + + Called by subcirucit.js/customDraw() - for drawing as a part of another circuit + and layoutMode.js/renderLayout() - for drawing in layoutMode + **/ + drawLayoutMode(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + if (layoutModeGet()) { + this.checkHover() + } + if ( + this.subcircuitMetadata.x * this.scope.scale + this.scope.ox < + -this.layoutProperties.rightDimensionX * this.scope.scale || + this.subcircuitMetadata.x * this.scope.scale + this.scope.ox > + width + + this.layoutProperties.leftDimensionX * this.scope.scale || + this.subcircuitMetadata.y * this.scope.scale + this.scope.oy < + -this.layoutProperties.downDimensionY * this.scope.scale || + this.subcircuitMetadata.y * this.scope.scale + this.scope.oy > + height + this.layoutProperties.upDimensionY * this.scope.scale + ) + return + + if (this.subcircuitMetadata.showLabelInSubcircuit) { + var rX = this.layoutProperties.rightDimensionX + var lX = this.layoutProperties.leftDimensionX + var uY = this.layoutProperties.upDimensionY + var dY = this.layoutProperties.downDimensionY + + // this.subcircuitMetadata.labelDirection + if (this.subcircuitMetadata.labelDirection == 'LEFT') { + ctx.beginPath() + ctx.textAlign = 'right' + ctx.fillStyle = 'black' + fillText( + ctx, + this.label, + this.subcircuitMetadata.x + xOffset - lX - 10, + this.subcircuitMetadata.y + yOffset + 5, + 10 + ) + ctx.fill() + } else if (this.subcircuitMetadata.labelDirection == 'RIGHT') { + ctx.beginPath() + ctx.textAlign = 'left' + ctx.fillStyle = 'black' + fillText( + ctx, + this.label, + this.subcircuitMetadata.x + xOffset + rX + 10, + this.subcircuitMetadata.y + yOffset + 5, + 10 + ) + ctx.fill() + } else if (this.subcircuitMetadata.labelDirection == 'UP') { + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = 'black' + fillText( + ctx, + this.label, + this.subcircuitMetadata.x + xOffset, + this.subcircuitMetadata.y + yOffset + 5 - uY - 10, + 10 + ) + ctx.fill() + } else if (this.subcircuitMetadata.labelDirection == 'DOWN') { + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = 'black' + fillText( + ctx, + this.label, + this.subcircuitMetadata.x + xOffset, + this.subcircuitMetadata.y + yOffset + 5 + dY + 10, + 10 + ) + ctx.fill() + } + } + // calls the subcircuitDraw function in the element to draw it to canvas + this.subcircuitDraw(xOffset, yOffset) + } + + // method to delete object + // OVERRIDE WITH CAUTION + delete() { + simulationArea.lastSelected = undefined + this.scope[this.objectType].clean(this) // CHECK IF THIS IS VALID + if (this.deleteNodesWhenDeleted) { + this.deleteNodes() + } else { + for (let i = 0; i < this.nodeList.length; i++) { + if (this.nodeList[i].connections.length) { + this.nodeList[i].converToIntermediate() + } else { + this.nodeList[i].delete() + } + } + } + this.deleted = true + } + + /** + * method to delete object + * OVERRIDE WITH CAUTION + * @memberof CircuitElement + */ + cleanDelete() { + this.deleteNodesWhenDeleted = true + this.delete() + } + + /** + * Helper Function to delete the element and all the node attached to it. + */ + deleteNodes() { + for (let i = 0; i < this.nodeList.length; i++) { + this.nodeList[i].delete() + } + } + + /** + * method to change direction + * OVERRIDE WITH CAUTION + * @param {string} dir - new direction + */ + newDirection(dir) { + if (this.direction === dir) return + // Leave this for now + if (this.directionFixed && this.orientationFixed) return + if (this.directionFixed) { + this.newOrientation(dir) + return // Should it return ? + } + + // if (obj.direction === undefined) return; + this.direction = dir + for (let i = 0; i < this.nodeList.length; i++) { + this.nodeList[i].refresh() + } + } + + /** + * Helper Function to change label direction of the element. + * @memberof CircuitElement + * @param {string} dir - new direction + */ + newLabelDirection(dir) { + if (layoutModeGet()) this.subcircuitMetadata.labelDirection = dir + else this.labelDirection = dir + } + + /** + * Method to check if object can be resolved + * OVERRIDE if necessary + * @return {boolean} + */ + isResolvable() { + if (this.alwaysResolve) return true + for (let i = 0; i < this.nodeList.length; i++) { + if ( + this.nodeList[i].type === 0 && + this.nodeList[i].value === undefined + ) + return false + } + return true + } + + /** + * Method to change object Bitwidth + * OVERRIDE if necessary + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + if (this.fixedBitWidth) return + if (this.bitWidth === undefined) return + if (this.bitWidth < 1) return + this.bitWidth = bitWidth + for (let i = 0; i < this.nodeList.length; i++) { + this.nodeList[i].bitWidth = bitWidth + } + } + + /** + * Method to change object delay + * OVERRIDE if necessary + * @param {number} delay - new delay + */ + changePropagationDelay(delay) { + if (this.propagationDelayFixed) return + if (delay === undefined) return + if (delay === '') return + var tmpDelay = parseInt(delay, 10) + if (tmpDelay < 0) return + this.propagationDelay = tmpDelay + } + + /** + * Dummy resolve function + * OVERRIDE if necessary + */ + resolve() {} + + /** + * Helper Function to process verilog + */ + processVerilog() { + // Output count used to sanitize output + var output_total = 0 + for (var i = 0; i < this.nodeList.length; i++) { + if ( + this.nodeList[i].type == NODE_OUTPUT && + this.nodeList[i].connections.length > 0 + ) + output_total++ + } + + var output_count = 0 + for (var i = 0; i < this.nodeList.length; i++) { + if (this.nodeList[i].type == NODE_OUTPUT) { + if ( + this.objectType != 'Input' && + this.objectType != 'Clock' && + this.nodeList[i].connections.length > 0 + ) { + this.nodeList[i].verilogLabel = generateNodeName( + this.nodeList[i], + output_count, + output_total + ) + + if ( + !this.scope.verilogWireList[ + this.nodeList[i].bitWidth + ].contains(this.nodeList[i].verilogLabel) + ) + this.scope.verilogWireList[ + this.nodeList[i].bitWidth + ].push(this.nodeList[i].verilogLabel) + output_count++ + } + this.scope.stack.push(this.nodeList[i]) + } + } + } + + /** + * Helper Function to check if verilog resolvable + * @return {boolean} + */ + isVerilogResolvable() { + var backupValues = [] + for (let i = 0; i < this.nodeList.length; i++) { + backupValues.push(this.nodeList[i].value) + this.nodeList[i].value = undefined + } + + for (let i = 0; i < this.nodeList.length; i++) { + if (this.nodeList[i].verilogLabel) { + this.nodeList[i].value = 1 + } + } + + var res = this.isResolvable() + + for (let i = 0; i < this.nodeList.length; i++) { + this.nodeList[i].value = backupValues[i] + } + + return res + } + + /** + * Helper Function to remove proporgation. + */ + removePropagation() { + for (let i = 0; i < this.nodeList.length; i++) { + if (this.nodeList[i].type === NODE_OUTPUT) { + if (this.nodeList[i].value !== undefined) { + this.nodeList[i].value = undefined + simulationArea.simulationQueue.add(this.nodeList[i]) + } + } + } + } + + /** + * Helper Function to name the verilog. + * @return {string} + */ + verilogName() { + return this.verilogType || this.objectType + } + + verilogBaseType() { + return this.verilogName() + } + + verilogParametrizedType() { + var type = this.verilogBaseType() + // Suffix bitwidth for multi-bit inputs + // Example: DflipFlop #(2) DflipFlop_0 + if (this.bitWidth != undefined && this.bitWidth > 1) + type += ' #(' + this.bitWidth + ')' + return type + } + + /** + * Helper Function to generate verilog + * @return {JSON} + */ + generateVerilog() { + // Example: and and_1(_out, _out, _Q[0]); + var inputs = [] + var outputs = [] + + for (var i = 0; i < this.nodeList.length; i++) { + if (this.nodeList[i].type == NODE_INPUT) { + inputs.push(this.nodeList[i]) + } else { + if (this.nodeList[i].connections.length > 0) + outputs.push(this.nodeList[i]) + else outputs.push('') // Don't create a wire + } + } + + var list = outputs.concat(inputs) + var res = this.verilogParametrizedType() + var moduleParams = list.map((x) => x.verilogLabel).join(', ') + res += ` ${this.verilogLabel}(${moduleParams});` + return res + } + + /** + * Toggles the visibility of the labels of subcircuit elements. Called by event handlers in ux.js + **/ + toggleLabelInLayoutMode() { + this.subcircuitMetadata.showLabelInSubcircuit = + !this.subcircuitMetadata.showLabelInSubcircuit + } +} + +CircuitElement.prototype.alwaysResolve = false +CircuitElement.prototype.propagationDelay = 10 +CircuitElement.prototype.tooltip = undefined +CircuitElement.prototype.propagationDelayFixed = false +CircuitElement.prototype.rectangleObject = true +CircuitElement.prototype.objectType = 'CircuitElement' +CircuitElement.prototype.canShowInSubcircuit = false // determines whether the element is supported to be shown inside a subcircuit +CircuitElement.prototype.subcircuitMetadata = {} // stores the coordinates and stuff for the elements in the subcircuit +CircuitElement.prototype.layoutProperties = { + rightDimensionX: 5, + leftDimensionX: 5, + upDimensionY: 5, + downDimensionY: 5, +} +CircuitElement.prototype.subcircuitMutableProperties = { + label: { + name: 'label: ', + type: 'text', + func: 'setLabel', + }, + 'show label': { + name: 'show label ', + type: 'checkbox', + func: 'toggleLabelInLayoutMode', + }, +} diff --git a/v1/src/simulator/src/combinationalAnalysis.js b/v1/src/simulator/src/combinationalAnalysis.js new file mode 100644 index 00000000..e45cb1b8 --- /dev/null +++ b/v1/src/simulator/src/combinationalAnalysis.js @@ -0,0 +1,667 @@ +/* eslint-disable import/no-cycle */ +/* eslint-disable guard-for-in */ +/* eslint-disable no-restricted-syntax */ +import Node from './node' +import { scheduleBackup } from './data/backupCircuit' +import BooleanMinimize from './quinMcCluskey' +import Input from './modules/Input' +import ConstantVal from './modules/ConstantVal' +import Output from './modules/Output' +import AndGate from './modules/AndGate' +import OrGate from './modules/OrGate' +import NotGate from './modules/NotGate' +import { stripTags } from './utils' +import simulationArea from './simulationArea' +import { findDimensions } from './canvasApi' +import { SimulatorStore } from '#/store/SimulatorStore/SimulatorStore' + +// var inputSample = 5 +// var dataSample = [ +// ['01---', '11110', '01---', '00000'], +// ['01110', '1-1-1', '----0'], +// ['01---', '11110', '01110', '1-1-1', '0---0'], +// ['----1'], +// ] + +// var sampleInputListNames = ['A', 'B'] +// var sampleOutputListNames = ['X'] + +/** + * The prompt for combinational analysis + * @param {Scope=} - the circuit in which we want combinational analysis + * @category combinationalAnalysis + */ +export function createCombinationalAnalysisPrompt(scope = globalScope) { + scheduleBackup() + SimulatorStore().dialogBox.combinationalanalysis_dialog = true + /* + $('#combinationalAnalysis').empty() + $('#combinationalAnalysis').append( + "

Enter Input names separated by commas:

" + ) + $('#combinationalAnalysis').append( + "

Enter Output names separated by commas:

" + ) + $('#combinationalAnalysis').append("

OR

") + $('#combinationalAnalysis').append( + "

Enter Boolean Function:

" + ) + $('#combinationalAnalysis').append( + "" + ) + $('#combinationalAnalysis').dialog({ + resizable: false, + width: 'auto', + buttons: [ + { + style: 'padding: 5px', + text: 'Next', + click() { + var inputList = stripTags($('#inputNameList').val()).split( + ',' + ) + var outputList = stripTags( + $('#outputNameList').val() + ).split(',') + var booleanExpression = $('#booleanExpression').val() + inputList = inputList.map((x) => x.trim()) + inputList = inputList.filter((e) => e) + outputList = outputList.map((x) => x.trim()) + outputList = outputList.filter((e) => e) + booleanExpression = booleanExpression.replace(/ /g, '') + booleanExpression = booleanExpression.toUpperCase() + var booleanInputVariables = [] + for (var i = 0; i < booleanExpression.length; i++) { + if ( + booleanExpression[i] >= 'A' && + booleanExpression[i] <= 'Z' + ) { + if ( + booleanExpression.indexOf( + booleanExpression[i] + ) == i + ) { + booleanInputVariables.push(booleanExpression[i]) + } + } + } + booleanInputVariables.sort() + if ( + inputList.length > 0 && + outputList.length > 0 && + booleanInputVariables.length == 0 + ) { + $(this).dialog('close') + createBooleanPrompt(inputList, outputList, null, scope) + } else if ( + booleanInputVariables.length > 0 && + inputList.length == 0 && + outputList.length == 0 + ) { + $(this).dialog('close') + var output = solveBooleanFunction( + booleanInputVariables, + booleanExpression + ) + if (output != null) { + createBooleanPrompt( + booleanInputVariables, + booleanExpression, + output, + scope + ) + } + } else if ( + (inputList.length == 0 || outputList.length == 0) && + booleanInputVariables == 0 + ) { + alert( + 'Enter Input / Output Variable(s) OR Boolean Function!' + ) + } else { + alert( + 'Use Either Combinational Analysis Or Boolean Function To Generate Circuit!' + ) + } + }, + }, + ], + }) + + $('#combinationalAnalysis').checkBo() + */ +} +// /** +// * This funciton hashes the output array and makes required JSON using +// * a BooleanMinimize class defined in Quin_Mcluskey.js var s which will +// * be output table is also initialied here +// * @param {Array} inputListNames - labels of input nodes +// * @param {Array} outputListNames - labels of output nodes +// * @param {Scope=} scope - h circuit +// * @category combinationalAnalysis +// */ +/* + function createBooleanPrompt( + inputListNames, + outputListNames, + output, + scope = globalScope + ) { + var inputListNames = + inputListNames || prompt('Enter inputs separated by commas').split(',') + var outputListNames = + outputListNames || + prompt('Enter outputs separated by commas').split(',') + var outputListNamesInteger = [] + if (output == null) { + for (var i = 0; i < outputListNames.length; i++) { + outputListNamesInteger[i] = 7 * i + 13 + } // assigning an integer to the value, 7*i + 13 is random + } else { + outputListNamesInteger = [13] + } + var s = '' + s += '' + s += '' + if ($('#decimalColumnBox').is(':checked')) { + s += '' + } + for (var i = 0; i < inputListNames.length; i++) { + s += `` + } + if (output == null) { + for (var i = 0; i < outputListNames.length; i++) { + s += `` + } + } else { + s += `` + } + s += '' + + var matrix = [] + for (var i = 0; i < inputListNames.length; i++) { + matrix[i] = new Array(1 << inputListNames.length) + } + + for (var i = 0; i < inputListNames.length; i++) { + for (var j = 0; j < 1 << inputListNames.length; j++) { + matrix[i][j] = +((j & (1 << (inputListNames.length - i - 1))) != 0) + } + } + + for (var j = 0; j < 1 << inputListNames.length; j++) { + s += '' + if ($('#decimalColumnBox').is(':checked')) { + s += `` + } + for (var i = 0; i < inputListNames.length; i++) { + s += `` + } + for (var i = 0; i < outputListNamesInteger.length; i++) { + if (output == null) { + s += + `' + // using hash values as they'll be used in the generateBooleanTableData function + } + } + if (output != null) { + s += + `' + } + s += '' + } + s += '' + s += '
' + 'dec' + '${inputListNames[i]}${outputListNames[i]}${outputListNames}
${j}${matrix[i][j]}` + + 'x' + + '` + + `${output[j]}` + + '
' + $('#combinationalAnalysis').empty() + $('#combinationalAnalysis').append(s) + $('#combinationalAnalysis').dialog({ + resizable: false, + width: 'auto', + buttons: [ + { + style: 'padding: 6px', + text: 'Generate Circuit', + click() { + $(this).dialog('close') + var data = generateBooleanTableData(outputListNamesInteger) + // passing the hash values to avoid spaces being passed which is causing a problem + var minimizedCircuit = [] + let inputCount = inputListNames.length + for (const output in data) { + let oneCount = data[output][1].length // Number of ones + let zeroCount = data[output][0].length // Number of zeroes + if (oneCount == 0) { + // Hardcode to 0 as output + minimizedCircuit.push([ + '-'.repeat(inputCount) + '0', + ]) + } else if (zeroCount == 0) { + // Hardcode to 1 as output + minimizedCircuit.push([ + '-'.repeat(inputCount) + '1', + ]) + } else { + // Perform KMap like minimzation + const temp = new BooleanMinimize( + inputListNames.length, + data[output][1].map(Number), + data[output].x.map(Number) + ) + minimizedCircuit.push(temp.result) + } + } + if (output == null) { + drawCombinationalAnalysis( + minimizedCircuit, + inputListNames, + outputListNames, + scope + ) + } else { + drawCombinationalAnalysis( + minimizedCircuit, + inputListNames, + [`${outputListNames}`], + scope + ) + } + }, + }, + { + style: 'padding: 6px', + text: 'Print Truth Table', + click() { + var sTable = document.getElementById( + 'combinationalAnalysis' + ).innerHTML + var style = + '' + var win = window.open('', '', 'height=700,width=700') + var htmlBody = ` + \ + Boolean Logic Table\ + ${style}\ + \ + \ +
${sTable}
\ + + ` + win.document.write(htmlBody) + win.document.close() + win.print() + }, + }, + ], + }) + + $('.output').on('click', function () { + var v = $(this).html() + if (v == 0) v = $(this).html(1) + else if (v == 1) v = $(this).html('x') + else if (v == 'x') v = $(this).html(0) + }) + } +*/ + +// function generateBooleanTableData(outputListNames) { +// var data = {} +// for (var i = 0; i < outputListNames.length; i++) { +// data[outputListNames[i]] = { +// x: [], +// 1: [], +// 0: [], +// } +// var rows = $(`.${outputListNames[i]}`) +// for (let j = 0; j < rows.length; j++) { +// data[outputListNames[i]][rows[j].innerHTML].push(rows[j].id) +// } +// } +// return data +// } + +// function drawCombinationalAnalysis( +// combinationalData, +// inputList, +// outputListNames, +// scope = globalScope +// ) { +// findDimensions(scope) +// var inputCount = inputList.length +// var maxTerms = 0 +// for (var i = 0; i < combinationalData.length; i++) { +// maxTerms = Math.max(maxTerms, combinationalData[i].length) +// } + +// var startPosX = 200 +// var startPosY = 200 + +// var currentPosY = 300 + +// if (simulationArea.maxWidth && simulationArea.maxHeight) { +// if (simulationArea.maxHeight + currentPosY > simulationArea.maxWidth) { +// startPosX += simulationArea.maxWidth +// } else { +// startPosY += simulationArea.maxHeight +// currentPosY += simulationArea.maxHeight +// } +// } +// var andPosX = startPosX + inputCount * 40 + 40 + 40 +// var orPosX = andPosX + Math.floor(maxTerms / 2) * 10 + 80 +// var outputPosX = orPosX + 60 +// var inputObjects = [] + +// var logixNodes = [] + +// // Appending constant input to the end of inputObjects +// for (var i = 0; i <= inputCount; i++) { +// if (i < inputCount) { +// // Regular Input +// inputObjects.push( +// new Input(startPosX + i * 40, startPosY, scope, 'DOWN', 1) +// ) +// inputObjects[i].setLabel(inputList[i]) +// } else { +// // Constant Input +// inputObjects.push( +// new ConstantVal( +// startPosX + i * 40, +// startPosY, +// scope, +// 'DOWN', +// 1, +// '1' +// ) +// ) +// inputObjects[i].setLabel('_C_') +// } + +// inputObjects[i].newLabelDirection('UP') +// var v1 = new Node(startPosX + i * 40, startPosY + 20, 2, scope.root) +// inputObjects[i].output1.connect(v1) +// var v2 = new Node( +// startPosX + i * 40 + 20, +// startPosY + 20, +// 2, +// scope.root +// ) +// v1.connect(v2) +// var notG = new NotGate( +// startPosX + i * 40 + 20, +// startPosY + 40, +// scope, +// 'DOWN', +// 1 +// ) +// notG.inp1.connect(v2) +// logixNodes.push(v1) +// logixNodes.push(notG.output1) +// } + +// function countTerm(s) { +// var c = 0 +// for (var i = 0; i < s.length; i++) { +// if (s[i] !== '-') c++ +// } +// return c +// } + +// for (var i = 0; i < combinationalData.length; i++) { +// var andGateNodes = [] +// for (var j = 0; j < combinationalData[i].length; j++) { +// var c = countTerm(combinationalData[i][j]) +// if (c > 1) { +// var andGate = new AndGate( +// andPosX, +// currentPosY, +// scope, +// 'RIGHT', +// c, +// 1 +// ) +// andGateNodes.push(andGate.output1) +// var misses = 0 +// for (var k = 0; k < combinationalData[i][j].length; k++) { +// if (combinationalData[i][j][k] == '-') { +// misses++ +// continue +// } +// var index = 2 * k + (combinationalData[i][j][k] == 0) +// var v = new Node( +// logixNodes[index].absX(), +// andGate.inp[k - misses].absY(), +// 2, +// scope.root +// ) +// logixNodes[index].connect(v) +// logixNodes[index] = v +// v.connect(andGate.inp[k - misses]) +// } +// } else { +// for (var k = 0; k < combinationalData[i][j].length; k++) { +// if (combinationalData[i][j][k] == '-') continue +// var index = 2 * k + (combinationalData[i][j][k] == 0) +// var andGateSubstituteNode = new Node( +// andPosX, +// currentPosY, +// 2, +// scope.root +// ) +// var v = new Node( +// logixNodes[index].absX(), +// andGateSubstituteNode.absY(), +// 2, +// scope.root +// ) +// logixNodes[index].connect(v) +// logixNodes[index] = v +// v.connect(andGateSubstituteNode) +// andGateNodes.push(andGateSubstituteNode) +// } +// } +// currentPosY += c * 10 + 30 +// } + +// var andGateCount = andGateNodes.length +// var midWay = Math.floor(andGateCount / 2) +// var orGatePosY = +// (andGateNodes[midWay].absY() + +// andGateNodes[Math.floor((andGateCount - 1) / 2)].absY()) / +// 2 +// if (orGatePosY % 10 == 5) { +// orGatePosY += 5 +// } // To make or gate fall in grid +// if (andGateCount > 1) { +// var o = new OrGate( +// orPosX, +// orGatePosY, +// scope, +// 'RIGHT', +// andGateCount, +// 1 +// ) +// if (andGateCount % 2 == 1) +// andGateNodes[midWay].connect(o.inp[midWay]) +// for (var j = 0; j < midWay; j++) { +// var v = new Node( +// andPosX + 30 + (midWay - j) * 10, +// andGateNodes[j].absY(), +// 2, +// scope.root +// ) +// v.connect(andGateNodes[j]) +// var v2 = new Node( +// andPosX + 30 + (midWay - j) * 10, +// o.inp[j].absY(), +// 2, +// scope.root +// ) +// v2.connect(v) +// o.inp[j].connect(v2) + +// var v = new Node( +// andPosX + 30 + (midWay - j) * 10, +// andGateNodes[andGateCount - j - 1].absY(), +// 2, +// scope.root +// ) +// v.connect(andGateNodes[andGateCount - j - 1]) +// var v2 = new Node( +// andPosX + 30 + (midWay - j) * 10, +// o.inp[andGateCount - j - 1].absY(), +// 2, +// scope.root +// ) +// v2.connect(v) +// o.inp[andGateCount - j - 1].connect(v2) +// } +// var out = new Output(outputPosX, o.y, scope, 'LEFT', 1) +// out.inp1.connect(o.output1) +// } else { +// var out = new Output( +// outputPosX, +// andGateNodes[0].absY(), +// scope, +// 'LEFT', +// 1 +// ) +// out.inp1.connect(andGateNodes[0]) +// } +// out.setLabel(outputListNames[i]) +// out.newLabelDirection('RIGHT') +// } +// for (var i = 0; i < logixNodes.length; i++) { +// if (logixNodes[i].absY() != currentPosY) { +// var v = new Node(logixNodes[i].absX(), currentPosY, 2, scope.root) +// logixNodes[i].connect(v) +// } +// } +// globalScope.centerFocus() +// } + +// /** +// * This function solves passed boolean expression and returns +// * output array which contains solution of the truth table +// * of given boolean expression +// * @param {Array} inputListNames - labels for input nodes +// * @param {String} booleanExpression - boolean expression which is to be solved +// */ +// function solveBooleanFunction(inputListNames, booleanExpression) { +// let i +// let j +// let output = [] + +// if ( +// booleanExpression.match( +// /[^ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01+'() ]/g +// ) != null +// ) { +// alert('One of the characters is not allowed.') +// return +// } + +// if (inputListNames.length > 8) { +// alert('You can only have 8 variables at a time.') +// return +// } + +// var s = '' +// s += '' +// s += '' +// if ($('#decimalColumnBox').is(':checked')) { +// s += '' +// } +// for (i = 0; i < inputListNames.length; i++) { +// s += `` +// } +// s += `` +// s += '' +// var matrix = [] +// for (i = 0; i < inputListNames.length; i++) { +// matrix[i] = new Array(inputListNames.length) +// } + +// for (i = 0; i < inputListNames.length; i++) { +// for (j = 0; j < 1 << inputListNames.length; j++) { +// matrix[i][j] = +((j & (1 << (inputListNames.length - i - 1))) != 0) +// } +// } +// // generate equivalent expression by replacing input vars with possible combinations of o and 1 +// for (i = 0; i < 2 ** inputListNames.length; i++) { +// const data = [] +// for (j = 0; j < inputListNames.length; j++) { +// data[j] = +// Math.floor(i / Math.pow(2, inputListNames.length - j - 1)) % 2 +// } +// let equation = booleanExpression +// for (j = 0; j < inputListNames.length; j++) { +// equation = equation.replace( +// new RegExp(inputListNames[j], 'g'), +// data[j] +// ) +// } + +// output[i] = solve(equation) +// } + +// for (j = 0; j < 1 << inputListNames.length; j++) { +// s += '' +// if ($('#decimalColumnBox').is(':checked')) { +// s += `` +// } +// for (i = 0; i < inputListNames.length; i++) { +// s += `` +// } + +// s += `' +// s += '' +// } + +// s += '' +// s += '
' + 'dec' + '${inputListNames[i]}${booleanExpression}
${j}${matrix[i][j]}` + `${output[j]}` + '
' +// // generates solution for the truth table of booleanexpression +// function solve(equation) { +// while (equation.indexOf('(') != -1) { +// const start = equation.lastIndexOf('(') +// const end = equation.indexOf(')', start) +// if (start != -1) { +// equation = +// equation.substring(0, start) + +// solve(equation.substring(start + 1, end)) + +// equation.substring(end + 1) +// } +// } +// equation = equation.replace(/''/g, '') +// equation = equation.replace(/0'/g, '1') +// equation = equation.replace(/1'/g, '0') +// for (let i = 0; i < equation.length - 1; i++) { +// if ( +// (equation[i] == '0' || equation[i] == '1') && +// (equation[i + 1] == '0' || equation[i + 1] == '1') +// ) { +// equation = +// equation.substring(0, i + 1) + +// '*' + +// equation.substring(i + 1, equation.length) +// } +// } +// try { +// const safeEval = eval +// const answer = safeEval(equation) +// if (answer == 0) { +// return 0 +// } +// if (answer > 0) { +// return 1 +// } +// return '' +// } catch (e) { +// return '' +// } +// } + +// return output +// } diff --git a/v1/src/simulator/src/data.js b/v1/src/simulator/src/data.js new file mode 100644 index 00000000..4e573c21 --- /dev/null +++ b/v1/src/simulator/src/data.js @@ -0,0 +1,62 @@ +import { fullView } from './ux' +import { createSubCircuitPrompt } from './subcircuit' +import save from './data/save' +import load from './data/load' +import createSaveAsImgPrompt from './data/saveImage' +import { + clearProject, + newProject, + saveOffline, + openOffline, + recoverProject, +} from './data/project' +import { newCircuit, createNewCircuitScope } from './circuit' +import { createCombinationalAnalysisPrompt } from './combinationalAnalysis' +import { colorThemes } from './themer/themer' +import { showTourGuide } from './tutorials' +import { + createVerilogCircuit, + // saveVerilogCode, + // resetVerilogCode, + // applyVerilogTheme, +} from './Verilog2CV' +import { generateVerilog } from './verilog' +import { bitConverterDialog } from './utils' +import { keyBinder } from '#/components/DialogBox/CustomShortcut.vue' +import { ExportProject } from '#/components/DialogBox/ExportProject.vue' +import { ImportProject } from '#/components/DialogBox/ImportProject.vue' + +const logixFunction = {} +logixFunction.save = save +logixFunction.load = load +logixFunction.createSaveAsImgPrompt = createSaveAsImgPrompt +logixFunction.clearProject = clearProject +logixFunction.newProject = newProject +logixFunction.saveOffline = saveOffline +// logixFunction.newCircuit = newCircuit +logixFunction.createOpenLocalPrompt = openOffline +logixFunction.recoverProject = recoverProject +logixFunction.createSubCircuitPrompt = createSubCircuitPrompt +logixFunction.createCombinationalAnalysisPrompt = + createCombinationalAnalysisPrompt +logixFunction.fullViewOption = fullView +logixFunction.colorThemes = colorThemes +logixFunction.showTourGuide = showTourGuideHelper +logixFunction.newVerilogModule = createVerilogCircuit +// logixFunction.saveVerilogCode = saveVerilogCode +// logixFunction.resetVerilogCode = resetVerilogCode +logixFunction.generateVerilog = generateVerilog +// logixFunction.applyVerilogTheme = applyVerilogTheme +logixFunction.bitconverter = bitConverterDialog +logixFunction.createNewCircuitScope = createNewCircuitScope +logixFunction.customShortcut = keyBinder +logixFunction.ExportProject = ExportProject +logixFunction.ImportProject = ImportProject +export default logixFunction + +// Hack to restart tour guide +function showTourGuideHelper() { + setTimeout(() => { + showTourGuide() + }, 100) +} diff --git a/v1/src/simulator/src/data/backupCircuit.js b/v1/src/simulator/src/data/backupCircuit.js new file mode 100644 index 00000000..c17a93c3 --- /dev/null +++ b/v1/src/simulator/src/data/backupCircuit.js @@ -0,0 +1,83 @@ +import { projectSavedSet } from './project' +/* eslint-disable no-param-reassign */ +function extract(obj) { + return obj.saveObject() +} + +// Check if there is anything to backup - to be deprecated +/** + * Check if backup is available + * @param {Scope} scope + * @return {boolean} + * @category data + */ +export function checkIfBackup(scope) { + for (let i = 0; i < updateOrder.length; i++) { + if (scope[updateOrder[i]].length) return true + } + return false +} + +export function backUp(scope = globalScope) { + // Disconnection of subcircuits are needed because these are the connections between nodes + // in current scope and those in the subcircuit's scope + for (let i = 0; i < scope.SubCircuit.length; i++) { + scope.SubCircuit[i].removeConnections() + } + + var data = {} + + // Storing layout + data.layout = scope.layout + + // Storing Verilog Properties + data.verilogMetadata = scope.verilogMetadata + + // Storing all nodes + data.allNodes = scope.allNodes.map(extract) + + // Storing test attached to scope + data.testbenchData = scope.testbenchData + + // Storing other details + data.id = scope.id + data.name = scope.name + + // Storing details of all module objects + for (let i = 0; i < moduleList.length; i++) { + if (scope[moduleList[i]].length) { + data[moduleList[i]] = scope[moduleList[i]].map(extract) + } + } + + // Adding restricted circuit elements used in the save data + data.restrictedCircuitElementsUsed = scope.restrictedCircuitElementsUsed + + // Storing intermediate nodes (nodes in wires) + data.nodes = [] + for (let i = 0; i < scope.nodes.length; i++) { + data.nodes.push(scope.allNodes.indexOf(scope.nodes[i])) + } + + // Restoring the connections + for (let i = 0; i < scope.SubCircuit.length; i++) { + scope.SubCircuit[i].makeConnections() + } + + return data +} + +export function scheduleBackup(scope = globalScope) { + var backup = JSON.stringify(backUp(scope)) + if ( + scope.backups.length === 0 || + scope.backups[scope.backups.length - 1] !== backup + ) { + scope.backups.push(backup) + scope.history = [] + scope.timeStamp = new Date().getTime() + projectSavedSet(false) + } + + return backup +} diff --git a/v1/src/simulator/src/data/load.js b/v1/src/simulator/src/data/load.js new file mode 100644 index 00000000..f9d7b89b --- /dev/null +++ b/v1/src/simulator/src/data/load.js @@ -0,0 +1,294 @@ +import { resetScopeList, newCircuit, switchCircuit } from '../circuit' +import { setProjectName } from './save' +import { + scheduleUpdate, + update, + updateSimulationSet, + updateCanvasSet, + gridUpdateSet, +} from '../engine' +import { updateRestrictedElementsInScope } from '../restrictedElementDiv' +import simulationArea from '../simulationArea' + +import { loadSubCircuit } from '../subcircuit' +import { scheduleBackup } from './backupCircuit' +import { showProperties } from '../ux' +import { constructNodeConnections, loadNode, replace } from '../node' +import { generateId } from '../utils' +import modules from '../modules' +import { oppositeDirection } from '../canvasApi' +import plotArea from '../plotArea' +import { updateTestbenchUI, TestbenchData } from '../testbench' +import { SimulatorStore } from '#/store/SimulatorStore/SimulatorStore' +import { toRefs } from 'vue' +/** + * Backward compatibility - needs to be deprecated + * @param {CircuitElement} obj - the object to be rectified + * @category data + */ +function rectifyObjectType(obj) { + const rectify = { + FlipFlop: 'DflipFlop', + Ram: 'Rom', + } + return rectify[obj] || obj +} + +/** + * Function to load CircuitElements + * @param {JSON} data - JSOn data + * @param {Scope} scope - circuit in which we want to load modules + * @category data + */ +function loadModule(data, scope) { + // Create circuit element + var obj = new modules[rectifyObjectType(data.objectType)]( + data.x, + data.y, + scope, + ...(data.customData.constructorParamaters || []) + ) + // Sets directions + obj.label = data.label + obj.labelDirection = + data.labelDirection || oppositeDirection[fixDirection[obj.direction]] + + // Sets delay + obj.propagationDelay = data.propagationDelay || obj.propagationDelay + obj.fixDirection() + + // Restore other values + if (data.customData.values) { + for (var prop in data.customData.values) { + obj[prop] = data.customData.values[prop] + } + } + + // Replace new nodes with the correct old nodes (with connections) + if (data.customData.nodes) { + for (const node in data.customData.nodes) { + const n = data.customData.nodes[node] + if (n instanceof Array) { + for (let i = 0; i < n.length; i++) { + obj[node][i] = replace(obj[node][i], n[i]) + } + } else { + obj[node] = replace(obj[node], n) + } + } + } + if (data.subcircuitMetadata) + obj.subcircuitMetadata = data['subcircuitMetadata'] +} + +/** + * This function shouldn't ideally exist. But temporary fix + * for some issues while loading nodes. + * @category data + */ +function removeBugNodes(scope = globalScope) { + let x = scope.allNodes.length + for (let i = 0; i < x; i++) { + if ( + scope.allNodes[i].type !== 2 && + scope.allNodes[i].parent.objectType === 'CircuitElement' + ) { + scope.allNodes[i].delete() + } + if (scope.allNodes.length !== x) { + i = 0 + x = scope.allNodes.length + } + } +} + +/** + * Function to load a full circuit + * @param {Scope} scope + * @param {JSON} data + * @category data + */ +export function loadScope(scope, data) { + const ML = moduleList.slice() // Module List copy + scope.restrictedCircuitElementsUsed = data.restrictedCircuitElementsUsed + + // Load all nodes + data.allNodes.map((x) => loadNode(x, scope)) + + // Make all connections + for (let i = 0; i < data.allNodes.length; i++) { + constructNodeConnections(scope.allNodes[i], data.allNodes[i]) + } + // Load all modules + for (let i = 0; i < ML.length; i++) { + if (data[ML[i]]) { + if (ML[i] === 'SubCircuit') { + // Load subcircuits differently + for (let j = 0; j < data[ML[i]].length; j++) { + loadSubCircuit(data[ML[i]][j], scope) + } + } else { + // Load everything else similarly + for (let j = 0; j < data[ML[i]].length; j++) { + loadModule(data[ML[i]][j], scope) + } + } + } + } + // Update wires according + scope.wires.map((x) => { + x.updateData(scope) + }) + removeBugNodes(scope) // To be deprecated + + // If Verilog Circuit Metadata exists, then restore + if (data.verilogMetadata) { + scope.verilogMetadata = data.verilogMetadata + } + + // If Test exists, then restore + if (data.testbenchData) { + globalScope.testbenchData = new TestbenchData( + data.testbenchData.testData, + data.testbenchData.currentGroup, + data.testbenchData.currentCase + ) + } + + // If layout exists, then restore + if (data.layout) { + scope.layout = data.layout + } else { + // Else generate new layout according to how it would have been otherwise (backward compatibility) + scope.layout = {} + scope.layout.width = 100 + scope.layout.height = + Math.max(scope.Input.length, scope.Output.length) * 20 + 20 + scope.layout.title_x = 50 + scope.layout.title_y = 13 + for (let i = 0; i < scope.Input.length; i++) { + scope.Input[i].layoutProperties = { + x: 0, + y: + scope.layout.height / 2 - + scope.Input.length * 10 + + 20 * i + + 10, + id: generateId(), + } + } + for (let i = 0; i < scope.Output.length; i++) { + scope.Output[i].layoutProperties = { + x: scope.layout.width, + y: + scope.layout.height / 2 - + scope.Output.length * 10 + + 20 * i + + 10, + id: generateId(), + } + } + } + // Backward compatibility + if (scope.layout.titleEnabled === undefined) { + scope.layout.titleEnabled = true + } +} + +// Function to load project from data +/** + * loads a saved project + * @param {JSON} data - the json data of the + * @category data + * @exports load + */ +export default function load(data) { + // If project is new and no data is there, then just set project name + const simulatorStore = SimulatorStore() + const { circuit_list } = toRefs(simulatorStore) + + if (!data) { + setProjectName(__projectName) + return + } + + var { projectId } = data + setProjectName(data.name) + + globalScope = undefined + resetScopeList() // Remove default scope + // $('.circuits').remove() // Delete default scope + + // Load all according to the dependency order + for (let i = 0; i < data.scopes.length; i++) { + var isVerilogCircuit = false + var isMainCircuit = false + if (data.scopes[i].verilogMetadata) { + isVerilogCircuit = data.scopes[i].verilogMetadata.isVerilogCircuit + isMainCircuit = data.scopes[i].verilogMetadata.isMainCircuit + } + // Create new circuit + const scope = newCircuit( + data.scopes[i].name || 'Untitled', + data.scopes[i].id, + isVerilogCircuit, + isMainCircuit + ) + + // Load circuit data + loadScope(scope, data.scopes[i]) + + // Focus circuit + globalScope = scope + + // Center circuit + if (embed) { + globalScope.centerFocus(true) + } else { + globalScope.centerFocus(false) + } + + // update and backup circuit once + update(globalScope, true) + + // Updating restricted element list initially on loading + updateRestrictedElementsInScope() + + scheduleBackup() + } + + // Restore clock + simulationArea.changeClockTime(data.timePeriod || 500) + simulationArea.clockEnabled = + data.clockEnabled === undefined ? true : data.clockEnabled + + if (!embed) { + showProperties(simulationArea.lastSelected) + } + + // Reorder tabs according to the saved order + if (data.orderedTabs) { + // var unorderedTabs = $('.circuits').detach() + // var plusButton = $('#tabsBar').children().detach() + // for (const tab of data.orderedTabs) { + // $('#tabsBar').append(unorderedTabs.filter(`#${tab}`)) + // } + // $('#tabsBar').append(plusButton) + circuit_list.value.sort((a, b) => { + return data.orderedTabs.indexOf(String(a.id)) - data.orderedTabs.indexOf(String(b.id)); + }) + } + + // Switch to last focussedCircuit + if (data.focussedCircuit) switchCircuit(String(data.focussedCircuit)) + + // Update the testbench UI + updateTestbenchUI() + + updateSimulationSet(true) + updateCanvasSet(true) + gridUpdateSet(true) + // Reset Timing + if (!embed) plotArea.reset() + scheduleUpdate(1) +} diff --git a/v1/src/simulator/src/data/project.js b/v1/src/simulator/src/data/project.js new file mode 100644 index 00000000..5a88fdd5 --- /dev/null +++ b/v1/src/simulator/src/data/project.js @@ -0,0 +1,175 @@ +/* eslint-disable guard-for-in */ +/* eslint-disable no-bitwise */ +/* eslint-disable import/no-cycle */ +/* eslint-disable no-restricted-globals */ +/* eslint-disable no-alert */ +import { resetScopeList, scopeList, newCircuit } from '../circuit' +import { showMessage, showError, generateId } from '../utils' +import { checkIfBackup } from './backupCircuit' +import { generateSaveData, getProjectName, setProjectName } from './save' +import load from './load' +import { SimulatorStore } from '#/store/SimulatorStore/SimulatorStore' +import { confirmOption } from '#/components/helpers/confirmComponent/ConfirmComponent.vue' + +/** + * Helper function to recover unsaved data + * @category data + */ +export async function recoverProject() { + if (localStorage.getItem('recover')) { + var data = JSON.parse(localStorage.getItem('recover')) + if (await confirmOption(`Would you like to recover: ${data.name}`)) { + load(data) + } + localStorage.removeItem('recover') + } else { + showError('No recover project found') + } +} + +/** + * Prompt to restore from localStorage + * @category data + */ +export function openOffline() { + const simulatorStore = SimulatorStore() + simulatorStore.dialogBox.open_project_dialog = true + /* + $('#openProjectDialog').empty() + const projectList = JSON.parse(localStorage.getItem('projectList')) + let flag = true + for (id in projectList) { + flag = false + $('#openProjectDialog').append( + `` + ) + } + if (flag) + $('#openProjectDialog').append( + '

Looks like no circuit has been saved yet. Create a new one and save it!

' + ) + $('#openProjectDialog').dialog({ + resizable: false, + width: 'auto', + buttons: !flag + ? [ + { + id: 'Open_offline_btn', + text: 'Open Project', + click() { + if (!$('input[name=projectId]:checked').val()) return + load( + JSON.parse( + localStorage.getItem( + $('input[name=projectId]:checked').val() + ) + ) + ) + window.projectId = $( + 'input[name=projectId]:checked' + ).val() + $(this).dialog('close') + }, + }, + ] + : [], + }) + */ +} +/** + * Flag for project saved or not + * @type {boolean} + * @category data + */ +var projectSaved = true +export function projectSavedSet(param) { + projectSaved = param +} + +/** + * Helper function to store to localStorage -- needs to be deprecated/removed + * @category data + */ +export async function saveOffline() { + const data = await generateSaveData() + if (data instanceof Error) return + localStorage.setItem(projectId, data) + const temp = JSON.parse(localStorage.getItem('projectList')) || {} + temp[projectId] = getProjectName() + localStorage.setItem('projectList', JSON.stringify(temp)) + showMessage( + `We have saved your project: ${getProjectName()} in your browser's localStorage` + ) +} + +/** + * Checks if any circuit has unsaved data + * @category data + */ +function checkToSave() { + let saveFlag = false + // eslint-disable-next-line no-restricted-syntax + for (id in scopeList) { + saveFlag |= checkIfBackup(scopeList[id]) + } + return saveFlag +} + +/** + * Prompt user to save data if unsaved + * @category data + */ +window.onbeforeunload = async function () { + if (projectSaved || embed) return + + if (!checkToSave()) return + + alert( + 'You have unsaved changes on this page. Do you want to leave this page and discard your changes or stay on this page?' + ) + // await confirmSingleOption( + // 'You have unsaved changes on this page. Do you want to leave this page and discard your changes or stay on this page?' + // ) + const data = await generateSaveData('Untitled') + localStorage.setItem('recover', await data) + // eslint-disable-next-line consistent-return + return 'Are u sure u want to leave? Any unsaved changes may not be recoverable' +} + +/** + * Function to clear project + * @category data + */ +export async function clearProject() { + if (await confirmOption('Would you like to clear the project?')) { + globalScope = undefined + resetScopeList() + // $('.circuits').remove() + newCircuit('main') + showMessage('Your project is as good as new!') + } +} + +/** + Function used to start a new project while prompting confirmation from the user + * @param {boolean} verify - flag to verify a new project + * @category data + */ +export async function newProject(verify) { + if ( + verify || + projectSaved || + !checkToSave() || + (await confirmOption( + 'What you like to start a new project? Any unsaved changes will be lost.' + )) + ) { + clearProject() + localStorage.removeItem('recover') + window.location = '/simulator' + + setProjectName(undefined) + projectId = generateId() + showMessage('New Project has been created!') + } +} diff --git a/v1/src/simulator/src/data/redo.js b/v1/src/simulator/src/data/redo.js new file mode 100644 index 00000000..bc252a98 --- /dev/null +++ b/v1/src/simulator/src/data/redo.js @@ -0,0 +1,47 @@ +/* eslint-disable import/no-cycle */ +/** + * Function to restore copy from backup + * @param {Scope=} scope - The circuit on which redo is called + * @category data + */ +import { layoutModeGet } from '../layoutMode' +import Scope, { scopeList } from '../circuit' +import { loadScope } from './load' +import { updateRestrictedElementsInScope } from '../restrictedElementDiv' +import { forceResetNodesSet } from '../engine' +/** + * Function called to generate a prompt to save an image + * @param {Scope=} - the circuit in which we want to call redo + * @category data + * @exports redo + */ +export default function redo(scope = globalScope) { + if (layoutModeGet()) return + if (scope.history.length === 0) return + const backupOx = globalScope.ox + const backupOy = globalScope.oy + const backupScale = globalScope.scale + globalScope.ox = 0 + globalScope.oy = 0 + const tempScope = new Scope(scope.name) + loading = true + const redoData = scope.history.pop() + scope.backups.push(redoData) + loadScope(tempScope, JSON.parse(redoData)) + tempScope.backups = scope.backups + tempScope.history = scope.history + tempScope.id = scope.id + tempScope.name = scope.name + tempScope.testbenchData = scope.testbenchData + scopeList[scope.id] = tempScope + globalScope = tempScope + globalScope.ox = backupOx + globalScope.oy = backupOy + globalScope.scale = backupScale + loading = false + forceResetNodesSet(true) + + // Updated restricted elements + updateRestrictedElementsInScope() +} +// for html file diff --git a/v1/src/simulator/src/data/save.js b/v1/src/simulator/src/data/save.js new file mode 100644 index 00000000..3ffb7788 --- /dev/null +++ b/v1/src/simulator/src/data/save.js @@ -0,0 +1,514 @@ +import { scopeList } from '../circuit' +import { resetup } from '../setup' +import { update } from '../engine' +import { stripTags, showMessage } from '../utils' +import { backUp } from './backupCircuit' +import simulationArea from '../simulationArea' +import backgroundArea from '../backgroundArea' +import { findDimensions } from '../canvasApi' +import { projectSavedSet } from './project' +import { colors } from '../themer/themer' +import { layoutModeGet, toggleLayoutMode } from '../layoutMode' +import { verilogModeGet } from '../Verilog2CV' +import domtoimage from 'dom-to-image' +import '../../vendor/canvas2svg' +import { useProjectStore } from '#/store/projectStore' +import { provideProjectName } from '#/components/helpers/promptComponent/PromptComponent.vue' +import { UpdateProjectDetail } from '#/components/helpers/createNewProject/UpdateProjectDetail.vue' +import { confirmOption } from '#/components/helpers/confirmComponent/ConfirmComponent.vue' +import { getToken } from '#/pages/simulatorHandler.vue' + +// var projectName = undefined + +/** + * Function to set the name of project. + * @param {string} name - name for project + * @category data + */ +export function setProjectName(name) { + const projectStore = useProjectStore() + if (name == undefined) { + // $('#projectName').html('Untitled') + return + } + name = stripTags(name) + // projectName = name + // $('#projectName').html(name) + projectStore.setProjectName(name) +} + +/** + * Function to set the name of project. + * @param {string} name - name for project + * @category data + */ +export function getProjectName() { + const projectStore = useProjectStore() + if (projectStore.getProjectNameDefined) + return projectStore.getProjectName.trim() + else return undefined +} +/** + * Helper function to save canvas as image based on image type + * @param {string} name -name of the circuit + * @param {string} imgType - image type ex: png,jpg etc. + * @category data + */ +function downloadAsImg(name, imgType) { + const gh = simulationArea.canvas.toDataURL(`image/${imgType}`) + const anchor = document.createElement('a') + anchor.href = gh + anchor.download = `${name}.${imgType}` + anchor.click() +} + +/** + * Returns the order of tabs in the project + */ +export function getTabsOrder() { + var tabs = document.getElementById('tabsBar').firstChild.children + var order = [] + for (let i = 0; i < tabs.length; i++) { + order.push(tabs[i].id) + } + return order +} + +/** + * Generates JSON of the entire project + * @param {string} name - the name of project + * @return {JSON} + * @category data + */ +export async function generateSaveData(name, setName = true) { + let data = {} + + // Prompts for name, defaults to Untitled + name = getProjectName() || name || (await provideProjectName()) + if (name instanceof Error) { + return new Error('cancel') + // throw 'save has been canceled' + } else if (name == '') { + name = 'Untitled' + } + data.name = stripTags(name) + if (setName) setProjectName(data.name) + + // Save project details + data.timePeriod = simulationArea.timePeriod + data.clockEnabled = simulationArea.clockEnabled + data.projectId = projectId + data.focussedCircuit = globalScope.id + data.orderedTabs = getTabsOrder() + + // Project Circuits, each scope is one circuit + data.scopes = [] + const dependencyList = {} + const completed = {} + // Getting list of dependencies for each circuit + for (id in scopeList) { + dependencyList[id] = scopeList[id].getDependencies() + } + + // Helper function to save Scope + // Recursively saves inner subcircuits first, before saving parent circuits + function saveScope(id) { + if (completed[id]) return + + for (let i = 0; i < dependencyList[id].length; i++) { + // Save inner subcircuits + saveScope(dependencyList[id][i]) + } + + completed[id] = true + update(scopeList[id], true) // For any pending integrity checks on subcircuits + data.scopes.push(backUp(scopeList[id])) + } + + // Save all circuits + for (let id in scopeList) { + saveScope(id) + } + + // convert to text + data = JSON.stringify(data) + return data +} + +// Helper function to download text +function download(filename, text) { + var pom = document.createElement('a') + pom.setAttribute( + 'href', + 'data:text/plain;charset=utf-8,' + encodeURIComponent(text) + ) + pom.setAttribute('download', filename) + + if (document.createEvent) { + var event = document.createEvent('MouseEvents') + event.initEvent('click', true, true) + pom.dispatchEvent(event) + } else { + pom.click() + } +} + +/** + * Function to generate image for the circuit + * @param {string} imgType - ex: png,jpg etc. + * @param {string} view - view type ex: full + * @param {boolean} transparent - tranparent bg or not + * @param {number} resolution - resolution of the image + * @param {boolean=} down - will download if true + * @category data + */ +export function generateImage( + imgType, + view, + transparent, + resolution, + down = true +) { + // Backup all data + const backUpOx = globalScope.ox + const backUpOy = globalScope.oy + const backUpWidth = width + const backUpHeight = height + const backUpScale = globalScope.scale + const backUpContextBackground = backgroundArea.context + const backUpContextSimulation = simulationArea.context + + backgroundArea.context = simulationArea.context + + globalScope.ox *= 1 / backUpScale + globalScope.oy *= 1 / backUpScale + + // If SVG, create SVG context - using canvas2svg here + if (imgType === 'svg') { + simulationArea.context = new C2S(width, height) + resolution = 1 + } else if (imgType !== 'png') { + transparent = false + } + + globalScope.scale = resolution + + const scope = globalScope + + // Focus circuit + var flag = 1 + if (flag) { + if (view === 'full') { + findDimensions() + const minX = simulationArea.minWidth + const minY = simulationArea.minHeight + const maxX = simulationArea.maxWidth + const maxY = simulationArea.maxHeight + width = (maxX - minX + 100) * resolution + height = (maxY - minY + 100) * resolution + + globalScope.ox = (-minX + 50) * resolution + globalScope.oy = (-minY + 50) * resolution + } else { + globalScope.ox *= resolution + globalScope.oy *= resolution + width = (width * resolution) / backUpScale + height = (height * resolution) / backUpScale + } + } + + globalScope.ox = Math.round(globalScope.ox) + globalScope.oy = Math.round(globalScope.oy) + + simulationArea.canvas.width = width + simulationArea.canvas.height = height + backgroundArea.canvas.width = width + backgroundArea.canvas.height = height + + backgroundArea.context = simulationArea.context + + simulationArea.clear() + + // Background + if (!transparent) { + simulationArea.context.fillStyle = colors['canvas_fill'] + simulationArea.context.rect(0, 0, width, height) + simulationArea.context.fill() + } + + // Draw circuits, why is it updateOrder and not renderOrder? + for (let i = 0; i < renderOrder.length; i++) { + for (let j = 0; j < scope[renderOrder[i]].length; j++) { + scope[renderOrder[i]][j].draw() + } + } + + let returnData + // If circuit is to be downloaded, download, other wise return dataURL + if (down) { + if (imgType === 'svg') { + const mySerializedSVG = simulationArea.context.getSerializedSvg() // true here, if you need to convert named to numbered entities. + download(`${globalScope.name}.svg`, mySerializedSVG) + } else { + downloadAsImg(globalScope.name, imgType) + } + } else { + returnData = simulationArea.canvas.toDataURL(`image/${imgType}`) + } + + // Restore everything + width = backUpWidth + height = backUpHeight + simulationArea.canvas.width = width + simulationArea.canvas.height = height + backgroundArea.canvas.width = width + backgroundArea.canvas.height = height + globalScope.scale = backUpScale + backgroundArea.context = backUpContextBackground + simulationArea.context = backUpContextSimulation + globalScope.ox = backUpOx + globalScope.oy = backUpOy + + resetup() + + if (!down) return returnData +} + +async function crop(dataURL, w, h) { + //get empty second canvas + var myCanvas = document.createElement('CANVAS') + myCanvas.width = w + myCanvas.height = h + var myContext = myCanvas.getContext('2d') + var myImage + var img = new Image() + return new Promise(function (resolved, rejected) { + img.src = dataURL + img.onload = () => { + myContext.drawImage(img, 0, 0, w, h, 0, 0, w, h) + myContext.save() + + //create a new data URL + myImage = myCanvas.toDataURL('image/jpeg') + resolved(myImage) + } + }) +} + +/** + * Function that is used to save image for display in the website + * @return {JSON} + * @category data + */ +async function generateImageForOnline() { + // Verilog Mode -> Different logic + // Fix aspect ratio to 1.6 + // Ensure image is approximately 700 x 440 + var ratio = 1.6 + if (verilogModeGet()) { + var node = document.getElementsByClassName('CodeMirror')[0] + // var node = document.getElementsByClassName('CodeMirror')[0]; + var prevHeight = $(node).css('height') + var prevWidth = $(node).css('width') + var baseWidth = 500 + var baseHeight = Math.round(baseWidth / ratio) + $(node).css('height', baseHeight) + $(node).css('width', baseWidth) + + var data = await domtoimage.toJpeg(node) + $(node).css('width', prevWidth) + $(node).css('height', prevHeight) + data = await crop(data, baseWidth, baseHeight) + return data + } + + simulationArea.lastSelected = undefined // Unselect any selections + + // Fix aspect ratio to 1.6 + if (width > height * ratio) { + height = width / ratio + } else { + width = height * 1.6 + } + + // Center circuits + globalScope.centerFocus() + + // Ensure image is approximately 700 x 440 + const resolution = Math.min( + 700 / (simulationArea.maxWidth - simulationArea.minWidth), + 440 / (simulationArea.maxHeight - simulationArea.minHeight) + ) + + data = generateImage('jpeg', 'current', false, resolution, false) + + // Restores Focus + globalScope.centerFocus(false) + return data +} +/** + * Function called when you save acircuit online + * @category data + * @exports save + */ +export default async function save() { + if (layoutModeGet()) toggleLayoutMode() + + projectSavedSet(true) + + const data = await generateSaveData() + if (data instanceof Error) return + $('.loadingIcon').fadeIn() + + const projectName = getProjectName() + var imageData = await generateImageForOnline() + + const headers = { + 'Content-Type': 'application/json', + 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content'), + Authorization: `Token ${getToken('cvt')}`, + } + + if (!window.isUserLoggedIn) { + // user not signed in, save locally temporarily and force user to sign in + localStorage.setItem('recover_login', data) + // Asking user whether they want to login. + if ( + await confirmOption( + 'You have to login to save the project, you will be redirected to the login page.' + ) + ) + window.location.href = '/users/sign_in' + else $('.loadingIcon').fadeOut() + // eslint-disable-next-line camelcase + } else if ([0, undefined, null, '', '0'].includes(window.logixProjectId)) { + // Create new project - this part needs to be improved and optimised + // const form = $('', { + // action: '/api/v1/simulator/create', + // method: 'post', + // }) + // form.append( + // $('', { + // type: 'hidden', + // name: 'authenticity_token', + // value: $('meta[name="csrf-token"]').attr('content'), + // }) + // ) + // form.append( + // $('', { + // type: 'text', + // name: 'data', + // value: data, + // }) + // ) + // form.append( + // $('', { + // type: 'text', + // name: 'image', + // value: imageData, + // }) + // ) + // form.append( + // $('', { + // type: 'text', + // name: 'name', + // value: projectName, + // }) + // ) + // $('body').append(form) + // form.submit() + + fetch('/api/v1/projects', { + method: 'POST', + headers, + body: JSON.stringify({ + data, + image: imageData, + name: projectName, + }), + }) + .then((response) => { + if (response.ok) { + showMessage( + `We have Created a new project: ${projectName} in our servers.` + ) + $('.loadingIcon').fadeOut() + localStorage.removeItem('recover') + const responseJson = response.json() + responseJson.then((data) => { + UpdateProjectDetail(data) + }) + } + }) + .catch((error) => { + console.error('Error:', error) + }) + } else { + // updates project - this part needs to be improved and optimised + // $.ajax({ + // url: '/api/v1/simulator/update', + // type: 'PATCH', + // contentType: 'application/json', + // beforeSend(xhr) { + // xhr.setRequestHeader( + // 'X-CSRF-Token', + // $('meta[name="csrf-token"]').attr('content') + // ) + // }, + // data: JSON.stringify({ + // data, + // id: logixProjectId, + // image: imageData, + // name: projectName, + // }), + // success(response) { + // showMessage( + // `We have saved your project: ${projectName} in our servers.` + // ) + // $('.loadingIcon').fadeOut() + // localStorage.removeItem('recover') + // }, + // failure(err) { + // showMessage( + // "There was an error, we couldn't save to our servers" + // ) + // $('.loadingIcon').fadeOut() + // }, + // }) + // function getCookie(name) { + // const value = `; ${document.cookie}`; + // const parts = value.split(`; ${name}=`); + // if (parts.length === 2) return parts.pop().split(';').shift(); + // } + + fetch('/api/v1/projects/update_circuit', { + method: 'PATCH', + headers, + body: JSON.stringify({ + data, + id: window.logixProjectId, + image: imageData, + name: projectName, + }), + }) + .then((response) => { + if (response.ok) { + showMessage( + `We have saved your project: ${projectName} in our servers.` + ) + localStorage.removeItem('recover') + } else { + showMessage( + "There was an error, we couldn't save to our servers" + ) + } + $('.loadingIcon').fadeOut() + }) + .catch((error) => { + console.error('Error:', error) + }) + } + + // Restore everything + resetup() +} diff --git a/v1/src/simulator/src/data/saveImage.js b/v1/src/simulator/src/data/saveImage.js new file mode 100644 index 00000000..8e2b813d --- /dev/null +++ b/v1/src/simulator/src/data/saveImage.js @@ -0,0 +1,18 @@ +/** + * Helper function to show prompt to save image + * Options - resolution, image type, view + * @param {Scope=} scope - useless though + * @category data + */ +import { SimulatorStore } from '#/store/SimulatorStore/SimulatorStore' + +/** + * Function called to generate a prompt to save an image + * @category data + * @param {Scope=} - circuit whose image we want + * @exports createSaveAsImgPrompt + */ +export default function createSaveAsImgPrompt(scope = globalScope) { + const simulatorStore = SimulatorStore() + simulatorStore.dialogBox.saveimage_dialog = true +} diff --git a/v1/src/simulator/src/data/undo.js b/v1/src/simulator/src/data/undo.js new file mode 100644 index 00000000..67f22005 --- /dev/null +++ b/v1/src/simulator/src/data/undo.js @@ -0,0 +1,51 @@ +/* eslint-disable import/no-cycle */ +/** + * Function to restore copy from backup + * @param {Scope=} scope - The circuit on which undo is called + * @category data + */ +import { layoutModeGet } from '../layoutMode' +import Scope, { scopeList } from '../circuit' +import { loadScope } from './load' +import { updateRestrictedElementsInScope } from '../restrictedElementDiv' +import { forceResetNodesSet } from '../engine' +/** + * Function called to generate a prompt to save an image + * @param {Scope=} - the circuit in which we want to call undo + * @category data + * @exports undo + */ +export default function undo(scope = globalScope) { + if (layoutModeGet()) return + if (scope.backups.length < 2) return + const backupOx = globalScope.ox + const backupOy = globalScope.oy + const backupScale = globalScope.scale + globalScope.ox = 0 + globalScope.oy = 0 + const tempScope = new Scope(scope.name) + loading = true + const undoData = scope.backups.pop() + scope.history.push(undoData) + scope.backups.length !== 0 && + loadScope( + tempScope, + JSON.parse(scope.backups[scope.backups.length - 1]) + ) + tempScope.backups = scope.backups + tempScope.history = scope.history + tempScope.id = scope.id + tempScope.name = scope.name + tempScope.testbenchData = scope.testbenchData + scopeList[scope.id] = tempScope + globalScope = tempScope + globalScope.ox = backupOx + globalScope.oy = backupOy + globalScope.scale = backupScale + loading = false + forceResetNodesSet(true) + + // Updated restricted elements + updateRestrictedElementsInScope() +} +// for html file diff --git a/v1/src/simulator/src/doc/Circuit2Verilog documentation.md b/v1/src/simulator/src/doc/Circuit2Verilog documentation.md new file mode 100644 index 00000000..42d6b89d --- /dev/null +++ b/v1/src/simulator/src/doc/Circuit2Verilog documentation.md @@ -0,0 +1,70 @@ +## Circuit2Verilog Module + +**Primary Contributors:** + +1. James H - J Yeh, Ph.D. +2. Satvik Ramaprasad + +## Introduction + +This is an experimental module that generates Verilog netlist (structural +Verilog) given the circuit. Currently, the module generates fully functional +Verilog code for basic circuits. For a complex circuit, additional (manual) work +may need to be done in order to make it work. We are continuously improving this +module to work with more and more complex circuits. + +# Algorithm + +The basic algorithm is fairly straightforward. We have the circuit graph in +memory. We just need to convert this graph into Verilog netlist. It is done by +performing a DFS on the circuit graph. The DFS involves the following steps + +1. Creating Verilog wires as and when required +2. Connecting Verilog wires in element instantiations + +## Some background information + +The different sub-circuits form a DAG (Directed Acyclic Graph) or dependency +graph. Each sub-circuit itself (called scope internally) is actually a (cyclic) +graph on its own. Therefore the Verilog generation is done in a 2 step DFS +approach. The first DFS is performed on the dependency graph. The second DFS is +done on an individual sub-circuit (scope). + +## Code/Algorithm workflow + +1. `exportVerilog()` - entry point +2. `exportVerilogScope()` - DFS(1) on Sub Circuits Dependency Graph + 1. Set Verilog Labels for all elements + 2. `generateHeader()` - Generates Module Header + 3. `generateOutputList()` - Output Output List + 4. `generateInputList()` - Generates Input List + 5. `processGraph()` - DFS(2) on individual subcircuit/scope + 1. DFS starts from inputs + 2. Calls `processVerilog()` on all circuit elements (graph nodes) - resolves label names and adds neighbors to DFS stack. + 3. Calls `generateVerilog()` on all circuit elements to get the final Verilog. + 6. Generate Wire initializations + +## Functions + +**Verilog Module Functions:** + +1. `verilog.exportVerilog()` - Entry point +1. `verilog.exportVerilogScope()` - Recursive DFS function on subcircuit graph +1. `verilog.processGraph()` - Iterative DFS function on subcircuit scope +1. `verilog.resetLabels()` - Resets labels in scope +1. `verilog.setLabels()` - Sets labels in scope +1. `verilog.generateHeader()` - Generates Verilog Module Header +1. `verilog.generateInputList()` - Generates Verilog Module Input List +1. `verilog.generateOutputList()` - Generates Verilog Module Output List +1. `sanitizeLabel()` - Sanitizes label for node/wire +1. `verilog.generateNodeName()` - Helper function to resolve node/wire name + +**CircuitElement Functions:** + +These functions can be overridden by derived classes. + +1. `CircuitElement.prototype.processVerilog()` - Graph algorithm to resolve Verilog wire labels +1. `CircuitElement.prototype.verilogName()` - Generate Verilog name +1. `CircuitElement.prototype.generateVerilog()` - Generate final Verilog code +1. `CircuitElement.prototype.verilogType` - Verilog type name +1. `CircuitElement.moduleVerilog` - Custom module Verilog for elements diff --git a/v1/src/simulator/src/doc/images/CircuitVerse Timing Diagram Size Spec.svg b/v1/src/simulator/src/doc/images/CircuitVerse Timing Diagram Size Spec.svg new file mode 100644 index 00000000..d92c7cda --- /dev/null +++ b/v1/src/simulator/src/doc/images/CircuitVerse Timing Diagram Size Spec.svg @@ -0,0 +1,3 @@ + + +
TimeLine
TimeLi...
timeLineHeight
time...
padding
padd...
padding
padd...
padding
padd...
padding
p...
flagLabelWidth
flagLabelWidth
plotHeight
plot...
plotHeight
plot...
cycleWidth
cycleW...
cycleWidth
cycleWidth
waveFormHeight
wave...
waveFormPadding
wave...
waveFormPadding
wave...
plotHeight
plot...
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/v1/src/simulator/src/drag.ts b/v1/src/simulator/src/drag.ts new file mode 100644 index 00000000..2e14abca --- /dev/null +++ b/v1/src/simulator/src/drag.ts @@ -0,0 +1,87 @@ +import interact from 'interactjs' + +interface Position { + x: number + y: number +} + +function updatePosition( + element: HTMLElement, + dx: number, + dy: number, + positions: WeakMap +): void { + if (!element) return // Check if the element is valid + + // If the element does not exist in the positions WeakMap, create it + if (!positions.has(element)) { + positions.set(element, { x: 0, y: 0 }) + } + + // Update the element's x and y position + const currentPosition = positions.get(element) + if (!currentPosition) return // Check if the currentPosition is valid + currentPosition.x += dx + currentPosition.y += dy + + // Apply the new position to the element using the CSS transform property + element.style.transform = `translate(${currentPosition.x}px, ${currentPosition.y}px)` +} + +function disableSelection(element: HTMLElement): void { + element.setAttribute('unselectable', 'on') + element.style.userSelect = 'none' + element.style.webkitUserSelect = 'none' + element.style.MozUserSelect = 'none' + element.style.msUserSelect = 'none' + element.style.OUserSelect = 'none' + element.onselectstart = () => false +} + +/** + * Make an element draggable within a specified container. + * @param {HTMLElement} targetEl - Element that triggers the drag event. + * @param {HTMLElement} DragEl - Element to be dragged. + */ +export function dragging(targetEl: HTMLElement, DragEl: HTMLElement): void { + // WeakMap to store the position of each dragged element + const positions = new WeakMap() + + // Initialize the interact.js library with the draggable element selector + interact(DragEl).draggable({ + // Specify the element that triggers the drag event + allowFrom: targetEl, + // Set up event listeners for the draggable element + listeners: { + // Update the element's position when the move event is triggered + move(event) { + updatePosition( + event.target as HTMLElement, + event.dx, + event.dy, + positions + ) + }, + }, + // Set up modifiers to apply constraints to the draggable element + modifiers: [ + interact.modifiers.restrictRect({ + // Restrict the draggable element within its parent container + restriction: 'body', + }), + ], + }) + + $(DragEl).on('mousedown', () => { + $(`.draggable-panel:not(${DragEl})`).css('z-index', '99') + $(DragEl).css('z-index', '99') + }) + + let panelElements = document.querySelectorAll( + '.elementPanel, .layoutElementPanel, #moduleProperty, #layoutDialog, #verilogEditorPanel, .timing-diagram-panel, .testbench-manual-panel, .quick-btn' + ) + + panelElements.forEach((element) => { + disableSelection(element as HTMLElement) + }) +} diff --git a/v1/src/simulator/src/embed.js b/v1/src/simulator/src/embed.js new file mode 100644 index 00000000..b17e82ba --- /dev/null +++ b/v1/src/simulator/src/embed.js @@ -0,0 +1,132 @@ +// /* eslint-disable import/no-cycle */ +// // Helper functions for when circuit is embedded +// import { scopeList, circuitProperty } from './circuit' +// import simulationArea from './simulationArea' +// import { +// scheduleUpdate, +// wireToBeCheckedSet, +// updateCanvasSet, +// gridUpdateSet, +// } from './engine' +// import { prevPropertyObjGet, prevPropertyObjSet } from './ux' +// import { ZoomIn, ZoomOut } from './listeners' + +// // circuitProperty.toggleFullScreen = toggleFullScreen; +// $(document).ready(() => { +// // Clock features +// $('#clockProperty').append( +// " " +// ) +// $('#clockProperty').append( +// `
Time:
` +// ) +// $('#clockProperty').append( +// `
Clock:
` +// ) + +// // Following codes need to be removed +// $('.objectPropertyAttributeEmbed').on( +// 'change keyup paste click', +// function () { +// scheduleUpdate() +// updateCanvasSet(true) +// wireToBeCheckedSet(1) +// if ( +// simulationArea.lastSelected && +// simulationArea.lastSelected[this.name] +// ) { +// prevPropertyObjSet( +// simulationArea.lastSelected[this.name](this.value) +// ) || prevPropertyObjGet() +// } else { +// circuitProperty[this.name](this.value) +// } +// } +// ) + +// // Following codes need to be removed +// $('.objectPropertyAttributeEmbedChecked').on( +// 'change keyup paste click', +// function () { +// scheduleUpdate() +// updateCanvasSet(true) +// wireToBeCheckedSet(1) +// if ( +// simulationArea.lastSelected && +// simulationArea.lastSelected[this.name] +// ) { +// prevPropertyObjSet( +// simulationArea.lastSelected[this.name](this.value) +// ) || prevPropertyObjGet() +// } else { +// circuitProperty[this.name](this.checked) +// } +// } +// ) + +// $('#zoom-in-embed').on('click', () => ZoomIn()) + +// $('#zoom-out-embed').on('click', () => ZoomOut()) +// }) + +// // Full screen toggle helper function +// function toggleFullScreen(value) { +// if (!getfullscreenelement()) { +// GoInFullscreen(document.documentElement) +// } else { +// GoOutFullscreen() +// } +// } +// // Center focus accordingly +// function exitHandler() { +// setTimeout(() => { +// Object.keys(scopeList).forEach((id) => { +// scopeList[id].centerFocus(true) +// }) +// gridUpdateSet(true) +// scheduleUpdate() +// }, 100) +// } + +// function GoInFullscreen(element) { +// if (element.requestFullscreen) { +// element.requestFullscreen() +// } else if (element.mozRequestFullScreen) { +// element.mozRequestFullScreen() +// } else if (element.webkitRequestFullscreen) { +// element.webkitRequestFullscreen() +// } else if (element.msRequestFullscreen) { +// element.msRequestFullscreen() +// } +// } + +// function GoOutFullscreen() { +// if (document.exitFullscreen) { +// document.exitFullscreen() +// } else if (document.mozCancelFullScreen) { +// document.mozCancelFullScreen() +// } else if (document.webkitExitFullscreen) { +// document.webkitExitFullscreen() +// } else if (document.msExitFullscreen) { +// document.msExitFullscreen() +// } +// } + +// function getfullscreenelement() { +// return ( +// document.fullscreenElement || +// document.webkitFullscreenElement || +// document.mozFullScreenElement || +// document.msFullscreenElement +// ) +// } + +// // Full screen Listeners +// if (document.addEventListener) { +// document.addEventListener('webkitfullscreenchange', exitHandler, false) +// document.addEventListener('mozfullscreenchange', exitHandler, false) +// document.addEventListener('fullscreenchange', exitHandler, false) +// document.addEventListener('MSFullscreenChange', exitHandler, false) +// } diff --git a/v1/src/simulator/src/embedListeners.js b/v1/src/simulator/src/embedListeners.js new file mode 100644 index 00000000..e7cb2d0a --- /dev/null +++ b/v1/src/simulator/src/embedListeners.js @@ -0,0 +1,259 @@ +/* eslint-disable import/no-cycle */ +// Listeners when circuit is embedded +// Refer listeners.js +import simulationArea from './simulationArea' +import { + scheduleUpdate, + update, + updateSelectionsAndPane, + wireToBeCheckedSet, + updatePositionSet, + updateSimulationSet, + updateCanvasSet, + gridUpdateSet, + errorDetectedSet, +} from './engine' +import { changeScale } from './canvasApi' +import { copy, paste } from './events' +import { ZoomIn, ZoomOut } from './listeners' + +var unit = 10 + +export default function startListeners() { + window.addEventListener('keyup', (e) => { + scheduleUpdate(1) + if (e.keyCode == 16) { + simulationArea.shiftDown = false + } + if (e.key == 'Meta' || e.key == 'Control') { + simulationArea.controlDown = false + } + }) + + document + .getElementById('simulationArea') + .addEventListener('mousedown', (e) => { + errorDetectedSet(false) + updateSimulationSet(true) + updatePositionSet(true) + updateCanvasSet(true) + + simulationArea.lastSelected = undefined + simulationArea.selected = false + simulationArea.hover = undefined + var rect = simulationArea.canvas.getBoundingClientRect() + simulationArea.mouseDownRawX = (e.clientX - rect.left) * DPR + simulationArea.mouseDownRawY = (e.clientY - rect.top) * DPR + simulationArea.mouseDownX = + Math.round( + (simulationArea.mouseDownRawX - globalScope.ox) / + globalScope.scale / + unit + ) * unit + simulationArea.mouseDownY = + Math.round( + (simulationArea.mouseDownRawY - globalScope.oy) / + globalScope.scale / + unit + ) * unit + simulationArea.mouseDown = true + simulationArea.oldx = globalScope.ox + simulationArea.oldy = globalScope.oy + + e.preventDefault() + scheduleUpdate(1) + }) + + document + .getElementById('simulationArea') + .addEventListener('mousemove', () => { + var ele = document.getElementById('elementName') + if (globalScope && simulationArea && simulationArea.objectList) { + var { objectList } = simulationArea + objectList = objectList.filter((val) => val !== 'wires') + + for (var i = 0; i < objectList.length; i++) { + for ( + var j = 0; + j < globalScope[objectList[i]].length; + j++ + ) { + if (globalScope[objectList[i]][j].isHover()) { + ele.style.display = 'block' + if (objectList[i] === 'SubCircuit') { + ele.innerHTML = `Subcircuit: ${globalScope.SubCircuit[j].data.name}` + } else { + ele.innerHTML = `CircuitElement: ${objectList[i]}` + } + return + } + } + } + } + + ele.style.display = 'none' + document.getElementById('elementName').innerHTML = '' + }) + + window.addEventListener('mousemove', (e) => { + var rect = simulationArea.canvas.getBoundingClientRect() + simulationArea.mouseRawX = (e.clientX - rect.left) * DPR + simulationArea.mouseRawY = (e.clientY - rect.top) * DPR + simulationArea.mouseXf = + (simulationArea.mouseRawX - globalScope.ox) / globalScope.scale + simulationArea.mouseYf = + (simulationArea.mouseRawY - globalScope.oy) / globalScope.scale + simulationArea.mouseX = Math.round(simulationArea.mouseXf / unit) * unit + simulationArea.mouseY = Math.round(simulationArea.mouseYf / unit) * unit + + updateCanvasSet(true) + if (simulationArea.lastSelected == globalScope.root) { + updateCanvasSet(true) + var fn + fn = function () { + updateSelectionsAndPane() + } + scheduleUpdate(0, 20, fn) + } else { + scheduleUpdate(0, 200) + } + }) + window.addEventListener('keydown', (e) => { + errorDetectedSet(false) + updateSimulationSet(true) + updatePositionSet(true) + + // zoom in (+) + if (e.key == 'Meta' || e.key == 'Control') { + simulationArea.controlDown = true + } + + if ( + simulationArea.controlDown && + (e.keyCode == 187 || e.KeyCode == 171) + ) { + e.preventDefault() + ZoomIn() + } + + // zoom out (-) + if ( + simulationArea.controlDown && + (e.keyCode == 189 || e.Keycode == 173) + ) { + e.preventDefault() + ZoomOut() + } + + if ( + simulationArea.mouseRawX < 0 || + simulationArea.mouseRawY < 0 || + simulationArea.mouseRawX > width || + simulationArea.mouseRawY > height + ) + return + + scheduleUpdate(1) + updateCanvasSet(true) + + if ( + simulationArea.lastSelected && + simulationArea.lastSelected.keyDown + ) { + if ( + e.key.toString().length == 1 || + e.key.toString() == 'Backspace' + ) { + simulationArea.lastSelected.keyDown(e.key.toString()) + return + } + } + if ( + simulationArea.lastSelected && + simulationArea.lastSelected.keyDown2 + ) { + if (e.key.toString().length == 1) { + simulationArea.lastSelected.keyDown2(e.key.toString()) + return + } + } + + // if (simulationArea.lastSelected && simulationArea.lastSelected.keyDown3) { + // if (e.key.toString() != "Backspace" && e.key.toString() != "Delete") { + // simulationArea.lastSelected.keyDown3(e.key.toString()); + // return; + // } + + // } + + if (e.key == 'T' || e.key == 't') { + simulationArea.changeClockTime(prompt('Enter Time:')) + } + }) + document + .getElementById('simulationArea') + .addEventListener('dblclick', (e) => { + scheduleUpdate(2) + if ( + simulationArea.lastSelected && + simulationArea.lastSelected.dblclick !== undefined + ) { + simulationArea.lastSelected.dblclick() + } + }) + + window.addEventListener('mouseup', (e) => { + simulationArea.mouseDown = false + errorDetectedSet(false) + updateSimulationSet(true) + updatePositionSet(true) + updateCanvasSet(true) + gridUpdateSet(true) + wireToBeCheckedSet(1) + + scheduleUpdate(1) + }) + window.addEventListener('mousedown', function (e) { + this.focus() + }) + + document + .getElementById('simulationArea') + .addEventListener('mousewheel', MouseScroll) + document + .getElementById('simulationArea') + .addEventListener('DOMMouseScroll', MouseScroll) + + function MouseScroll(event) { + updateCanvasSet(true) + + event.preventDefault() + var deltaY = event.wheelDelta ? event.wheelDelta : -event.detail + var scrolledUp = deltaY < 0 + var scrolledDown = deltaY > 0 + + if (event.ctrlKey) { + if (scrolledUp && globalScope.scale > 0.5 * DPR) { + changeScale(-0.1 * DPR) + } + if (scrolledDown && globalScope.scale < 4 * DPR) { + changeScale(0.1 * DPR) + } + } else { + if (scrolledUp && globalScope.scale < 4 * DPR) { + changeScale(0.1 * DPR) + } + if (scrolledDown && globalScope.scale > 0.5 * DPR) { + changeScale(-0.1 * DPR) + } + } + + updateCanvasSet(true) + gridUpdateSet(true) + update() // Schedule update not working, this is INEFFICENT + } +} + +var isIe = + navigator.userAgent.toLowerCase().indexOf('msie') != -1 || + navigator.userAgent.toLowerCase().indexOf('trident') != -1 diff --git a/v1/src/simulator/src/engine.js b/v1/src/simulator/src/engine.js new file mode 100644 index 00000000..2f74df6e --- /dev/null +++ b/v1/src/simulator/src/engine.js @@ -0,0 +1,559 @@ +/* eslint-disable import/no-cycle */ +/* eslint-disable no-use-before-define */ +/* eslint-disable no-continue */ +/* eslint-disable no-param-reassign */ +/* eslint-disable no-bitwise */ +import { layoutModeGet, layoutUpdate } from './layoutMode' +import plotArea from './plotArea' +import simulationArea from './simulationArea' +import { dots, canvasMessage, findDimensions, rect2 } from './canvasApi' +import { showProperties, prevPropertyObjGet } from './ux' +import { showError } from './utils' +import miniMapArea from './minimap' +import { resetup } from './setup' +import { verilogModeGet } from './Verilog2CV' + +/** + * Core of the simulation and rendering algorithm. + */ + +/** + * @type {number} engine + * @category engine + */ +var wireToBeChecked = 0 + +/** + * Used to set wireChecked boolean which updates wires in UI if true (or 1). 2 if some problem and it is handled. + * @param {number} param - value of wirechecked + * @category engine + */ +export function wireToBeCheckedSet(param) { + wireToBeChecked = param +} + +/** + * scheduleUpdate() will be called if true + * @type {boolean} + * @category engine + */ +var willBeUpdated = false + +/** + * used to set willBeUpdated variable + * @type {boolean} + * @category engine + * @category engine + */ +export function willBeUpdatedSet(param) { + willBeUpdated = param +} + +/** + * true if we have an element selected and + * is used when we are paning the grid. + * @type {boolean} + * @category engine + */ +var objectSelection = false + +/** + * used to set the value of object selection, + * @param {boolean} param + * @category engine + */ +export function objectSelectionSet(param) { + objectSelection = param +} + +/** + * Flag for updating position + * @type {boolean} + * @category engine + */ +var updatePosition = true + +/** + * used to set the value of updatePosition. + * @param {boolean} param + * @category engine + */ +export function updatePositionSet(param) { + updatePosition = param +} + +/** + * Flag for updating simulation + * @type {boolean} + * @category engine + */ +var updateSimulation = true + +/** + * used to set the value of updateSimulation. + * @param {boolean} param + * @category engine + */ +export function updateSimulationSet(param) { + updateSimulation = param +} +/** + * Flag for rendering + * @type {boolean} + * @category engine + */ +var updateCanvas = true + +/** + * used to set the value of updateCanvas. + * @param {boolean} param + * @category engine + */ +export function updateCanvasSet(param) { + updateCanvas = param +} + +/** + * Flag for updating grid + * @type {boolean} + * @category engine + */ +var gridUpdate = true + +/** + * used to set gridUpdate + * @param {boolean} param + * @category engine + */ +export function gridUpdateSet(param) { + gridUpdate = param +} + +/** + * used to get gridUpdate + * @return {boolean} + * @category engine + */ +export function gridUpdateGet() { + return gridUpdate +} +/** + * Flag for updating grid + * @type {boolean} + * @category engine + */ +var forceResetNodes = true + +/** + * used to set forceResetNodes + * @param {boolean} param + * @category engine + */ +export function forceResetNodesSet(param) { + forceResetNodes = param +} +/** + * Flag for updating grid + * @type {boolean} + * @category engine + */ +var errorDetected = false + +/** + * used to set errorDetected + * @param {boolean} param + * @category engine + */ +export function errorDetectedSet(param) { + errorDetected = param +} + +/** + * used to set errorDetected + * @returns {boolean} errorDetected + * @category engine + */ +export function errorDetectedGet() { + return errorDetected +} + +/** + * details of where and what canvas message has to be shown. + * @type {Object} + * @property {number} x - x cordinate of message + * @property {number} y - x cordinate of message + * @property {number} string - the message + * @category engine + */ +export var canvasMessageData = { + x: undefined, + y: undefined, + string: undefined, +} + +/** + * Flag for updating subCircuits + * @type {boolean} + * @category engine + */ +var updateSubcircuit = true + +/** + * used to set updateSubcircuit + * @param {boolean} param + * @category engine + */ +export function updateSubcircuitSet(param) { + if (updateSubcircuit != param) { + updateSubcircuit = param + return true + } + updateSubcircuit = param + return false +} + +/** + * turn light mode on + * @param {boolean} val -- new value for light mode + * @category engine + */ +export function changeLightMode(val) { + if (!val && lightMode) { + lightMode = false + DPR = window.devicePixelRatio || 1 + globalScope.scale *= DPR + } else if (val && !lightMode) { + lightMode = true + globalScope.scale /= DPR + DPR = 1 + $('#miniMap').fadeOut('fast') + } + resetup() +} + +/** + * Function to render Canvas according th renderupdate order + * @param {Scope} scope - The circuit whose canvas we want to render + * @category engine + */ +export function renderCanvas(scope) { + if (layoutModeGet() || verilogModeGet()) { + // Different Algorithm + return + } + var ctx = simulationArea.context + // Reset canvas + simulationArea.clear() + // Update Grid + if (gridUpdate) { + gridUpdateSet(false) + dots() + } + canvasMessageData = { + x: undefined, + y: undefined, + string: undefined, + } // Globally set in draw fn () + // Render objects + for (let i = 0; i < renderOrder.length; i++) { + for (var j = 0; j < scope[renderOrder[i]].length; j++) { + scope[renderOrder[i]][j].draw() + } + } + // Show any message + if (canvasMessageData.string !== undefined) { + canvasMessage( + ctx, + canvasMessageData.string, + canvasMessageData.x, + canvasMessageData.y + ) + } + // If multiple object selections are going on, show selected area + if (objectSelection) { + ctx.beginPath() + ctx.lineWidth = 2 + ctx.strokeStyle = 'black' + ctx.fillStyle = 'rgba(0,0,0,0.1)' + rect2( + ctx, + simulationArea.mouseDownX, + simulationArea.mouseDownY, + simulationArea.mouseX - simulationArea.mouseDownX, + simulationArea.mouseY - simulationArea.mouseDownY, + 0, + 0, + 'RIGHT' + ) + ctx.stroke() + ctx.fill() + } + if (simulationArea.hover !== undefined) { + simulationArea.canvas.style.cursor = 'pointer' + } else if (simulationArea.mouseDown) { + simulationArea.canvas.style.cursor = 'grabbing' + } else { + simulationArea.canvas.style.cursor = 'default' + } +} + +/** + * Function to move multiple objects and panes window + * deselected using dblclick right now (PR open for esc key) + * @param {Scope=} scope - the circuit in which we are selecting stuff + * @category engine + */ +export function updateSelectionsAndPane(scope = globalScope) { + if (!simulationArea.selected && simulationArea.mouseDown) { + simulationArea.selected = true + simulationArea.lastSelected = scope.root + simulationArea.hover = scope.root + // Selecting multiple objects + if (simulationArea.shiftDown) { + objectSelectionSet(true) + } else if (!embed) { + findDimensions(scope) + miniMapArea.setup() + $('#miniMap').show() + } + } else if ( + simulationArea.lastSelected === scope.root && + simulationArea.mouseDown + ) { + // pane canvas to give an idea of grid moving + if (!objectSelection) { + globalScope.ox = + simulationArea.mouseRawX - + simulationArea.mouseDownRawX + + simulationArea.oldx + globalScope.oy = + simulationArea.mouseRawY - + simulationArea.mouseDownRawY + + simulationArea.oldy + globalScope.ox = Math.round(globalScope.ox) + globalScope.oy = Math.round(globalScope.oy) + gridUpdateSet(true) + if (!embed && !lightMode) miniMapArea.setup() + } else { + // idea: kind of empty + } + } else if (simulationArea.lastSelected === scope.root) { + /* + Select multiple objects by adding them to the array + simulationArea.multipleObjectSelections when we select + using shift + mouse movement to select an area but + not shift + click + */ + simulationArea.lastSelected = undefined + simulationArea.selected = false + simulationArea.hover = undefined + if (objectSelection) { + objectSelectionSet(false) + var x1 = simulationArea.mouseDownX + var x2 = simulationArea.mouseX + var y1 = simulationArea.mouseDownY + var y2 = simulationArea.mouseY + // Sort those four points to make a selection pane + if (x1 > x2) { + const temp = x1 + x1 = x2 + x2 = temp + } + if (y1 > y2) { + const temp = y1 + y1 = y2 + y2 = temp + } + // Select the objects, push them into a list + for (let i = 0; i < updateOrder.length; i++) { + for (var j = 0; j < scope[updateOrder[i]].length; j++) { + var obj = scope[updateOrder[i]][j] + if (simulationArea.multipleObjectSelections.contains(obj)) + continue + var x + var y + if (obj.objectType === 'Node') { + x = obj.absX() + y = obj.absY() + } else if (obj.objectType !== 'Wire') { + x = obj.x + y = obj.y + } else { + continue + } + if (x > x1 && x < x2 && y > y1 && y < y2) { + simulationArea.multipleObjectSelections.push(obj) + } + } + } + } + } +} + +/** + * Main fn that resolves circuit using event driven simulation + * All inputs are added to a scope using scope.addinput() and + * the simulation starts to play. + * @param {Scope=} scope - the circuit we want to simulate + * @param {boolean} resetNodes - boolean to reset all nodes + * @category engine + */ +export function play(scope = globalScope, resetNodes = false) { + if (errorDetected) return // Don't simulate until error is fixed + if (loading === true) return // Don't simulate until loaded + + simulationArea.simulationQueue.reset() + plotArea.setExecutionTime() // Waveform thing + // Reset Nodes if required + if (resetNodes || forceResetNodes) { + scope.reset() + simulationArea.simulationQueue.reset() + forceResetNodesSet(false) + } + + // To store list of circuitselements that have shown contention but kept temporarily + // Mainly to resolve tristate bus issues + simulationArea.contentionPending = [] + // add inputs to the simulation queue + scope.addInputs() + // to check if we have infinite loop in circuit + let stepCount = 0 + let elem + while (!simulationArea.simulationQueue.isEmpty()) { + if (errorDetected) { + simulationArea.simulationQueue.reset() + return + } + elem = simulationArea.simulationQueue.pop() + elem.resolve() + stepCount++ + if (stepCount > 1000000) { + // Cyclic or infinite Circuit Detection + showError( + 'Simulation Stack limit exceeded: maybe due to cyclic paths or contention' + ) + errorDetectedSet(true) + forceResetNodesSet(true) + } + } + // Check for TriState Contentions + if (simulationArea.contentionPending.length) { + showError('Contention at TriState') + forceResetNodesSet(true) + errorDetectedSet(true) + } +} + +/** + * Function to check for any UI update, it is throttled by time + * @param {number=} count - this is used to force update + * @param {number=} time - the time throttling parameter + * @param {function} fn - function to run before updating UI + * @category engine + */ +export function scheduleUpdate(count = 0, time = 100, fn) { + if (lightMode) time *= 5 + var updateFn = layoutModeGet() ? layoutUpdate : update + if (count) { + // Force update + updateFn() + for (let i = 0; i < count; i++) { + setTimeout(updateFn, 10 + 50 * i) + } + } + if (willBeUpdated) return // Throttling + willBeUpdatedSet(true) + // Call a function before update .. + if (fn) { + setTimeout(() => { + fn() + updateFn() + }, time) + } else setTimeout(updateFn, time) +} + +/** + * fn that calls update on everything else. If any change + * is there, it resolves the circuit and draws it again. + * Also updates simulations, selection, minimap, resolves + * circuit and redraws canvas if required. + * @param {Scope=} scope - the circuit to be updated + * @param {boolean=} updateEverything - if true we update the wires, nodes and modules + * @category engine + */ +export function update(scope = globalScope, updateEverything = false) { + willBeUpdatedSet(false) + if (loading === true || layoutModeGet()) return + var updated = false + simulationArea.hover = undefined + // Update wires + if (wireToBeChecked || updateEverything) { + if (wireToBeChecked === 2) + wireToBeChecked = 0 // this required due to timing issues + else wireToBeChecked++ + // WHY IS THIS REQUIRED ???? we are checking inside wire ALSO + // Idea: we can just call length again instead of doing it during loop. + var prevLength = scope.wires.length + for (let i = 0; i < scope.wires.length; i++) { + scope.wires[i].checkConnections() + if (scope.wires.length !== prevLength) { + prevLength-- + i-- + } + } + scheduleUpdate() + } + // Update subcircuits + if (updateSubcircuit || updateEverything) { + for (let i = 0; i < scope.SubCircuit.length; i++) { + scope.SubCircuit[i].reset() + } + updateSubcircuitSet(false) + } + // Update UI position + if (updatePosition || updateEverything) { + for (let i = 0; i < updateOrder.length; i++) { + for (let j = 0; j < scope[updateOrder[i]].length; j++) { + updated |= scope[updateOrder[i]][j].update() + } + } + } + // Updates multiple objectselections and panes window + if (updatePosition || updateEverything) { + updateSelectionsAndPane(scope) + } + // Update MiniMap + if ( + !embed && + simulationArea.mouseDown && + simulationArea.lastSelected && + simulationArea.lastSelected !== globalScope.root + ) { + if (!lightMode) { + $('#miniMap').fadeOut('fast') + } + } + // Run simulation + if (updateSimulation) { + play() + } + // Show properties of selected element + if (!embed && prevPropertyObjGet() !== simulationArea.lastSelected) { + if ( + simulationArea.lastSelected && + simulationArea.lastSelected.objectType !== 'Wire' + ) { + // ideas: why show properties of project in Nodes but not wires? + showProperties(simulationArea.lastSelected) + } else { + // hideProperties(); + } + } + // Draw, render everything + if (updateCanvas) { + renderCanvas(scope) + } + updateSimulationSet(false) + updateCanvas = false + updatePositionSet(false) +} diff --git a/v1/src/simulator/src/eventQueue.js b/v1/src/simulator/src/eventQueue.js new file mode 100644 index 00000000..f40110e1 --- /dev/null +++ b/v1/src/simulator/src/eventQueue.js @@ -0,0 +1,116 @@ +/** + * Event Queue is simply a priority Queue, basic implementation O(n^2). + * @category eventQueue + */ +export default class EventQueue { + constructor(size) { + this.size = size + this.queue = new Array(size) + this.frontIndex = 0 + this.time = 0 + } + + /** + * @param {CircuitElement} obj - the elemnt to be added + * @param {number} delay - the delay in adding an object to queue + */ + add(obj, delay) { + if (obj.queueProperties.inQueue) { + obj.queueProperties.time = + this.time + (delay || obj.propagationDelay) + let i = obj.queueProperties.index + while ( + i > 0 && + obj.queueProperties.time > + this.queue[i - 1].queueProperties.time + ) { + this.swap(i, i - 1) + i-- + } + i = obj.queueProperties.index + while ( + i < this.frontIndex - 1 && + obj.queueProperties.time < + this.queue[i + 1].queueProperties.time + ) { + this.swap(i, i + 1) + i++ + } + return + } + + if (this.frontIndex == this.size) throw 'EventQueue size exceeded' + this.queue[this.frontIndex] = obj + // obj.queueProperties.time=obj.propagationDelay; + obj.queueProperties.time = this.time + (delay || obj.propagationDelay) + obj.queueProperties.index = this.frontIndex + this.frontIndex++ + obj.queueProperties.inQueue = true + let i = obj.queueProperties.index + while ( + i > 0 && + obj.queueProperties.time > this.queue[i - 1].queueProperties.time + ) { + this.swap(i, i - 1) + i-- + } + } + + /** + * To add without any delay. + * @param {CircuitElement} obj - the object to be added + */ + addImmediate(obj) { + this.queue[this.frontIndex] = obj + obj.queueProperties.time = this.time + obj.queueProperties.index = this.frontIndex + obj.queueProperties.inQueue = true + this.frontIndex++ + } + + /** + * Function to swap two objects in queue. + * @param {number} v1 + * @param {number} v2 + */ + swap(v1, v2) { + const obj1 = this.queue[v1] + obj1.queueProperties.index = v2 + + const obj2 = this.queue[v2] + obj2.queueProperties.index = v1 + + this.queue[v1] = obj2 + this.queue[v2] = obj1 + } + + /** + * function to pop element from queue. + */ + pop() { + if (this.isEmpty()) throw 'Queue Empty' + + this.frontIndex-- + const obj = this.queue[this.frontIndex] + this.time = obj.queueProperties.time + obj.queueProperties.inQueue = false + return obj + } + + /** + * function to reset queue. + */ + reset() { + for (let i = 0; i < this.frontIndex; i++) + this.queue[i].queueProperties.inQueue = false + this.time = 0 + this.frontIndex = 0 + } + + /** + * function to check if empty queue. + */ + isEmpty() { + return this.frontIndex == 0 + } +} diff --git a/v1/src/simulator/src/events.js b/v1/src/simulator/src/events.js new file mode 100644 index 00000000..c3c0edca --- /dev/null +++ b/v1/src/simulator/src/events.js @@ -0,0 +1,338 @@ +/* eslint-disable import/no-cycle */ +import Scope, { scopeList, switchCircuit, newCircuit } from './circuit' + +import { loadScope } from './data/load' +import { + scheduleUpdate, + updateSimulationSet, + updateSubcircuitSet, + forceResetNodesSet, +} from './engine' +import { backUp } from './data/backupCircuit' +import { getNextPosition } from './modules' +import { generateId } from './utils' +import simulationArea from './simulationArea' +import { TestbenchData } from './testbench' + +/** + * Helper function to paste + * @param {JSON} copyData - the data to be pasted + * @category events + */ +export function paste(copyData) { + if (copyData === undefined) return + var data = JSON.parse(copyData) + if (!data.logixClipBoardData) return + + var currentScopeId = globalScope.id + for (let i = 0; i < data.scopes.length; i++) { + if (scopeList[data.scopes[i].id] === undefined) { + var isVerilogCircuit = false + var isMainCircuit = false + if (data.scopes[i].verilogMetadata) { + isVerilogCircuit = + data.scopes[i].verilogMetadata.isVerilogCircuit + isMainCircuit = data.scopes[i].verilogMetadata.isMainCircuit + } + var scope = newCircuit( + data.scopes[i].name, + data.scopes[i].id, + isVerilogCircuit, + isMainCircuit + ) + loadScope(scope, data.scopes[i]) + scopeList[data.scopes[i].id] = scope + } + } + + switchCircuit(currentScopeId) + var tempScope = new Scope(globalScope.name, globalScope.id) + var oldOx = globalScope.ox + var oldOy = globalScope.oy + var oldScale = globalScope.scale + loadScope(tempScope, data) + + var prevLength = tempScope.allNodes.length + for (let i = 0; i < tempScope.allNodes.length; i++) { + tempScope.allNodes[i].checkDeleted() + if (tempScope.allNodes.length != prevLength) { + prevLength-- + i-- + } + } + + var approxX = 0 + var approxY = 0 + var count = 0 + + for (let i = 0; i < updateOrder.length; i++) { + for (let j = 0; j < tempScope[updateOrder[i]].length; j++) { + const obj = tempScope[updateOrder[i]][j] + obj.updateScope(globalScope) + if (obj.objectType != 'Wire') { + approxX += obj.x + approxY += obj.y + count++ + } + } + } + + for (let j = 0; j < tempScope.CircuitElement.length; j++) { + const obj = tempScope.CircuitElement[j] + obj.updateScope(globalScope) + } + + approxX /= count + approxY /= count + + approxX = Math.round(approxX / 10) * 10 + approxY = Math.round(approxY / 10) * 10 + + for (let i = 0; i < updateOrder.length; i++) { + for (let j = 0; j < tempScope[updateOrder[i]].length; j++) { + const obj = tempScope[updateOrder[i]][j] + if (obj.objectType !== 'Wire') { + obj.x += simulationArea.mouseX - approxX + obj.y += simulationArea.mouseY - approxY + } + } + } + + Object.keys(tempScope).forEach((l) => { + if ( + tempScope[l] instanceof Array && + l !== 'objects' && + l !== 'CircuitElement' + ) { + globalScope[l].extend(tempScope[l]) + } + }) + for (let i = 0; i < tempScope.Input.length; i++) { + tempScope.Input[i].layoutProperties.y = getNextPosition(0, globalScope) + tempScope.Input[i].layoutProperties.id = generateId() + } + for (let i = 0; i < tempScope.Output.length; i++) { + tempScope.Output[i].layoutProperties.x = globalScope.layout.width + tempScope.Output[i].layoutProperties.id = generateId() + tempScope.Output[i].layoutProperties.y = getNextPosition( + globalScope.layout.width, + globalScope + ) + } + var canvasUpdate = true + updateSimulationSet(true) + updateSubcircuitSet(true) + scheduleUpdate() + globalScope.ox = oldOx + globalScope.oy = oldOy + globalScope.scale = oldScale + + forceResetNodesSet(true) +} +/** + * Helper function for cut + * @param {JSON} copyList - The selected elements + * @category events + */ +export function cut(copyList) { + if (copyList.length === 0) return + var tempScope = new Scope(globalScope.name, globalScope.id) + var oldOx = globalScope.ox + var oldOy = globalScope.oy + var oldScale = globalScope.scale + d = backUp(globalScope) + loadScope(tempScope, d) + scopeList[tempScope.id] = tempScope + + for (let i = 0; i < copyList.length; i++) { + const obj = copyList[i] + if (obj.objectType === 'Node') obj.objectType = 'allNodes' + for (let j = 0; j < tempScope[obj.objectType].length; j++) { + if ( + tempScope[obj.objectType][j].x === obj.x && + tempScope[obj.objectType][j].y === obj.y && + (obj.objectType != 'Node' || obj.type === 2) + ) { + tempScope[obj.objectType][j].delete() + break + } + } + } + tempScope.backups = globalScope.backups + for (let i = 0; i < updateOrder.length; i++) { + let prevLength = globalScope[updateOrder[i]].length // LOL length of list will reduce automatically when deletion starts + for (let j = 0; j < globalScope[updateOrder[i]].length; j++) { + const obj = globalScope[updateOrder[i]][j] + if (obj.objectType != 'Wire') { + // }&&obj.objectType!='CircuitElement'){//}&&(obj.objectType!='Node'||obj.type==2)){ + if (!copyList.contains(globalScope[updateOrder[i]][j])) { + globalScope[updateOrder[i]][j].cleanDelete() + } + } + + if (globalScope[updateOrder[i]].length != prevLength) { + prevLength-- + j-- + } + } + } + + var prevLength = globalScope.wires.length + for (let i = 0; i < globalScope.wires.length; i++) { + globalScope.wires[i].checkConnections() + if (globalScope.wires.length != prevLength) { + prevLength-- + i-- + } + } + + updateSimulationSet(true) + + var data = backUp(globalScope) + data.logixClipBoardData = true + var dependencyList = globalScope.getDependencies() + data.dependencies = {} + Object.keys(dependencyList).forEach((dependency) => { + data.dependencies[dependency] = backUp(scopeList[dependency]) + }) + data.logixClipBoardData = true + data = JSON.stringify(data) + + simulationArea.multipleObjectSelections = [] // copyList.slice(); + simulationArea.copyList = [] // copyList.slice(); + var canvasUpdate = true + updateSimulationSet(true) + globalScope = tempScope + scheduleUpdate() + globalScope.ox = oldOx + globalScope.oy = oldOy + globalScope.scale = oldScale + forceResetNodesSet(true) + // eslint-disable-next-line consistent-return + return data +} +/** + * Helper function for copy + * @param {JSON} copyList - The data to copied + * @param {boolean} cutflag - flase if we want to copy + * @category events + */ +export function copy(copyList, cutflag = false) { + if (copyList.length === 0) return + var tempScope = new Scope(globalScope.name, globalScope.id) + var oldOx = globalScope.ox + var oldOy = globalScope.oy + var oldScale = globalScope.scale + var d = backUp(globalScope) + const oldTestbenchData = globalScope.testbenchData + + loadScope(tempScope, d) + scopeList[tempScope.id] = tempScope + + if (cutflag) { + for (let i = 0; i < copyList.length; i++) { + const obj = copyList[i] + if (obj.objectType === 'Node') obj.objectType = 'allNodes' + for (let j = 0; j < tempScope[obj.objectType].length; j++) { + if ( + tempScope[obj.objectType][j].x === obj.x && + tempScope[obj.objectType][j].y === obj.y && + (obj.objectType != 'Node' || obj.type === 2) + ) { + tempScope[obj.objectType][j].delete() + break + } + } + } + } + tempScope.backups = globalScope.backups + for (let i = 0; i < updateOrder.length; i++) { + let prevLength = globalScope[updateOrder[i]].length // LOL length of list will reduce automatically when deletion starts + for (let j = 0; j < globalScope[updateOrder[i]].length; j++) { + const obj = globalScope[updateOrder[i]][j] + if (obj.objectType != 'Wire') { + // }&&obj.objectType!='CircuitElement'){//}&&(obj.objectType!='Node'||obj.type==2)){ + if (!copyList.contains(globalScope[updateOrder[i]][j])) { + globalScope[updateOrder[i]][j].cleanDelete() + } + } + + if (globalScope[updateOrder[i]].length != prevLength) { + prevLength-- + j-- + } + } + } + + var prevLength = globalScope.wires.length + for (let i = 0; i < globalScope.wires.length; i++) { + globalScope.wires[i].checkConnections() + if (globalScope.wires.length != prevLength) { + prevLength-- + i-- + } + } + + updateSimulationSet(true) + + var data = backUp(globalScope) + data.scopes = [] + var dependencyList = {} + var requiredDependencies = globalScope.getDependencies() + var completed = {} + Object.keys(scopeList).forEach((id) => { + dependencyList[id] = scopeList[id].getDependencies() + }) + function saveScope(id) { + if (completed[id]) return + for (let i = 0; i < dependencyList[id].length; i++) { + saveScope(dependencyList[id][i]) + } + completed[id] = true + data.scopes.push(backUp(scopeList[id])) + } + for (let i = 0; i < requiredDependencies.length; i++) { + saveScope(requiredDependencies[i]) + } + data.logixClipBoardData = true + data.testbenchData = undefined // Don't copy testbench data + data = JSON.stringify(data) + simulationArea.multipleObjectSelections = [] // copyList.slice(); + simulationArea.copyList = [] // copyList.slice(); + var canvasUpdate = true + updateSimulationSet(true) + globalScope = tempScope + scheduleUpdate() + globalScope.ox = oldOx + globalScope.oy = oldOy + globalScope.scale = oldScale + // Restore testbench data + if (oldTestbenchData) { + globalScope.testbenchData = new TestbenchData( + oldTestbenchData.testData, + oldTestbenchData.currentGroup, + oldTestbenchData.currentCase + ) + } + + forceResetNodesSet(true) + // needs to be fixed + // eslint-disable-next-line consistent-return + return data +} + +/** + * Function selects all the elements from the scope + * @category events + */ +export function selectAll(scope = globalScope) { + moduleList.forEach((val, _, __) => { + if (scope.hasOwnProperty(val)) { + simulationArea.multipleObjectSelections.push(...scope[val]) + } + }) + + if (scope.nodes) { + simulationArea.multipleObjectSelections.push(...scope.nodes) + } +} diff --git a/v1/src/simulator/src/file/Open.js b/v1/src/simulator/src/file/Open.js new file mode 100644 index 00000000..c371be16 --- /dev/null +++ b/v1/src/simulator/src/file/Open.js @@ -0,0 +1,96 @@ +/* **************************************************************************************************** */ +/* Implemented in ImportProject.vue Kept for reference in case any bugs occur */ +/* TODO: Remove this file after testing */ +/* **************************************************************************************************** */ + +// import load from '../data/load' +// import { generateSaveData } from '../data/save' +// import { escapeHtml } from '../ux' + +// const scopeSchema = [ +// 'layout', +// 'verilogMetadata', +// 'allNodes', +// 'id', +// 'name', +// 'restrictedCircuitElementsUsed', +// 'nodes', +// ] +// const JSONSchema = [ +// 'name', +// 'timePeriod', +// 'clockEnabled', +// 'projectId', +// 'focussedCircuit', +// 'orderedTabs', +// 'scopes', +// ] + +// var circuitData = null +// const GetDialogData = () => +// '

Browse files or Drag & Drop files here
No file chosen!!
' + +// const ImportCircuitFiles = () => { +// $('#ImportCircuitFilesDialog').empty() +// $('#ImportCircuitFilesDialog').append(GetDialogData()) +// $('#ImportCircuitFilesDialog').dialog({ +// resizable: false, +// close() { +// if (circuitData) load(circuitData) +// }, +// buttons: [ +// { +// text: 'Close', +// click() { +// $(this).dialog('close') +// }, +// }, +// ], +// }) +// $('#ImportCircuitFilesDialog').focus() + +// function ValidateData(fileData) { +// try { +// const parsedFileDate = JSON.parse(fileData) +// if ( +// JSON.stringify(Object.keys(parsedFileDate)) !== +// JSON.stringify(JSONSchema) +// ) +// throw new Error('Invalid JSON data') +// parsedFileDate.scopes.forEach((scope) => { +// const keys = Object.keys(scope) // get scope keys +// scopeSchema.forEach((key) => { +// if (!keys.includes(key)) +// throw new Error('Invalid Scope data') +// }) +// }) +// load(parsedFileDate) +// return true +// } catch (error) { +// $('#message').text('Invalid file format') +// return false +// } +// } + +// function receivedText(e) { +// // backUp data +// const backUp = JSON.parse( +// generateSaveData(escapeHtml($('#projectName').text()).trim(), false) +// ) +// const valid = ValidateData(e.target.result) // validate data +// if (!valid) { +// // fallback +// load(backUp) +// } else { +// $('#ImportCircuitFilesDialog').dialog('close') +// } +// } +// $('#CircuitDataFile').on('change', (event) => { +// var File = event.target.files[0] +// var fr = new FileReader() +// fr.onload = receivedText +// fr.readAsText(File) +// }) +// } + +// export default ImportCircuitFiles diff --git a/v1/src/simulator/src/file/SaveAs.js b/v1/src/simulator/src/file/SaveAs.js new file mode 100644 index 00000000..d94696a7 --- /dev/null +++ b/v1/src/simulator/src/file/SaveAs.js @@ -0,0 +1,54 @@ +/* **************************************************************************************************** */ +/* Implemented in ExportProject.vue Kept for reference in case any bugs occur */ +/* TODO: Remove this file after testing */ +/* **************************************************************************************************** */ + +// import { download, generateSaveData } from '../data/save' +// import { escapeHtml } from '../ux' + +// const GetDialogData = () => { +// const fileName = `${$('#projectName').text().trim()}.cv` +// const Input = document.createElement('input') +// Input.type = 'text' +// Input.name = 'fileName' +// Input.setAttribute('placeholder', fileName) +// Input.id = 'filename' +// Input.defaultValue = fileName +// const Label = document.createElement('label') +// Label.setAttribute('for', 'filename') +// Label.textContent = 'File Name' +// const container = document.createElement('div') +// container.appendChild(Label) +// container.appendChild(Input) +// return container +// } + +// /** +// * To Export Circuit Files +// */ +// const ExportCircuitFiles = () => { +// $('#ExportCircuitFilesDialog').empty() +// $('#ExportCircuitFilesDialog').append(GetDialogData()) +// $('#ExportCircuitFilesDialog').dialog({ +// resizable: false, +// buttons: [ +// { +// text: 'Save', +// click() { +// var fileName = +// escapeHtml($('#filename').val()) || 'untitled' +// const circuitData = generateSaveData( +// fileName.split('.')[0], +// false +// ) +// fileName = `${fileName.split('.')[0]}.cv` +// download(fileName, circuitData) +// $(this).dialog('close') +// }, +// }, +// ], +// }) +// $('#ExportCircuitFilesDialog').focus() +// } + +// export default ExportCircuitFiles diff --git a/v1/src/simulator/src/hotkey_binder/defaultKeys.js b/v1/src/simulator/src/hotkey_binder/defaultKeys.js new file mode 100644 index 00000000..0529ce5f --- /dev/null +++ b/v1/src/simulator/src/hotkey_binder/defaultKeys.js @@ -0,0 +1,29 @@ +/**Add more elements here, along with a valid value for key + * Elements keys must have the same name as their ID + **/ + +export const defaultKeys = { + 'New Circuit': 'Shift + N', + 'Save Online': 'Ctrl + S', + 'Save Offline': 'Ctrl + Alt + S', + 'Download as Image': 'Ctrl + D', + 'Open Offline': 'Ctrl + O', + 'Insert Sub-circuit': 'Shift + C', + 'Combinational Analysis': 'Shift + A', + // "Start Plot": "Ctrl + P", + 'Direction Up': 'Up', + 'Direction Down': 'Down', + 'Direction Left': 'Left', + 'Direction Right': 'Right', + 'Insert Label': 'Ctrl + L', + 'Label Direction Up': 'Alt + Up', + 'Label Direction Down': 'Alt + Down', + 'Label Direction Left': 'Alt + Left', + 'Label Direction Right': 'Alt + Right', + 'Move Element Up': 'Shift + Up', + 'Move Element Down': 'Shift + Down', + 'Move Element Left': 'Shift + Left', + 'Move Element Right': 'Shift + Right', + 'Hotkey Preference': 'F8', + 'Open Documentation': 'F1', +} diff --git a/v1/src/simulator/src/hotkey_binder/documentation.txt b/v1/src/simulator/src/hotkey_binder/documentation.txt new file mode 100644 index 00000000..f4af3be9 --- /dev/null +++ b/v1/src/simulator/src/hotkey_binder/documentation.txt @@ -0,0 +1,45 @@ +The feature includes two libraries: +1. shortcuts.plugin.js: It consists of a few function(s) + a. Add + b. Remove + c. RemoveAll + +a. function Add takes 3 arguments: + shortcut_combination: eg "Ctrl + X" + callback: reference to a function, which will be invoked when the above combination is detected + opt: some optional parameters such as propagation, type of keyevent, etc + +b. function Remove: removes a particular shortcut provided in the param. +c. function RemoveAll: takes no param removes all shortcuts. + +supported format: + * Modifier + * Modifier + key + * Single key + +2. normalizer.plugin.js: is used in keyBinder.js (line 73), to detect the shortcut_combination in string format + which is then passed to the shortcuts plugin. + +MAIN FILEs: + keyBinder.js is the controller, it performs operation that are defined in other files (model, view) + It consist of the keydown listener which detects while user is customizing the keys from the preference panel, + * checks for restrictions + * warns override + * restricts non-overridable combinations + * Others + +USAGE: + TO ADD SHORCUTS: + #1 add the shortcut in the defaultKeys.json file + #2 Assign the callback in addShorcut.js: + * the callback should be a func reference,if function to be invoked is already defined in the codebase just set it as it is. (for some func reference may not work, refer next step) + + *for callback not present in the codebase, or is present but doesn't work as intended, defined the function that will invoke the required callback in action.js, note that callback must be func reference hence define it as a higher-order func if necessary in action.js + TO REMOVE SHORCUTS: + #1. Remove the option from defaultKeys.json + #2. Remove the case from addShortcut.js + RESTRICTION: + To add restriction to any combination, mention it in utils.js -> checkRestricted func, which contains an array that consists of restricted combination, push to the array. + +*The feature make uses of localstorage for persistence, only defaultkeys else userkeys will be present in localstorage not both. +On load IFFE func on keyBinder.js (line 111) will check for userKeys, if found it it will be set, else defaultkeys will be set. \ No newline at end of file diff --git a/v1/src/simulator/src/hotkey_binder/keyBinder.js b/v1/src/simulator/src/hotkey_binder/keyBinder.js new file mode 100644 index 00000000..f4653fb7 --- /dev/null +++ b/v1/src/simulator/src/hotkey_binder/keyBinder.js @@ -0,0 +1,151 @@ +// import { +// editPanel, +// heading, +// markUp, +// closeEdit, +// submit, +// updateHTML, +// override, +// } from './view/panel.ui' +// import { setDefault, checkUpdate, addKeys, warnOverride } from './model/actions' +// import { KeyCode } from './model/normalize/normalizer.plugin.js' +// import { checkRestricted } from './model/utils.js' +// import { SimulatorStore } from '#/store/SimulatorStore/SimulatorStore' + +//** keyBinder dialog */ +// export function keyBinder() { + // const simulatorStore = SimulatorStore() + // simulatorStore.dialogBox.customshortcut_dialog = true + // $('#customShortcutDialog').append(editPanel) + // $('#customShortcutDialog').append(heading) + // $('#customShortcutDialog').append(markUp) + // $('#customShortcut').on('click', () => { + // closeEdit() + // $('#customShortcutDialog').dialog({ + // resizable: false, + // buttons: [ + // { + // text: 'Reset to default', + // click: () => { + // if ( + // confirm( + // 'Remove all custom keys & set the default keys?' + // ) + // ) + // setDefault() + // }, + // id: 'resetDefault', + // }, + // { + // text: 'Save', + // click: () => { + // submit() + // $('#customShortcutDialog').dialog('close') + // }, + // id: 'submitBtn', + // }, + // ], + // }) + // $('#customShortcutDialog').css('display', 'flex') + // }) + + // //** targetPref is assigned to the target key option to be edited */ + // let targetPref = null + // $('#preference').on('click', (e) => { + // $('#pressedKeys').text('') + // $('#warning').text('') + // $('#edit').css('border', 'none') + // $('#edit').css('display', 'block') + // $($('#edit')).focus() + // ;[, targetPref] = e.target.closest('div').children + // }) + + // //*** Modifiers restriction enabled here */ + // //*** below fn works in the edit panel where user enters key combo, + // //*** responsible for checking duplicate entries, overriding entries, checking restricted keys, arranging keys in + // //*** proper order, validating key combos */ + + // $('#edit').keydown((e) => { + // e = e || window.event + // e.stopPropagation() + // e.preventDefault() + // var k = KeyCode + // let modifiers = ['CTRL', 'ALT', 'SHIFT', 'META'] + // $('#edit').css('animation', 'none') + // $('#warning').text('') + // if (e.keyCode === 27) closeEdit() + // if (e.keyCode === 13) { + // if ($('#pressedKeys').text() === '') { + // $('#warning').text('Please enter some key(s)') + // $('#edit').css('animation', 'shake .3s linear') + // return + // } + // if (!checkRestricted($('#pressedKeys').text())) { + // override($('#pressedKeys').text()) + // targetPref.innerText = $('#pressedKeys').text() + // $('#pressedKeys').text('') + // $('#edit').css('display', 'none') + // } else { + // $('#warning').text('Please enter different key(s).') + // $('#edit').css('animation', 'shake .3s linear') + // $('#pressedKeys').text('') + // } + // } + // const currentKey = + // k.hot_key(k.translate_event(e)).split('+').join(' + ') !== 'Enter' + // ? k.hot_key(k.translate_event(e)).split('+').join(' + ') + // : '' + // if ( + // $('#pressedKeys').text().split(' + ').length === 2 && + // !modifiers.includes(currentKey) && + // modifiers.includes($('#pressedKeys').text().split(' + ')[1]) + // ) { + // $('#pressedKeys').append(` + ${currentKey}`) + // } else if (modifiers.includes($('#pressedKeys').text())) { + // modifiers = modifiers.filter( + // (mod) => mod === $('#pressedKeys').text() + // ) + // if (!modifiers.includes(currentKey)) { + // $('#pressedKeys').append(` + ${currentKey}`) + // } + // } else { + // $('#pressedKeys').text('') + // $('#pressedKeys').text(currentKey) + // } + // if (!$('#pressedKeys').text()) { + // $('#pressedKeys').text(currentKey) + // } + // if ( + // ($('#pressedKeys').text().split(' + ').length === 2 && + // ['Ctrl', 'Meta'].includes( + // $('#pressedKeys').text().split(' + ')[1] + // )) || + // ($('#pressedKeys').text().split(' + ')[0] === 'Alt' && + // $('#pressedKeys').text().split(' + ')[1] === 'Shift') + // ) { + // $('#pressedKeys').text( + // $('#pressedKeys').text().split(' + ').reverse().join(' + ') + // ) + // } + // warnOverride($('#pressedKeys').text(), targetPref) + // if (checkRestricted($('#pressedKeys').text())) { + // $('#warning').text( + // 'The above combination is a system default shortcut & cannot be set.' + // ) + // } + // }) + + // //** if users closes hotkey dialog by making changes & not saving them, fn will fallback to previous state */ + + // $('div#customShortcutDialog').on('dialogclose', function (event) { + // if (localStorage.userKeys) { + // updateHTML('user') + // } else updateHTML('default') + // }) + + // // Set up shortcuts + // if (localStorage.userKeys) { + // checkUpdate() + // addKeys('user') + // } else setDefault() +// } diff --git a/v1/src/simulator/src/hotkey_binder/model/actions.js b/v1/src/simulator/src/hotkey_binder/model/actions.js new file mode 100644 index 00000000..102209ee --- /dev/null +++ b/v1/src/simulator/src/hotkey_binder/model/actions.js @@ -0,0 +1,205 @@ +import { defaultKeys } from '../defaultKeys' +import { addShortcut } from './addShortcut' +import { updateHTML } from '../view/panel.ui' +import simulationArea from '../../simulationArea' +import { + scheduleUpdate, + update, + updateSelectionsAndPane, + wireToBeCheckedSet, + updatePositionSet, + updateSimulationSet, + updateCanvasSet, + gridUpdateSet, + errorDetectedSet, +} from '../../engine' + +import { getOS } from './utils.js' +import { shortcut } from './shortcuts.plugin.js' +/** + * Function used to add or change keys user or default + * grabs the keycombo from localstorage & + * calls the addShortcut function in a loop to bind them + * @param {string} mode - user custom keys or default keys + */ +export const addKeys = (mode) => { + shortcut.removeAll() + if (mode === 'user') { + localStorage.removeItem('defaultKeys') + let userKeys = localStorage.get('userKeys') + for (let pref in userKeys) { + let key = userKeys[pref] + key = key.split(' ').join('') + addShortcut(key, pref) + } + updateHTML('user') + } else if (mode == 'default') { + if (localStorage.userKeys) localStorage.removeItem('userKeys') + let defaultKeys = localStorage.get('defaultKeys') + for (let pref in defaultKeys) { + let key = defaultKeys[pref] + key = key.split(' ').join('') + addShortcut(key, pref) + } + updateHTML('default') + } +} +/** + * Function used to check if new keys are added, adds missing keys if added + */ +export const checkUpdate = () => { + const userK = localStorage.get('userKeys') + if (Object.size(userK) !== Object.size(defaultKeys)) { + for (const [key, value] of Object.entries(defaultKeys)) { + if (!Object.keys(userK).includes(key)) { + userK[key] = value + } + } + localStorage.set('userKeys', userK) + } else { + return + } +} +/** + * Function used to set userKeys, grabs the keycombo from the panel UI + * sets it to the localStorage & cals addKeys + * removes the defaultkeys from localStorage + */ +export const setUserKeys = () => { + if (localStorage.defaultKeys) localStorage.removeItem('defaultKeys') + let userKeys = {} + let x = 0 + while ($('#preference').children()[x]) { + userKeys[ + $('#preference').children()[x].children[1].children[0].innerText + ] = $('#preference').children()[x].children[1].children[1].innerText + x++ + } + localStorage.set('userKeys', userKeys) + addKeys('user') +} +/** + * Function used to set defaultKeys, grabs the keycombo from the defaultkeys metadata + * sets it to the localStorage & cals addKeys + * removes the userkeys from localStorage if present + * also checks for OS type + */ +export const setDefault = () => { + if (localStorage.userKeys) localStorage.removeItem('userKeys') + if (getOS() === 'MacOS') { + const macDefaultKeys = {} + for (let [key, value] of Object.entries(defaultKeys)) { + if (value.split(' + ')[0] == 'Ctrl'); + macDefaultKeys[key] = + value.split(' + ')[0] == 'Ctrl' + ? value.replace('Ctrl', 'Meta') + : value + localStorage.set('defaultKeys', macDefaultKeys) + } + } else { + localStorage.set('defaultKeys', defaultKeys) //TODO add a confirmation alert + } + addKeys('default') +} +/** + * function to check if user entered keys are already assigned to other key + * gives a warning message if keys already assigned + * @param {string} combo the key combo + * @param {string} target the target option of the panel + */ +export const warnOverride = (combo, target, warning) => { + let x = 0 + while ($('#preference').children()[x]) { + if ( + $('#preference').children()[x].children[1].children[1].innerText === + combo && + $('#preference').children()[x].children[1].children[0].innerText !== + target.previousElementSibling.innerText + ) { + const assignee = + $('#preference').children()[x].children[1].children[0].innerText + // $('#warning').text( + // `This key(s) is already assigned to: ${assignee}, press Enter to override.` + // ) + warning.value = `This key(s) is already assigned to: ${assignee}, press Enter to override.` + $('#edit').css('border', '1.5px solid #dc5656') + return + } else { + $('#edit').css('border', 'none') + } + x++ + } +} + +export const elementDirection = (direct) => () => { + if (simulationArea.lastSelected) { + simulationArea.lastSelected.newDirection(direct.toUpperCase()) + $("select[name |= 'newDirection']").val(direct.toUpperCase()) + updateSystem() + } +} + +export const labelDirection = (direct) => () => { + if ( + simulationArea.lastSelected && + !simulationArea.lastSelected.labelDirectionFixed + ) { + simulationArea.lastSelected.labelDirection = direct.toUpperCase() + $("select[name |= 'newLabelDirection']").val(direct.toUpperCase()) + updateSystem() + } +} + +export const insertLabel = () => { + if (simulationArea.lastSelected) { + $("input[name |= 'setLabel']").focus() + $("input[name |= 'setLabel']").val().length + ? null + : $("input[name |= 'setLabel']").val('Untitled') + $("input[name |= 'setLabel']").select() + updateSystem() + } +} + +export const moveElement = (direct) => () => { + if (simulationArea.lastSelected) { + switch (direct) { + case 'up': + simulationArea.lastSelected.y -= 10 + break + case 'down': + simulationArea.lastSelected.y += 10 + break + case 'left': + simulationArea.lastSelected.x -= 10 + break + case 'right': + simulationArea.lastSelected.x += 10 + break + } + updateSystem() + } +} + +export const openHotkey = () => $('#customShortcut').trigger('click') + +export const createNewCircuitScopeCall = () => + $('#createNewCircuitScope').trigger('click') // TODO: remove later + +export const openDocumentation = () => { + if ( + simulationArea.lastSelected == undefined || + simulationArea.lastSelected.helplink == undefined + ) { + // didn't select any element or documentation not found + window.open('https://docs.circuitverse.org/', '_blank') + } else { + window.open(simulationArea.lastSelected.helplink, '_blank') + } +} + +function updateSystem() { + updateCanvasSet(true) + wireToBeCheckedSet(1) + scheduleUpdate(1) +} diff --git a/v1/src/simulator/src/hotkey_binder/model/addShortcut.js b/v1/src/simulator/src/hotkey_binder/model/addShortcut.js new file mode 100644 index 00000000..27834ab1 --- /dev/null +++ b/v1/src/simulator/src/hotkey_binder/model/addShortcut.js @@ -0,0 +1,102 @@ +// import { shortcut } from './Shortcuts.plugin'; +// import createSaveAsImgPrompt from '../../data/saveImage'; +//Assign the callback func for the keymap here +import { + createNewCircuitScopeCall, + elementDirection, + insertLabel, + labelDirection, + openHotkey, + moveElement, + openDocumentation, +} from './actions' +import save from '../../data/save' +import { saveOffline, openOffline } from '../../data/project' +import createSaveAsImgPrompt from '../../data/saveImage' +import { createSubCircuitPrompt } from '../../subcircuit' +import { createCombinationalAnalysisPrompt } from '../../combinationalAnalysis' +import { shortcut } from './shortcuts.plugin.js' + +export const addShortcut = (keys, action) => { + let callback + switch (action) { + case 'New Circuit': + callback = createNewCircuitScopeCall // TODO: directly call rather than using dom click + break + case 'Save Online': + callback = save + break + case 'Save Offline': + callback = saveOffline + break + case 'Download as Image': + callback = createSaveAsImgPrompt + break + case 'Open Offline': + callback = openOffline + break + case 'Insert Sub-circuit': + callback = createSubCircuitPrompt + break + case 'Combinational Analysis': + callback = createCombinationalAnalysisPrompt + break //bug + // case "Start Plot": + // callback = startPlot; + // break; + case 'Direction Up': + callback = elementDirection('up') + break + case 'Direction Down': + callback = elementDirection('down') + break + case 'Direction Left': + callback = elementDirection('left') + break + case 'Direction Right': + callback = elementDirection('right') + break + case 'Insert Label': + callback = insertLabel + break + case 'Label Direction Up': + callback = labelDirection('up') + break + case 'Label Direction Down': + callback = labelDirection('down') + break + case 'Label Direction Left': + callback = labelDirection('left') + break + case 'Label Direction Right': + callback = labelDirection('right') + break + case 'Move Element Up': + callback = moveElement('up') + break + case 'Move Element Down': + callback = moveElement('down') + break + case 'Move Element Left': + callback = moveElement('left') + break + case 'Move Element Right': + callback = moveElement('right') + break + case 'Hotkey Preference': + callback = openHotkey + break + case 'Open Documentation': + callback = openDocumentation + break + default: + callback = () => console.log('No shortcut found..') + break + } + shortcut.add(keys, callback, { + type: 'keydown', + propagate: false, + target: document, + disable_in_input: true, + }) +} diff --git a/v1/src/simulator/src/hotkey_binder/model/normalize/normalizer.plugin.js b/v1/src/simulator/src/hotkey_binder/model/normalize/normalizer.plugin.js new file mode 100644 index 00000000..cc9a7def --- /dev/null +++ b/v1/src/simulator/src/hotkey_binder/model/normalize/normalizer.plugin.js @@ -0,0 +1,389 @@ +/** + * This plugin has been modified to support metakeys + */ + +/* + * Library to normalize key codes across browsers. This works with keydown + * events; keypress events are not fired for all keys, and the codes are + * different for them. It returns an object with the following fields: + * { int code, bool shift, bool alt, bool ctrl }. The normalized keycodes + * obey the following rules: + * + * For alphabetic characters, the ASCII code of the uppercase version + * + * For codes that are identical across all browsers (this includes all + * modifiers, esc, delete, arrows, etc.), the common keycode + * + * For numeric keypad keys, the value returned by numkey(). + * (Usually 96 + the number) + * + * For symbols, the ASCII code of the character that appears when shift + * is not held down, EXCEPT for '" => 222 (conflicts with right-arrow/pagedown), + * .> => 190 (conflicts with Delete) and `~ => 126 (conflicts with Num0). + * + * Basic usage: + * document.onkeydown = function(e) { + * do_something_with(KeyCode.translateEvent(e) + * }; + * + * The naming conventions for functions use 'code' to represent an integer + * keycode, 'key' to represent a key description (specified above), and 'e' + * to represent an event object. + * + * There's also functionality to track and detect which keys are currently + * being held down: install 'key_up' and 'key_down' on their respective event + * handlers, and then check with 'is_down'. + * + * @fileoverview + * @author Jonathan Tang + * @version 0.9 + * @license BSD + */ + +/* +Copyright (c) 2008 Jonathan Tang +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +var modifiers = ['ctrl', 'alt', 'shift', 'meta'], + KEY_MAP = {}, + shifted_symbols = { + 58: 59, // : -> ; + 43: 61, // = -> + + 60: 44, // < -> , + 95: 45, // _ -> - + 62: 46, // > -> . + 63: 47, // ? -> / + 96: 192, // ` -> ~ + 124: 92, // | -> \ + 39: 222, // ' -> 222 + 34: 222, // " -> 222 + 33: 49, // ! -> 1 + 64: 50, // @ -> 2 + 35: 51, // # -> 3 + 36: 52, // $ -> 4 + 37: 53, // % -> 5 + 94: 54, // ^ -> 6 + 38: 55, // & -> 7 + 42: 56, // * -> 8 + 40: 57, // ( -> 9 + 41: 58, // ) -> 0 + 123: 91, // { -> [ + 125: 93, // } -> ] + } + +function isLower(ascii) { + return ascii >= 97 && ascii <= 122 +} +function capitalize(str) { + return str.substr(0, 1).toUpperCase() + str.substr(1).toLowerCase() +} + +var is_gecko = navigator.userAgent.indexOf('Gecko') != -1, + is_ie = navigator.userAgent.indexOf('MSIE') != -1, + is_windows = navigator.platform.indexOf('Win') != -1, + is_opera = window.opera && window.opera.version() < 9.5, + is_konqueror = navigator.vendor && navigator.vendor.indexOf('KDE') != -1, + is_icab = navigator.vendor && navigator.vendor.indexOf('iCab') != -1 + +var GECKO_IE_KEYMAP = { + 186: 59, // ;: in IE + 187: 61, // =+ in IE + 188: 44, // ,< + 109: 95, // -_ in Mozilla + 107: 61, // =+ in Mozilla + 189: 95, // -_ in IE + 190: 62, // .> + 191: 47, // /? + 192: 126, // `~ + 219: 91, // {[ + 220: 92, // \| + 221: 93, // }] +} + +var OPERA_KEYMAP = {} + +// Browser detection taken from quirksmode.org +if (is_opera && is_windows) { + KEY_MAP = OPERA_KEYMAP +} else if (is_opera || is_konqueror || is_icab) { + var unshift = [ + 33, 64, 35, 36, 37, 94, 38, 42, 40, 41, 58, 43, 60, 95, 62, 63, 124, 34, + ] + KEY_MAP = OPERA_KEYMAP + for (var i = 0; i < unshift.length; ++i) { + KEY_MAP[unshift[i]] = shifted_symbols[unshift[i]] + } +} else { + // IE and Gecko are close enough that we can use the same map for both, + // and the rest of the world (eg. Opera 9.50) seems to be standardizing + // on them + KEY_MAP = GECKO_IE_KEYMAP +} + +if (is_konqueror) { + KEY_MAP[0] = 45 + KEY_MAP[127] = 46 + KEY_MAP[45] = 95 +} + +var key_names = { + 32: 'SPACE', + 13: 'ENTER', + 9: 'TAB', + 8: 'BACKSPACE', + 16: 'SHIFT', + 17: 'CTRL', + 18: 'ALT', + 20: 'CAPS_LOCK', + 144: 'NUM_LOCK', + 145: 'SCROLL_LOCK', + 37: 'LEFT', + 38: 'UP', + 39: 'RIGHT', + 40: 'DOWN', + 33: 'PAGE_UP', + 34: 'PAGE_DOWN', + 36: 'HOME', + 35: 'END', + 45: 'INSERT', + 46: 'DELETE', + 27: 'ESCAPE', + 19: 'PAUSE', + 222: "'", + 91: 'META', +} +function fn_name(code) { + if (code >= 112 && code <= 123) return 'F' + (code - 111) + return false +} +function num_name(code) { + if (code >= 96 && code < 106) return 'Num' + (code - 96) + switch (code) { + case 106: + return 'Num*' + case 111: + return 'Num/' + case 110: + return 'Num.' + default: + return false + } +} + +var current_keys = { + codes: {}, + ctrl: false, + alt: false, + shift: false, + meta: false, +} + +function update_current_modifiers(key) { + current_keys.ctrl = key.ctrl + current_keys.alt = key.alt + current_keys.shift = key.shift + current_keys.meta = key.meta +} + +function same_modifiers(key1, key2) { + return ( + key1.ctrl === key2.ctrl && + key1.alt === key2.alt && + key1.shift === key2.shift && + key1.meta === key2.meta + ) +} + +if (typeof window.KeyCode != 'undefined') { + var _KeyCode = window.KeyCode +} + +export const KeyCode = { + no_conflict: function () { + window.KeyCode = _KeyCode + return KeyCode + }, + + /** Generates a function key code from a number between 1 and 12 */ + fkey: function (num) { + return 111 + num + }, + + /** + * Generates a numeric keypad code from a number between 0 and 9. + * Also works for (some) arithmetic operators. The mappings are: + * + * *: 106, /: 111, .: 110 + * + * + and - are not supported because the keycodes generated by Mozilla + * conflict with the non-keypad codes. The same applies to all the + * arithmetic keypad keys on Konqueror and early Opera. + */ + numkey: function (num) { + switch (num) { + case '*': + return 106 + case '/': + return 111 + case '.': + return 110 + default: + return 96 + num + } + }, + + /** + * Generates a key code from the ASCII code of (the first character of) a + * string. + */ + key: function (str) { + var c = str.charCodeAt(0) + if (isLower(c)) return c - 32 + return shifted_symbols[c] || c + }, + + /** Checks if two key objects are equal. */ + key_equals: function (key1, key2) { + return key1.code == key2.code && same_modifiers(key1, key2) + }, + + /** Translates a keycode to its normalized value. */ + translate_key_code: function (code) { + return KEY_MAP[code] || code + }, + + /** + * Translates a keyDown event to a normalized key event object. The + * object has the following fields: + * { int code; boolean shift, boolean alt, boolean ctrl } + */ + translate_event: function (e) { + e = e || window.event + var code = e.which || e.keyCode + return { + code: KeyCode.translate_key_code(code), + shift: e.shiftKey, + alt: e.altKey, + ctrl: e.ctrlKey, + meta: e.metaKey, + } + }, + + /** + * Keydown event listener to update internal state of which keys are + * currently pressed. + */ + + key_down: function (e) { + var key = KeyCode.translate_event(e) + current_keys.codes[key.code] = key.code + update_current_modifiers(key) + }, + + /** + * Keyup event listener to update internal state. + */ + key_up: function (e) { + var key = KeyCode.translate_event(e) + delete current_keys.codes[key.code] + update_current_modifiers(key) + }, + + /** + * Returns true if the key spec (as returned by translate_event) is + * currently held down. + */ + is_down: function (key) { + var code = key.code + if (code == KeyCode.CTRL) return current_keys.ctrl + if (code == KeyCode.ALT) return current_keys.alt + if (code == KeyCode.SHIFT) return current_keys.shift + + return ( + current_keys.codes[code] !== undefined && + same_modifiers(key, current_keys) + ) + }, + + /** + * Returns a string representation of a key event suitable for the + * shortcut.js or JQuery HotKeys plugins. Also makes a decent UI display. + */ + hot_key: function (key) { + var pieces = [] + for (var i = 0; i < modifiers.length; ++i) { + var modifier = modifiers[i] + if ( + key[modifier] && + modifier.toUpperCase() != key_names[key.code] + ) { + pieces.push(capitalize(modifier)) + } + } + + var c = key.code + var key_name = + key_names[c] || fn_name(c) || num_name(c) || String.fromCharCode(c) + pieces.push(capitalize(key_name)) + return pieces.join('+') + }, +} + +// Add key constants +for (var code in key_names) { + KeyCode[key_names[code]] = code +} + +// var fields = ['charCode', 'keyCode', 'which', 'type', 'timeStamp', +// 'altKey', 'ctrlKey', 'shiftKey', 'metaKey']; +// var types = ['keydown', 'keypress', 'keyup']; + +// function show_event(type) { +// return function(e) { +// var lines = []; +// for(var i = 0; i < fields.length; ++i) { +// lines.push('' + fields[i] + ': ' + e[fields[i]] + '
'); +// } +// document.getElementByI(type).innerHTML = lines.join('\n'); +// return false; +// } +// }; + +// function show_is_key_down(id, code, ctrl, alt, shift) { +// document.getElementById(id + '_down').innerHTML = KeyCode.is_down({ +// code: code, +// ctrl: ctrl, +// alt: alt, +// shift: shift +// }); +// }; + +// function update_key_downs() { +// show_is_key_down('x', KeyCode.key('x'), false, false, false); +// show_is_key_down('shift_x', KeyCode.key('x'), false, false, true); +// show_is_key_down('shift_c', KeyCode.key('c'), false, false, true); +// show_is_key_down('ctrl_a', KeyCode.key('a'), true, false, false); +// }; diff --git a/v1/src/simulator/src/hotkey_binder/model/shortcuts.plugin.js b/v1/src/simulator/src/hotkey_binder/model/shortcuts.plugin.js new file mode 100644 index 00000000..f80d37bd --- /dev/null +++ b/v1/src/simulator/src/hotkey_binder/model/shortcuts.plugin.js @@ -0,0 +1,250 @@ +/** + * http://www.openjs.com/scripts/events/keyboard_shortcuts/ + * Version : 2.01.B + * By Binny V A + * License : BSD + */ + +/** + * Restrictions: + * The shortcut key combination should be specified in this format ... Modifier[+Modifier..]+Key. + * Can have a single key without Modifier .. Key, not Key + Key + * These restrictions must be be hardcoded to not let users input invalid key combo + * There is no way to override Ctrl+N, Ctrl+T, or Ctrl+W in Google Chrome since version 4 of Chrome (shipped in 2010). + * + **/ + +//*! This plugin has been modified + +export const shortcut = { + all_shortcuts: {}, //All the shortcuts are stored in this array ex. download : keycombo; + add: function (shortcut_combination, callback, opt) { + //Provide a set of default options + var default_options = { + type: 'keydown', + propagate: false, + disable_in_input: true, + target: document, + keycode: false, + } + + if (!opt) opt = default_options + else { + for (var dfo in default_options) { + if (typeof opt[dfo] == 'undefined') + opt[dfo] = default_options[dfo] + } + } + + var ele = opt.target + if (typeof opt.target == 'string') + ele = document.getElementById(opt.target) + var ths = this + shortcut_combination = shortcut_combination.toLowerCase() + + //The function to be called at keypress + var func = function (e) { + e = e || window.event + if (opt['disable_in_input']) { + //Don't enable shortcut keys in Input, Textarea fields + var element + if (e.target) element = e.target + else if (e.srcElement) element = e.srcElement + if (element.nodeType == 3) element = element.parentNode + + if (element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') + return + } + + let code = '' + //Find Which key is pressed + if (e.keyCode) code = e.keyCode + else if (e.which) code = e.which + var character = String.fromCharCode(code).toLowerCase() + // e.preventDefault(); + + if (code == 188) character = ',' //If the user presses , when the type is onkeydown + if (code == 190) character = '.' //If the user presses , when the type is onkeydown + + var keys = shortcut_combination.split('+') + //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked + var kp = 0 + + //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken + var shift_nums = { + '`': '~', + 1: '!', + 2: '@', + 3: '#', + 4: '$', + 5: '%', + 6: '^', + 7: '&', + 8: '*', + 9: '(', + 0: ')', + '-': '_', + '=': '+', + ';': ':', + "'": '"', + ',': '<', + '.': '>', + '/': '?', + '\\': '|', + } + //Special Keys - and their codes + var special_keys = { + esc: 27, + escape: 27, + tab: 9, + space: 32, + return: 13, + enter: 13, + backspace: 8, + + scrolllock: 145, + scroll_lock: 145, + scroll: 145, + capslock: 20, + caps_lock: 20, + caps: 20, + numlock: 144, + num_lock: 144, + num: 144, + + pause: 19, + break: 19, + + insert: 45, + home: 36, + delete: 46, + end: 35, + + pageup: 33, + page_up: 33, + pu: 33, + + pagedown: 34, + page_down: 34, + pd: 34, + + left: 37, + up: 38, + right: 39, + down: 40, + + f1: 112, + f2: 113, + f3: 114, + f4: 115, + f5: 116, + f6: 117, + f7: 118, + f8: 119, + f9: 120, + f10: 121, + f11: 122, + f12: 123, + } + + var modifiers = { + shift: { wanted: false, pressed: false }, + ctrl: { wanted: false, pressed: false }, + alt: { wanted: false, pressed: false }, + meta: { wanted: false, pressed: false }, //Meta is Mac specific + } + + if (e.ctrlKey) modifiers.ctrl.pressed = true + if (e.shiftKey) modifiers.shift.pressed = true + if (e.altKey) modifiers.alt.pressed = true + if (e.metaKey) modifiers.meta.pressed = true + + let k + for (var i = 0; (k = keys[i]), i < keys.length; i++) { + //Modifiers + if (k == 'ctrl' || k == 'control') { + kp++ + modifiers.ctrl.wanted = true + } else if (k == 'shift') { + kp++ + modifiers.shift.wanted = true + } else if (k == 'alt') { + kp++ + modifiers.alt.wanted = true + } else if (k == 'meta') { + kp++ + modifiers.meta.wanted = true + } else if (k.length > 1) { + //If it is a special key + if (special_keys[k] == code) kp++ + } else if (opt['keycode']) { + if (opt['keycode'] == code) kp++ + } else { + //The special keys did not match + if (character == k) kp++ + else { + if (shift_nums[character] && e.shiftKey) { + //Stupid Shift key bug created by using lowercase + character = shift_nums[character] + if (character == k) kp++ + } + } + } + } + + if ( + kp == keys.length && + modifiers.ctrl.pressed == modifiers.ctrl.wanted && + modifiers.shift.pressed == modifiers.shift.wanted && + modifiers.alt.pressed == modifiers.alt.wanted && + modifiers.meta.pressed == modifiers.meta.wanted + ) { + callback(e) + + if (!opt['propagate']) { + //Stop the event + //e.cancelBubble is supported by IE - this will kill the bubbling process. + e.cancelBubble = true + e.returnValue = false + + //e.stopPropagation works in Firefox. + if (e.stopPropagation) { + e.stopPropagation() + e.preventDefault() + } + return false + } + } + } + this.all_shortcuts[shortcut_combination] = { + callback: func, + target: ele, + event: opt['type'], + } + //Attach the function with the event + if (ele.addEventListener) ele.addEventListener(opt['type'], func, false) + else if (ele.attachEvent) ele.attachEvent('on' + opt['type'], func) + else ele['on' + opt['type']] = func + }, + + //Remove the shortcut - just specify the shortcut and I will remove the binding + remove: function (shortcut_combination) { + shortcut_combination = shortcut_combination.toLowerCase() + var binding = this.all_shortcuts[shortcut_combination] + delete this.all_shortcuts[shortcut_combination] + if (!binding) return + var type = binding['event'] + var ele = binding['target'] + var callback = binding['callback'] + + if (ele.detachEvent) ele.detachEvent('on' + type, callback) + else if (ele.removeEventListener) + ele.removeEventListener(type, callback, false) + else ele['on' + type] = false + }, + removeAll: function () { + for (let x in this.all_shortcuts) { + this.remove(x) + } + }, +} diff --git a/v1/src/simulator/src/hotkey_binder/model/utils.js b/v1/src/simulator/src/hotkey_binder/model/utils.js new file mode 100644 index 00000000..8a2a8a8b --- /dev/null +++ b/v1/src/simulator/src/hotkey_binder/model/utils.js @@ -0,0 +1,67 @@ +Storage.prototype.set = function (key, obj) { + return this.setItem(key, JSON.stringify(obj)) +} + +Storage.prototype.get = function (key) { + return JSON.parse(this.getItem(key)) +} + +Object.size = function (obj) { + var size = 0, + key + for (key in obj) { + if (obj.hasOwnProperty(key)) size++ + } + return size +} + +export const getKey = (obj, val) => + Object.keys(obj).find((key) => obj[key] === val) + +export const getOS = () => { + let OSName = '' + if (navigator.appVersion.indexOf('Win') != -1) OSName = 'Windows' + if (navigator.appVersion.indexOf('Mac') != -1) OSName = 'MacOS' + if (navigator.appVersion.indexOf('X11') != -1) OSName = 'UNIX' + if (navigator.appVersion.indexOf('Linux') != -1) OSName = 'Linux' + return OSName +} + +export const checkRestricted = (key) => { + const restrictedKeys = [ + 'Ctrl + N', + 'Ctrl + W', + 'Ctrl + T', + 'Ctrl + C', + 'Ctrl + V', + 'Ctrl + Delete', + 'Ctrl + Backspace', + 'Ctrl + /', + 'Ctrl + \\', + 'Ctrl + ]', + "Ctrl + '", + 'Ctrl + `', + 'Ctrl + [', + 'Ctrl + ~', + 'Ctrl + Num1', + 'Ctrl + Num2', + 'Ctrl + Num3', + 'Ctrl + Num4', + 'Ctrl + Num5', + 'Ctrl + Num6', + 'Ctrl + Num*', + 'Ctrl + Num/', + 'Ctrl + Num.', + 'Ctrl + Num0', + ] + if (getOS == 'macOS') { + restrictedKeys.forEach((value, i) => { + if (value.split(' + ')[0] == 'Ctrl'); + restrictedKeys[i] = + value.split(' + ')[0] == 'Ctrl' + ? value.replace('Ctrl', 'Meta') + : value + }) + } + return restrictedKeys.includes(key) +} diff --git a/v1/src/simulator/src/hotkey_binder/view/panel.ui.js b/v1/src/simulator/src/hotkey_binder/view/panel.ui.js new file mode 100644 index 00000000..06222901 --- /dev/null +++ b/v1/src/simulator/src/hotkey_binder/view/panel.ui.js @@ -0,0 +1,60 @@ +import { setUserKeys } from '../model/actions' + +/** + * fn to update the htokey panel UI with the currently set configuration + * @param {string} mode user prefered if present, or default keys configuration + */ +export const updateHTML = (mode) => { + let x = 0 + if (mode == 'user') { + const userKeys = localStorage.get('userKeys') + while ($('#preference').children()[x]) { + $('#preference').children()[x].children[1].children[1].innerText = + userKeys[ + $('#preference').children()[ + x + ].children[1].children[0].innerText + ] + x++ + } + } else if (mode == 'default') { + while ($('#preference').children()[x]) { + const defaultKeys = localStorage.get('defaultKeys') + $('#preference').children()[x].children[1].children[1].innerText = + defaultKeys[ + $('#preference').children()[ + x + ].children[1].children[0].innerText + ] + x++ + } + } +} +/** + * fn to override key of duplicate entries + * old entry will be left blank & keys will be assigned to the new target + * @param {*} combo + */ +export const override = (combo) => { + let x = 0 + while ($('#preference').children()[x]) { + if ( + $('#preference').children()[x].children[1].children[1].innerText === + combo + ) + $('#preference').children()[x].children[1].children[1].innerText = + '' + x++ + } +} + +export const closeEdit = () => { + $('#pressedKeys').text('') + $('#edit').css('display', 'none') +} + +export const submit = () => { + $('#edit').css('display', 'none') + setUserKeys() + updateHTML('user') +} diff --git a/v1/src/simulator/src/i18n.js b/v1/src/simulator/src/i18n.js new file mode 100644 index 00000000..602f4c51 --- /dev/null +++ b/v1/src/simulator/src/i18n.js @@ -0,0 +1,17 @@ +import Banana from 'banana-i18n' + +const banana = new Banana() +banana.setLocale(window.locale) +const { locale } = banana +const finalFallback = 'en' +// object with default language preloaded +const messages = { + [finalFallback]: require(`./i18n/${finalFallback}.json`), +} +try { + messages[locale] = require(`./i18n/${locale}.json`) +} catch (err) { + // If Asynchronous loading for current locale failed, load default locale +} +banana.load(messages) +export default banana diff --git a/v1/src/simulator/src/i18n/en.json b/v1/src/simulator/src/i18n/en.json new file mode 100644 index 00000000..e9fe2e17 --- /dev/null +++ b/v1/src/simulator/src/i18n/en.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": ["Pavan"], + "last-updated": "2021-07-06", + "locale": "en", + "message-documentation": "qqq" + } +} diff --git a/v1/src/simulator/src/i18n/hi.json b/v1/src/simulator/src/i18n/hi.json new file mode 100644 index 00000000..96f4543e --- /dev/null +++ b/v1/src/simulator/src/i18n/hi.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": ["Pavan"], + "last-updated": "2021-07-06", + "locale": "hi", + "message-documentation": "qqq" + } +} diff --git a/v1/src/simulator/src/img/ALU.png b/v1/src/simulator/src/img/ALU.png new file mode 100644 index 0000000000000000000000000000000000000000..fa8094251a57c08ed6cdb85f8ad0b9a63a8a1236 GIT binary patch literal 57481 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

(DOe@ec`5}uQ@%Enyd(PG0tYsbGB-|l{)lZ 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 literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/ALU.svg b/v1/src/simulator/src/img/ALU.svg new file mode 100644 index 00000000..0db7c17a --- /dev/null +++ b/v1/src/simulator/src/img/ALU.svg @@ -0,0 +1 @@ +BACTRCarryAnsALU \ No newline at end of file diff --git a/v1/src/simulator/src/img/Adder.svg b/v1/src/simulator/src/img/Adder.svg new file mode 100644 index 00000000..9249cff0 --- /dev/null +++ b/v1/src/simulator/src/img/Adder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/AndGate.svg b/v1/src/simulator/src/img/AndGate.svg new file mode 100644 index 00000000..6273b83b --- /dev/null +++ b/v1/src/simulator/src/img/AndGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/Arrow.svg b/v1/src/simulator/src/img/Arrow.svg new file mode 100644 index 00000000..c25f20a1 --- /dev/null +++ b/v1/src/simulator/src/img/Arrow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/AsyncCounter.jpeg b/v1/src/simulator/src/img/AsyncCounter.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..88a40590e4f870e3024108f534cc902b5a7d03b6 GIT binary patch literal 5872 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 \ No newline at end of file diff --git a/v1/src/simulator/src/img/Buffer.svg b/v1/src/simulator/src/img/Buffer.svg new file mode 100644 index 00000000..bf867043 --- /dev/null +++ b/v1/src/simulator/src/img/Buffer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/Button.svg b/v1/src/simulator/src/img/Button.svg new file mode 100644 index 00000000..6c16a24e --- /dev/null +++ b/v1/src/simulator/src/img/Button.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/Clock.svg b/v1/src/simulator/src/img/Clock.svg new file mode 100644 index 00000000..653d29e0 --- /dev/null +++ b/v1/src/simulator/src/img/Clock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/ConstantVal.svg b/v1/src/simulator/src/img/ConstantVal.svg new file mode 100644 index 00000000..dcc41214 --- /dev/null +++ b/v1/src/simulator/src/img/ConstantVal.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v1/src/simulator/src/img/Control Sequencer.png b/v1/src/simulator/src/img/Control Sequencer.png new file mode 100644 index 0000000000000000000000000000000000000000..2189f0a7554381e4dff78bc664855567d53cbc6a GIT binary patch literal 271641 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ξ+xc(xZ#WsHr|#M>82xgg&NJN)zEwkqO0wm@C-JPW1o5i1~wD)~&_o1q#Lu zDTv;Ep!)1eS-+|jbk%cM0#6Z?hrsw z*Qfh|zDr%cSO2_C9&fUmu&{8=L`n$9{QVxVOpW!iI`*b^1S2=8Bp~oG%v9fy^#sZh z!^1JeQkoB{+Fhyxm1XJw_mIb?q}IQC$UKaGL%u$&{_5;8NkMcpu<#d4gzT~3$<;^< zMv}*ocG&MHq;V?QL<4z>=$tJ_1!$e+st7tL`L77OrCPg%>CZ=dFQu1=;E;Z)^wnc~ z=+@+@mN>PR*L2V5jGlG2-B>ic(K`p7&(6wY7EOJW87hT!nySPqq%5NzyE}9<_`2W7=eJ7{kt6Nwb0RdGki3v33N{g`4>q)1LHR<2-Co9)y zi!eiLXQrvo$uDqKEs526JP(Cg$)U1ske4_o=^+zZQC&?Od1A}#wnAb_+)80 zWJ%hSjFH$#HO+Paz(WX~Iq~@+n4exWmYp3@kR#v<6piksl`jnT5MEK1$TMr~!!J`~~MpR|1`ZTd?H#kN%fLGXq;q0~{~ z^cl~?OSVPLonn{wbbGr&sN?2!4g;jTk($bn-q(6>_bdZ3!qrtEF}uLt(A zDfevT`9w-ZxC_8pe0K~sCy2iQ@a~%M|q>1MeEPRnZ}HN z2GE~AdA-JXH2S%77Em*=@XxIKAX=kaMI>e#mNPs%m zTgI=Qoq;Y%4XeVzn-`&b>i6FE%N)Ao-nw*&RYLMm*3?Y--5iH;aRs{?k>8L z^D*a3V`>NOsA1d9u1xk`GxL;f4pOOGTN^EBrky%$%KJVY&XS!6uIs}61@7D-8|9)u zK%b3J41-LR)G#zzzV!5PzED?qC`I1hJ)^^um=j|M74-YHYGG|Qg)d_%r-XjJ@c#9F zMs?wYyvpt2Td0J{&*q`rnejqtND=J;CrJts-MuSa%WZhWG#zVUMu&V-2{S7EF+-GY zM$cdGU~`1|k))fSy;dAaXNfGN2yIVM#ViPwL&QuqcRpO~A{tPJel1sht72n&O@RQ~ zsvspX8kg7XR`-*EdNJg>UA;E6T`cF@)EMPY+6T#5z@!3fbCI8rlioRGoDG zqHdalbLx1UD{Z=8spLE;t3=eWrMkX;yi!4Uf6mCFjAhEPQeD9DCrZvlYBDskn`s7w zyga=ccGvO_Az%>9UVZv5?v}o5JWvNEeVnj(T4hCu64W3hq4tJkTXsjfe#e_fI);1` z>M0j>qU&EPCi^syJZpIvm4p*)q`;H}HDfN*3OAG`yv20i-U2D|JYZsiM*yj)DW5Gi zO_%Fj)_d_PI>FMRdtk#yySdE^pR0z9tYpY>Fo=O-LNAkeY#DLuubgV#wLb(2Dv61> zZ76GPk@p0nabe3w1bl>>qk)#xzvF8{d>L;?-bv7Srj$&~BscXjn+o=&s+nk08v z*SU-=68R}cC}S*_)!j+l1G{8|VSZqrh8A&JH<}yLj>n!(j?q7?qZPOIU)~3e_{#}J z2mkL@h^zz71oAjdE3yF;TnIZ7D(kB29QLaoj7w<6Hj-pjLxaSpM1_)YM~zFA{qxq$TCr{zh^Ighcu8MXj-rzZAnX~(DR7a5@#-N=g zT89jMY;F*`bBOB8=h46~L=a_5529oxB$zALhJs&s6qHZoVdbvfo*SADb{f|BxJ?EQ zc6!?!SdlC!l$yuXoBBBE>E*QqlMDK2GNAw-(WqGHWCzSiHgrCh&Ds#s!N>o2N{N^- zx$eLpo5GPx)`@eb&BV@i4R?kg`e^H^F*sgO7)6@cT)rXQrZ%6)dWu_^TA2EhovZ_@ z_B)m+QSl2cxi0Yw{%xtxo0-(%%H|Bw^%3=5w}xGUOz!sWH@vFr>LTChbjVrBnN~_n zx3uucW+k{ASx%gh+#q+jK#23SMKXJn_509eu9K>L{Yz$cfd1`2S>qHD;oLpto@bE6 zY_e`7GwZ3X(E@Ad%MN|LQ*HOYx}RS!aRI4#XhmbH$o9Lnw6E&{eOlbc@`)pWJLGz&82L)X7rQz^`$-^n8PTwsVE`>qOVz>Q_-&!7j`WF6*TkPP6|w`>Gq_?)65 zX~IjR^5HOxvyDyhvxx1Z#)GoHLc{Ha4aW2_RFT9qWjwW6u}C*L_aRvuY@ z{jCpEY#&-$0OxRRPFNO8OAX^2HqyJFIvCaXg3ui9}Ql+E}IKP{(SY^TtkYYPh5jII5uHWkrG{wbTCex&@( z8@H~cHh!_#rLVw916jsan>QGF`x(SnZ)lVK zy@^GH?%zQFizzKwTfwL8dlgb&;w>H?Jg;VX+HyysSd&9eLf*-kGbl}FZk_5Y58q}f?;fkhEV9&Q85#Dm4}HsM^mYa zwwL7v+dhQXo%Gt`W5R`+l4)SKzgX{bTXE} zLiJtWlgX(@q+sAcAW4-Z=6P-m5Ydqlmjf^hSlev?q+OKyxVIS|=4(eq0rSl{2gy2f z$(kzl!^IKDH#+cay}iGgLcd zv@SM2I>}vC`W}a5({nq9Ai8miJulN7R4V?=0_eMn3rq7=-`mGe3O%i_g4w z3KcFFI#9B?d@}WOps`GTOiJq=Aa#pJ!Cj)HC7zM2s;mvCT(VL#tz3O~`XiY;2t2cp zy7LykB)3El&e50ivqz2q^Oh4utwZT-Wtd#3H2Mpck`zGW`IloaKoq1zq@z@cR6ik) zC^g_sNK#W5_$n(ZmP|HYsyZTY5^=;uY{68eH*r8*lp!m(N_x9ZqJpRY87bPJ#lT?! z>z8gS_Ku`3>N}QFN$*`uWSwp2ckC)P`m8>F#*8$Vcy*{W?R>Z;L!9k`6x6wrjO%)P z6H#8t680mCH~aU3f;H!#{iziR^|U{Z+p+yJO3)eJD7WcIAlo7hIQVrpkl6I(TxH}L zYh>pdzKot)QpeDBF^TR#o;vTlMyHbORiZzHNKaZiC+026KAC?|zOLdOi-I)qZZJrE zL@Y*G4JG4;a-MHxQqT1IWltOM@f=y_b_F_d|G1$DI*dYa2XdyPHF15REa$~p3tP+1 zIDA<+b68n0HZd{r(@Dg-oEc;u%bjKXe($zZd%nh>N9?>&qRdFd&~=MemLywh>m32y z>7}JW9M$v$M)uHS+C?%(@xPRI2k>ai4G5_uW$77ItZIdv_ed5ABbMd60&JoMh`)$^IP1 z&?1PKtzRo~VL{$M`MWErO+(+!XY(w?>qRWGR*+P0n$PX9M4-Q3&)sD`k|2&SG7oEv zeH;#Rk7*-U)aw)jbLTPIbt7l96|Lb;nqX>5Z7T;8FPUq)HV1^phdZ~NT-$WfJoh64 zey@$Uu??Y%e&&SCN4GGYzJ@3i_0IU&;LI}ZNBfD|Q!YDNp#nqI#ND3F`-_>vN}n-8gKC~L|XdfrXwqvp63db#p@LkEAcG%pI5?h zF9DU50b;<4!1a@L+OOXzQJ{y#p%wHGS?NaRkznl=WG8t$N;bfW5Z)~P(uGuNcH^jp zU^|uCry8=wr+1^Wm+vc~=QHCG5`@D=AX`vE2;{PnqpsE}rtMh`=cR$0;F%7u4Fm9b3C9H$7U z4l(s*njI{>uU3$x5c_hI+U6!n<-Dw+BI_5svc7)ay5l2R2g-l$K4ch;Ln>xlX4AtF zCw9wQ6@QbNQIyN5h@NM-KebmpQu5bW zz&ZXkt@}HR=1X9de6Q?AI@JQ85bnpie3b*4NABi<^G7xO0I`j3K#zBvO3W8+4OjX*8S&KOIW7H+uUVCk3BsA_p5dl z!hi(@2go}A=&w$roA{4Rn7%%4zlLy*q95U=%<;&h_k03G4dnT@Ltgw>5Zoq%>q_VD z+><%+)#kuX$AssNQXw`Sx7Ff(8Mm|)Ml$(MnjgwuF@IfPLtx&;NQtaumto_rJ5Zj3 z9>9hJZVOz{CVG0rBBz4H!uZc7XEagqhajk!r2*|jeBSR26@$co5fC|78K!g=1@`N^ z(>I2E61Hvi^o&39EvOhhzSJvTq0qOnC2q>~a!1;f29XP?E)csZG7_b6q-UxvJ3@L@ zqxzN`)nk+QKR;U6NUa&jOz(3Si;#ZNJAU$)&m%dEtT$xfoo_8ai$*;c0;nN%Y%p{B zm$ZPva*7Oa;ZH7Kp9mU2Yg0Olit4~6KKEw*##$tA)IQZ$hk!493R{98Muy8o|xhI*Lbh7giF*Pcn^H+#7q`hOLS zMFsQitzYt=@0Hz<{^<+*LE6llY~g^3%M;V30;K6l5^XAk$J*k(BRh5Ei`IOFljxpT zhQ=RVUDY^z4_qe}V~Seq0xVcf>|u%DT1<$)>C>FX&)EvS+B_&Lmz?gjuJ*UiEyaWz*+!aehO&9MQ){ z42MsEa{Uf)cn&LCJ<{H$*on22Ym=#IBKY5cf?$6RFad z7f~_iFJ8Q-HGyWCO-F+`7D4FN?3tmT19_@FJ9FHW0MJqmi+4mxt2w4jnRQpyR3#0x z-IJzL6-ynRhb^DFkFDX3vwM*5RoV{WXsK@_4aQ)KSR%KXG^W5MW@AVM;z;Gn>DbtO z*YIH5&jG`&L(&2mC8LxLh7&e$gn0Z0WEIQ?9KKqt-kq;XK+^m>?36V5(!&7GCEoy zdY@a`37kt;gsSHPozYhjD(9p-7(e8U1DYJErifTA516}M|HZ3mT4{wsQa5D6}w5HESXNsv# zOpC@!>)z!q_hK+|1_*=RK3E>RXsw+8UahXBsFo1e>Q$%h}QHb_yn1Ab%dO zkY#UzZ@Ie@a=L+{tdXpU}=Bx2XJSt@z;I5 zZ?DEMa<7^ADC{~@X%)AH>Zf?$v9hM>a(P$&1oIkcr|GPzUZ&+KUn3sEx1l>6vCa~i zB7IS!P{oVlE)(??%8_atHP%0TcXQFBVX?2hy)h1X7N}|yl|F!H-wo?=dY)a&sr_fn z3pmfFA22WIX*376kIzOQ`DT`eK=4szS@&G3)3ClrV9%=8(VM^eq%q2dU@MseN&VB# zYX7*i_D6om;MbxSpHw_Bmk!MCL4AwBF?gY;oC8=^pp2!fr{|)nDFwqbFwjHB7T#P9 zM-sGHX_zk9QUw&4>S6LHlYn@;ipD^!gaNg0H0M!(obyYGYF1Pl;K!9;_ zSk?60Ik~)YtG;HctMs%E!T%*LVFOTm#-Vh7y8TS(&4I!E9UDgwwd4Jt0n)1=i`A|z zWIv>ree`G@E-knOZU$k}^4Uuk)zsC2dl#%rJ9j{hPZS2k!d9m}?5j3xB;CUygt!|C zWuD>%iQ7E|eLW+BiA&?{IWzZ6Y>tFT_TA@nh^C8$;m_CyOvthy$|psqluZ{~I9$be zmYZJDnwh(UE0NX9JOEWqO%s#I_y&8^`wC_h*cb5zprREGHmvHZ-6tos*2;Niy>@5{ z_tX5))YOB5z|{$j!}NoxK1Mk9AHKT&f4+KEAv+PF@M7vuXHU<)$V8K-G^e>&FI!pp zy7zX5I7ms`4S(tPxwl%ZV9`c7QAABn)Vb(o48rV^2e=n$aOm1j?BCDbo~geakHw>Z z26*VlqhMezmwk73; z+^ zdkRm~Z;3ek@N4g(mCrU-cA-Gk1CG6qE#v^o<*e%QnX)0~Z3XQ^6OfeIeEL}qH0X7u zn<^Y+{a0?D4%52-_i$X(Dx!+@BOFKUR?t)%6989qcHWR7N`gMSP^{hgkP|ttM!J=Y z6cQ=ov(Pvo`v4S&!kH9{79SnMFLk_48?RZ*$fgk0!*Lqa%nUdD$}zv+_RizkgDkVI zW*nR~YjEwX``7s9%z1vm!&S{i=vVQ*3<_qvuG^ynSBD>Z(R22kF4bwC^~IgWk)=-C zD3gp=Cgn9c>}H96OuaHCPwmb?&JkYI^BD&$PSflgNQQmyYM*x2`e-J8DZR-oy5>A+ zVnfWXdGml4bPV+$Q1{*1Fw(l);Hsle7-QSSm0%C+t=6P;*GShX=domGQ`4Eoum>{_ zW*$2EI~fG8p39(=ED<}ol7ZxCru96erUwtp*`4o1s3$q=J6_V9JV-|pJUBO{ym*_HP$HZwhR=~KXKbCZQhF_L*O~z zzubJYj>KTod)-lc#PSKD1lGkiMGVfHc`)+cr9v7onZE0{Fhp6FWHRIevYwVo|z(dWS}*slokW9r{Bq4%*iI<3r|F zetXC|$kATa0gzEHl3*$Y&>Kja@bZgpl%xzHPsx!O3QV`yYnbi;?0 zy<*g{375XK)YRK;;*$rHPC-swkXhL=a)xH@x?kcL+vB%0lfIPX+&+m3sQ?1 zBMmhpy?3PSG7`f$O{!NQJ9cabB;oe@d^Vz}0!|O&ww1DQoIe>vqL8i=GIQy9_)j;B zSCfwNIfbfA(4;Rp_VQ#yeSJ!HHf?2k-hFp>3V4vg!J3+yT-@B4;OMn6ARyp&R_%qI z5|55@#J#V1KikUn@_?RXY_3iLm}4 zU1HO|y~bTykeA6);w{Kfx#Kjn_Q#8qG(sJ|y8487dTMH_Rk}uglg`B5wv?LlID-8l ztIpkLi<5}{dg9zOvrV7U{RLtLCP+C6?0zk%j%nZD0XecJos`(J_~tt3KccEmS2CO~ z8hX%mdb}fJB5mdGk2^WoxZKKBPQL0A27RmwyRf~foW46GB+_5Mwz9Pih&aa) zcVS3%Yi|FQZR;rcWk+AnQ+^VKnX;U7{_VS%s6l^STOLHp=eMtVzZSCwPhPUF&&|z+ zZ-gDikSfe$XlZG|7{2LghicWAClx$D4GmTGikN+_BdKqIJfR`|yRz$AvP28*w1_VX zE-fPt{m_Q=yfa$Z!f#8M?#rfc?H?9fn(FK4_q359!kb&ykBnR%k2xBdn4Z3R1l%GB zUdm=22;4ANkj41-O)Ke=pJ9ya&gV%%1%^04#LVwr0n2Fm>G`-TpAgd&mmYNZG`WJd z%QVYm9-b(N)w6QN)}`l#l|T#q^vl|}Z})jWy}+vKW98aDK8uTs3zI*q>+ZO1~o{e%X%` zMI&3fEv1~L#}t`(Ad75aVC~QLJa#SCni``SYi(gMh|!J=tJ(uT&zcSwjAKw{;E-R) zz$mc9mqDif+6{}n=QI{p`WS{Q$63u4xL2PRuaLZ2@z|-ls5sTrg1X@&y`4PFubVz7 z=kxFeH5ePOt~&HAzNGeK?CZ2u2R8%+OpNmAZk2ei@9AIWmd(u_{yreXX~?l`Dx+^` z0AmMO#mteutSV)>D+PXr()#-kNgZCNKQyJ=qx3c4w{bbMN$oO=tQv{l{M`J3v7FYs zj$q*>X%wzfr7~Z!J)mxA9!z;J}R)u7Ve+;Gz|Ka zy^YXqlV0(#!6q+G`UC4ZB=7Fpb}?>zHu12j-ySx9DyOsKP!mpRE&nJXMM&My^>k6F zGnxR3SkRvS-~xXgJA{G|$gI18B${>cVxOsI|G8GK`mQ~Y^bPv;T=)v36^er5f>~Q< z?Gfpaux!&5JmYY-Kh%d&Ky1dbEh$TNI%HgLI&WN6szYK9e9?{=xYi-5Ie4_uWn46DzC~*n!T!hu-H% z!FzPVPHeu6o~d)tf$QpeSl%56o2&FBJlr5iR=WQ)WBWYU{N#;~=YMuEa%kM>W;YHc znQtF&)=@U~KTCZqP71CNo0;GnBpf4r!jL}5NI8OIneWlayv42Vpf|2^wyFoY$!j4o z2ybD3;D_!w&lY*_<)>eZC)!NE(HY2>bD6bg9Z9zYqwbY{J33=Nj@oT6u*83gB=A*0 zSM|5-(mJE{>~VM8iOtIsb2d$nR*Ju@WUs5MbA8Zk({@i^2F1S7wp(C1TN%0bfa&7R zXZ(e)%5Py*;UbpPoUNsvC5(15!TH{t^Zr=gUV*8c0u>m8KgAL_r$A$hPFZB7WGVfM z5q6lZ=NjM$)^tLk4-rx!QVvl$_kR>LWWo@}wb%a}>RUH$)b$t$$FnrQ%==qYDO zw;9mg{fLD}YWyQ3MfGtHHQke+|R;5Dv?Ssc0C&_(K@R9y!si<@VC#l ze8>3xAZugZ+F!5I51)Ofi-~A6SUSLpb_NRtw6dgaJz)&hLSh7JK_!L4eIOBBz_5K^ zZxQ)z8uZe_)<8)HGl?I31{nmJpN;!KPdiSE7 z=H+Ctj$W-Hbs}huI~q?{f#ROq1t&}-F2>KRDMHgdp){Lk6WM`n15=FI!kh8~_GmSd z)=CJBY2FF`Qqe!!2DJ%YuY^jXXF{wnAdZq2rOYu24M^Sl~A4vDq_rv>7T)JuT8Z z9`w9T?YFWwHa21`W{7=nD#Q$9wX$ajG@ggc_R|B5>vQArDTl65w}HP><+se$6;c-HJa(%;Nj%G3YdxQ`2MR~*Mgn;cHH-%Rb_d1?9kT6+24(+(eny zrz+|mu76f2OdImc4-;?exI2}aoII8&3jJVSl?CWL6Y{%DJ8~e+VZs8@Jdj0H;Rz5K z-BwVC?fx1Wf)nb;iW#F&Sk&))8xO9gb2d~7-00fI-1JRHm<=;-UVA;V$s;OBnkIgL=dcaxm$Wl5)!a620vIEV7_>)OWDx^T`H0^t! zN=gAS71w$x!_Y5D2NjDF{fYT~zZv&JM+5HqlpjotI=6~A-NwL&fm?rLb#+aRBaJ$i zpinYcoE%cb@^oi!2kNze^IVq_Lcwf{7G9aS^&x`ylloz@4g^vlqZ+kq}@`~r5HiczWw3Y)Z_iEQr#k#UlyE-c};IV~&1aa5gy-)UEnl;iGM zBHYJ@erj94yC;poLK^jHx5$exlUx#3f^H{NRjm=$%*k=s_pWN$pkM?srSCV7W3EM> zzcc0sgHU_020ksaP0^mMrR-JPTvYB*xM!M3i#tRGEw1{8Ne$2al;ZKAeXLsZ0 z>EYxa%E%2Zzxz7|$1mR!R(P=_AnUN&p4t%s3X{+Y6n@u$ue-MhM-s-jRZ#pCng zLuiZ$RXSvXc(p;Q>7;1M5%=-duorPeI94Z?Wpe;J+VkgQDq6?kBFC{NF%c1uvh7%^ z-%Q7q-L)y5Mhsx*upMVghRET0kV0YZT`C`7zTMK@n zc%E3uWixcuBG%NQblAuhEJZMcm2P?-GhBk;?x)VcF$4OYD^S&PL|{7wr_qC|qgOGw zB~(DXb~6(ln1s>{h6uj6Q5m*JADF3&jA%G`1XGtzPrED=Z(Z$mr?9oG^|l6Oyx?3p z5e+jP^T9wG#LYiCPYtWG%Jl?R$;cYVSa<{`; zhN4(l4J$Qu`1i*@b(!dv;FvL42lep<%WA5ty^(r7-yqSgN~1;<>nr3FKWwj+W=;IE z(Q0l&it?BTvqqoPXtwV^p)VBw0OS)dG6{L}^X zK|+pG1Kry@aziu8_=-=i6HtvfDVE5jZS zK=~vuPK@HP?fLGX{~T8O=U_4ME!~(Y#A7bA?SPfqdCT*Q67qH`e0@=^*Te=zzog!n zub3zP<{HS%I`quw1tV_zPu=7b6ZCWOi{-VF5|*yMKGr-8R>e4K(We+>Oxd>MVC%ED zdM{%7UKtQNgEw^0Xe{?)+0WjqZ?^UPW{C@k)O6I4*n}#1Xjt6q7QsABFjRapvL=bh z@2Bp^xAl%lAP#0;9E3X46-==v%4syfBS_0ZY1ZlSUN?hlr|gqNKN& znR(;h%bq`Zh`$AOJA61_gVrf>0W7)V!(RWet#%k)otBnM%=Hw#J{SBUBFP+C!_#2(_6WV06H&{R-sgXaDNkD&#v#^l^7Z`+wT|8Q$^*6DrCqvB`B2lk%5O(t zW8=`Cu<`sz_rSLs(b^cx?)QFs>Mr|1$>Irz@?DOqIdoTD5vfKb_ubrI2^9N|#WKEs|I4OmwfI&`vJNKl zT#$*@#{rJx{q&$Em3W-}vXha0Ex*ZU*cS3rA89dRF|Lp}&C|cEHo|U5`)o9jUe$j65 zWpzZ6RrH}QX9?Ek;73#LAi1~`cJ|TQjp^;p0gaU5QGah9i3>d+l5_~MNRS7l29nnc z4_zdh5CoWUJGvL{`Y{ieRIUA)@H(8yA{M5qVU${dTo>+I zE79GZU0%NN^ybVxCq-CBxB`o*M@)qwIQjg9-KPf!bB7(l@tHx`uFHc6@9Lg)MqBA8 z?|U}r-chnU&YXbC9xKK-BQmL%uH>fQpeWIVJUe@P+42nAp1MOiV9&!Q*G+UgrdR{3U|4G~oOeLH>9w^<7n#lXVEzQtlC$O3W_SJqmJk z3cUb|wGbrNCz+>##kXZZ;o5#-p}<}&#%;M&x&ow0IbBOnQBm>vi970u^HU8nw4t+0 zP9!d+wjy8QUqa2)1eR~1=9lBqL^e0-KKv~Mec{#}*Ae0@)z}X{enA7wVYY!x1;P7W zN{1BE=5o?D;Z&)<*+vn-RUpk-S*vct4t0 z@E@+YRstOr6}JbMQ0CHpW^Pz#gIQ=Ri8iRcgoM|sQR71BkPK>~cO%LTuYYA({dJv0- zrY+fWq8Z)jG_vWUVk7q128L3z?Pbb;giT34m%qWLdqZ?Hfq=w0hY@u|@p zW)y+ol3P$5^J1osX8ASky$j^Pw zGjsvwdGaKOuBS9ExSmYL6Z6W zMaE+U^u;2f=Yd`M)Fwzm7Ja~347x^0U`7M)Szth5R6wYlF#dxzIUZ6%P?Y(6t$)*2 z6cVedEYF`;-fc8V@jkP{)Sxx-_+_xz*lc}g)`?9D!s^G){HN=!qHSZ7l9eT;PpDlT zC5ENw19Wl%qch>vi#9uRXNB-e4EKZ`ft`P@?C$&&YtOq*VA_nJ7nlkOJ{p}IqV=8!O$A2;pMppG``D@ij6=Oxh zPLoDHg{Z(7_AxQ;ylN<1^HzaKn1E?cK!I9=t^#0|ni+3vIjKCS87xT9?5BZ`hOde7 zI1WSv>m*;!V&CGzp4(`A{=EFw^D0u@{~`Ezy2$PReT;dO)+gwH62S5XJC>?dx_;Fv zIrSof*vvQ`*`o8Nrta3>39dvyk#H2e@ebyo-Iq6WFM193?smU+*)ANlOrYc*iNKa{ zCrxA31f4LI1T#aYF*D{D6X7Gz0jLwIos-Brn}tOCpjIVMqg47CIID{SbsYwU2cn&y z+uWslzkFG+3p!Q^Djj-~>MHx{usO$Hk*9ECheBwQ`WTu-lWsv_;OqPmG-!g5+~?b3 z0F2v*^T0^r&xgV%t~y96f!_vMr(kv(b} z8`pF&hxJE$_*lH%bT4W(2S-tdVGLTn)dUOpQ!Lu$XL{tIVd5wsjGlls)Psfag^vGpQ2sE$?PoK;fiBvdYSf@eqD1sR zp{Wj34L*PL^gcukF4`t~b%VR);GrVB&jCjITU00`tuwyz;e^=L!|4`Q=Ud4Tp5jU% zhWOl74&2c{SSs9codAB?*uuUFhFniY$&_Cz9+Ao7UCtAwTCKylu0oAr5YyO{Okz=} z^G_h@9!2r~wl=xc^z2z=;=jM_J=#q^V2zt&7KYx%suhi$9X@R#=xE=xd@ zGOzLTQ?cx0);2aa0QFinA--3fB?nb>G1n!JByBCwN4+j8HPyEFTHa$Q+!7&ESb*^d zcWaZ$hbOx~Bf?PDtphZXw;0Z-i1%9ihG|2846@6xIY!I?v0PC_TFLOZv+K8d!DX;~ zf(d-^uj$YUcbuCoAlrQ+I?2G}f|AdIUHle2F87O1z39a;IPzXwQEEcJD3vxdRmJT} zpsGP^EyI&tv4y)B;arQ2)VYXBQ^zq1si@f1vORn}V^}~$fUHwY3_7_1EaTES>qB!; zIMg_7xIsd2mreg;c!Z7)!3fmq_KwtjuXE4u`d+m99tPk3-Fd#Khi(yMQ8_kwXi{?Kryr`Q34_d2Eb!eqqg1v_*rO$N~%GCdqA z-P74w!Xxxf3a3QokRgAvz@8fZcme%Pj4x?NqgPeP4BIB4*iGvsq9G8vDbbJ9H;nS- ztD!4r=N`6N*9xn`x=F;|n7UWe_OnUwTH|6|78!MLorUxf%{xAQ`gFh~>D8+nP}b`Y zp-o3#phx~XGPu)HIheLg)yYMtwM5tN$<_^+XWe)X-o(L*l8O}(XYVIofM63aTuvVueb@A`&*6%Q zN9#m71ufeIvSe)>RLlD;%~~S5y)e5*4ivR+8%G_uFYr ztr`tEI=xxr0GN}P>}+js7r#6iRq=IVf^4PM&^1;k!gTwCvz&LvQ2HI|SnGQ;(h8m% zQ}voiy=rov+3cTE2RlY6Nt|HZZcJ^UW>9+y8w#^!>u2(gf$=0yqIM5G7`slDRwejP z7;ySJ?}97loqA{8^GV~ZRqyL$Hr;VVPa;}vh0Y4)BQhyn3-?Z62OA}a3Y`dI1Zz&y zjA}uLgR5Eh^DoQrKN*F%OR6TCCjK}$b;Jj=S7jn69Jsuqx^`dMT$;eyoWQx$VU1I+ zRsHZOrxz?XbvQS@I8Hf4VIie~*NMi5zlS(VrTKTfP+LK~E=Jbk-FieYvX%z}oST}P zZ@wPRk2#v&Bt)`o(8<2oFR~!9e_<~}hB0a%V_=AyEhnbmel!W0q&~$zZ5>M_9Sn|o zU&SYnpQ8`IP2}9vpySA+qT-XqIXbWssD^z1B6=+8ol9Bw!n$RcQHuiW~ zX32^VoB%zG_uH!Is_(-O{xNSjIyS6#=g9^P&MmIF%=uw=-svM%^(+Fu`zNjb_6OUD z9~{LG_N%0ZI458n@;x4%H97Mc7Wrz=owGk^HiLrBEVgy>Z=NV^=|11|>uHAMqwDxm zN|wLaw|uS&6Uz%8@!4!k=BU5Ca;NOw<;%9gnXhj<22WCRl8*Fl6V{`M1=!LoqTS1) znuOEi@fg%pmRQ^>V!2+|_36{bPp?kB4DsfCoskiAEm_}{lWMu$9`xdneSGoUJx@9M z1fEY_&pc2^pMDTCvyx%V5%U98R4GyfK`nVIi~70i-4JO>1p7e-20phL^5nDWsq3`{ z^wQ>nPXIXHM0u9hmtfk=oo%I&COkb>5(Rt`g0@qI4eHnODjW1Bt{4>r^cV;>8ystg+4msQO%5~Gq!EI2xJOatdK0VEqv1yZZ zKFNUNl$-l=`@NZm2tBixuy?2Y+F|?FU5n`+i9AkGNe@zr*+b(Ys1v_bA#PZWXG|Nbg}I0iJh^P&SBhD!Y@nl(FChX zRMR2LU{*&*$GVQz*7fC&DSfU%NSOTDJUMH-MoL0BeTgaT3fJ>0PwT2*{f9LL=!7*L z+RTG{KDr~C0L=lf(!Y}_f91UcBX)cAFPfMXtPBbcz8PeaJOy3_N_{K0We2`941mgq zPkG4@9&uOiHXhNv<8POg?@CsatK^UYqxVeij= z+K^n(Hb66SZQoG#p~otyWM;-G%VZaxbToFE)Sl&QM)|}1@+}xiZe-)XIV12;fB!vO zyeF6&o11ITCwXAnE?Z<}*N99xkchHUs4oZ#-iS6#+_hh+?(FtSE?N9by2`x}m)Mwn zqkr8EE!le8GNuOG@qs*NXL;SP|MH>N@S#vF2Pa9&f@|TojbicIVj#r`w)DEFQ!iOu z^TuW9A9^Di<(lECac>9|cmQ~)>lpcD5P|GFCFcP*_M;t-8k!lw?VLUzt{~9i+J*xol6tyK6&2u+c+ZA z+nCpIW4LyTw;<)_hC`oL)f7?3GL~#8j=9ri!p5>f>6aY|dsxn$SfM{F?%FfH^>;R3 zbz@^!`{-Vr~TAZnHt8eoPFoT&NL%bu`{{8eC{h z*~(@JeB>C^d{q+iL~{-oMZZt z&8q=QH`SjSZ6(N{wctg3%yRE4k&3(gy<$O$>BFVBT>Kr)x{HWt-FPOfFApRFEWD0Tm<%X`mZLMF9a31j&L*rU{ahh$Kl88;MHJ zIX4ZzbsBV>d1vlBQ(t{mzpv`vx_`{n=;^c1UVH7ep7pF}<>yN7;Z-rZQa6 zX#sg8DS#DXsFL#MTirM?_m-ynE_?~>;$ij_*q0_-Yd{YC!9;{V=*)o!g6s%FkOcs) zP`hg@u-kVpM;X9A>=pAoz;vL3YUz~Uo7b;TH(%Y?ESN;db-)H3cre#3XjA%Sjra}Q zV5ynWxKK7nd*HMt2()=mXM(gQP#LJLp%)fZYmX=y8X5w;M3*lJ-StPX6>IX4Oiwye zx>_E(**vIm5efKhfzg>Y(USvgAZ>&VGzf&dkz63{YMsTZyeB#1?PXK2@TepxU~-zo z?h2|sxn^B0HSn2|5G=RWAAnm;HFB(077Ghn?r+4ZPts?1E)~0Bvt|YrHI8<1;03VtWi8_{bMZ&8u`0u}Lk$?5 z9)Hcls@)PETY%)7j&P_KoV9>nn@FP9Izz*dvk){Pm<)QmGm$R$Q+Hb#Y?YxEsw^ep zZJsH?pe^}TajMaM?S)a>xw7H2LS>rX9qFq{T3ZYh?2Zl9&Xmk)>FO48D#4{iwmAz9 z3``Wv&dEW8coB4ob^u=s+i*!p8=!FnQsn?vBe2ZbCD13G%;9ju9M~Q}3!t^n5Oe_4 zbQ}y*&8Eu&`Sm}-+k<$ZBQWnhEaYC={`L>eS7x100rWr5oC^ackFY`-X7^W8I*+p0uu49Z~}xBiVrF_{+;U#F3POX;E+QNs<3EOXDQPT@;T; zlR@HpR-FF4UBw=%&T_clYK$iyvI|=+pHEs$&Yr0DZ+bAwAAt~{{@H`0B9TIpm?wal zG94E~MX%XipdT}94L#sw=zO#@TX?pmCQ8hj&DeoBjS<$>ss+LYEB5E3EKm=yb?q+?L?T?+Q76PCuAj!Qd}o-mzJTkYuOB1ukl|v z7>|;c^~n-upnn<^2PXoUPpSesQed3*xc#~254b(5?c3ahdwZsidK*hLeqlK)C9!lH z8wO44VBpGEu57op1_uQVXQ<1q3!MBrPngW|9zsD0BnK!{?F*LLU#T)kRJ2)WAeifb z-iV~vQrt%Hv#G_%uz;kbg6YpZm7hOjraW{(T(0sM7ysCZZYzgKVrhYZlh$=XQ3uZ+d-tMSRpkh7Y ze4d!Hyh{27pwAD-<>jq_@DEu;?}VJ*KRoi9=T|Y3MHG*(n|QV4WLY zY1{j#ZP(+lSVHQt<%KFL>pWkf1Lice(&<~%>pFHVV~z%e#qAY+hlGgZM%*U>Sl>RqO!GY`YJ$)V!2#)?7h z^R8->GEiilRYYYX8Z%Vdrh%h@Bzp-lm&BIIJad z`8xgGt=UHxEly8|>E!v+KaMP`P8V7jCtQ+LfA|$4_19Rg{F@Exh8IL`_HRdCE4AX z!DJpe6;_ma06_~RLasy#rxn9@|A!~?WDLp20BHycL^4n7tLcK%92AotzH`*cJ)MC(f^JR^@_iuhw#T0(@rkf=Q z4nRfkm`3V>Eh9sqgpbs8Yh?(EMt4`LeUo}Lb2vm3|} zE5rjEZD*{Pjoe`WeIfQEFl{u4=WER*_h&pV>SJNo=V%^2w4FL@83_2w`5oye4e|bm zPJ$62C)gU(*7vbWsl{-lug0p_C^|Se><~W*Ah&N7UGBsj!Ky?cF-CXF+1SmtH1u_F zxa3TOWH}un-7m?&`O=u{XflWRtgA;D+bJkH&S1A8`a&?2k>Z~pjN^bftP7UX)FJ~w z5Ydk)PY9>se`+c!embzcZtw}88Ea>!!vfA0HBV@Vo7=Ta$~|5Hg=ZBm?ULo?3CVj9 z0QYtqxgnzJS4tml*$ExaFlONRzuJpH(q3?0_>Eg!%=EJ#*OgLe$UE~J5N4sK#tS2y zEi23V+>Oz1r~EG`FVGbPnA@rMZ>21d7r`h1tt;mVaNM3fyCTc&FY3H(^P4^l?J0qQ zAphJ;)Z2w9BHH{A|YW7#TR*)Ei|?Gvdr30Kw`3#;56J{`~=@-fN zl5*(i^{J*X7ym-_Rp0&s@&-7g^%EVry<~6@_SfFa%Qc-pl)rNBsNO*-=3U zYW5x{;BpoNvXue9q1!>y5qWdFlQ46J?38m37yh}qy5-qLMTl9xnhp}-_ivrj(7Cv=q ziCkKnt}1-fV>6hjTd-WIC5LgSt^9rliCwzjRXFdHb^i!mwmijD(FH@JnqP{=_m4iz z7GL%Mc?h*m(b{s;4e7~)I{1}RL<7a(vXNWKz5;YzlSWj~v8Azta*7;V@;9R25q-X3 z>#stgT@TsSC%-=kgHglgbhJl=@SW{56G9Hw=Vx!&wLs5Rq^H6{~efZ9|u%UOTW|E{iSrEQhNL@kYk>Vl#6?8L6~ z{_>qZc}MwCO{W@V?R5tU`C{^&Ogo5yY|YS)W_UovwZdEaJZ;v$xlBnHN7N=@J)?(X zS-JEONlUh9zHobo=9YKsH+Z@7Mh5T=a`sly)@jME?N?@TS7te`oIGe9!&M;_MhM{C zY^O?drQ6-QtKa#`$)htwMTOO=_QDlH)k2#$)Z?*0NA3cB(C3`{j_ds!XS;s1$e`;N z=6}esfY+pv0Os>5BsoA-Irvh0x;`wx_rtpcT#48&H*x355~^&k3=6`?RWV57dI9NH zjD~=YFxKW<`>;;_yq)HW@K!R5dOy(-1?r;ej7!|_OdJu(Mr0hH!D6)_&8K+utHs`lk7uSqK&z8SzWZtNrLQTyCwwUt`N3ao$And8Q8 zQ1(_)QE?(#igs%v7imKyxCqvEi!3(5t-`kXN+ zXKGZ57LK>L)pxxps*_`!u<8mpfSdrQp)Y%K`HXNUB6%Fr(M(O&@yv z{p;B8ks*-iBc*ZM8DO-{0&fCp)TkA}N5fg7HKJG!yRaONKvZdN&`#VTp%Vnnko`tSiQCk z_k!eP)BTA>JpfKMq=ZfTlZm=xg+~TFc*9(&=v7rz&UN_t`y&&KE>P2G!)Cp?8XJSF z4iytZVQ?R+YCRhg>O6OT@Z5PBk>*K3<%5Dd@>(NMAHOU`F{s=)7N$maWFHyOiB`{t zlSe3#LBKu*;1!^+4gfo6cGz9_D~7r9*&yC1RptnkT|^9mZ@vY12Je9pc7Tmnv=$&f zgm5|21+siyei!X3z%i|~rD7FM6s8uG9_7fiTr1sq_wYxNqhm)Qy9%AHf1@=~2%ar* zERkqeP~HuiX6jJnhm;z$n34)tmj}-rg0Knr;l1WItYz5M#T?raohmus(}+rLOgt#m z9xkNi3rho<640e6KTI$NF1@l05)85=540p7=9xJ*Q)a z8+Gsi(Cq6thLnNtgGd|$n=Ud82D2y(`hz?QVp;>Sv9VlBqrU#Rs&v63yj#|W=S&7Y zUn`8foS#{O5iEa%&GP4<+yC4Ea(UdnyOm^+)&(TUnZIXKBVvK3_mOmV<4q_jej@>; zZ39$CpbP8Q?{10Y(8hM-?JVfGiHT#tVTLKeRA=ojIOaHiJzTkJStQjTyn8;=du{9m zhve7hy5=>+5_C1@dlHlVXUnWBdMCmE; z{-UZK$HZu*iL?<)S27)S5TkTi*1*0|BKs1JLS2FALc$_pu7yK#srXX55OMN5NB?IU zo?z`${q#5PWZ<3brqk|YVE4EnJ360~1QL5rD^q1+=zeI2d)kvV*#p!ZqRgjGxXtW( zqf$~*k{d=H;k;Q$aifedHF#1X!zjc>RF#Yd2;%_5|(rUF-3{72djS{`{y6`%O1SR2cB`j?jx7D}UhKP+#vW z|2EP|MOD?#&W_0`al zU|$y6u{WB=ATVjH1(#!+J8%s#yqNGgIdDMW5VleJur+&wYbmCt0=`{Grg;|-P@#K& zSD#(m-OPMw*#Myd06J@JLzJY5HXS+0C>RC5wr4_}i@;VH>&!=312(phEC8)a33SJo z6_GXskR~m_uB}41{roiUnyiM#SKtBTq0!!Uq`BAIFGSml8b+N#o#*XUtax-m0S0a% zpe6Q0hLn0J^cf4%zedJC^NTSfuGJJv0ccYak8MJZwjHy}GK+M0q}f6qwTmPrYA)@E z6N!Y)Jho%NV>J2W=^dVohH1d+_3=L7#*=Lp<>@qG4+@#~9kyzXm#nJ5kufdfxuXDP z1RcuP!3Xvq9fk@7w^z@&#%=AZ^>B37!jGqwk~=VwJXu*BcrqeAxbCbZaQ1e8INb0_ z8*7(2osrl1w$_rH$sGUrr1>}V{;(>Uu1i_n4`}MAKEBzp^Xe9%$ISKnb_zUf2})Ax z{&eaV!-HFL@}@GaJI6ea-YB+ddy--E>`BBEfhQ;4Y@c#@Qhu7@#6j|{mOcV1O_La< zz3EqjDNEw=J*?D*7ieBxG->Kg(C*V*8;}s^i?C-#yKR-gdvxmaXCZ03Rap{HU;D^3 zQw(IN=T;AuiFvUIylY3BZd*$mh8cYWJn=T0Jm&R5^B)iGNGt+);l+fKP5fnB%GIXR zSZVlGX6Yyj)vOZQlkAyYR%jy>pSLBdkzI~P?Ujo6ZsbA@Gobbwei1Vr%+{Hub1j+y zHPknn@RJgdE3-#{_(IO}PW^$}aB~wAg>)V8)J4m+cfgKBPBx42g4n+91b?z|l~z=( zhF9X|%k~sj2`jv1J6HH{LU0eRl_)m$h=w$0m#FN%3Eiho$Ggi7p21|@lZj^&%F7Tkfh|%U3 z!|{l=S0`%mq1}qM&C_{c)GyVGjRHZ~Y(**_gknLQkTL?^B1L=&@bQ_YFsujhYtt;C(LC zAg@DM%0-kCW$XT9)o8cZ_Ud&vdn2KWQ~oY#msHosJ?44OmzklshYXUW-JD+x0}HL0 z^E&mB_8|5_<8-Hi>5~F)vx%#(UUgTV2%NFb@86wRq7wbLzm2lWo#PH8;9Kax9ccx!wZ$3Bo>3f>OGxGbe?v zt?bkdq0y_UoeMH~&$LszW9zzEeZv^$(G`M)Ei}O`fMGWPJL(y0j)!lJx*Q#Y7}mHN z3aoj3eXps|hz@%nBJKh8mZ(g8!~z`+Fl3+M5$bgauD>+E?4osp%j&1hUR3{z7A{-X z0dR-lC5mF!Rk)BBQ&2e-S93QB}hV{P_UHv3v^f)+QZlT5*Yc|4h9Xs8tbZnKiXYJ`4%NqZx zzlapxB&lwIx2!(1?IR$QNXc6%=p>hR4U9rXS`y?6KIhkjNf2NJxQu-xa4=~%Or>R? z+$Lm#%Th+0nL>a7)Qmv1q8skMp#R|riRl~EvTT5V8?v1B|e9x1HInl9Qv+;=MaP%EUG49-6A9Y#r-olExyZ zgk$HxPM!w(#ofMr`>B5rxPmoM56QGC0{(C4=?#Mrd#DcZIRJcD1*2r2E%$J&F)PeU z0)}pL8v4R{rz`iC?Zy>P_>asLaGuDlto>vckUO5ka}65CF;K1yH1^i-jjzpyw{yw4 zXtp5YI3A^VI+WZ+RAzmfz+a)zZu^3Lub33+HHclDNXFjl=h!`jXl}Xfc~&f|NZ@xY ztrA=g=~Ew`tPz`d~L{9C{>wqwq*V_$ardJoK~mp zL!@rE8<=PJy==q@ucWQMK4npO0{QMsUkSr(rOAxeeUO;tUOkU=dT=VPO$QWSB&Htb zSYknCcc2+-og2Bd9{o7r4{Yb)z@cX8&Yn6L)%@V}Tl>IH{mKkJ1#4wjY`4sbOXd@G z`Ayh&Qzh$Gj(9P0$ld3m)8W#=wQ0V!`mbMKnXpMZEj~RQ#$Wa{XO9oA*H~n}tOV}X zs};am$T06>r@E(OMLh_EOkYwzqffuT?))lhJJlxmA7{h7B!2&kA;Pf2XAlNgIM2?` z0**vg_Z}bS)N71F48wCKO7S&2c*RDp4a0yHfP4Jv=c!3EOE+STR`1C#o~1J(-Y|iG zsCPY{*Ex$_d3D?+e5ie4Ac*9EoNKH`&s#(60FF{69>Pv&rKnZQfZOA|a=-8udx~j) zxD4ndA_ZH{(o6W=c?LD?ftt{z&jtr3-vyi1i_wZS-($nzwAN3oI^1#GOSrXVoRcAp zk+H-SNGz4tqRPRqFb~LueslpJw(eZi)#%~Xr6>4rDxbJ>^ov+RtzCieNnZNPw8cYg z&G@dh{s}7Zu>_03kiJ@1ip5v5$|CFDy4K-MpZd-aD6?zFAvBR&Wj;8gt^()nF;$k4 z@DV}0uoWD;m!Q}S`nGR0;jr@_62>8u3V->c2chB@eh0#=eyFZy2LTTL3GZFi zss9HDs9uP1juQl&P54nf`fwL4r0s?G3av}KS-!jFDw%ZXgTFFbdhSNe2*hY_o9$-F zFJ57ptZn?|y^O=1Pc`k9!Z?9IGW!#dXbS2%_rnLAd?IMqx32))ocK0qJ-_4(6a|?H z{@xaSVmnpOhv~HTaffqrvN?S_C-4axFQ^QF{yyK!i3A7NaRwnAwx7R9!Zx+dL2q%17kjK1i>l-L40yIN85&Hibqx;k{ z^@_+Hr=PE16I1PSp=YlB?cp#n73+el2TsYz1p89%^LnwW@OiQoY2QUz5D`#?CoYrkuC~V-!7(sps9B0x`oG6pV%C9!>ywNk_}u=8DRZsRz(Z`W=Fu z8Dz`hMtW>2FPlioM0N6ng({jYzj$?32rKp5v*K3U{@rv~cGeHI@8`S|Nj|gm`J_l? ziW6}TAA4YVdm~3n9HoC?vZpCTPl1iN^4rh}6~j5{1OitwM!CM&l`<>@HaBF!N>irO z($Ta$NbC4`&dAk75GD{@z4L5=&f_3D)*E;uePpd5FaV)oSW-W9fO#Iu1|2IFk!EWS zPm0RgtuNa8jDvN6f&&ewd$8%74_6DBcZMv3$olDy;>MD4Ya5nhXC$WuNWoC)QZU^x z!!K?Cx3|E4y0^mC{9!xv_+^iBdo*la8^Ep}rauOM3M|}5zC0!!Vvza|uR8UgJz=`y z3PIZG(Co*>;Vj_8AP7k!MI4p~oNBCi!OL63F?ukJND3eEt$?dHX}3zZY2i`wVx?sN<^eKDOhCH9%sKk`z8{gl)a>PGBoYmcBpq&NM$0$@=RNywJYPY$S0}e2 zN^-8htvkv$JEkMfBvPW?hS)Mp38|%yZY3VQ@5(x(9OKt6_IOk;ZPi7BU%wl%NA_Q~ zOuDV#oS>0S2D(88Yp45`2Eq#uJVhE-0gl~8?@2`3;rMjJiOV9p++4B<|M;uVP5lamVE)o<%|$(F}lMg}=l z^qniRvXrvx zV`+5U%Eg|__0W#t{X{T_WOEd6~?Zj+;+(=4amof@I$=Da-D28>fo3tsQuxdfZP{UhUaNz#4>Vapo6y z=XNs=k3)opx!}bnct_=2GmouO@bMe6ag1a30#*qFlFU>u!~5)NIX7DsIPc3ywYRqy zs_$G#${pt>w{XUNX>NY`5w*~(^y+==&pB4;h2i2XDu`C3`ZdyVyCHW>>5Dzh@g?> z01pq?<902)D<1;##2S^2y!QmF+K^zU$Vm60$nx-AHBGF6aF1Vjap>)3wF%gT>5Q1I zdrr-+9ZfNhTh82Dh92is%F&tN$#i7D^1l1om4?$W(cq*95FWVzl6sWl zJsc4`TF8t~?BSb-g9{^LhO2d;kG>g7{-YIq5DmsCdm@Jf^UEQTJv1^LFAU61IGEhA z)4K@Zysjn!-Lse9N1#v_Xq2Ao!7U1jzw8bIR+TH9FyHOLck1j!vPF-A5Z!xAbteV( zuw=K-kmw?|@adre>rEBKUA7mMRB5G3+8B+G11`|d(*`5oxW59TY)EgI1DD9=R#ANj zV`5by&9PjH$t4p}#k{-`yv_1}k;BaiAWkpILB6nZ@X<2t5$D77fSq!W`+d1XE!I{B zq>OvjYn^2e{0NOY8mf_o|8gl`L<7xV@C)x=y7(iT-Nz~d!U3^iMgWwRU)-qY$>t`t z2}9Kc-?%7ybv9#`mtAJy+}wAqyHOMp8IQVy7DYWJa)G~?rK3Tz`eE38kD2605-JFM z0l1AJ#J{mO0eQjS@->HeA@%^BR<#<_rJehuuT^LRE%ahKOo>o4R80ry?Tq;e$f8(z zAd9O0$enNCddcCY`QTmHKXac>=+GC*Rb}1Bdl8UCgF8ujAb}a%3@n-(^jBrQ=Gq6S zdoSQeoRKpRVm{Yi_l#{5vFbfvcOK@x)E$2c6zIk2u$5(n&5qN3#*mtnwmq8>lKR!) zeQf6#d9|{V%@0n4b_?CDY?bWo>MHwTcG=Qr2#T>K=8!fb8LkT{jWHJd0F}%jzNX2aCrT_8Ki>$+2PB6XY^h@((Ednzm+y1}uA#6T0D>ng zyBFwqn3@8*D1Yp2;&xPiv4Oud`x6-8n)3ehYYjNu449z$HHD%3e(d98yXGxcYH8Lc zqsP_yKRo8xKq^#kdd)zsu@+wn6CK?fG-#lG_-@{wGfV!Q9c<$Fk_*m8cE5!w^`Vfx zk)XU&WO1`E0iGZIGLU&b4oEk#c)%?*=vrj#62oNVp6v!bl2;0G9E&25O(A!nxA<+= z7Sf?s3G4UzEeBu;@m|<%e{?<|e7gkf-Z(o>yK(-KJr6Tnr9^x?;A4Ui^qyz@ty-YJH*Vh`5W)g5n4Y*+^a$YRnz@N3Q1nEQ6>E4<{b@RvF4p~Ae} zsXwmPa<&g$iGTqTyB@|*pC~J`1IMo5#SfFOK$M+*uq!zv6iOu;#yLFAw_XwiBQ~yn zwnMXYdzKCFJU4A?ZM}*kd63CYk`}M7!gHT^Zzj$6hrw&RTIwxnm@SA$E}yg)2w^S+ zA=1Y9{QUg$g!x{2Wr+XQu{XdSx!zEpfM{^;xhUnxFi%L6HftVR$(1^Fhlu=QL{R(= z(kZ;a)4W7KbmG8z6bQ$bpH_|bj3D?X=B)|2CZ*7vJ4aW{&W&uLR+LE1p}kt#GZzX5 zUAILucYr_w0@wo-&SSr1fs=d#=Z*mumBJy_gzWsFCjK*UFCt=Dj?!*wr8cjgKVtd%gI9v0gWoVye4dA+r@kE~+ z5(~jwA=Obw0JZtv2~dBW+r19ES|=aI-urcx@?>zhcRsg~3tLC4$HBSw)z1!HmyJ)}t z2G5B|kG|U{$UU#(;P{4t*peIC(am4zTnBiHXMERr3%UN_box@hOvlch^%?NkI#Y74 zP+|#k>KNr-yYRGu0#O+f0I&gsBBIERCN&`|=2$C6N8y zs6Nfzh#}{2p1qQwXHjS%J^I=T&}-+KFd9}+V70nZVsT;?1Das(G!bQs60a?mjL(;c zg^N`u_&4BvQ|rj~>)63uLm5SOn4`U2803BeizDVqf?(`VAT1eUJM`0U#S%=~* zinj_e$Z<#h{0dv=Mv=67b~p&e$PTMjB}grPbHx=b-5o><`d{o}#lAY>MnzZ0k-FUc_u4T3VV zA}JNoIx=_bR`0e}=nXm8rnMx)U?Nv^I2WjCC$EA=UjN@$K))|L6ppIhe-ac+U4=Bm65E5Zw!kg$h z^kDG&wUd;4f;#n6I%C^~N1+?390Jz$V{*C&nR%cjfrH$ zd}}FTdZliP0m#!#d8mxgV;5Z?$o%kqCX@O+dNL_m-+=Y-tgvRVE-K1Rrt1}f`SBjO zxJm+VTzf0HbN&9RMzHJ_(I?ka&Zk62N3*n+$g;KqZg4EN-fmz2IeHFBt+IvT-yMVz zGC%VXI!)IZw9SIh$na*jB8YYY=@euxi7GSW_G8-qa^J5xhls#h>dr3E^ZJah0&2=t z9MpawUtt~npT~rhwtJd3H_7elL0DmPnxHyDhflC?0a)<{UOy)UD#ntcyy4)Ie)k($ zy83igb3r{P@wdFJvjFF(7_!=JF0?IFJu2~RQbb@SZ!V-yh>ANXp&WSW-j8txh&}cV z^yBGXf)p3X_p@{_ZXhvrhN^ki-f5&0PPqcP>lS$?TGM#~pvN&~;y5aW)gl?~CbK7% zx{P+#7_{uTRCIPfAq68tP=f^A@e=~-$U{mOwui}K5j1|XRZlKG(>_wNMF*r#D~iIL zpgPuQXq8+0)tcki3(i=Z2(22*I2jM7zROr}{hwb1?LyFW5DI4JI3pWc{|TyUWS33I zV6`N#K4?9!6;XRz1}Rd{C0%cl0BR1`TLjB9#}clO<16_JLz0XdW3C|eueUFVTIG;s zt*5HEQLrjdi!$N<3SAf?z$u-jc`2C(u-w!6TN1t9jNqceb9v1+CV zMIjZZb8Qqe1=`JeD#F-Am{eV3MJ~MOKPqBK7HBB+@MIR_fm1PBPNBknk_)1a^QK)j zg;0qyJl68U8|p8jGJmeWuslzQ=i^{u?s(DDfwP@RhTEPg)Q_;;m;;%m$?_v2J^F!2 zZLODtXN}I5wGOHFhNN7}Zc9H*cGx4r%4NjFQ=k~~Ee9~Sqxnc+3j&M<6Y|v`w+gje z41Re{mUwV05+?vodkiMHHk1_hBD&>w?gBc+Sw_Adiyn4=uaOEP^kkXVI)LC%GQvR9 z?@kndZn`ku5nTLjj?M$ew@`Jo^Q}8H`n}PFc96Kd-VTkDEJjE&5G^1+yeDEJHXx7jBu@`?n??{TNFw%MBs}lpAh*l5OWoK%oy6Smq zG_>HTgTz}y-=~zWzxfo!eg^|fmSk)ZoUksF2hY=gsPgE(?r>J<=+iwdCnv|}zJQ&)_DVYpWRVOCmz((ga*N4#RZo`3;_NoAvL&YmIz}fbcO#u5%I9wohmF z8PLvmpC5%eD<0a*jP`h_5&YQ*NU$!y6&(IHoO-{?or|i*6Un6j=?+6z#6^JFc`JT8 zc(QS|Knf^M3nL)CsTD97b`4n}_#4%+n!WO`?TCgQ3L;T^KDr#z?LvKdhpREE zZggmuMZ*AK+|yVAWG@Ov4a9v1t44Q7gpZ$oZHjjGbx-Q2Z-s^&$>P#lY#J1d3E z-mPW>ulw@MkdJz=Ith?%IaCJ40cDL8nwZoL;D`n?A5ByIQ+6F^r8>_sX^-W(Xer`t z2-ISm`9NK3v9sI6VEgxj&P5QF`A}1cTsjGN=5;@RIQT`v$t%2>__CQN%;lE?1Pnj> zoiBIT+wHSr5G-H!c^)bM=OZICAXYjytkyerJ}p)iAe2v|1-jO7)%O2hE)sqFE8fB^ zGBR9w_)uvf(R*#tTSjeX7eQ%lRw=d_I6@xRE?mh&s9et$Y>ov5J*qe0ZsfW|hC0sz z;EM}^asKjpVY!y_SfKNh~ z`L-WUMWXiw6KF<>^@bplo8DKLDYo7Eb@%I3q(}treIDXD7@=zja1}J94ilaor@3A= z%H)>I)B%2d188Ec+dB&7?!0=*$R`i7b;Gf%4qYhLYGdoHmw;&8eVIv7k`Zau(1u*F zx*B=qNQpl2w_c>C5q|$CSK{8#+kmUDGx+Y(#`I&@ge~@Z1u5mjWy!v@BG>hz5U6F- z_Fo(J|E%{c{ZjAYKhxZ#8`Y^_Co3Yv8yBaN3TFQ|=c2z1ph*uM%|2yU9UvUswrw^cn z@rDN!3qAuOWt*6~6$er#1Kbr1`LSV-?OipqZ z2(>7ffmGgEXI60PX*(xqafhF1$pW2DQ9Q04pU~(}`!{CbjoeHjA_CeP7wr^-PmLiV z|4fY-WW>uV)9^2Sry1o6b$|p`XRQxGa;!HT3_Dv}!wo;7{x}%&fw!0vvq(q2tnZKa zT&;LONwc4|UlW2kcTVZ9gi)Z~I?R7HR!+P%%{a2=jvE?aMamg3UG1GF4q{Vo9bvjH z-h|9M_zA?190Xnl!p@1+1?VMjAk1;UB9K{zQuW2`vU@cl_;!Gj8$24$n!5@IMPaNr z6gWf-?7DDIy-?ZS%pN+B9og(GfSJ?o6JupSTtZ~4OZSxU-;+hqYaygk_%-79N+CZv zTq!%h5Ax0TOMjw{M0C)a&|ry?2OMS|2*(g0P-=wHj65jjEmt=~8VWvk1GD^UeLw!` zyUn&Cw`^bt2?vZf*DZoPgSjlH)3S_BsKcfK{3v#|Qy=Q0O6kbW{(R%Wu!PNzcU))f z(A73Q=I%}(*n3VO(;uPd}d$(SG*kte~)6z1j_+Zq0_;U@@yu-1BajYFL!Tty!;xNK?Div~cCf{qSBS|Vnpb?<(EPwZ0lbY^ZO=K7sdju3diQT&jV^X~bf&C{A#J?YhWoGYl zD0vn@klwY@FT@x;S!%YjMkrjX+{$Av7hAB)5Uz>XxcbQxB+QFco7qeXo_mb}@_Mu# zYBQ24Aq55$-B5|tO+|C>4rh}XwOVV*Pe4pvQg zyvOW`;`N1gYb6^V=&QP3^|-liZNylLpaB76k{)bvtZImBW4Tpr;Lf9kMkmqbWEkRngtd4yNEqP}bY+s12q1 z(6erIeIK`tR+ytVC@lAY(sWfA~oLhxx@Hi1HKsD>@Y^2oosz zf9C2WwCBDoU`ET>rp$-8=Z2eNn;{ML5IXZCN2ReS{Ky(OB3O1isgCt9rwS|1?+$U) zSZV}9G_{>_0&jgG%{_#Fo15zh9EMm#>{h^v_wq9mu?lD|<7&TCKSAMg0}Z_-TmzJy zpVjbLIx(mhuC$51`2cP5 zPYNOQs9wQLG4lmS#xKfWlu=)lXE`M(?cEHy{pFdbARa5y+qTv`G<193{IMlSS{cEg zLD{>JMVOGy^HhCEz^`|C+)3ADo&r@-XsKIt0dm7cSD~Bb*Ynepll(Qe932Uu?XKSr zX`g7QVhFnx?>gl+ON^G_KO>r_);y9uPDg=VCl`hF%-9XAL_|kG2|IdF4oy8ySGlTt zJLvKD;NajXeMd*f7rWe?iOYfn3G6v&8EJ=7O%i1bj-Mh8zC)Ud~V|@MK{zxEo0%Tnhkp zc?N9n;S%uH9c-Id50Qv^65#`5HA|8t>>{G+( zJR!1RqLU$_Uzcde~G^Xj3(%SRT2okrDAYxl#t^EyPN z2Dt{gP=j2{&%?mVN)vFn=-a#BT|O2-tiSM=yA&vo!<%HbNnux=2=jMS)GzuTAQbL< z2q`IMadKbonh9K2^Yf=_lA7*pT?;-BB}S7|!JygpyzFopIf)l|Cc0ru5A;>+Z^4D& zzvuhjkid87^LKRh8oTA_pUc--NYN`K{{m=rq1sfwci4k4gc`;%#FdTWqL&%(St!v(Lc*!STMpnL?-3_w}O`1m-{)TnRc{3x5FA25$t0_XbgYeaP! zEbF*{l3RI??+vmg;DX&C8&#_rnbfJMMGh5;RG6B$HtXkrnq@%s8WYbektG8aZ67%t znikxokV-RwxoS5N*wBE_Abdf}^+O4sCMmZV)jJ?U@kKc#laNpC^5d0J^E?}-fA_g8RW>*RsV0*)QB zb(Kh=VZvE@isjuF={Ock})skNp5%T9n2to(p$)5kQh!m1B0hFS1 z2+9r46BJ;IXm`w;=w6Qh{S|cF7UaEy3y%!Wek2z1t7pNb&{?s4U#Z!(m7bapQTqF|L7$D=PMw- zY5n3r4iX=Nj{f3VP*$yf3M#;y{@y(ryNJ~P|Ia;6|DU=?a-X&T)kFVB_sFnuARrpj zD>PUY*snpzmHCw9qk-fLujEp%e! zm6A-IgOf9QW%8`k=US5Cl5RAg8)Nw6=JWUa2Apc>2$wLMNvH>5Y@XCmHOw%gXuv*H z%nB?#KsYY@A<3#ZZc~POZ0=oxdObFI? zzyYy!w*|TwAlkqUU%2K2JisM~W9yf1o;x&K+fuuTmgMw5$HXc3Z$TIzGFyPs^I?X% z5Xc>KyNMEq;}?eOK3;Sx39jV!l#RM|mq`h3d<8K4My_Ur-74)hXU);BcACWYUSkDE z2p9zJYW`d&8XdaBTorn!NbL_%EO@SEt~4sZuw5cIAvlA>qb?{>BMWKBBlKw79E(Pm z1o*K4l(ew0;Gqj3(V^93@c5@g4YZMC-m5OPP~^-A1Zr(e*wKw2G6?4YYIB5QN)pod zg#hHBLjoj3aoiUG$k8F_XW5&JPuKCft6q5@F6uE>MjtHW6qlfwuckC?Vzk0@p)M~k zCuewp06`NK6_xkep?ax&3{lhDnhc5S00m{G*<1E*jdjz4KdVVc9WmxqlHmC64*i9Z zG5oy}>?gM=w<)eA2cy6EsLhTe!wd-V8suq`XA=>a}PB_#+%bNM9{e{s=c`0oY2Hxh%*Y^2<+ zi+1Qv87(<@As=n-fdeC91+fw^)?HZkA^E@BN2B92HU+ltZXG|>gXQdL;+}R4F>y5M z^MK5a_oDaCUqU>BZ5FuEk#}Ny!rz9osqVq=FD+b2KP;uRiF7mcUmKmF06PKm74&|i zh;%NxfS3eS7Q@sA0SA&$ObcX*G!&NcNb$$_n5up0(dyJ}?%DK9@U!vVhP)=c8fxiG z+67Z<=-Pb453hrk|LFVigsZ_?GG@>rq0~AG!3yY*U#zVar$E~E@o@_w;%M@CafP4%*PZdfp=BqXOYu&bvEGh|8rBaw7rH7Pu{ zzT=krTU2nKX~n$*H%ZZ(nNEo$(mg2+CvE2ZU)gLzn8rm3ML6~FWrLcKVsUe=b22@z zlv?H2AF<0H4D#<@Olv9cgbX%CVvT*EzTfwUJ(7A^=SS*ECXy@Geo0C=L2T40lr4j6 zBTjelzwn>-ty>}~U8g!MmqD&7SGM`9{&mLQ0k!K8 ziGV}-fXV&E7OOdjep>&U;x7)%=(t#ysPcQ}U@PgG|efkgITAdCbkH5ua&CmK~VOLMJ;o~R{xh093#Y2C+kU@+e#!fv?1GBmR zA~@cBy`LMI+AFSkbK=Tk@;%oT+NuX6 zUgpo&M(hs@bT7E?zJV@Bqo&IMBU&#>&AWlui1Bwvj&}dWkz+Mn1qzaBfB8Zy-pCKF z8copYcWbutqr8VE84s7TZd@eZ{)7G`K8I(GduAetX)2yvRh7|%N`9Q~dR{wsGeMOY(D3sdN{IG-H0OLa|- zSh*}TBIO%?Kate_O4RAIvvFMPvsjoJ&*6(%i&`}#26xUJCWFTJS+3X@gF}N@KH-tV`owIK%OPPcE|4gUyDlKDUF@~BWlCim zwzNaW^dqrkae^)WmYw>y!v374LeE|=#7(Z} zfT<$Q+4P;zZDWf6Wy~sNwkIQF*$C<~B;yJSt~P>)IEff@(mSR_jb^YcT>KOWlfSa*)J@RmaZ zLM}Qq()k~SROUyL>cXvY*5A)^8NYSn?(1L3@2|!cipQ_T)MkGpy)udHJp&gO!g?)i z_6M+>bo(z9=5j6bSiA<0xTs_He^j9IXAyX3YM}N`q@D zC$+$k1xdNzm*{fX3TNsF9Wq3@B>ikSd5jv$1+Gm77yCEGY=OiALHlPIkK6qp@1*Bs zWgWq`w6$I5WzwdE6~a)X^*{SBVHPiyq81@mp1Pv_5TIKG7;sF-a+Nr4Q&f} z81hUbxAk?lv|_5Y0&55Gczhp+n3z~pU5pOa?r$Edc@XJ4B0Y3^7GN#qD!PVf)VUEx z6uckoFPM(gS;N9{NK+cB9u3(n!z?x!vxLE5EG#ac5|NO|&&`cr`)qn@1l4Z&fYoFp z%7eFF-yDH2J4i6mD8DncPc+~g;Rber>&iSJZFp`d9X6?W-Ga=IS8LtFV29h_rQ6h}$TKh?-PI*<+{V)3x!$lFT${rPnR0s`tQZ=M+Xn^*HWyuS9A zAjq?BH&L)t@Gpqrz{27G?f1Xph|5Rc!RH+p-Z*!SJQE}LCTjhOns_)@8><_TlrC5| z9FYa&VIP*ZA|LRp{^H}$;1}M_oAi^rfB~9b=xf(=RAj5@Ba}}RW4|e}0 zdeA$B0CrFM{_DFcbQ3vXqx=H9P}6hNBxVbfbpCV!-T!OvK(GK;7HCao0h$}6s60Z) zLDy~IGbYglz7^>ff&a|0R~ProclfpfI*;o%s7w&FCIib@M~hw1ea>uQNc0Pq1V?rG zM7H+YNIMnDjA!L)oKbVsB>#+>+;f8DMFU^apq9{-|NZU%esiR``@gpK!`J-xjP3rf zZ$T<>|MjW=y-WV@-JzLjx)8&(TW;hUF=`O9A_*CC`=co%04|>^tRaSvc91>sFIncF zbc4ZcJNEK!BTsg53I7d6v+Mk}y(i8{@7>Nhd5FX3jo*$8mt2#*GL{t|J~13HM;%(& zcCX0YN8T?n;c{-yo7XX~wk3Py+$VpYBF7*Z;N zSS72YL%*LmPT{Hcf9tQKT6#9c?fehFj=Zt-LdD;_{Qu!!|6kYc>@x2Cf3WudxBvRz ze)+}2Sz@MFK1uD@@nrU5e&zhwxUdSFRUUTQ)@6zsF{NClGRcn08S=ee&N+s8Cnj9G zc&5^_v{z`i-8~PMl#qE{h{7itrKelmp|9Pp^gJ3Y4;4YPA0&E(&%Q0Z)&hlGq0-$c zTn4>fweQNiUalGl2nYb{$`Lqtb|5+cylLn}KHx%L8b6G(Ojy(a^xG@(I3I{+!Vl#y z3`9*$O~D^Rq~?J#0S(XXYvFT1dm9K`0>Tgob)1YKtLddESN=3Mt?NL&7qYgn{ZibQ zdOXnwKHQ^3wO@J;(%&Jk>vbKUNe*O40HZ@TvidOAdYNaeJzD^C!^Y+$83Vr#<8Pl* zS{bEqW(iDXYe z(!d1}m%*r!Iy36-pz{6gEKmz3nPwIYtLcJTl!Z#gjI9#?{G(R(@l%#wzeJ0 zxXaNM7QVuZWfOC8f7cGt6-xd=ZVB2J!{h@bk}^IVqZ?g}m0GL_Gn; zW9c_=9S$Ah*t1I5nrA7p3f|n3OJ&Lfp5ESkT3KJ%4_{us*L1F8hOb+F z4C63TsTE@Hb{Oj_tjbFBh2Uhpe$UORv@=H#1XOI!5!^CU7?I}fZ{L1-1$Dj!VorIZg`7yk4=XyQVrvvl-`*2=|6S=iW2%++v*G{VwmJe7hD5KKUmuJg60Yh>wqW2?5sSWY__|nd?X>E}Ar~&9wBscB)73OYB&k)Q20OZ!ZeZ^k#P$xZ7TS`E_jp zvp(HT!DdVBNm1vV+$k4ygs5B6c>}{K$HKy*oDR*PNf;@Q8N)_k)w_r26xdzaeQBlN z*Oo?3QKp^oVwv@OyNh@>sVg0Y`f2(FQN$(~BuDVXN#)e6eCB6)<&AI_U)3*i9)(`y zDJL=u4~rPOdzf<~Fsw&Zudr#0Q-(W>q1;FR%z-S`cr{X^q zF!z1=?gc$7EjFNGK+vj&pM~AJ9OeeCl8<|CtQ2?P_d|4Bz8JC@gje>Ds%|=vzA&@y zQp$_=fwrinr`lK5(uV#G7LnF1GDuRJvup5Ts| ztb0b&T@%-zb$34Yz+K;6Lrc78E;D33_mXVWCFR)vy@>pD4JZJRN#*)5-b086To#Y| z#q0x!i~eDP#Va7McHUH7nt(^Y0^z*l9TjYcS*N2(%rJVq@i950uCDIJjT={y@fs@Q z(7wMUaiiGWxjDEaj^wff%x{dLR7G8A0DU-^t}>TvL&bZf9B)j%gBrSE9q3Yuj*C;n zJIvgRoXT&OJ&&UL>GpI0Fnj^hbSN;rm-ey~VJPC+32juu!5^nJc(YeKXnZE;>C>ms zs{d;nNG1M+PfP%YElqYt7V(=NxO?U|XzwCBo_sf?=YhLSPlo=l=N(Wq+KLu?arMSY zjkTw~h@;U4JE|h^p}N(bJfgf0evbPBwO~BIz{n<1EmHcP{5xLRP3buiGOmv>K8bVIHMTmpMJ)7P5RWSQzuWJl#uuiEJB8*o+9gEP!(RqDfwFMzbFEef+#V8o|2dE zpRZh*jT6dTmHu9TE43Ig)HaYLMn>j($ga1yq}#Q)6TI{72Sop5RPrmfAB-Jqe0o(Mdf)Qjw}R`#%a$)sj>&NFm$pe?PL|wJW8<;dd3CkGyTShWWL-(c z(tYzABv6yNe9ueR0$cQV!7i7OhYzbb=~=i`|4J;R5I8R5#cu;Rj0tru^}GJGmX&)8 z)7h2;hncEoFA8?KYf!Y7@>r{CBjMW!W1mXAi8l39PP9o6bhR{ocZCHe>5=#%WfDK4 zvSWUg&7C)@nn$xYvAv!#BKx{Rsc;}8+nID|D^|a7;ZVSY^*jx@Jzc(dX*z&8U_l{T zdFz8C)DWb`-|0;D?Iw^>$BMSsHn53j^>d~h#6m! z{eg6zbEW!%0S#+QPU`-SJ#>$cnc!n$@rlWDglfGPO>w8mb6Qov_3|RMJ9DgnpPpZjyjh<-|Y41;lrJ`b}D|*l{~pRT7A`pti+k#Z`;;&#^E8? zTmLIvm02c}3-j0!p#|V@Po6G;zvUHo*3mY#>(P|2UHl&J+5xEUc^!(=3v~ z9eJgA?;hckUjdgi&pQ2_Yn!k!vEFy{pG4-3N3V4m+OD1Fg<99(S7b67+7_rM*5nx| zf#dSUe`7 zd2ja2%s+jf_DMkJ;~}S*PAQS!XjP4jj6n0GxsHj+Ak=D8&*OTjLX2W|naQ*_o{9mD z?wil~7fh~G_1cSO?he_e z@Z=2hv*>7~k?Oz@(s2$)1Y|5yr%pxu;{xWNn85-rtss@4fAUWr&oFGA*(ThvZ!GE_ zLCah6D#u^$Psz!n8?fLaG89fzHUbL_P7u8Obozl;?-%)yYS^m=@ffmK?H-WsUwzf6 z3qipRT3F&C`Y(&iAAcpWXI8gl0FWJAcGz|}e9d-m_%f42g%>pRMyNT_0BNlck8(} zL8~U(mBw4le@iGXP4{#h?cVJAEj;Qif^g}eN6PJg+IU)3X>VVVu#}WHkY!R{PXk9+ zce$U>Ync8(`c}b0X>%Q^-D!^bODQ4W1{^5syek3U+2y&?z}8e&;0^(pv;=@2H&Xlg zCzLVSSEMlrk>z>EyW!M%S~7|t2y65kbP*QPY> z^jFErnk#<@dgu>9Ga!OS>TOXdTSq`dZT+T85;T9Qfly%0zmEsXKFSk}t4dj}l+uPK zUu6TRja1uGtJqOFTaxiMBK>G^&zG|i0UGq^sK$ZubGQ4Qw^U3$);mBoa??NuA4RPtp4;p1F z@=eC%3@s2PNzu)<2NR@8QH^_U1b12%r2pn;@=`mf=T={l<4j-CRX1pg-JIZF8vd^i zBMACjNT_}054%}KoNKH#M;y*0_v3WeKsV8VYW5Aw8`TWiym-O`H;09+tc8&^h5lPS zt%lN8n}mS%sEcDndDmR*N(>IyY|llF@w>%N+Lcb|Eq6iVrxbN6-N6_UbGHj?u-IPgNSD*_`_*sV=FO;N#qo$dQX#8EPCmQa>1qI&-V^%B*nwGaA>ddOno%{RQUe7+Uzr zhUXO1s!nIiKk6fhiptjbOOfuTnUXHaZ;D=98}>5{b+{}W@Z9Z#`xRaQp`tL-2?(wRE!8x9NAKx>jfTqyHPHK%}N*>t`(MZVgiCfI&!+?vCTZV z30>0^7lwCzmXdVxYEA>RBdjQ&ACWa9@q}?%lu{48^ZN!CGrMKPJP)Q5Hc6c{v>w*3 zDaJ1`r_)|BbAL{bUW=*=d9bg>m4#qqa`gyGQVY-E%plyp)HD+g7=@L9mi~L^hU#{* zQReO(DV)fxiy!}D=#`&OUFvBynmZ3;XnB$)9K4(v0)WGenxyH}V9z#gd_Gl#x>BxS zgp<-yyI4aTmEG=^l|Pqe-f!ZA)27Lpu6%Pt~jUJ>flE3OEYN^qLQWtWa^Y04F-OOM`Y$cOR?WDW6 z08MQoNjp?Cz?3%`tf$E!?r$lbHflt4^j|KSF;!Xn=;n_eKR zmWi#j$;71lCC2^~y+$vlL>Jk2jK{aXrFffC%w|@LNVf9}+>dPZ42?7Vv(`RrlV|S8 zz8OQyR8Z6a+7UBUO82)s&lZiArhLq#Ky9;JoDF87>gh2;{a^&@PGo6)vdO#zlgDGS!IrCI|C;8Ruz6=zMT1eM|{1+8aCn_&0ZMpC(#RK)13&uSo$r zu6C_d{nd7uHIpcm%=^FK&4dHurm(iyY{vP85Kk_e-~BI&iC(hG1q|@N?ihswj4!yo zN(27e!6~oJh?370vA|4>5iU-o(Sa9 z_wU2_mj4sL|7pPg-%Y?Efvqi$kwrxKOX6@R52YS+wwP9v6prN`< zyLWK|wIXXUG8p8Nay|M6sBp_wlSJFBcF7%%NHY$%H)YFRQkYw@FG<}nk; z%$4k5-}$;DEz|IBN`ZgciaRhuwn5?>@cTS>4{QPjQw?Ga=k;&xKi4-az|8oS=a*tFeSg_PZA=eBD zB>Sj=q*Oi8MM>_LE9H+grLj~vf%=S&n)9xaOgYm?nvR;8MNn8N^7@=sN>I3ru zT8;W3c|{c3s|e+0=MDrsDW;~T`)T}=pbuR>cG%?# zF~6)LdR4kUejS-V3oRuM@U^EHybu%f9)Dy@dZ`Y5&sXHPnyiF zFf^au6UmlN>8~5i2tMu_%cxOfKaegiD=RA}N0~K7SU6!^jsY#{0(!FO50Nc;EkfPL zD%(7bEnr0O3blL`TNDBv=41nl8c1Pq>5Lg#Vca;s*>?}RFirjjdY4lMg1oMb%D>zj zJ#61qH_9lSH^h#zx?zm8nj98lGr zvAQ68<$^2%ajHc4H+1dEp=8ha=iJ+_%uWqdFY=B*rrD6FHyyIpl|e%KvKiOP`rWb$ zZwWQx7c?PQ6Vv)i2ga1n4xq83va)2LV}0dQgk<#^gp_CdiXI2FJWh_5EgiPI-uRpu zXKuA)Qm{RDrFFdGt%-7ayqg^{))B@G@r@o$2uAl;B*raD=8!J08#V*kJ39w6m$c`2 z>md*){C!3oz>HJOBTW?$ZormM%~Bv#*_^d!m|D|I8^yb^={QE|hU^FDhqg%9D zdRKoMW%Vq0BU4w~0)1G*fRhyGlK01S-HDIs%fOy0yY{UjcLq4v&Y>psa1{flWg2qn z5DtN5+#Lv2yT5_MOm2+!eHXoUf*Kr`m>&Za|Eq64g=Hg}0Kw7gv`O-&?};eX4u-Al zPiS}W$g|S~oKD=%%9Ek^ey<{*%5TT$1PYiMtOAd}V#+-6OrV zEyuDY36=-kDdf|Q)59=4*HU7@==Szo$pe0A_f3MdtYElCt`uW@!_>@-V7N+d9co<1 zJj6wW1^41e1x142JyWAbHtwV=yS;|YW!clp4l)zn^sipMf~gnpGl17pDPSzi9L-F8 z=>`srB$*Bze>z!AK1aB}smVeY*ut@34s5C+! z>nagw@>v@m?vM*w>8x?6V{ULPE!@hnMIFEFy5?GC<^*qjK`^8K(+*innqKy(e?*3*?5>?eKg>xsS>Z>&}}qh-$P*68d*qc0pvQDD`mk>Z?y^05g* zf`5}eyx=w>lVyPJx$H5E=MirC_#v;|%IG-V7U-XQa%W3|dM^CrAgYE9vEKK5* z^>=LY@-1Vxso`^qkzcq9Bo_!@B_Dj6>{i`94pjpsIXjLw-A8@+eRW`BXA~6`P1S%3 zs=vfzc+)@~ed%MC1ogSn`!CevX-DE^>3Co)`jVz}$mVZmgF$i1HcoDM)QUYQ+YU6Y3Pmtp0%jt|eO_l+;NczS?V#Wvm+PT> z-wwybO1)_XFjkR)Fmzt&+dB+QRI4OX`C^h#pcl}!d(8AnN=QhEiS4F=dA`L0?UMdk z?adPeb)U%cM8b>L_j@}#m+(scEiElkAkd$O{#Da?8+4m})tpNHi0xT83)5p|tJW9; zpz{g!4qD+0YKk`d%Mn*?xGGgm#uh$IJe6r~&od1zmpROyU(tHTDpl*gc2rEv+Tg8c zEHC8-%Kb33+Yb~j^Ecj_k}WBTrg*eQrkZnj$K-3)=pb)|QA8jrPcFQplc~R(>yS(x zj07m#ibVS3hune@)tt(aZdR@`n@fr`W^jSx!M(d?M-VZ8O!hRU^HcFh8Xo=bud{-H z-teD z8y0+D1Kp%>vc}QMO3X@t$2`p*3AIxtYf^{7SdqT6~zR;MS~j7@$BH zdW-bjD!k*KsaAeJw&Ts6kD|+X)#fQ~aonQrM7I(rVSvROvnr)Kr9XEircLgp+$-#5 zktWH6;7nu=*KNAi*)?g;Z=Zpae06mdstotaRv{&gfUArmZ#n6xlYBdx^C~7Jx!1qp zF?Z-vx6@xPS?w8Vzf}!-*)x;5`A;}OYB*!D&@qw_OJ1@0&G9T-^tqP$+gW9 z-Gn2;~I z@70K0)jrhjR^8)uu}1c&CCuLw$M3m7H__g%C4j(vgs@*Aw7fj;E1k`YU@@VD@;qj{ z7)#u!uPj2;9fi!Szmz%>>-!F~@{mP7{!y8|ay)JOQ&~FHD&OVLUI*W;*Gqr(USJ8> z0jY(I--?WfrxuK&2gjm`;tvhqI_?*Mp;}9z6&U|w6AG!z^ac>??Fp*ddh$l`VD_=Z zEYYT>ASvKnJE5Iv+6m9r{Bf=6IRIaCfPK=V%Jyu);L_7C{+7n_exrnXi3Vod6w(Ut z@h?PT9R|zMzw2x*GxV84D<>bc>`u)RC_fiQ1LMCTVSQFNT%(KKnxKUC zfj4KZf>-p!G_R4Y!a{L@Z!k<)+GmzMVObgH5X(B*ErA=!-=D$qC3eS~57WEso~;kt zj%RaGdS2bTcdwo&N77_{LKo;ca5x+VbZTueS*{-lxub}{EEz}#o|lz|%O9^VH|rnh zwS)LFp5M*x!-7JpR$BSj>$bKF>9RMZ7W>EO+I2f`JOn3T*wH+GJW|)hPplD$ZdFym z%OY`r`xqueHsjew!}5}5-aBwvZo3x}CO^ng!$8g!g7?GxW^wiAQ%SK6LcU)Z6K!B} z;kD$2doq#RJooH!i*<50ZqMyOxP714UcU~bOCR=tnJ>^z@XP5|Uv}5y?Px|ufr{=M@tPu2QUJI$YDMyrOAoE3AVn-N4zpXPxbFtF4Pl04gWf(kgJEx zHB5OAwRI{S{A%niFgq4twFi-1SDELD30~o87KP{DhQSY%^PrDaR?h ztuE!1^;vEy*RSh1(!g^0@m?M=-7o%JbktQMuQlzc~E;`}fjNhFqL1yuf53 zm@ps=%088onwkn6o*FYy&f>H}+nzgS;uc%ngp8jLoGdGtoSG5<*s%>Y;0B6<==CLj zq^}$C#IH+1y@^|>P~pnWiwJRyqcGEjlg0w~6x*TepY=dAuOjd3%nXd+4!(f;mc9fe7bCRL+wON+*KxJ^jK3*}X8p{H*nO;fa|k@c1Pttu43)}T&g zeK4jiS-r*z<=F)x)1612RxSIzd5CAo#BUCgYsapYs1`l!0O0wH?IY&t`c2P@Sn9Uue1p^al(ZpiZ@U#{Lf(T(w#DgE}I(G=NA)v+~jJ4~ZM%}QP>#4EvXkC_m|`e14gAjl>Zh+B*dh%AyL0D`LJ=~5464Cs+b8`4i<=}GqU6y&@b0aV z1&oh+0@cbzPJ zOc;SDKTU#GVCR2ybQ)mw-3T>vJ#Zsy+ufyY|MJI{pgvn;1_pM?v#EFZOf@JoaCjJ_iBzv|6X`e?WpMv?#z^QReAm&`tE-y<10(y+*^w$H%{G zz_~GvF3k>dZ&;k$hQ%RX_NN*$sJ45;cNqAg8D@Vl>A*J&HvfZfj0)+6(5gX z#hvYmeNZcN_{b67caPt~leuWqiNhK-18<#ppCI$Md{ba-^KIwp>FM40eXKlMq3AoL z`sQ$_Gwx9Up8jxSJO88eS@1Kqz=7Z5l=c)B$N{i;e=u>g1_6+p)bLbkig^f^%)T)y zbM?h^tVT9Wrz)TI4`9OQj+6M>!g@SCq;{xA`n*CeNt+5fxn^W@F2S=1QPi5n62|lC_Slj|yRdb@%+yWyrT6Ov(3=kdj^8 z^cQ>G^t;!5@K0XzE1X-pXH#A)L5{KlP9b@FOB6?djM@*Jw6wg8qXXLl=v)Af_1n4f zh1gl(MFsdQMoF7QqPzvp3$Q)nERm@GL<*r!_{$TdI(*P-xFT!JK>Bb6T5Ze(X_h1| zZtU{e{cfWY_rPNiKE}Bz-<3E2bY+MsS3xM`IT*j))NkwT?VRJc2YSqVr?^edV@H3u z67PR-C81~?7U;gSfD!;y=S#zE88tXkb#*+rjs3Ub8na9!u8*r@kL?KpSLzd!GD&r% z7r@LHdI!nw5I3OTiD|*r)zx>D-(;ny+20*3kTQ5O3tY#&$$l6g3vuVq z$f?#4<%m}(Yhj`)EDcbZQzJg|k<+MR|Bt)96<_iC1$pg2ynkacdw^`xHgLpnD+6ty z@8VGS-e@h$dz$GVFa|A5keGP*imH)}fY!*`U8$2u%tYDbyvjMec&A39b5G}~KIz)p z?`LP}%VPavAw%H#P4d-GFy9Cq47JSp_HdWJ_PiJ^AAb|BFz$NjTITZy@6u53R2#_e z=lVJSW&L~Qw}Y$`#if_R%FAwyopz7!U;oB(((m+UMC5TNC#_I{A<@O^7YjEPv?YUy zhoU<_THwy@*z_m#8&-q@I(zRI+o*Q|+P5YU{~=_8o(Tu+lg=kR)gP!+9~?+nNcb!) zvKf*39a*}RK-nb8Nq2~ofCk_sc`>RtyHD&=82u8!$$(r%_Qgz!HMt#zG80kuAF-Kw znrV|83e!WgNGXzAyt6N4k-LsUl@c-j8fj=Nf~#cqcYZ*Tgv1@D9k}Qr;%diT-2@oLEE4<1d?xa&48U zT72xX_$I)az2HSQY&>L2c$-;Xg$3>gHAfQt1ac(z8tFiS?Hm^nAT6~A?w)JuS(@NU zEpV3f-xht;h2Ar+$UG|A_oX}fi|F*!(m)ObhK;w_H@brBL@uv z=8jYrv%d@S6B>JiSl>@?!qH>;OQi*_j(HO`H?e{1fHY-BH$^=93WAaaAOWs z;!;Ng*A}NAo?yvaotm+cZCkVyfgt(Q8Qz=t!_IlY&cQ}{OnIP64V80v)O*_L02ui? z1M$qRKYaF2D@TbPHRNlbSMw(=ZHc9?!foTBs>mXry#4Mw|Kyn7!qK}RAKu0I7iQA) zFJ`hu<5odnLCCU#KdJi8GekJso+)K?F7Z zLyg3wHUw2<{9m$naD}ex3H+0cE8_-@wzV; zvVoq#I(%f%2kJ*s1^(`mfu`Q$vVZv8tit+kAyE3)hC=`9`f_9b!g1^G&SHJv8{)m6 zG96mpD4o(o4Z>jS?aHPpOGt(>LH%?*Ee|H+VjXjO==1VRpCdPmT-MKG`!h-qM4fE> z{b~bBI%YDQk+rY_cccVnh54Qx#*EZtL>Uf$eJLb62|u3|Bn4itmf1%EVQ;ha+l}Pm zenhq?2r>Ry;0Rlt|4BeR1nPALNk!38nw!v`)!_wBDA}V7il=uA-%))MW0w0G*GAmh5tz!agcz)LSBJ3fOw2?kz>Nna4{Fv$-kOi-c))CTnr6BcDF6d*;B$XnyAU} zb+&hsbgQxfF8BR;R~J-nMhP7Mq0-F&zVK9g@ecIo<#0PCNYX=oLD$6EI2FMTrIRAl8!^KgZnk<9-JZ_+istVqdnI#i}LiXX+daAIkET<#s=G?o!`wisl;q zT>S4s{ia$^BykY-hC)=wuzwYA?|J*xoVq)|Sg$1TDVqSDPB6`w^q5K{BbyKkaA81p z&AMJ~(Ufj?4qPU(c1AhV%kCqAfIosOn*z_ z6{YoOZt9g83+)LqJv)?rAFtuAXPfA@Mi@@~g}lnjwdaldo1dXW^zCQw4lgYWLDYA( zEu`&#<2X!>EqP977z*MPcVMS0t#HIP@(Vfc>7+Z;mbmN7g_b{J)BofP9=hGsE9|}S z=pbkG_lDseyTZ{+mV}0Ud|WJPR4e6nc76ryBrg_yCcDeP&=BST4dYn2KTR*Kt*t>V zNIlR0?7Z%HiIs0N`(Py+-;7h-gS)%QQWi6{Kq9bV@o(pA!p-H-jN!uHT&|HWA&18C zd~|g5%!@gw7OAFrt)KZF&%wblo^u`YBRk`FVr-n!a`kCR>P?fK3pEx=UE$gxZ*LOhjlR5_87RYui${V#gZC?@CQ!Mv|1FiTxO7Pt@o(c8nnmBpuv>MHw}eOavo+K!IR#NAX~NeLeKELF3eW|3HPrwsC5_*^o`x zqrdM{K#$zFnVoxdd*?kxYhKLMhh*`*3jdSYCV1vs@IJzWP9qYDmr_}mO8nQo*C=fc zlgq2>@v`eu_8A>Eb)e?U#N}dN!L}$0x^LP9UEiZ@dRBJ61o`1Q;-Mu}u z@Vr@sX>@F5|Bk%#?E#f7wY6qX60Ah-+M_E9A*c7)=LvRlto5LGM6{Gw$G9Vq^(EGHMsaA`g>so0KG5;rk(U?HuW z$*i#7-QcJeiKShBCTFBwJeh2EPlQ}US!XG#V952H8`7|O7eE93#1CW$-@a5-;88L-;@qs4DG3)VLyvaJU=7c^|xouzAVl~~{@R;mZ9^~&VQbSOyvDLIug!u%LB z6;D}-_c`XFr}CKX#3{S(9sC|pF!97y;E6ZP%rlqUg(RM-0+t=LO(Z{7wak*i7 z|GNH^Bs`r^h$a*Z5PD*VZf=!px<(y zWy2eXL4U}0>IDW&;EnfZwKW9?Nt_ynS!{goeMiESFEvU6IeuO2OzA>X4VRA{_y-x{ zue?BEU?T53TH4y=j2jO@jWDO5`^4^x9c8YNpc7VWq0qin(~;Ae$>B<+&?4d@*{_?~ zz9ktFIyzvfsy0V&b?2B?D0o4adv9;Ad0^}LR>o!tUkPiB$x36m%s`WYoO=B1ZUV`d zUpA}H)EU?B+;F@{T>XaqR0QN~C7!7CRKnZvFRPD{=fuX}QnTHcRwAY&`LXQ#6rLVh zcb?h?;ZKdP;=Kp#y8Yp`L8un;g2~2T452sj)2B~nGy(dc0LXsNcf45;n_wR;T&k#Kgn|7gTYvemw(}K4e`(0&KPFF(xC5d==_v6z?#tn1rAI;`(XtE*jXp z(Z6h7G((vdZ12`Y?{_ux6@oTtG^+jAExBDL*s`@sQxV+aeCV3d(U-9t2J_f*XIvdx zrxSC8@8iS%0+{<0nrqjS*By@(dR$>v^J{n!>sKBr=kIlO>+bNyM^P0pxET6q-?MLF z=8Phr&@qGX(Zi8+?Tb}(t`Ri#HpTN%lqOrY;ztW9rg;oyoudXX4YLTA7 zuuDqSZXesujC-gdz4h$3Oi(i{wY45IeDH`?DwwzsizCxo;qkdn`8 zW6LGuK1UCy^78S)jJ;lW$VEC0S3~LA&?npM?dPmyQ=a#kLccCcQmawx@*q|&?h90b zlHm1)TgAw|#}dYr-j^3UM)nSrNIuGU*XFAI-Xe<;B^JZQX|HGG9~PM6z6aU_)(0TJ zTBBjp_tpt1ahh@^Esn#$XbT5*Sz^29PI*rLtX*A_*_F*&%FH(xE5`@MLxRzmQ!q5n zXP(Aqo-ZMmW|+08qVX9!^uF?~3)#~<$_3KSB)5MBHYZ}e=V?EV!D~|kUg5@jAMdN> z(YXTyp`x03kB6|fHa$E}m|O_QsLtfPK5}xJ=|j28{cGmTFgA;s9Udb?F#>Eq#57x4 zI2P+Cdvsml<*aWxzeg6+_Qc*pWzrE}VDK>$yO%T0a`0O)X6CESa~m+(#CE9OfXR+6 zTUir6PHM~EoxJ}ro8hW8R5W*I<#z%E!M}LH8=-;~z5eO7h7D8>?M&G}q~{d-w#g~z zfPVxggS5&^-CpXn`<4fq^EK0Zk=>1%Ls&_1<}Wk|X%|QFdn~R|H(2POE7lAfJ=7mC+4m3FZqKeKeBaRbXFi<_J8O~Cn8fKoG<9Gh>Y%(P#>Fq&p!7PrQKRda~w(spboC zy1$|aVJIyEh_EKZ=WddW!54Wor7zA$UG!nEL@F2;iiXDd=L=m5Hgh6AGdcFEr1p-E>7M)}aShaPmK^7OjJAq@$Xkh~(v7ZCccu3-XOP4a z*e4(Z7VERQU%{cEOCloZ+P|SyeyFDX#mZ)998e%VF|v$$<=ZB@V3JY^k3!@%f}Ao~ zbXv&29-)=G!z7++*28qf>-}BPlu{LkUmkz@zymxACd6sOcTR{A3zYc+3B~?Y*B4jW z!xlpKE9T9X!i#57MKM(T2p>r*pXmMAr}5j9kFOU8HPXuacF#AjKQugX!oA^mVPES* zzC^&?8aCiSbD83O=g*y0na$^dQR7Q=^2O~Vc;mnl!mp|X< z%FOKhRiUYZK2vzzZD=}#%!H3feDPv9Ej^1NNhjMFy-LetWHWD){oYR3Kgl6mT;(@C zhw8^L){*m>pVmc&%gfWfY|WOvZ>}e5eR}YuC|zF@0?vV~eBBFc8F%CJF~)~4L?2|@ zGF6vc{fS*z?IK_%g$MvqRibJaA;#RdmU(mlXXU5q*O->cWHz4J%HfW=)!qEeKMo(O zs5x3x5&d&R*A%}doW7-ydSes)STnk_r6tUYIEs{NQMc3x&QQyCp;kqa+y<`VR2??2i`mtrx!FxS84E1vm_o zfdR0${H|Ts?*ng1O^>!@d{ISSy5xD7Hjat74&`j)M@QvSw;k1c#o`>I*}}GLCCwMC zU6~6sZ;9=Q@A1mJF$u+m9JXvc@N>7Nw0rTp=Um)}mUC;kf)Ir=_$!6#X!bs+BzN?d zUb7$8JTM6t%?EpFPqKeH2RETdmrrP*SY31hN#p&nr&A7g|r)u(^d9XDWfDS7S=t+I=4?O|IKMhXJ>Ao3| zdB{9^UW-1AD7F$Zs22dDJIuEZnRSK2CLnu)5vL`iG3GGac5Ccm^|(H6XPnI9M@46x z8?5&;R}?927EzGjd_PW+PsrHVFDrXcQaqe-NsY_n9tx=u5fS&typ)lUe%$b_Fs-(b zk&Vp)SMu}5tk0X({!sa$j(NozXZs9f#CYdXK#_MRr?hv;@edJZ;|GN;YC}I>1OB(2 zFcg*aD`rzQ-+dsZKG0^HjVfZN)>rU$n-9U+LaO`a*ME{u_ z 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 C?GeWS literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/ControlledInverter.svg b/v1/src/simulator/src/img/ControlledInverter.svg new file mode 100644 index 00000000..927dc8c8 --- /dev/null +++ b/v1/src/simulator/src/img/ControlledInverter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/Counter.svg b/v1/src/simulator/src/img/Counter.svg new file mode 100644 index 00000000..ee2aa77b --- /dev/null +++ b/v1/src/simulator/src/img/Counter.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v1/src/simulator/src/img/Decoder.svg b/v1/src/simulator/src/img/Decoder.svg new file mode 100644 index 00000000..9a48c394 --- /dev/null +++ b/v1/src/simulator/src/img/Decoder.svg @@ -0,0 +1 @@ +01 \ No newline at end of file diff --git a/v1/src/simulator/src/img/Demultiplexer.svg b/v1/src/simulator/src/img/Demultiplexer.svg new file mode 100644 index 00000000..61cad635 --- /dev/null +++ b/v1/src/simulator/src/img/Demultiplexer.svg @@ -0,0 +1 @@ +01 \ No newline at end of file diff --git a/v1/src/simulator/src/img/DflipFlop.svg b/v1/src/simulator/src/img/DflipFlop.svg new file mode 100644 index 00000000..49f4ab5f --- /dev/null +++ b/v1/src/simulator/src/img/DflipFlop.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v1/src/simulator/src/img/DigitalLed.svg b/v1/src/simulator/src/img/DigitalLed.svg new file mode 100644 index 00000000..a9259c2f --- /dev/null +++ b/v1/src/simulator/src/img/DigitalLed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/Dlatch.svg b/v1/src/simulator/src/img/Dlatch.svg new file mode 100644 index 00000000..8aef7671 --- /dev/null +++ b/v1/src/simulator/src/img/Dlatch.svg @@ -0,0 +1 @@ +3 \ No newline at end of file diff --git a/v1/src/simulator/src/img/EEPROM.svg b/v1/src/simulator/src/img/EEPROM.svg new file mode 100644 index 00000000..504f61b0 --- /dev/null +++ b/v1/src/simulator/src/img/EEPROM.svg @@ -0,0 +1 @@ +EPROMADIWDO \ No newline at end of file diff --git a/v1/src/simulator/src/img/Flag.svg b/v1/src/simulator/src/img/Flag.svg new file mode 100644 index 00000000..87ef27f4 --- /dev/null +++ b/v1/src/simulator/src/img/Flag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/FlipFlop.jpeg b/v1/src/simulator/src/img/FlipFlop.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..5c3d87cea34b60ff4158c2222ca06425f065213d GIT binary patch literal 6224 zcmcIpc{r49+n1ywT2#uA6d_5Xk!>_&&yqE=gql&wGPcOz;h|FYr7UC3nym(7jJ=SU zvGa_fvBZQi6UH(#mhV>Y`+m=ReDCr7^Bv#(abDMbUgz>V&+EMJKYsJl)L55~M~H`m zgM&|B@1_|C2WLF6rybzjmAPFx92}0Ego{mz-a`>9B9MW!~X_Us}FJ0pmAG=NK zbCGc5`zd&I2PrA`tPn1mgaVzAIH-6U4FMI=fCD)BoAz zm-&;mC;!6w4;Uhf`U&6pg#b^3hUi^L;B+7bApQJdRY{|8uPbahnwSI?n5I%XJO6YFnphpADV7rD><|me6BbIdQpC z+`e9%2xe37hv%R6+$*(`2@kj?4-&mw_;7RvkwbG*bH{+ZKKEJEYAK|}laP45(CcX8 zt%%4^PKrYNj&c`yaw4*7({EkS5KZZt;nF1w+E?NZbxO`bcsiuiQWJ0{?&j6hfAKs z#$YWU`*mheaMO-C-o4sZ%HZSyt^<2Z$#kW3Binl*{iivmPpt*zAXTY|CtwhvMYKie zlSCDYD z4&8K5vns7%Kzca!)~srsST1gypU)p_H|hD7MRvyszS=kN)r0f$ggFg?z4?NC1SWbP z4^wcC#&mwHC)3H$)+*D>4q|cc7*cUj!9ztoP4v#&Ubh_L$yYN^)f_6U^%Fi4FEz?U zEmyefT{_9OK-;+AKF%S#da2aN*G45iYaPP`$GUxQfn2B^}egXa<$eE#XPF*kfjS(DH!9 zOH(ub+^OOlN6qxk(K}+BdT0;F3j>$O?d{n3Oq4gRo3IIoQ-pQf=FT$Oqd^$=@hA?F zGGB^`RZN|hO^aLTByAj*O7a}5rv3G_<)@sJpQv^j2<(Aym~v2yT*OI&bq=ug2|ljh}DQ7lAA(AGeEpOQUp%bkS$jATlFP&jAq2n zXo7^{hTNm>S*Psv>iBkNQ=gc|fEArdT-JqpZ;9)+3zsv7>}!oSi#g_O{Wr_x(>cmX zbb4&AX+P-sVbL|oTEjRl*vKR8^vjWHXjr+lJZq|rcWU-l)`q!y@aFXee2veX8Rq0Z z*g{erx16$;y&RA!0pymmw-71v#=TWK_OG>qe6-oFBq7KC~p<#%KIJ{`$FyslYpx_n>$*Dfrp(IN06S;zTDyY~bo6F~7MN zRnbHm8skBx?MsaT+2H(Sc|$`F;XWmXe%`dNa_uW}$!SqzyCtj?8lw^*QN(KVFirSm zYs9sla&ipOMa7l~N7!xHL{_$+kg3@wDyVr^_0z+LV9}=Ov+?`(a=*nFWe$?|~dD8P7 zsmPsIy?;Wa9kV9>QYGEzfkNTpe!;+4-6* z!|?jJy7$uEnnP^6#vm*@=n&m-2bgO+7st)W^npG0v{#k`9dw18alxA#UX+uEKkYLw zxV7icci#ElAT>#St*gv8=Yv4~3Kt9?FO*NLG3LzKJMU>xZCDsy2q9al$okXfTg-m8 z$oQ&GrFN92_IV|QSQK)&)MoP?6yx6HZaZA{aDb4d(d5#>-{ycjj__cw(+_X`=*#P0 z<(3*h z(vS$(QZkl2*0CXf@tZ8u(mexW!#JlzyEag0Qs~(GaHPUf>6nRy@nixUdGoB`9|xrNo}6 zB}M4ckMGTSwHv}RPAwbGS!F4Y3%N|L;AWL$gs9jhh%MHh^y&FwbEt}K%%6J_XF1XG ztIe4=uiSOE57&WYWE3{X4HC1-{uYIHF5r}h8pG*f@Upscs39*5E!Ml|ntGU8hbUVA z`Lg5Ph?|!zN3z9^cqcFpVn^Q^xgSMtnljiO17UoaBicF_wO7zao5> z&##-7*Ej-Q)TtMn(*@s>-alUbSWwW@=biUh)k6WM=j$WvmK?)(n>WvO%DfON5uSiO zIdE61)wA|!-w2&|=9Y?)jPJCuVlyONP&15pCN5D3KUTkx99FF8pt0&y`=%n!wm&Q} z*FC0C=)3aTs8Y*|TGP|oqvvw-l6cy+g;JIhU1C`F6}DC{IZPYqi+9@EU9|{4gZ9zH zqGYUEf?Nn(RU1E8F|2i02x&pgwK^oA_2t!|)tc9V=u@%6$_WXzf$Rg z^8X4j+V5ttwrV|6e7(G{NT-*2vwpcd9)P_-;Z`KQgJnGpYHj#j)=*dT^Wk~^SkDTC zi3TKp98}@%bLX!X)M>_nBAE6CyiZ>1dj9>J=T7d_FBQ+U|`%Jq))@VVAJ!C#=#8*r4E&XTmF^ThzN-sgS|4}Ce+1VR$yqtRKD z*jUTY8A+2eS2`7Rg&eahqCjgM(D38}VjJtQaKO{g-VrSbSFi$L9s}Elzr3!WsoW3r z3_n(>!7tQ^Hc?le+4#Vi>TfON`%9zQJNG`;C@x{j>te5IpiZY=)B$s{ z5r?9Kj(-3FcE>4v>;|#6!Ec(VfPP5A7?x_}LPWalGYvyvI`8?apf1{GOjj${@C#k= zfLXl>UWTvt-n1u8A#0QSpNrf!!SRfu^DPp3aTV&;Qsmo<=jG_j<--uJJBT9 z`$4y3HUnkuZECcBX~5V>b%&}(!K5uEQ_yPO-+^ga9@}VA1f?xLoD77sq#q-OQ5b(} zOnAGnvXl*eR`=tSF53B-M)1xL#7e7x`gFz55z#fmDGXHVMVR$W>*b&Wx)##83}Xto zC(w1H6t0aykuRUW^tMMKz57kQ+)AR>>|@rZTM!po{rvZ(m0ILDjg8zHms&fNpEFmW3}55PTC=3JLssw~ErLh56oEwc?W^ucYElj2#Cs>>!xn$k5v-ODAOumdglusQwn5@7dbOI$HuA+w-PO zK(esn1Bvgr1}Lz1n9j;TrH4nV!`H#@T}qUkmYA#zk&(^CHD%IH`(oH#;4rl8jHmMj zIyOD4g8s2~-0wlndYV!{?MfCmoHb{pdXY>EEe&FoE+Ct5@H{D>zR1}DD1-4V|zyA!v&P%v?Ka@l2=EQcA z@C&Bouo%a=P|l2to^70*h?(z)rK&<&x$_Ukm2yN)s2p^{NVu~f1%NA}3A0AuZhZ?1 zK9dj}_jP?1so+8>WAGLc3L+qRgF%T+Wp8$BAShY#$9dfK{0j8kBebnwS7oMq)=9Sa zfKt*)30gZVtH&|~zHZ{!nC!duGsJq!{L7iS1vjC!h1#nQBHilVdEHurAv@UQ1}8@_ zl6kUsS@H*8*7m(UhGb<|*f|sufjEZA?CR=rw)WkUBqjra9>8@_vPepH-%nGYrUw{O z%^kQT<^K5An){ePfk1$5yQ#sy7Rr$kw%c3{n+$c3sGT~faLE}&S1?cqGp4f4;v0jI z+<16z5n-4(=OCcOQ2E9U=up`d`-(J6_yV;y$J*1<(6Q0DcYrul0$6!ziSCr70B*W3 z2n8y4;nu#p$0~PO7J&74wD_dpBu48Y%~BT0oOhcuN0p)3P3ZVM8|!Mu%zJdciEjG**rKsKBz6WxZz1s8R$N?>sWXXCbPDsp&36d>(Q~ z;xdw1*OLNSb+dz0P}(*37^gx#ZwILqxwPJJ$Wc9x_BM7u`*02;4<6 z05jd#@t?bxvi?E`Y0n`u!wcO2?&1d1ms}XoErg} zSP>tLpB7eJCvHp7VsslVSXE0Rsw$)tx#+p;7m+3Ctfqi7v10?o@<%Ayh|Xe0F(G)J zf_pO}C%Uy}D}WL=Ql@+7$b4$B^~l>) z2*{&+HrNtF0z=f%9i1a3SGQi_Bc2UM4Z?ea&irZ6R1dIZ3#-(1xJmFc1e;CDN&bWz zjSWF=PT_g!fwxgc(x{Yq>Uu~68M8XcLw^)f%go+wc+$KZ`Ka?qL4P5z+wE%puQlI9 zdWfh(DmThEc_>_hUeSS@&%LoSDE96}6v(K0jnFQNoJYFc`ok-0(fE}?mf1Y&RR zLl?8%4CXqt)Inqs4Hfo)!S6ED=K-R0i0CD0ltS3H11|r+TS3*@ojRbbwUKe+!oup- zdp15`rN>rrL1WnOiAo!Q6BtoCuWI>EQr`C15UiS-;#5r=dg0#m@p+ z0mgOrW;K7UD0O*&MlC__-Y&4L6zTybN#_%wU0H-vF0Z}#(}2DJoG;o7kh|snyHxo_ zygGXQ?cleH099xQ{Jnos!#(Z0EN{s#0KX+Lbb#h>a<|XBxOQ_XyY9Mr{U&&UZyiAM z{(|>+S%Q9S{U5RX|0n(*wbxVJk@(&<`!euP0f)Y}@y&A0dtv_t_ifs_ literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/ForceGate.svg b/v1/src/simulator/src/img/ForceGate.svg new file mode 100644 index 00000000..28b50f3f --- /dev/null +++ b/v1/src/simulator/src/img/ForceGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/Ground.svg b/v1/src/simulator/src/img/Ground.svg new file mode 100644 index 00000000..70f453f6 --- /dev/null +++ b/v1/src/simulator/src/img/Ground.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/HexDisplay.svg b/v1/src/simulator/src/img/HexDisplay.svg new file mode 100644 index 00000000..10c89e13 --- /dev/null +++ b/v1/src/simulator/src/img/HexDisplay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/ImageAnnotation.svg b/v1/src/simulator/src/img/ImageAnnotation.svg new file mode 100644 index 00000000..8fbd9f75 --- /dev/null +++ b/v1/src/simulator/src/img/ImageAnnotation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/Input.svg b/v1/src/simulator/src/img/Input.svg new file mode 100644 index 00000000..42a626ff --- /dev/null +++ b/v1/src/simulator/src/img/Input.svg @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/v1/src/simulator/src/img/JKflipFlop.svg b/v1/src/simulator/src/img/JKflipFlop.svg new file mode 100644 index 00000000..9e723197 --- /dev/null +++ b/v1/src/simulator/src/img/JKflipFlop.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v1/src/simulator/src/img/Keyboard.jpeg b/v1/src/simulator/src/img/Keyboard.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..9922daff6949b554cde6f755ece5ce349e18761f GIT binary patch literal 12636 zcma)j1z1#F*EU^Bhk^=7mw+@3At@n4ryvI1Jv0a+lF~>F4MQU(FqDEIjkLso3d2YZ z-Sr=M^!?uF`QG>cf3AybpES^`^+i|vbtW=Yltf1kNgCRvKwto&vAXY1Y}D%D3Z~2^&eAAoh=JX zmZVfU3lg@*^kmi+Dc*$KY+i}5Ch z84)~wG2eY2PVApUlVaCkGo3;wsJBu%^i3ZzjC#m6Vc-j*4n;Z$CdjQ;U3W zYiGBBMB@4!^`{CZreA+LL?otnEqJrdi;+x@fB*+G76X$BlPntpH&~kr_bjN0;8h8R zZg7yCDm7;=QPHNf(@miRW0vd_oK_TQ}(}F#ZKyHqOoGy z1Wq=inJyM)y(D88-_JNz8ZODXfBi1Ar9Hq0lYd$Ho|YsGKjaf?4SnQyjxy^*?NF5K zay6QeJYM?J*zYfrUR=>Mzmep}CgXjrOydhKv%|sHpG?RK;H{XsnvM(hI468BZsohLE3Dx=~_)9r5`EHGKT*45gh4p8AxA3MC^dlCE zqTGPC%Cvc9mTg@`&)p=BP`OF?!q&|T`Z$fBj~i~@NLD;;(}B>9Wh+7G+yzokEheuE z88`&<2T&u_dN9WQIQd`|_#2o5iTdhiEJ4+rOGlvTvK;IIrXVz#O4kpj|ZgmcK#pGpF-? z)0FeW$|7E9G@fj>p{pIJV)prrP*c^770-)XdGo^?zivPR9{#ZT{;^0DSN5s86Vsg> zUZyyLMuj|HbiRA3c^=`u)g8jDM{I5_PZqYshKh9~#$2VdOlQSYA1PmVuJ}1)pI9Hr zh5sxll_<2`wb4&HOLB4N$g%z!+T6HiN;eE+EI8)}7#5;=4`)RZJ5%o0h(_V@+UnkO zx{`0VO6a0rlZ&Je;5pc$Pb~sbTV7F}&sRRTKVorK`^6GIh;l18=An7r?%P67vF33L z|I_TS^;q+mZC$^1{C(0X`{b7UpTo2p#MHc=vp&^Thv~5N9_NdarX=?v`D0UoMNgQy z7(^1*fvS>ozpp+x?^vJJ7#p!@FVeB&?DVdf(dETQuEUHp5w^3l0EQcSrFyaY1==~K zq^s}aY`VQ)x0$n9_f$?fQ|}D$j^CeLty}r<74?X$k^A8f+9&0ss0MOl<@y;12Z~kc z^*Tds`%T)nUwq=AcQ$fmk?s;b9uvGwJjkur$?OR#p}eq<1_!P0^|c~0?1D!(o5$4Vd-Qgy@Zf|2>fF$rkFpme!FDiQj+F&WQ`lV-I z=I&UVPvW>>w7slgB)f~lM1i3aOr&cn8_XCiN0@t!BUbZO#a*qtR1{e72n;`&^QbSG zD5*_ZG5ksg$k1AU|5|?_YHfk_jZ<%@;A6x4gHA;(SPWaq;0uuhP!+tYO189LR%So) z$dub%Zv{c0R8dx@OJJ)Thy5(BWarWPo7B|QuClyz5~V;tzbGDSM+b-Sd)@|Z9Mii7 zZy4!hHau&~f8)q1ng zENEh9Yb%b=x;02XEEHrXC*3vvD*Hi|b|$}%hX-=Bd5!hxr5Kat4Tvg#HRrB)@A%G+ zo4mb`2J2A$xPtn66xbND1G>C~@qMIMXR9 zDV?^v*WtySSgh9-oL=~6PwY+Izj3Zyo`1Z(Ek|^_clPt={^@DsYO&;8cvu*I?<<32 z&KniEe)t&S3{bfrYd;Y!EmC@mEQghqeDcoYi;MZHH_27!8g|dlq;TP@v^B}ipCa9n z{MqXguLybFMGojzld;|*JN=A1>64G^a=s9LDPlHRTt}yLuWEcD^}%rQQr_(#j%sab zvB91tMw>r;gE~8d9-22cG!PsXt`tc@%6`!ERE4@xr7L-!;p5{6ht%hWWfuMP$O-Xv zgTb>*L6P+sNZl{1he9X2098d(`H#HqIyit#5}77#FBVaSR;UVd;Ru&} z)i4NnoZ6%$Vxt~uM48=NHaR(&mp+Jx>hNQfmh?&232X=N`KEw>&WKxEAS9zVKE)x# zXjW$qmp;FA(~95>@94Pjk)~4$8~$;@O-KLE($^RC%gx)H_SN+Kd`dp`b;j#$g74nF zBjYGo$v3QYXFoKrTyF@2n0%3RNq%6jy5&@DypL?BHN-G zt|(7t&=t#AQ?!_az9}7gqL~oe{^2IETF-1&R+gKao26y2?Gzv-xB-i>f+hZX&j72d z)OOgboPN$Bm7$v$*LLS;XNyb<{e68SX?bu{W)TP^VugYAo3%|@eh#*!1&Loc36#>@ z-yfPQnVz2h>j8$T1N$?+d-sNu;zg2rk#9Z{MMqKO>vbzhmE(rZl1S-R-%u zRydqaJ8m*J=c8UTnmV#XCfXGXv2tDbYpi%iD;W;S?yfcVw{c1bU&R@bwJE;56|C__Flp?!3{y}W(BIg_g$JlY);C97xH3i>%N%-$lXDjCyyA|oSjmU>WwA}{!h zBT@w&3@Tn-#3aw7JhO!P?Hb!ykcbh(2{TaVp&JJQB$9uTSloX2<8<#)FQ>>ubYvNaHM%=XKHb2Ss|;7T@EuWCFW>g!5aQ zkYkMnGs;^*7vB`bmg642<-I$xqFvA=nNkvyD-T9@i=I)GM)_!^cHapv9+A5iCt(m1 zQdJmjvZ8F`9i2#(#ZjEa(TK~c6QeCap3A~(SrSmNL3OPDn9|>2?A5n#--=($g&=Bm z-oAayDlEa@a|=1T4aa*l`psz|`#5xHrT?K4IL6-s5q~o8&QuSRLR!hI&I zOgk;tBNu9_!nuhIn%F8WpFJ;5?$GYDv{;sisAjrV!aW;)U)&oz5~_dlrqy%SJ>KY@ zr*(p;w@mpAy^+PRyMhVy#hy#M)rXTuSZis^e{eFJ(MZgdo3EBX9OYn@ZR0_7YQUxwkjPtdzvZJm(@4K=`| zBngdBWxgVd>4_c`!#hyYN_=5wqLo4U++dteT&k|@6Or7Fcyb6utr+23ESw`E4VoSa z_2o&j(@@;1BF`s5+cdL{PTooLvg2P#>qcP>g8P~hT-1BH=r^FP{4;QaU?ggNy*wjB z(po;e6OY!7Ywz{cSSQ=K=qyIz%cs^oCnDo6>n?5cl$ug@viR(0a-@({8#DO887uKFFQwxKGal6YrWjwf|9oo41$&SwK)tu)c<8Zm zH!^RnIv{V?B!Vc4oy+&gkh!~R!#nTjzAGUUU zr-1$wh8+tHEuMXO^g)6z&-+*EwsAs)Ac8Gi+RrNf=bFeUwjyO&r3dDVtKyHo>G3k< zHDhUDw=$>xR2FrOFE{ZB9?d=spvL^X+UFLE|DFE%SDtrDWPq^}%kQ{$FoKtAHu4qvHBeFF*k|&@LH-nC#qhUPRe)9DN>h| ztl``qb%p5kfA&UG5B3g$U9x&U%1X?-sk+nFT5Jq!cJD3od^@338_q~}*iR}*R`6Bf z;=Vpg(mC_0FgnY!ua=0E4wm%OZ`Qrbu2m@BT27DX>jJeztAPQtcs1j+SB8dl!$W-0 zpyk`E!#6Z;b#Bv6*SfJFdZZfhApr*_9MSx4ypvrxp)94C>Ec3|xQ&_IVVRkkU0B1! zUzsN?1mlD-6Z7s?3beYUfsYI;DYC9jgInsE%JD=CiNv3kL`9Xnubl|z>b~wM&mT9z zV76R8iYpiwyqxx+SFKt+81|zhzB?%@EtZ?Tk0@}#tl%0=eOEovP_LVA$QJFuEjfu7 zeu04uc}@Dfw8d}xeQ&zJ65rS}GFB7&kQE}9)tp-1gBM zTYu;l!42|!7E)e8>)n;{Su9;!bj)lTe8#3E&G~v`^0YDOeZ_ea_Xi8g5ynYXrmVuZEN&(B*e zQ%z=K@=t~qGiO6U8oZ4ZMq>U({E*#JxMsKU106CIWArWdJ(&Vq2T3|ApU^Fc(Hk1p zJoNql z{$6d-S}8pP79@QW*iHl?bYgeSb@G6pb@lWfN@=Kyxg3n{k!skP?~`hL#ni%+M?d-_ zOKQ#~|Aiy;c7R$N`@!NI0x?Y01rgM@p%WtwGq^Ya-X5-`Xh}cu#(s^e;9;`Usf9Za zr)Lj0$F~nx&oXBd`VKw{L=JVlWeBW-gehQr<|k7$%^3HJiugt_)kw#|>zyU7Un_`v zRI*~P>9l9aS>Vb3J3jYUSk9wT`QM^s{|I~im&lqY43cvdP5Zyf`Wt2}iCr6>G`1>|^0KdekaFeWD za)fXcEyXxf{M~K$$B$38bxTNO@iXg(4<9~i**Q8g@;qs3ri_4GilHKcLZNyu-GJ@8 zTxDgYj5n&UudmJ9k%I~jhab;@_6Q~je)mj!ulrEEw4_8pKmd50T^ELSc6Js@-M|0r zNZHsp%|++vxwm)Y=yFtcYAWpxqOMMOG|&1S`NYJ8{-}%ONP=8R;;=%b;QBhIsc1)p@lhZLsNGLHQ!_U*R@WbS465Wb*p>B0fj;uq= z&HP?#H@BL^-Sczlo7YQJOEBqX=jZ1qCM@&yL5CFTw6KmJ-TnQE-<5n(!^3ffz+uFo zsh~g+`-z#E5i`dDHMtzY-SFg{ot?6>vg+z;VE3<~OwY+u9u@USLt|rQMcdcQOH4*) z-p|6`{?WK|W<@fweOihIa(~DPDS9NrB_L2q$ z2GD49em;wOC!EE&p^|{;a-xbNBBv1|7Ts|W)y6oa9;Eg(H9kHbI0fkV*xTBUlqxP6AWx&m1 zwR_3&k9IdVzn-!r>~HPe7Zo+oFR4kNR+>DuTs%B%=!%MpD!St>Ed9v<^Uq2i2QB;D zGDV5C?W@Tnvt?3^guw&ZKauS2uCChy5I$aB-L)}hLtKuzqj@c0;a|DYZ#SVL`n?t} zZ~ldrMo#%O>?DHV?yJwTJg;I8Ne`&cgfAVYU`~Y~XRb#Y1c>+vwWXB%$?e5{DQ*ia zM{(ba9S|ukE#2y;Amdm@FYG>^est22Ix{olA)Mj3rm4Ymjw&c%jqJ?zm2G~)$4$@) zBD{M!C|Zr~I-bY)<3$NE#Oac=7?Wt{vh+`e!L==~#nAiPU`0r@bwK^h0Fm6n`0pX1 zuRDH>jA*A1&=7@=Q4-*|TU8CAP96%LoSnb(fkjku6?fG`E@2VOg#+FW#E0iNF~?ck zxdLs?Kxt`_;cZz)nOqxV$t}~{lNw|8^MPj-srx6X1FyEhrQ>u5bA*4ub%NGCPfkvJ zU%bfcLmr2;2;$vEN4Gafm6~$mohYerPTiwn!b>pMHLrd9>bfSI5kYnQr>D9PwA!Da zUmUj;H1W-&R=r=(xD0v^2}?_%G7gOMV56K=M5$Z7ozL%Q4LvJrG^x-omZT@0UM<$; zqKR~?%CAUgYnC;UT|>Odhy_-94uxbM5hiLz3%c86`oN2RXu>t zx>aX53k3~kd;^JqaBYjxyDk5A8U?T!V)D6q^frz}913c_t2*PB`3+}HbFd+g zN4NRQa2x{esDy?)co zGHYNlJGiP-_`5Bt6rqr=pUf&JRpcA7TBij&X+-+i6dB;JwM)|k+%6@NJC zaUX0Jw+DqYEP)FWXE`A&DYJ8j|%N2tdpQfDC3th+NAQZDCvSZ^9pYSO7E?~fhOY41oIAJisbW*FZ zM}o{~Qdm|;V5uzOiB;URdV`?&S)q;Vu8=x#%x1Ltpw3Ofbcd8ykTL%FU}g=7mR?#? zTzbNKqaj~AAr>{tw5eiznmNLyzz)K8-jN)d9Q@8RJc=XC%#@wzJC_n7T|U{A(U)+J zYuc#8$qMO(!Y}$*!@#leVjMkN4EtzCm;-Cf!r^QVNaQxIK6%Rf?=2sCPdd2!!LH*XM%+}^ncO(P4h=$&LD6tuKgB2T znr0e4zF%iE&JYC%7F-7cU#)0D!%IP!2%F**e8Um#Rq#h|#e5|8{^XFiV$e>+ta=W{ z5J+kRr`f80j2uJFVE_Z@%8ZdborVb?)eghpsT0O_hZW!fZ6y9Luo|(UtsS1BAkYaD zA^r<;X4|B?>fQh!YdfHQZwY9`l2to9HF0F9sIUtdh#3|)LH1q$1x6HuUS=17mrqP= zq*}JAu`&!45)g#o!>`b57-E&(JK*e4b{x|Kf4JLtfzQSi=EhV~0UAe5Dlt{Y0Ox8r zU;zNF_|lSrAc9Lp@X<6(a(5US#~pSF5nVeLgs!#B26+HzuWnhLsW-=7U58k>J<$ph z!beeKT4iqDcZZEm263aBnT9|w2{IwZf**bNSEm&agulRcc+n$JIOSL1pAHaZ)w|rM zcBM*o0Z`%R<5Hi0nM3vrqDyE4oVzzEFV-(tD6V%K$*5S4INm>!wl$6 zE%L(b{8pVNeSEwXaj7rG?2JMOxg|s_8n?f@hbwskp%aH=ATKNMy*c;6#Pzb&od~(} zn75+{asR+tC<(gbONUEgAK$q{aeZED>ydYYw3M{8C1WxQirj+>W7{oB`3|5ZQA5Jyi0iRr$p@KR?Z6_GSqI2P z;bOrPBqkC{KMhelfY1a?=U@(Ur>UoPoO5?*Paao%h3XCis}<933Fc1-Tx3EhvTt3m zm)mXD;A}S6Y>tu;Z)Ub23Mv985nJNiGrFy(Lqq2!J5w@ihbRjFiMKLh_M_2uIu0H?mi$raJzRMnf%`0Hl%d5<6 zbUyG&TNPoD7}yck6Bt~-@rF9UaTN07Ca^i_0pIVsiGn^0WL{}bkl1jaQ{g1mLoBa8 z_`e8$`42dkT8)eTvsMonpuT3q!^$`9BFg=b5m^lRNFKE-h$j)V2IkK?t9k^$#_Ah<_iam({5@SZa{9OI2JeTg6;loFpIQMKVVVbHQD5vGUzTLg; z7NUy$I-p}S}&aX zCAA_>WBjhchf{W4=|IyxE$LC?~Xlao_W{2XyxohXl&8AWq%tlj=~ns@d#>-;F;UPrRC z0OrOkU?a*wB|!olV5I`jn+vSBwzhUqL!x_dxP->T!J#2i5)#j4ap2^anOWg!=8ZBt z3-mvGTWOI|n4h8c=@N#UAF%%hVAPFp^7Z%hxU`m)m+!eR;*-)h?DfURQ!x0TezhrW z)XxVVuKYOgZT)gJND|oW1A~$b4I(5#pcz|E4i0O3`(1bQu#UTJYwPR6%f68`)YOe$ zu%dRI4fm>{qFj#pxn*leKW8elxsH*=DBdLlR|kYSLSn`Zp;hSgRHM({3UDwR2Tp@Y z-Wn<@;(mwkx7uEOiAjA-FXfZ(Sgj(QDel&_4K}qjH-9&1yyQ0ts*7_UEmSY;07`TA z6r~Tq%uxN|0=2MGe}lk)y_(+UbMNyE^7^yZ_4PI`kJ-UO&7y+~r%NL^fc<-gVO4Hn zA)C0kI4|!Yk5Vr=aCVGlFaW^yyP~clWDTINV{p#C6R(-EqwR{{HwR zw>4YJ%KE237O83}yohRxNV>wMZ3PfUXqfWjE9S>a$m2qtSm9V z)$d6APMMMepKIGf>EEX=-}hxEB{kUT(Bf-P|n6#ig18ug}eGS4~mlO$r2d z?yHlPkS80p64o|?5)#uqP~%nT0UD8@z$IJh@%87==RKv5cH5v<^+^pru#r_I3CO|v zK1#K}BtlPriJULTZ;5qpoz!{1vc?ElmpO}5Ip~(rSDxNopFbG|)$mMvk?;h=-w%coKh3;vm zu{&B?TB_0(q=$xvK701ewyIgD(WAz`SfTNFW2)w1^wQ?Z`b_dR_`YV-RMG!uW$2KUm>t{xYc&XT2l`P}#k z1y(N*vN}qVz5FHuBEWn}*cE6mSp7?2z~v_-F#B6o?~j<84+G}%<;Vg^11xZ4H(QxF zR-t8|8%Q}4_kbm-nt6xFLh02XVOQ5Vr@h%%DlP^8xn8kI_wexW3A2)wl?8)ixZt|X zf=qv*W4LtYB%|b{Bvw||sd-Adm2AiUH-CWyo>03^Bcm`4K9h#8=Y%z*Df*VEu`w+JL!0k`V=A)zaeZ2s9JOhQR`*Kb)lb; zwI`lcHBZ!^e@qtf=pu>Rpx5YX@&J0aTbY6nmAmQgEzdT4yN$AkNu)QqH{tzI=fe2} z_+Rj$<|PMXs+CrjmLlFa;hm}tH5AyP)pLX%44NF?o*ZMhSzOyjmXAtcub(TqYh1B^ zi6HZ<4Y<;-#xmhX&ddNIgt+^EfZ_4_?<}cnXbgS)_yCBusi{SBogdA~hmlNuX}`^K zJOd06ql={_|JNhW#AkoaXvXl-JN~;862?i5Zm78y-^r7>g7?5PU?b0NvO@UnBin6> z{*ELe#y>naQ__9Cd@PL&93T5=g>~fkSX)~|AoVHC43b{_KswpW>zif@OOrp(uJRyT zrF_V{VIiJ>8{9C~VCmpco&&s6t^scbG$-UX9o_M-?!xqOZ6hOEYHDE#iDUG^T!Tx; zyWC8?`9%+FGQqUhXZaT`cVfg@-Rx;asP)|cZ9a}?Ko6Cap1*hjZK-K!Fw~8E_pV4P z+qSr(LgZe=?5xSC!+fiMAuAA?LyS4P9@tHk4Hvty<3+MV(l-1%%!p5)St-T9aIi zJ2PKEjza8D{AV7g^#Z&er~Q5m%yFjs9q-zBdVW}$m>Ifu?OI2B`|{Y_B22$LI7V=1$?vVo!p4{qiWRG<}duMG6T8+@J4Bv-8nha4=S0kh(Nc6MIha zVBP626BBYEzU1HYzBgqNaHvEekZHV}Xg8Q9tdWygcDe<5eHF>Re8=BUv6~nhdt(a~;N(GU?b#>ORQP-CU>`*|PzV&X+IkC!*D zUquH2FV2+o9@)?89vU);{9w6q1ci^mPF*`*6Th~tDa>TQ*w{y7$k*|cENqf=$PSZW zFX-M|;v3Q`hOx5BgP-@!f@bR)uVmRKnb+qRL;vNBt;li#D< zDjhG8@f)%@T0puMw=Mc_b1vfqhz3kwRSGvHEMfOaKH4yb*#XfiKe6NeI*+L)d9j_7 z9UUq5tJ34Zrx5KltDiMfJiabBU$2Vx_U*8FmtK%gA*=uqK!#)YNBy*D`hbV7_p=uH zxnBQ5AdLZ37|V?9`IvUNG$Edt@$eN-E~(G<3|%HTfaHfmIZzFIUW|I9Apw-K&V7dZ zU8X*YcOvp<)|1x_nO$$bhM5WW;x?AO9c-SJN@VHrR!j^~skw84eQ@kjfN+FJXPww6 z9X&ixmwA0`;jLmf0KKe(ma>BF3QIx3d&CDYWVOi}__A~w$h|Pv)p<(Nud*W(wQf`b^B%6}ANq|t=MR(wt9FQ;q8~>@}{!{b(r~OCW^hz@mP<1U{`Q|@W zXamGtT6;;*Rr{|L5aPxa^Z&>`X`?PHxG(Lz8szq$i^2af=)a__2Cwo-K=|S+kpz(P zcOavef|Bta_ aQjzDO9w$(jdf- \ No newline at end of file diff --git a/v1/src/simulator/src/img/LSB.svg b/v1/src/simulator/src/img/LSB.svg new file mode 100644 index 00000000..31148b47 --- /dev/null +++ b/v1/src/simulator/src/img/LSB.svg @@ -0,0 +1 @@ +LSBEN \ No newline at end of file diff --git a/v1/src/simulator/src/img/MSB.svg b/v1/src/simulator/src/img/MSB.svg new file mode 100644 index 00000000..21997b94 --- /dev/null +++ b/v1/src/simulator/src/img/MSB.svg @@ -0,0 +1 @@ +MSBEN \ No newline at end of file diff --git a/v1/src/simulator/src/img/Main.png b/v1/src/simulator/src/img/Main.png new file mode 100644 index 0000000000000000000000000000000000000000..3bb25dac12eca21bc94afd0e87439830545b6b4a GIT binary patch literal 2061 zcmai!dpOgN9>>2f%l(kDQYlI5$0DReX}SE$vzSxT^lNRo-{w+8C7T^15<7k@N~}_& zWE%-Znqv?YFquI^Lqk%jw7a`|VPQcglW{nl!NEZj6B9>AM;#rV zrKKfHOUsFgiTU~YA3uKB+1a_fyR%rV+}vD0KR+KIpS88Mix)4#;c&6^i~e0)5c%?=C< zB#}r(MMa&Rovp2{XU=S-ZBd*$1*dG&O;bftca5QJ8Q2SN-@fhZ>nkiQ6p2JRIXTtU z)e?y$BqSs=GxN)rFP}euuBfQs^ZC=$(`II75fKr+y}gllgz!^6WPBO_ccx2dV= z`Sa&>b#-NBWjr3QxVShyJ>A~k{^re_&z?OK3WaTLZExPZiHnP))9FYgGA%7FDJh9e zCJzh@)YsS7)YQbp#56QCgoT9xI6$FLjE#*^sZ<7op^8_PE97FS7==Os2tZd?*UHLj zd**h)3jh)TnOrtJHw>r1(P(sbcJ{h_{qW(#c~A26^z?{CBI_GVJw=^4&g_}$K~Yg? z8hTJP2qi7;SCs{EqzA$=0l_EMsG1-85Y$lgX3tI{BT8 ztBX_Lr;56Y*4EcX#iQnV<_Yx)zU99BMgIA+^B+b&;2ZG<83qHh17}OlHcvFy4c8rg zeAJj|oWaT%5)FME`I0%~s{KdWG)YPzbf1Y-(@JUF%Oo;eEqlx(Yo z_`r+m_a1bMUF`#RSNE_(C3O(C&lT|fT2p_nrEQCeB^SY+T`A29fASbp7j%!;yt7u8 zq#&7=!%@bfevOWs5}DgdYAedN#revF&Sb5X~O)sl1RJcP*W8PgmFa$`~htT@o3{Ip3y+O(J{)%>)KMAc)>Rs=}0{& zAu4w9x zJ;N_ukTC_0+oYJ4iU){08ePu&%1fVOnTuW0!G??(nuBeuR6l<{UY>@q2NHHUB`7zV zz@kNRJ^X9`fC}r~kJc}_8GMM1t&QP_oG~&oMRUo@q1n6rUVd;Po7>4BS(ARxJDJ;j zQ04ynyTOUNowiNAr3b057e2e3M&znO9%M-VIJAdTiE!vcZAhMdIWjnfMX5w2n%{Tx z#?vyg6;=yn5O5$JLSj`S{LV8f?~nLyWyhax?gF zQ_x8rf8VIre#r(4j5#IJb|ozcjj8++q?9o~PlJ>ZwO zah<2B3p%$oFZH|J3^1Qm7hLpKu~ zhm}IS%AdxCpH&A3VEV2iIlOj$rCF_ZcU{GJx3ln z@KVF4f6KC-kjQsTgp>_mzC^D2daT2Eys-c4DF>8KQuWankwCP5#(s)*v;I&N9X7{Y z`1q~w*>3d7aI){U{0qG&O9Bcp!s*-2bT*aJf`I>HO>*^-sOZxX!i`T>y`xwEsi;smdn>VI2~-{Kbc8WmS_}i2JeK5!c6Fvfr0`sR~^>d`KncX{O>O8%=So~Ax~&ZV3{ zc(Y|S&a1`N1&E3EHSzKspptByF+no~xgtx#RpUD62AovKsb#EosR}Vum;FduzHNGV zI%d_7U8>BcuWb+a;Tl(k+2I_E%6g)KZD0t32GNOlLE+xQgrY5WO|I|U29AtJH{wBB zKX?DfSaiyf59$29YC01 \ No newline at end of file diff --git a/v1/src/simulator/src/img/NandGate.svg b/v1/src/simulator/src/img/NandGate.svg new file mode 100644 index 00000000..04cddce2 --- /dev/null +++ b/v1/src/simulator/src/img/NandGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/NorGate.svg b/v1/src/simulator/src/img/NorGate.svg new file mode 100644 index 00000000..55e9abc2 --- /dev/null +++ b/v1/src/simulator/src/img/NorGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/NotGate.svg b/v1/src/simulator/src/img/NotGate.svg new file mode 100644 index 00000000..a0d40ad4 --- /dev/null +++ b/v1/src/simulator/src/img/NotGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/OrGate.svg b/v1/src/simulator/src/img/OrGate.svg new file mode 100644 index 00000000..741ba9fe --- /dev/null +++ b/v1/src/simulator/src/img/OrGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/Output.svg b/v1/src/simulator/src/img/Output.svg new file mode 100644 index 00000000..7d4298f6 --- /dev/null +++ b/v1/src/simulator/src/img/Output.svg @@ -0,0 +1 @@ +x \ No newline at end of file diff --git a/v1/src/simulator/src/img/Power.svg b/v1/src/simulator/src/img/Power.svg new file mode 100644 index 00000000..a4619920 --- /dev/null +++ b/v1/src/simulator/src/img/Power.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/PriorityEncoder.svg b/v1/src/simulator/src/img/PriorityEncoder.svg new file mode 100644 index 00000000..417325c6 --- /dev/null +++ b/v1/src/simulator/src/img/PriorityEncoder.svg @@ -0,0 +1 @@ +010EN \ No newline at end of file diff --git a/v1/src/simulator/src/img/RAM.svg b/v1/src/simulator/src/img/RAM.svg new file mode 100644 index 00000000..92fd8293 --- /dev/null +++ b/v1/src/simulator/src/img/RAM.svg @@ -0,0 +1 @@ +RAMADIWDO \ No newline at end of file diff --git a/v1/src/simulator/src/img/RGBLed.svg b/v1/src/simulator/src/img/RGBLed.svg new file mode 100644 index 00000000..299657c8 --- /dev/null +++ b/v1/src/simulator/src/img/RGBLed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/RGBLedMatrix.svg b/v1/src/simulator/src/img/RGBLedMatrix.svg new file mode 100644 index 00000000..cbb52e83 --- /dev/null +++ b/v1/src/simulator/src/img/RGBLedMatrix.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/Random.svg b/v1/src/simulator/src/img/Random.svg new file mode 100644 index 00000000..4da0fa99 --- /dev/null +++ b/v1/src/simulator/src/img/Random.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v1/src/simulator/src/img/Rectangle.svg b/v1/src/simulator/src/img/Rectangle.svg new file mode 100644 index 00000000..f2ac9773 --- /dev/null +++ b/v1/src/simulator/src/img/Rectangle.svg @@ -0,0 +1 @@ +Rectangle \ No newline at end of file diff --git a/v1/src/simulator/src/img/RippleCarry.jpeg b/v1/src/simulator/src/img/RippleCarry.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c1fbf61f06e9431bcebe1c2fe0af1c5cb53b6f52 GIT binary patch literal 17664 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 zNdaFxc$AYEzKVb~GKFuOXNpU;*W3*!w^G`(Qd&4(LW9oClADEn000000000000000000000000000000000004080c \ No newline at end of file diff --git a/v1/src/simulator/src/img/SAP.jpeg b/v1/src/simulator/src/img/SAP.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..79b76da052540ec1a57e295476003e558cc8f4af GIT binary patch literal 41613 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 UQA${o`xShw_t{w%TKs(JfBtH#PXGV_ literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/SRflipFlop.svg b/v1/src/simulator/src/img/SRflipFlop.svg new file mode 100644 index 00000000..c41ff746 --- /dev/null +++ b/v1/src/simulator/src/img/SRflipFlop.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v1/src/simulator/src/img/SevenSegDisplay.svg b/v1/src/simulator/src/img/SevenSegDisplay.svg new file mode 100644 index 00000000..bb3d2ae8 --- /dev/null +++ b/v1/src/simulator/src/img/SevenSegDisplay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/SixteenSegDisplay.svg b/v1/src/simulator/src/img/SixteenSegDisplay.svg new file mode 100644 index 00000000..ad05274b --- /dev/null +++ b/v1/src/simulator/src/img/SixteenSegDisplay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/Splitter.svg b/v1/src/simulator/src/img/Splitter.svg new file mode 100644 index 00000000..fa4a969d --- /dev/null +++ b/v1/src/simulator/src/img/Splitter.svg @@ -0,0 +1 @@ +0:11:2 \ No newline at end of file diff --git a/v1/src/simulator/src/img/SquareRGBLed.svg b/v1/src/simulator/src/img/SquareRGBLed.svg new file mode 100644 index 00000000..7900e614 --- /dev/null +++ b/v1/src/simulator/src/img/SquareRGBLed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/Stepper.svg b/v1/src/simulator/src/img/Stepper.svg new file mode 100644 index 00000000..f18aa4fa --- /dev/null +++ b/v1/src/simulator/src/img/Stepper.svg @@ -0,0 +1 @@ +5f \ No newline at end of file diff --git a/v1/src/simulator/src/img/T-clock.png b/v1/src/simulator/src/img/T-clock.png new file mode 100644 index 0000000000000000000000000000000000000000..66442d9e3ada92704aaf5c3e6bd5005242b240c2 GIT binary patch literal 47639 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%0Dv>aXGAiYQ4=zns+wkgne** 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 literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/TB_Input.svg b/v1/src/simulator/src/img/TB_Input.svg new file mode 100644 index 00000000..c1c42ead --- /dev/null +++ b/v1/src/simulator/src/img/TB_Input.svg @@ -0,0 +1 @@ +Test1 [INPUT] Case:0 \ No newline at end of file diff --git a/v1/src/simulator/src/img/TB_Output.svg b/v1/src/simulator/src/img/TB_Output.svg new file mode 100644 index 00000000..b62e1993 --- /dev/null +++ b/v1/src/simulator/src/img/TB_Output.svg @@ -0,0 +1 @@ +Test1 [OUTPUT] Paired \ No newline at end of file diff --git a/v1/src/simulator/src/img/TTY.svg b/v1/src/simulator/src/img/TTY.svg new file mode 100644 index 00000000..208e42b9 --- /dev/null +++ b/v1/src/simulator/src/img/TTY.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/Text.svg b/v1/src/simulator/src/img/Text.svg new file mode 100644 index 00000000..db86087a --- /dev/null +++ b/v1/src/simulator/src/img/Text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/TflipFlop.svg b/v1/src/simulator/src/img/TflipFlop.svg new file mode 100644 index 00000000..50925f80 --- /dev/null +++ b/v1/src/simulator/src/img/TflipFlop.svg @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/v1/src/simulator/src/img/TriState.svg b/v1/src/simulator/src/img/TriState.svg new file mode 100644 index 00000000..d251882c --- /dev/null +++ b/v1/src/simulator/src/img/TriState.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/Tunnel.svg b/v1/src/simulator/src/img/Tunnel.svg new file mode 100644 index 00000000..ff5b95bb --- /dev/null +++ b/v1/src/simulator/src/img/Tunnel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/TwoComplement.svg b/v1/src/simulator/src/img/TwoComplement.svg new file mode 100644 index 00000000..6baa7056 --- /dev/null +++ b/v1/src/simulator/src/img/TwoComplement.svg @@ -0,0 +1 @@ +2' \ No newline at end of file diff --git a/v1/src/simulator/src/img/VariableLed.svg b/v1/src/simulator/src/img/VariableLed.svg new file mode 100644 index 00000000..e2829407 --- /dev/null +++ b/v1/src/simulator/src/img/VariableLed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/XnorGate.svg b/v1/src/simulator/src/img/XnorGate.svg new file mode 100644 index 00000000..4a8bae40 --- /dev/null +++ b/v1/src/simulator/src/img/XnorGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/XorGate.svg b/v1/src/simulator/src/img/XorGate.svg new file mode 100644 index 00000000..639b4c0b --- /dev/null +++ b/v1/src/simulator/src/img/XorGate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/assignment.png b/v1/src/simulator/src/img/assignment.png new file mode 100644 index 0000000000000000000000000000000000000000..c27df5bc834f3a776bb4bb97f903d45c1d4650c7 GIT binary patch literal 33699 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 literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/caret.jpg b/v1/src/simulator/src/img/caret.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a382f8daa86f7cb0127faaf81dc53abd0e760535 GIT binary patch literal 11217 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 literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/circuitverse2.svg b/v1/src/simulator/src/img/circuitverse2.svg new file mode 100644 index 00000000..23dd6118 --- /dev/null +++ b/v1/src/simulator/src/img/circuitverse2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/circuitverse_black.svg b/v1/src/simulator/src/img/circuitverse_black.svg new file mode 100644 index 00000000..eba77c2a --- /dev/null +++ b/v1/src/simulator/src/img/circuitverse_black.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/circuitverse_logo.svg b/v1/src/simulator/src/img/circuitverse_logo.svg new file mode 100644 index 00000000..27202ecb --- /dev/null +++ b/v1/src/simulator/src/img/circuitverse_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/cross.png b/v1/src/simulator/src/img/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..bb7126e2a8083eee1f63ee7d714db1d45edec46a GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAIz3$+LnI_w4>kre88WaO&~9K< zh($ literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/cvlogo.svg b/v1/src/simulator/src/img/cvlogo.svg new file mode 100644 index 00000000..ce4f7e59 --- /dev/null +++ b/v1/src/simulator/src/img/cvlogo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/simulator/src/img/default.png b/v1/src/simulator/src/img/default.png new file mode 100644 index 0000000000000000000000000000000000000000..8e183a8a21dda36485b94de239e6e8a7911f982b GIT binary patch literal 7548 zcmeHMcT`hZw~wD=nGyRq3`KzvML+=|0uc}el_pJ5q{}EJAVi4tDvY2aMUWN(h=`~N zh;#@EMQU;>p(i1s-p~Vt4#K-Pes9)$Z>?{=zrMfTbFG+j_u2io_de%_=SBuv`+pJq z1%W{9*U`Ru6M@);Lm+mB?A-}bnuQYips$}CuIOJuAPS=QZQAaFo<;9#-_%DSd`}|~ z!G9qT>kuh;9D(qVLm(#aArKdn5D5N9_zGiH1Y*a6(G8Pp6SMP^oQ0`5?&$c`zzEnk zFxb^cZ|~{_I=U$Boh@xtN=H{)S1+}vzlYAG4~`6h6YObDKXa&w(pKM0scmQ`)iqSr ze5)kYmRD7m5l9uJT0(Ulv9`XZzUf;Nxslx3)z26NC#L5Y$!*jMVohyhOCzOiaFjj4 zSr`}^t!r#)2HJZWEY=8E*F*-VW{GtT4J`n31Y``35JXZTW=}R!T3Ms)j_y7JsjjS& zSpBWBhc-~t&`e_ulfE^U6G+|tjDg{?va0I-fx*GC@yR)EXD_X_vxiXgjXg8h($-O3 z-_*w(>gefjAh!b4?$SykwU<`kLSYP#P0cS3433OXbEY^8q}uw4*@e-Gsj0bzv8h?c z&}e0KU2|)DMO95RrLDcYZ){?^mD=6j-CIGb>0_`u`{>;?Mpf-MaB^mZJy}Vt85{w> zHMWdS&VW-h4b7C1iD?FFxPn++T2Tc~bEw^Yls0NdPv77edtzpeJvCcZTmP+@!W?CH z_0n3}JG*HEKxfY|I8on3Zf@-uVo%mJG&i;Y&&5D|%Zr1VS)e=js&`Z`#bjT9ELVZM7|M zMC5BhZgJMY@q&w%&WMvof9pT<+xb|H>YFov$i4aFk?yFCweRCoO%U`5nonAp$U=J4eOh>7Z`=|MM+_U{3X{%-tf-!n}(b9c#hIrB^AVxD=df`IX zC-zyV%gnQvjF08p+H~D@U45%bY#}ttV|NH!%-;@IMM+saEqgip*-(UXEda_UD$mt0#WfJFOBIFZ;EDC<<0ykvKhyn{SU1&E6tPtl_WqUReF

HVKS4XshDWUUmAKLiwZUQ~US& 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 uRJHLYk`Hn1^92J2%T#NSMxOPh5QFS(@^IC literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/drag.mp4 b/v1/src/simulator/src/img/drag.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b211439caec8d453b07c34376e6f4b8c212504d2 GIT binary patch literal 43892 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 literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/edit_icon.png b/v1/src/simulator/src/img/edit_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..32f99fb15b2e2ade3dd74e7370f97c9659c3fe4c GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU0wmSG7d!(}Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4Z?C=OJ)|JO_CWfepiCq08;-sUysy~SUEnQY zzIj40q4~P}R`sh*Pu~e$zA?SNpz=^ShfDM|S&KUi42VR^8v`vqM-a zW@^fzt>@)-eL=gtB8NVUW@q9i4;B-JXpC>2OC7#SED=o%X8 z8XJTd8CaQ`TNxT^8yHv_7<}FR?+S{B-29Zxv`X9>TAsOO05vdpy85}Sb4q9e03pzz A@&Et; literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/embed.png b/v1/src/simulator/src/img/embed.png new file mode 100644 index 0000000000000000000000000000000000000000..54a7d78d83ea8a502b5eeeb783da8c811e6c30f3 GIT binary patch literal 27061 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 w0pLKuSvF($e-vcFvsVHx0B7 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 BDwzNP literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/facebook_signin.png b/v1/src/simulator/src/img/facebook_signin.png new file mode 100644 index 0000000000000000000000000000000000000000..e78185f0b4515999078505863203d212633ec7c1 GIT binary patch literal 5050 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 F@IN^8HJ<qi;4hrLdZ!j<%!~HJ4 zk|Qp@1gzs-d{u;8dGKVRt2d;fX$|9qkUYKH&1`u`0xVEozXKd=6O!wmm* z_5W;!|9Xi3<6!>NWdGw}{>OX&dG-J34gcK?|8GCU{~a^@*GT+lZ}_if_&<1vy)n#0 z=+GzLZ(#X2*NK0T2Dtz6-2RX5oX!2$8*npxOl{Qj3d3h-EdJ!^{Ph3CY3C^aGvEE= zqW`#CM$82~eVSmkLwc`7dL9xpkCFrRhz$c9`w}j8AX_Jf@=Ia@ohvuv z!iN>}aJUuvrX0p@7L3<_bQ$a{yJ?%OZd1(g^hQGo^^J+@r&Ci7Pay&tMO#R79$Al; z7_H-xgLGe+R?GJL)4qa3p4)fPI51;XfiG4fqS`48>!Z$15jH7F#+%US_ou4enZg;ev!B6zGwaM?2v-43VBvZGTGM`_Iz2w@7zN{AxPbMr%e`j-sj8P8}<_wNz1!>dU`ii zzkT~=Wo32y_U*4VJe-_eLSbZW|5^_A@F*9C$e{aGZtm9!32x4;8HbpU9UQK^dU<&{ z5HrjA+zR_b_;2s$5#_oe8{{_|WQliNu^D`IM>4;lAXTE-eXCmJiV%6}wW$l}IB#HE8efpXySHbX3E){9ogqZZCUsB7+S`9$>G%B=b6&KN!e{f2+&0H4U}v$5Uj_$n zs_pt`WM4p+i+jpLgI(7K!Efm=U%noxs;WxQ%6fI3j1j#kD{y>r!#i=ARIpG30|V=* z)UA<9^ERK@p-1P)AS4(2`p&Ok*TpEQsEP^;kG5xlmDpsZr7w4{5ki5Z3_(!W5JAZE z1Fh565#pubO4RP+ZC<~#qpd7I_#I@N5yZ5xsA$FPlVyDC`yl~vO>#6U3&@66RXwYR zo`VB1xKf{-SYKMY`L#e@Lqo%55?WT~0FrcLW23HTM?C7&r%yRK>;&$Wme9GmIoW1p zdmxq*6mhirB`qN#0SbJah8adjP5p-9#*G{MmA<~d$`T;enzMWld-dv7ZSD0uhspOj zO--gZm1u9_?p0MngoWSR4zZku>3se6O)EpPVCVV{ve9ib`NhHL*w~jjX|o1LjXQTz z{SSa&IL^1tevYTR_Je48jS4LPB2?stEp>Dj6Mop(*u33^sdVDaONLqI$fJVs$ZWdo zPuCD<$1Bjj5Z{f0l)F5hnN>fqR`)yl`_-0}ce?#8EGf?g%ffj0zCFVLk@sI;M8w39 zN~!o&ZtLjj>OSPWvgJrSYSQXe_bbMtu*<6zeQU(qs5cYpYd^^_(s zhc-8xu@ul-gCMmZFB1`abj9V_vno_d6gus&T||jI^twy@^0~UYi@7XE^wcumD{mA&&Kh_RxGV0D@fM%mU}5(n|G9cZ4N9+z1W^~E-5Ji2CgMPQldiO z1{~u*s5gNUliy??O%DeR#UE!QhpF!{hijC(?99oew*1VTBHE~<)EO4iahSnI%n=bb zEk+T?-slIhTn?GnZiYhVeNzrCK4!ON>in{EbabB)&1zuXo@=$I_6*|qmf0#)9PH;L z3G2V8-e_-bznUxKv3q|-x}cyyRCrwG)0oCjU)fx}*<1K<6=mfXs!f-W!$=CaSAQh+ z*S(blVE+5~wLKEyHC{9-4lUvy>C+I8g`w8c==zr*1wtCpi< z#qnK!be6}!Mk4@h1QH)^o-X4(4r!|_FTWAtXqk6MI3qK&jcpLQl44mVB!g|dqvY^& zb5P06&24<5(RJlA3_a{pEGohzB(;s8`ZmU0q&R zDoG0wv0bIM1Ui$E*_)dtA7x}@48L`;z$ygXT(5!`H@8Czx?j792z)pw2`V<{^OrXU zg|_bfV7n;~WgWXV*Q(XZGTr<}OZN2R%aY2 zNY47)x5^)d#PJRML7JFEMt8hf3H8DvvsqbN8!+NpCqvi03r}NPPcamrgq@}HTwOnA ze>&e9UfJE`6?p|+_`SvYi))&I-VPx;yyk_M+NMcA8bIZ!^B9k{)(boL4)QOVPQUW+aYes$Z zR11QDeGI2^YkM@fH6R3aP~hU`*3{6Da7-qyA-TSu0uRJR==wW2e3p#tytu}NkFc#n zypMjt4>zr!Y=XRx4__;N_inea+f;ns=OCKG@xbW}4!WL8;ArUA4e~K`SeLdOifL#3^FUM z5`Tn1`gebunqs{83>qpZJpFy2-*uFR95(R7z>btEMIJRg9GB|4(oe%g&^QIkgBKmB zG373>bsZ|Tw~LAb0Eo1;&HrfFT+z=BJGnMy$`m{XNcC5qz3kz$H z8n!9Y^0h(b3y*uVwwk{`)BxZv=Ckt;*yvgzB2wizD@pYeB(`x4C#T9Xr^k=uQpoV( zG+;9qfdkGrgUhmTd)txf=l;sTpoW8?+;An{&(*cH={^L=!OHP-hzHHbKUP*!wO3YF z48O^^>XWmc!E>9Mre3OPXt+s?qCg$(+wFKfXJv7L> z*Wxk4S5;hj6*J7d*?og`QwINZA(-s*WlxgsomRp_4zzn?SS_Pr7s#eeH!V{18%j&n z>*Os7Hy~DtVzz@G-8-|*4Nmj2HMa;d=%koHy?3NWuyy#hLS`M2HAAvu9M4GupU1`4 zYCsdGs;oi@u5xnT7K|t1qEpN?rY|TddGh@E=wSTJy|3<0k%xk%^DKGr>a*$kr$lG* zdPSO_4suSlC?q8%SFfHN9vStd(C(%)EO^x2o7a%Fhrf52P znB*PP{k8P=h{S{htC@|CqIi3d&W1Rcf38rs)Q<0UT5G&*`0V~zN2M>XaW2bSe%98K zOxSo;`5bXP|N2$458j5`!I+U{YIi|?{=0gKzzI50&JKi{T1r0tvBH+qWpIbzd48eJ z^2Lkg9+GD1ulSFv zo$i1_?lj-_^!A<1&BLZ=p-3b$;i{He9*PWdu8lO&(P2mIap74C-!O_9LphD7_(B2n zixQ8MQgn=sg&QIqLPr7S)-LdT2j5lX) zNzx{3FhTc{s`17fn@7L5!3UoIP zy_#pY54}Q$E|FhkXW^eh)Py5O`lVxj(5x$;dLtlzKJabhI=sTP{3bo|(HWw-oAu8v zHV;j&(dNx-S5Bzpjhy;mYWfLA8`8(r_7OJmDD!9^8}mlt4? zKDKvcKJJSRSi_zNF^cT>Mcdy&vW8Ur@6>#sak#li^5^rY$!07v-h*2)%TV9?en!eP zW2FvSJ{|&sL|W}!0bLFzb^LBYu1jyibVKNaO0IvskHHrp|E@1eG>VrqzvQt^;XL!L z8FNoZo5JR4&sJm@-p<Fi#LGoSol7ZxMPd!nkM$|eJ)%b%#>l$HLiNtJyB_if+Z}>wR(e0YYB)0Iak!y zbc0le=DFFQJ;cEE+D85Nmby={lGIi}N%ub9Hm`U19^m3%WgO*?!*-zmOl zz9QiTd)#Uf`{%Cb5B&UO^WQ%iD>)&%!5B?MCs=0IAP5^fKR;g^%HsTUz)g#03Sn+Ofy50M%TE;Mx%5rV%7_k zgVTdGqe=^A_@i%y8U?z%m+%qb%IKBm|9A&U8R(v?o!;`1g#rR6K0dxpdIlmTbp{$L zeBsYItiYIPkI>ANX3%|;p8o5(WEHDLi-(AeOvaTv>)$_q{5aeE0=-gv1bS2L!(N~= zz2;I^AZ&1)jX>xX>yxs|N=r&Idewt%JgH*@mjj21KBHIP!l|w*5Hj6#I6)%3f0cq` zVwG|)JFc6%%boDWCK`500RmQukGM^U;XDd`JdzuyAe$A7rCmB^V{4ltX#OOh4qT^+ z;Ns300Kc(^d`T1U4J@A63?*g$`K(0z&TGIG*wirm+f7yKOf@`5Ew9lov&s0vp92KY znst;iu!251g^QRHmX5hBL8&|0=IedA1&@s7uBPTImZ<1x^F|l0f7y;W+@&%7${p3k zPYG9_?V6U412ojr+k2Y~^v2&GU+4IjNrZ1XFUYArc=Ch~$;S%lEpS&Msn+G?WinRT zC=4RmzwX-(K$M>2VzOGn2@znVo&csJ2M_GZvdt$PgNPGY!Zu(BfJ;cV?NDZ1XPfWY zk`So4(JKQfp^oL2P$c*VI#6DU1>l^wUc$)M=L?}$R#rwPJ)V1f{b*;NwJGV-qwRSp zE7}~luuii4DlsrlqFcoRDmK*4kgrM%HKeS@>_>loE-fFd{Z>(IXt`6QW;;fI*M!Hw z8h6UmZlmOG;7tm?L^<_ROpI*efFL#=YRqhEa!g!RxoHH#D5}|Uf5vsEZ7nl>#`OSI z-g@oM_Uv(HLYnW<>6R@-%ge^g=ZR1Bvm5=~DF)$$B&d#*6K=nJ*LMb`$)edHikkwA zKR7Q|`XlVE!2vg+Y00QaC1V)yy zyjZUY@G}t9c@1gS4ix3LyU=k6B3U~}VWmGwM}>&Fu%IA(uH_@}5eluu%uK(v=j^Js zqwjQraY=s8HXq}$`V80FeJe32T{;tlY2~`MaDcnwvr7&Aa=4yH@!2o#72d*wQlm;k zTxubU^BDv>Meu*0CmfbdDxoxL=Y-_$lCbGkh`v9i(B^LnZ4k_LZ%) zj^zDN6k-QZxqL)ZwRX$1?~;Abj*7K?027J6o%5gD@tWx_05r*RuiW&8wcNdX>4Mti zVF!Jju{>sM`*s7#0>B_VZ~}H}+bgIKeh9dpmJH237z*}HYwFF@>H1>rGUF-*Zz>19 z_d-kNzp_3+EGWPxUdH9uURghTKQ*t6(qM3&_dRA$SEb_tS<3NybwRaKI3<^I6nzc> z`^(%cU}{<}JF_@F923WShWA#zq~~cF8BfQ^Snijyu6^q7m-K?IFLg(P$feI&x2$`T z)I{|9=pLYbK)bCbY(IW&iw6KJaDLalEE*g$h**O`YGZ@Ra&dLHg}s3KD~xE}TifmK z3NNKBjV-sZkxP{l#QNh4UkoSNpMur{$zMKyZb@KV|8ARQ(3lGGZ>ve8^brb7ly@A* zxaECx?dY~D1?vieD#CB+(x=UYV098{IVxZzk;D{BF21w!GC~4J5pt@$JdBx*mh=6A zep;cH-AkQb*V$hx)~#PfA8-dq>ls_UA&Cg#ft!lxauRPLmK`PQv76mb(vNzwHd$+z zaPPh|iHRI>?{*-PKne0}et%&6PI1HcN%ZSsuA4!87*hAC8ZVY|%;n-dEJZpJ2GJjL z-a7`12a{H@4^--U*M>ZqnAj~SFWmnXWi@EE`!v6Se#}}UiO--XmNhm}sz@vA6_Rvv z2)MuYmtyr4!Tz`XN&Kp04=< z{S)HS4?3~8IIe1@$8pHMJ-bSc_!tr;^Wa^y`<%Fx!^LYWNiFI_k{orpc`Ofs zlwft>7wIYoOM%<-TDPZ5xaO9}O-t>xAeRDft9rd(wo)62y zYlDl~ccJ2=GGkV*Qe+H+*sI(u5EBfjN3YEFMf3ejON9j8T3zk689ydJE1#udrzF`f?`FfjNS5MuqM)@5owXxCAQO zUY-OJPf6z*_PT_;K$MgP{47=lIP8;uj0M1-gsFXkzNu^YW#{=hu0}o_>sSQ(y zUOvmUlK-R* z2$t44j+dp1W~;=qNJapP_^{INke`P8*3l(b;5=YI=#8V-S!v$<$`ofiZCxpnw)pa# z@9}H^mnYffTXG{>w=5`Vm#xwMV0EAyb0mw=jY_a%8CF~{u0-&>6G0rgzecHHdA;Lo(?~3+kr|S1YEpRV zb(I+VN&H5;%$_Hzzg!Q08Za{eT2Gz}4g>B5@;!det-N*1rsupCMhqD8#MZ2h>!B!vMKJ)4wk`vc8cJN@;@Y_U{wNz8 z|7gO!Tb{SCOPJ=HAsPbo7q};E$ z^Re|YFK#)1Usd_(f;zeXqcKHp4bW7IbD2Ql(RzEGz;gAJS5{0?98_cjN~k$?S16g$ zI2&o?vH^SOJIx#cD1ZqH4?{9+-IY1ud(XG9XE4Kn6l?fS8xv<2F7 zV8M=&e);YMEUhubeATvZ_CTt8z00Ph2_SY;aQZ#LuO?@HgmR#`i`%N8D1Ch&|1(*&fWXiJPx_$@8i?5p9dfnV9fgxdmt1~QanH~&5J*_|Ag)@) zUTh^SQGoa88YJ_bD>_A@F%iKd3_=^|6la-v^HB#LtNvoZY{M{G;mWJSz zh~3XKt$QM0;_)R_toQM8@b1a}(>}F61F}*08>Kf#gQqpt2BFiwSxvy~aDLs>75AT`wB^9|;oLZ{lil zDRYVAh!8(j`$Jn>+f6yx z&b(!yFxHy&E$PV*&+>dJb{tU)2SX4ezuKqMv_enb3n|k3+#V5t zNnU@!a#4TLy#^X9<$PGn^cI#ne78xr5gxP$kT1yQkxOa4>S!~4#NmN|!Fl&f<%7pn zIZp$9-Dr}LSfxa%ipwYtXbWxF>lO~)=ne}^R*=&Y@ErY41P_HYW5}*W0KBylbVK#m z0gwSpW&l|c`nwRJfv-;IXt7=r=9}>+PA(f?3*O)J2Qe&?Py}3%miFRsmZEY&1thYz z1EBvM_8biYWIO#ACLjYT6S@DIT#S60LMXNW77uLG1~u6m=P!}R0}tfBa2b5wFmJ)c zX@eY(!!e^e+eVMQr35Y6;waD4m6T_}%6ngyxzITobR7e^tbYC=e}Teebg44ZuLaL? z#n>BE20ME&XOKa+2R6fxn8M?V;r$EIkWGpA}T6MUQ!u#3ZN-b z(TS|v;pjeVGTC?GA6utR;%~+m>WV98?Y`LDIJR{!SIrF5A!rItv9R;sAdN}>DKR97cD zO9CWbh{kXin^A?mcUe)hZU>@TUh8L|41%aDk4lyCc3-4G%v+wcO-DGAk$D(%mBf`l zuFTbdIySAYGt&DHT^9PgLcQFLr58~k08-s?7a8QEoQQ?V&3cWrn{P%ni3nK&jf%B7rHv{n20wKb%E7XcL`zbHXAczp>Z?H{w!D)V7)NMr!8nZ_Gp>w;`6`~u|6;lr6eZ&XDy)%->3H!ox=St z>vTuZ7?9$TUKVa)eP>cr_yA!h{Q;D@L6w>2F-Utd>32|M0a8F$u9qJ%-t?4epD&X6 z56{`owRi$dXJ8|JG->s2g{d?b<#Tk3VmO2tQljGJW1qtdzr8EZ>v3R8c+a;O%j;k3 z^(Yl-?VdiT^F|2;2zU?Rl)&xM2Qj@Jap-vWiI#gLfLgwr zyq+ay8?*Cerpz5R zEf|66r`Km!*4FtIj{L%qrhdfBpgl8@de8Rw`>d(+%}s}yuebPTA$Gm_o!szPR!EFu z8<^VA50uND0LSd~y}BEP^g7<2)g}at*I0%8?`EAEVH|g?^x>>s$rKA~BvyQbeI(ZC zxO)|hnHVr7q^1^QdpL0mG7+;#Pu8P*a!(>If z)yvJ{((tz2UyHKpi4xhJ5aEDRXfLD%vGK{9S-lp=Zt6poQLk9xOuv zve#;sa)ckKNEavT5d%T)#qv=*wVf8m&^Xf-e&*55?`v|~e5ed7V!2aSeQqCHK8E|q z;!CXy0t?Da5888(^|WLT_2trHr_V95aIajw3KX_`I0bg!3cq5YJ1kW{dEj+q{uyg- zz%Ddaxt7U`-BJYN)%QVCP(%0n0w3JB-lkLLWLJSDd7+l*u11nEdyi|J$0oL_B-|J0cfS!JFa&D%;%4OXHLnz5V80w7jlgsbAqvCQE6qf9FdA zwPDa$Ujfa}JTE^#7)miw;~)t*_}%z1C_zs*y)0n^qAjbQ-gjYMpu!4|5LD+bSWUiv zP_NW-h7dBXZ-F{V@+nwhdz2I1E#2=_lf z?RCK#z^Ofmwz&>BL6vnq=zGPE*~~ZBd@`c0Vs#g`?5J7jU80?HsXhr0I#B_X$_L~K ze#5f%@@*-J`?s+os1~9?uc;tS(9NI(>96%Ng5_m9zN|R{eGG5h88O>H(H(c@Q`Jx9 zW(~xo^NYwY{Ni9l!VW80$g;wv-JZP`G$ZJCoS8~e+} zedVky0L6-4`xMEb3tFB>+CIB?Feo4Lv60RrkR1T`teAE#c7@g{((WgH_xro6C8xa6 z0{>acM-BR?sk6RjF{=I)A)%QHTSZj&CY}1R0Q2y`i+eLV(+~Rxc?~y^FS2Ht#d0l` z>lf!3inD4NfYi{nOq90Xi>Zq?M0aXfBHiaKh-E0j*G+!R{Y|_3zapt9DQg!1>1F)M zs9n0>>@F8SfPL96Vk1KHQNHgLN2;yWQJ?w&x9E1VKq(kZ-JUF9M(kg-x3_0_5CG;f z1I(C}lFW_Z#{$v#6R}UB^0Ga*8afgfHBv>nv_k0w?=5(&{3)00tbQjsgi3(gb#n+z zMFGrG`C0C!W^4p0dAK4M>Ux5LLb+Y`~z(v(RVlc2^i!V^$xshne9mfngHa zEqnSL=#w!%E;MS23BbZ59R;n}3cx=%b4n)&0lgjG7&FGugCi?f&4%ehm-{mQ2&v(pd1X9Bqx@=hh9w97*WADVsJ_uN7N!-gHFS4KWyDg@ z9KmZ*SCJ!`f{2yt_1|6L-y?+R4nA6|Jn`(FhRlxF%lT#Yh%uTKU`b~A&V9?ZoGbnm zCx0;c0nDg+vDJ_$L4!eY>}L3y6a^~#aJIbem$e+we1}B>uIN$w*TQwY1bx`IV!f+0 zgs|Y(vWyHQJD<(C&!m^9_c>R`L9Dcy}KCN zWrWMTAy?e+15_wv}@vVbJ{ouPm5i(W0t2eQdSR_AL0QbJt3rK3!p42=!h6#-E^3Y(?ax(Zc$#_;e=z6S=2s`ug>;5{Q3S!7}<{@eKI&D`x^4L?D~m* z-2=sTkW-UH(2hhKHmY3MyJFQ5gwr1Yw0nz27o4^4KVGZ>%vi-v2r&+7Wt+@-xcp*q zN-=Jk<~Jb6pScIv=|n|CjYy?Ap977RA)@zVg#y;<5$^cUS57wD#8AwoEaR8W^Eekq z$Mm|r>BuGzBJ(U1J1n%q{0?;e@7%dVaYTD|LE|a#3_kjzdz<{}(@NHasTQ8~b?t zE!)Xb95GYQ`U}k8XGH!v)PTo%InRnh{}X(y(ysvH9jO7cg}R#hSBhXw4uA8578z$) zs*#u*w%iIt7Pc3Vk@8EA^1HV*7hLI~Z=eus83`^Ki^FXg=R;!gd{C7Xw!{^$1CD}N z{JmuV8*!)1{XCNz8(r;-6yI&4kD(KJ&i6@zm|2p#Sl>CE#A8;$;RHkmxq3|EH9&%0 z=N-BI{(xedUSvc5HOC_}g*l(}Md>2a=3pIrcEYpcg0tQo=F&^8-p6Pn@ROE-SkTEIJ8#Eut<%}T?PDtK4ts89 z&aCT<#Gd(%W*D-)kTjf;P|jo=P=s-g@PB1A!$Gk#Z2|BbJn;M)ncThnqN2Q2)`+!5 zcNzswLBR^ogVjFrw6(@Qo&YZF(e&Gw9!y3_#rAHAIp)Tn(=x#*uv4$TBjqK(xf&oK z8oa=*V{}IhVh=WtkpAp7kn%bo}}AT`n+hJxqa-8k675t_1Oe0Um?@e%u}U zNIcVr8HC1$ST{fOpUu9QPle1$O9(4L_O3+WU(dP4`BIVUZ|vE2zOPObffk1(-HXMm zEUt8#yLA(PG~9eL4t3MG|Fk3E5G%dxBR_rhgD?XWGu;bV)Ot#tE6yZi1?Mujc596o z8yMNddk7kDQKnrZOW%;h?!M_7&}V_BykrKgFyRl88NoPfDtt$TUhgvnHK>hfU6jvm z26n(C|7Igp+ky!V_^3haGa;hpWg`iDo?q^Jk_>H)ICtAy{h|aV-#hxAUM11DkL7aa zp#uZ@<&3HOG~P29n9LfdWowM?CwaZr_ekE(&W=yq7$VnDy^1}K3qRg*0vs2g$2sVf zb$TlRJYtV!cA`nzYFZlxSS=|HaMdqB+v)8%Rc9Ysjd#(%08o-nq40MyqgKS!#iVrK zr00^o0VqdSy0-OLpa?8~3FU`NUE5yxu%2=QqlE{aGid!t=1I+lj}<8Dt9v`5yHG$G z8SoHA{a4?^mX|?*k44`p7w7LLoM*OJVehlp&^moV&j&_8 z=58-WBDYDy{8~Jj!yNgWOk}Kkwi!+Z;5u0CuDK}Sp+mA~W&7-W>rJ~6&U^S@$?S(P zIS_7a3o!QWFG>)(7&fdCp>d^0BpAmarJ;c#we3stzvJZxV6FM6W2N`QVswBo>Lv%f z`ceo^b(tLDabOzoSwbkrYvdac*lUqQFQ3i6T@Ug+`y~L*^X>o!DR5RMpTh`E?lfjHGg4ntN`D06fEMHXs+e z2zzB1Yw6+~9`nXY%g2nK1D-RYBR>(6A{HA4<~85&u3!Fin zkX)d~OmS+%g4vl~(H9)j3A@EgZ9FzCGtO}l11eLV7}T?-Ujuk){N+EeQxB#GY_FQb z@>d@Qx_5mZz(5t{(HCxu2=z=qd#1uHVy5}D>L+SLD9a`W8TWi^%3#F?Am}NK7SdkAff(iyZPF&Xh{Q2sq_(7DD0ihqb$7fXqOSsXNwHAPMyDpNKF9LBIryyfNfu`ZuUjpDSO7=Dg%`3(U-m4b(MS{ z0F$ZXs;BJ$nP24c4U7xAsw20XcS>fi8NUzs&pZ8XWHiaGFaiWX=H_$j8A}ezZF7>9 zw#Vk2)#soQ`AU1Q*{%Hf{8!8@gKDi$1LA@zJn$^mJ)ic$$Ya5_wO=ek5q@!R-n_#G zy1=&>w#25V>T{KrkW=mpQU(Vvwn00~RskRAY!}oKx#;6zHkydzId83A!J#ofLCVFp zgU^~ziKIocEa(K=;FCYWoobCnW^G?=;(zc!ETOyD$y3CgV@s&-Y+kPaNUoCFaQ#y= z>@$_5^__VrwEqjB;xFWZUa*PrZRs`Yow{Yf6whXGc>~H>Pr&yxRrkzF2N0;N^Nnt$>;b}6HvEcm%Kq;N9 z#)`M{!#fgr^%60TSPLyw+JS40XaQjiJl3*@9vRB?`dKWUivmN*M~eO+^MXu%_ac05 z5$^2mOM@QhF9IhHXfu3RAZr#_#Q=25f5)U?4&NMSLR!e5{uDm{n7VTxN-?)7C{sIH zQW|fjGWC3%A?=IUB~MLQS3N*JI+&?Uy@INH^XUG_Z#M(D-dg-2z$ssG??L?#XocQy zfdmk?ARJ&+gfX4o|HBAiXx}ggEf2>?EEuqQEMQtINfcPq!#@`0?$M-AxprWk?h>T18^=6PPRIj>EDEos5^16U5lx?|dsW5u?(P1#(wXS~QdR+tFX$F3jV6 zpY188!`4xIy{tgV1tFF~-R=o=m%nQkKwJhn>tIGYMu73gll;#-X7$&;HhO@Xj|<&S zY%&x%S*sb6dYyqzqCHwxw_(9xTBuYG&`q~y7+V0lLbSeDWdnk2S~{y1;2LIXn0AfL z7il<4<-_VL0Z4QzD^HbhwYieZim)<37ft6~4}u}F3;3WT0H*&0P`{DIwaFi9A-))EeP*uEORY5OD27{VRl}MqkFok z4Kte-TKI-eZ96lvbTJc%8}9+7TP%l`9KjGdo;4W6LZ15D3}rH(lpSprxdac{#wm2H zf0H&F1oqN*Yykc!`HYu^!02Zch2kNe4r* z(jSmeAr^O(hq)_))&IPz8pB@-WRszUn|P-P3dZ>o15gmbcw+F6BRkOAW@?$YyWRLj z)_0(qk0i_F!}Ih5^G)24F=LEjiTm*wp$l1oDwoonk{BO@zEw>dC^*`5yG99Ttr>loU=odvzs+8X?c%{xf@ZW)lGTPdYx3D(#)PY$>*Bn0(f|DGFu{ zjO6X6YB%sC^vg}hluKCY&jE>2GQ(yrOSlGqF72|ynGA_tK@VAx;>dRKkptM}0MzjP zM8;PcMzm~)f88$c}?4g!o7e|R4q z^~NAQs3aZFHjB)@xoadG4l|4hEv`k72YFJ~?_~~RqB>&K1=#MIWwNYhm;p}xe;M@@<@!M8S9Zdnw`t4j3`F;-B1=TVPb zc?st2LuX_H*8P~dL33tA3ntrE!DAwlc=^Qp-8)v%IiM>9wuApj&;o;Bf!MM<>g3xo zc+_IXZ9Wq9+`=jlk&^Jh3~pmONiZ>m6B=7%Vw-|^{|l%nR=#6T?o~(?2)Y9F77}u8 zEvVJVcz?{|75OjLkD5LH$b+mCX}p=wK#rZD;Wq@_NVorX2qX{&d#>{^Y_|!J&oa2^ zL9@7qIWP5)Trfj7mDX31vs!!#W;F8TuSNLr#uskCo$_%%5Je0a-?^f{r_|W1W2TY= z&zp!9cOg$F9g_t!Xdgb@8tv@9NpT)|{np74poiNKM`kk+vKnQ(Du%^qM-mxEb!d%;x?Ese4Coedw|c*35`B(0RxxRmoslZWo$tK$tGBd zVi`vP%!f7fV}l}K`WOd~FAX9B3rEWpkHfyDxIpfo0Tf9sS)X$&7!E6V+3a;#a>Vu$ z=xQn-A7XQ|vo8Wk&6vJD-|`B>6_DK`{InF%3L|m0&u#~v0S{ox3uOiY(v76yFZ|rj zX&v$U4K?ERuj%i$6&do+W)W-0x5XDB3`U}H#q*oJ>S156G@bsc85%X$R$v^^2+?zP z7@TzAOf~K8X6AkVOa9p^RR+fW&iq!~2h6dIM{ z0w0#Ho?cx_hu@5Dff}zB`JM9Fz@@ZYRxOJDDc03cxKgpNoA5ToImmii$S7lW52j4Gj~1Z;#e=n2R~x;eJNMKR1(x3^Cq~$ zDx_B!C0YoYb?W(xd4_v9%F5gZJn2Ep%~3l%aP#0LVofN3Mg3&@kHJ&rAC4}){G2ML zLI6U)u)M=vA}0+#=!;?%oXgO%o_V!b!Bn^cVsn@}|<#!E>e?MOlVD z+4nlYlRbaL;SYpr3Z-({9@j%0Sa8c&0S`X1!-jw#>IJDK@y#~5sZ%W#!}2Dhs$c9_ z9N^d}eo!A_otD@GKv@ZbMig^GarA`%Zt+nc&$teal^WIINdV^XLNDbtslKAC@<;c6 zmInIhV!4*1Df`nDiJ06hDmA|fLCdyl2TAJes;bmI`|SgzGuKS26+^oKt!hq=mIW`! zj$ZzyOJIUnz_j)qVK;zR6*BmR+aON$d#L#h9RM2qb5Jw5fn5eA`Z~0rHjy>m&si7x zis6;dxjksIRj5DIyv6`VILr6)&LxKiQiP0XpZ}WFp`t9mXxDI4 z*D3NVyB>j=TxtZ4>>rBqa;56OPXxD$K|B3-x!S^6QwJSL&~)1oBfwRNFHU}WQM^E1 z0ujXv<`8f&z^S8$48|8s3yAO|kYI|YL|lOyvj=Nem>KiYQQP;QS?q&iECHbs7EF1d zr~4`Bsc^LVBY|0h>v)fSy7?ra7_$_fP`vF0ud;Bsf(?N?gUqgKtEv ze)PrvnTo2~lXUy}d~=+HiphI|dd4wZkgGq~0Cb%IDXa?%2x!1oxxfS1jbH#427^fz z*&qG-&I7#;oE1!k_=A84>^UeMd~K{;2rzAjEj|hwEkapnCzit83kW!BK5FRsijYi7 z9?eJ=nh78bt!#rw0MXy99r!t}4H)8)6%^E5!A+~FuBoX5sHMo^j(o!_60-4nHm5Is z1LxAq9a9oua((HH->m9k2<7LuH`J*peeXAi_iF%r2NW1)PbVNrfyNlPLD$bE4y)Vw z1dysoqUMf7oTpQ@6wF?)eE*tAt~f+b+tF<|S5cP`Kb~)EJ)$-?JU^`TFYn9&&I4Rz zE+`OO=kt4tTRuf$OW?@}a@jm=Ae)VBD~x0%Ccl*Jdg2j5N~LT6u-th_EHjt+;mPh| zTPk@cnCvRGvCO1gq6Ipwb`Sv-_v2g+HvLK;UtF*S#iBuXydLZvw|$9g+aJb*Jw!3Ner3#Tu_LFKz7t z8RR{Ve8_DeDWRhi2N$>v7_iZixNbjAT;r;^d7sir=s;8nYA=Gb-FqmOY}xZklKy8i zpxb?HS3jq!q5l|whU)eB*RPixZqOy>D<{6oS?>*wAFBmAHXk|oYYm;UZx)(|<0v*Y zkHP^27XafTb?fn)3(K((MLg01kIL$9q5u;H)Q*S*Bd*>|FqV zYr;5!c0z-FDX-ceRAVwr>GThLRiF{K#!YN=HE;hNg?2j&oxb9$@4#3oln}=y(QfDc z{f;02!%LjyY^E-`s!-2gP<8huEx^+zNnN0rl@s>0>pilud13@ca+V-4o95KDOK8$n$g6qE$b7s_{40JTw(-BQt=~(Xz<8eBKm*_c#{p>=;CQ5+=Uj2+JaP zfK>0nehTzFdaxqf!n{&dGn;qp z8BZG`&ZV{HWn?JL7WMn4tzeEyvT05CUa zE`vu~w661Hy1`*~8BAsA9hbkn5$RI=uq?1B#e*AA1p7J0|D$Rih>9SmgG#uW8Qk)Q zqfz?>X8!``puSl^PEX*bf=ZLaX3w}_)X?iY6}S;%#LO2X@0=5Chz|G)m;j7-!Q-Uq zX%9f$$M|S!12A0T4KM@?q=;YRXSLf*L?1C}Vb5e>I$ zr=f6L*dK+QA)GUqhfcsWA3OJDHt>kvq8=%>=eoB^HXN*&-%PU06x0LpQcs^$l_;j* z2I^~usKcoyg4mpmoa6Qm&b;4Q`Ji~*?sctU9_+ZWXzYBSOgyV3Q=78noV-`@hv2WG z*cmh8a0PKfUq5{JY@um5Lvp&Qsyk%QM8U!)qQ=>^q>o>!y+^imOrvzK96aQu#uoaK zhZ@0=-naEMl0!b%?7>}*XK^2b6s=G%b6Icu(z`}|pl>~5xQ^Z%_>(j=));El8|%2Y zSI~-bCw7P#;oSZO?GoWv4Mqs(TP`nGUyFVmm)`M!2W}r#x)?CbK=(w|_G~mTd^R{s z_Fb2vqp6m<`nN^~Fh+CtR*bf_hAK6=up~|Rp}DuxV@6{!fvP#$<>_i}c@0KhICE5r zV*ZmKYlOF>u_i*Wf1*!T#-FZ{cThV?d_P{#W+D-xSiDX*khRY%7(h?dCCm-_Baq?Z z+`ha@M4e&R5_M>)!_smHrl6$Z>v?>4$rHIJ%KyxOJ!8TiW%IAN+HF!W!d@`F&&=r@l8)qao2Nz58V>J34xL)qb^ND2>cboi>N)Q%&;Pc+e zMTQ@~1~}XE_2HagDVk?{Jw76|>|Jjzu-q&7BpJ7=^L>|)v=`-WK!{Jo%<|a}k9kN7 z9vwn6B*LfD^GF-vs6Pj=^zf~!2g$FYuR%arb!mGuHvfix z%#n|nH>?5lNrF7Q6A;HUEa~{`R>#11V<%-KNH1QT>2M0C&fgL0UTi zq8Xy~@L{f?^Pjnr_`S|PL*D+p$f#T!0&*U>NmNR=hsODG77}*#qS)0bCjUsfp-RAe zIhPglO}*t~0B}Sb{V^l_&`&9dSO6Xw2_C9k9PIR^YJEJyk%Yzfzes!Uc&gw3fBe|9 z?3G;+NoJCDjHHm2GBOJlBBK!5GkZnZR90q)!ZETdBU#y!Q#Qvs9Da|ZUa$A}{rP-< zzkhzOZm(OnIM3&~uIqU{AJ=2t@ApS_dt9yfpGm)EEwS8P9zQ6ecArf&aK(sOwa0ia z)u;tgq)(^lA8w0m$*^+Ur;xWD0kYpED&V8~@6tXO+5>R6j87&yT07EB5&bgwSl@8# zvD8ay)*)}sP&QXXs1@lq1O^rY;slG|{rN9q1ggENV+<&(^33WU^Xu*e%l1vmLb2?# zW7XnB;M+qZqi<*@+qOQDO@KvAdAa4B1}beH@`$R=$WFN7-G#&T@%-G@Psuipj9l zyxja`?Z=hW>wBKR`uGmaGfd_}tM=cPm&ZKd_{)%3JMl`|jBso^?HWc+g7tTE^6if; z=*sTQv4g?gL;~Q0_4g8!?!i%1xS~`!4w-`AdH#P4Z9JqOty$>87DO3wzn=d(N}l#f zM@8nl0~!CLuWs6dmj1F=fIdJHLi_Hyb;AL>MkNuEOukJ8m!=s7VC_HR=K%Hp{gv(*5?)%d}is57q< z_5S{Mspp?R1*&m*yyW>R{nuvPN~izGG2&rlp~r)s&x`8Lw%jN&yRSFf#E{Kx(GZ4yPph58Sy1*+9D9bZMEkY$ zdhtIj4d2)!*Kn6FqDI^AegR>vN*Bl#8_t5$_Cv$+w>>Mv(YLTrr@bDe1F@OoLkC$7 z#G?d6dsFk*xjxRxojZ4(gplF(8)6-d+9}qR$e*lfwO)(!$Bd+X=HdDGh{(t^m=!~C z#3Ev55=2w1FtqzBhwLxB(2D5|Z202~w~TdG5X52a?NN{kp5OD!_L+O07ON?};(C=j zxz6#?$vHOI59RKww-Sl=NwZjTNvwfzO`i6Qib(u4OdM3J0_ocg+u@WnjP&(e3r4&7 z)E@uX@N1HQ@eUUg&hTeMczD;_%^I7}$EbfH_f}LISTmIZNNWVJuhJiRyRhEso4pqy z7jX~Jfqf1@sbiL9qWuxI^2p@)k?4Nh{%T_bRxSNY8Q)P4PvF-^hY8ewTEFIH(_vD z>x_n+BlveGwAc7vPEaV&wcOSbRy2D=@TK4&gjmUD?X`G;5a~6{M8_g?(zRcw8cS-C z^%1+;tz3)u7be`2O3cSMgw;12dygSggUgR zKQFV;e)S`Rwgp!qKJSNo@m$>cY4WFGR7r!qo-BVY`=_qui}m|H!P4FC z2rg!ir-nnVr3dyT?RkY1PE4^O>XU^otjyvSv^YZ&iER6bXRPSczMf1_WZr@p*u)o@ zFF*3=YYx)RJDPE2c)}suei5}p`&%wge)8In;L2Gi@%tuZEyl{BpVQV>#+D~ejb63M zeg6EpI}yKp*Y!={Arl)(AONvG>8{$#&9{SP|9qFx%R30z+~t{Wis}ghya)ECM6wj% z0M!BK^YqPrkRmu=dPp?RVM~6p{e=CkE!z<*g_)P=XbzH2!HuVSMTx(?wq|AKymlzP ze|%b{C)tm2x$!~p+xn76tIvwH-JU@9dPK^V?>9G`TwW22Z!q&Zl!F!LixD4d4VIWl zRDGQi!+tBmB<_sH?V^)0k6GDMbBr-5`0PxoE+*x*xCD2(91qr7l}$g^Nh;!s88IG# z`f&j!$o)LLY2>|M{I3td5v6G|R%lb@_?J!dG#goPxmy!_gAyo=0(jExr@=N&{m1jG zC(=|P?1H_h^_7J9_-!3x!{Ka@$AG{if0G{1X@1NW`>w5(^t$e~3filsGEcq=W}ea#g{s?;f8%iiXT&6$|T`ha zQ+fMRaLHpu4Ex{d+%}9SGW`_peTFF{ReWQ4VnQIIBlGbv6oVJTAbKUs@Y(mM4o7dB zY6LiXW^m}~Wd9b~pM|Hjd;#R$il`L@%%@5_WrGLPc@_m&xtIzgPeNr#+chSL z(W{1reGo}dx#Yr_PBGApotsmWndORU?=@ki=Uwf}e?t=NAmw)#~ zj(PPyNYG)H#@HMC^=dm6msx3XmnZqnm5=sHH6=eFT%DJoM2Sj!ZS979b%Y9BHOp%N zI(8m;@G~1}gU9nb_Pq=f&jcrJNo~q&bNCL8+=_2`7gQ)ie${Of`3Wa=Lx~+&}PPNoiMGvU&`}Ty}*nG zC(g;C$Ma(0lmyM~xO=ld8h|#mv?Wp!XUN!idY8nm)Lga@Wo^7!&!Io0?BNC;d!w{|y(7SIf$jjAU@53IDlPealcq(!>{PR$C%q!RPg z(kK22yX6)$I z(X3tdZcR?hWW30;flo~~ygUz>B#atbxl6oG`VRTiQwr@d3x?%bfri5LAEr`b;IaR2 zrV>A%kTujc>Geh6a8iDT$Ec}EnHQOL!~iL+a_fn85)`JKa;uYg;0OZjk7X2}kjKc7 z$R5a3Xpj)%RL~#$i0AtvHK>lBVSRgFv-`UIMEb$z0sHzvCq{%QjQfV?@2=eOZEWO^ zjSh*ePotg=BBv6{kWMUwWe}9~c^}si8vV!*-ZoJ8qbM&z)z-SxS=mH+oAG(;+;>OR zXNIxp?CPPBxP*j+Q(6;Sq8%~3D*6skyHPn?M1Y89aLD(7j2z)afy$*zq*cm7cBNiN zvm6~}6>r@-&PXxcM7u&l0hB9qOZn!?)u)G~*X<|NvWM&{?Qrks4*jIn%J=LO#8|4W_*Tm+>$ zJQM(*;b;`L5gUz!#bi9H+U=jkoD->PT=yh&y2`(~-{!yGrO#7JLPll3pQH;YQon}~ zJ0+0B^Iz>FoL43M<+SGZXM=Fxx(f+0flo;Vz-00R8eQ@Z$;@&xuwdJ;prS* zCU2@Q(NHm%_(K$QwHG+6(U#-hyZ5ad3QOt>*17c=b`~9d3Xf;%=j#E2sNc*FzwIYw zk4Lm4L`9BY^HW@43Wa(9jQITJ>3&qWtg|xPE`!_ixSKrd4aT#>ZMZ7&lavmx$o&{% zZyIVUyt~Yn^;wb4jL)~fLB`MITX0lJ!l2EWn^l@Yglv8>FIk5*tWR@s1BzPm)6tWS zO=kO%e~yY1f!uVY>b|B|FJEOQYH_!&Y6fu!o?G{fb(R7p1qp0hSvf0N8}4(|ci~hp zDO-+5A)fcK4+xA0cDMm)yJ_whe@mm+Gw*cW2G6f~5*0zoKR)|a{H@5!ZK$p$r@ zQyE@ysj1YfVm|v`FME?p97L`TKqM23JgY&GxIXDR>%xfhk-lp)ge30E{XcEkeq6<>Yl@ehrWTAwC(X4-F8W!#uP6QbBqjyldZ! zNclhlV1#wygSbcW44D=q>r{RR9j7I(7a)o)ZPF{^BQ-*Tm$|QerQhRdOFgcoq zEMRQ%!kMTz6~GF`H$s^y{ai=!32s5W*7Ver>;y__mNX$}ko1gsy~(WaU|iPW))u=2 zpp!%bU_w>{@%S`@|7;z^kwPKv(_yEm53&y@_rSkpW)?6dcqmj;x68%Fx-y;F0eQ_!UUP{pHNn5F3*T!{dd25q{ASggtI3Xe%YgOZ)g2sGEZGS zy=Jng647n*)R-9Bo;y&|(59eeusw?fh86J#t25Zyl(LNFY>@TYS9JvzV}3JPA)|n2 zAu(vfiS4C<=+;f)hc92hK25NxxLvUDz87V3jINlQBr?D&!pR}v)H!9T6**3`>IZ%^ ziE2>4L%gDPUnpy{4_pCN5!&0Yof#7t8ZxQ?O$WLq6wJ{{f01NO-EU{CtgS2W_9~Oy zg0lDxt{Zqw`9o|NK13?W0J^7;64W5PJS;4N03TL#CJ(53{?!k8v{I!B7TJ#nntUui z-3V^(Lt+l;2buVU$$6->Ds33ElZf)ZF8U%$?dfZ!A z{4{M$3RLfaLB)ym9z6&kmJO3zfa3xAS;ZrLT1JrEEjdM2fc zgtJl^3AiA=EJdWw<^N56`VpyAY}@YeznM=#-{H~VnNNREX=}%py+BS+XK^F~5bD5$ zCnMNy?7j~QHf5W%CqK{;PC2cCXCOkOwiztp`-F8rb^-jpDw*fYwd+SuTVj{vW9Tpq zNy}Vzr=hmfqhRujdnYI1+;-iJLHyjO$r)m!zw9R_$A;hipnH5vo`U^iZJci4p!rkp zGH>Q&HSQ;pKlGS4E4{!4DydylhqpNKs|Bm3w)P+penCy9ae9^hU;Fup(n#}LDqt{w zTtkXK{6OqCgm0q|fUozQQDi*r#Tu^0J)Vy)btKe97AE{=#oDo|9Bijh! z^O5$IYA?WCE3)~jrx+BQGy=*dAw4rZPdI!>TKsE)Ix6KMs+gVCs@_Ol$5=!{A zf19540bZuT1ZLWztay_XG{0PVU3%!ybIir&s`L@Lt9jN$3N@(HXMVjoJm`lOi(n_wPSw?Y$3 z54y)W{VV9n9&n(%ZC7bO77u5eFcUAn5awcykcyXSHGMz6-r3j68t_W^Y{`Ajs?v(Z zgWp2YTjN8Y&yUZ2?c((D-ouH1k-R!19d-JVhX)A!5&HH-Qw@~3o7LWFF!NidwkQeQ zkB$Z|di?8rnhnrGJm?|`Uy(2wCGaHqBH>#{j}_XMIXF8uI_mmi48emrfuX`xR}*bg zrrtq#@?jkJ9`28Y&us7Pct{=tfD1Rv8Tj7~f9qN`{0DX~9JI8k8a)Gj(7g-r`z&*` z+Fir~lXN#?QyqP0Co*Zl zpAqCZa-1?!naHA~!GpBaK>1*B(4gXGZfx)oJ->As^Rq-S3{7nu5{lGB!^=s4*dhDZ{r- zv~Xs=uOpme!w)CC<@lAjyVumz)CLC!wY9ZXbtO|iue#TM5LpJ*Nc{ZHF8TiRVGjt+ zeCE)LgL_CBtNSO6mL*!5yQDpG60QIDVX8;?k zFM+6qwiuBOO(_ej=qG)}Sh_Pd2y4o~uvgT9j3=7uvp(NVx_YyrU=*SG^fVS{LLG46 z=7NC=-1k&S5wnet~F>azWznkJ|iZ z>wZ%6lr$(1fyJZo&E|%We0YJs?7u#fEOGdmzjx*^%xTk|tGXsz!W8|q250g}WOtwG zC{^ND_4)VTe9$5pNj~Vh|9MG(g^q&YsVe%|%JvX*SNRvncDLpCmNN&Q%Ppw{9weJ= zie`dX0?0i!*iKYjlg%$}JixGg5B(eow`HwrsM0$ukCM6 zuf~7x=yS?<8oq0GuJFz`jKkw^$eEPY@#;CaX2tQd&D*I5?%Xf5az*efv4Ud`SEVJM z>G>YLy&n>M!<#wdi}FUj1~wHzIj8UPJSC-27~uU3cq8cQp~Q$aC_y zugHHLFtN+Yij>NIrotXx;4h$8kk0(7h*IyH`jmdzae+)qJzWBw>rV@gGgW5iQRYn? zbV$(;xdB_@4yVntxg?RugfX^95)#Y1@)NuAjtPnan0SDcaUKna!cy7=7t-IF6IV)4 zr<~sHUgp-R<}P!%XsVIMTrukK{Jl#->}ZB*+Sqvpb^fLEj^lD1%+RF-Bt%+2zRAf^ z@uXD-wMzghy}?V~Y*>MLz4lsj80F)0=T7dXpAW|cXW}FrD7&7sGSW2KY>Qt@A>&0*+y*E6xoS&obai4=*&#E<@gS5QZLW7aV!3WC!$W~pz2tD z6@=%!y}bt$B50GY>FTbAAoq9^lFLEN0Yp=wFNpv*6vqYvo&2PamfV4wELr(%Rh87D z5_u!XBFNq8@x~`7yF>Z#4E5golfDPj6E8&f_3*lK%2^XQi^A8m*!vw(&~r!kxy7Qw z+wYfWCp;ZWj{5zqvN=)Yv+CEPDIkdX&MPa+UXaKCu}IEqoAy@S?+(yh3sjv3!aab4 znGz26w@@!c&(hwR+8E_?CDbu7c>@4hrUTIW%p?@E`IHQKI9_5OQ2y#oBK*;@eNa#(^%p?-Px;$I+y%A=-_^C%6@-b<;b6)Im$b&vBPzq#o-EP=;){k6FK93 z-GB$YRzO`VU@fJxI_ctj9eoe&@xyH6U-JF=G68}74q)eKZ)wwnZWmv85^H|(FfE29GX?jiu zZdtDCx}U5Po|udp(kNzns+Oqxy(hYlayg1dO`EbJN~xzB~|-M zRJd|=V^RAd(fn-szVPjq1UL_MDDPRS&brAq7%IXyPczo0vz#%cEsc2vFY*UgW$0vK z6}}55AxMGkVvwgR6;41c;JQTyEmjaOH<8t&&99wqe+5kjSSQkFo#`30XY&njnd5aH zE}43?JwZlMSWhq>1IUl{b#&WHs$gVs(fi{Ui-}WAGp3_x-w|1w@EmQJ-+?&eR!Cv{ z(=jq$a6n^84Dp`x4Mm201wqWeE1#i^Dx>-VpsiFlV;x>vI=6j44bn#n=zdEApY)-~ zvP+K?4VFzRH$5`0|Gxfe+~D+nuhaAsWc^cf-JURN%DvvLA}s^kft+QJXUlC{t3s!O zyu~!=CUr*c(+)5hvry4SJXS@|tv{tT>xNiTk94y4N5)>k%lhG zGNq+elXIVcc(zilh=&Aud%RP(0~n7r19cgqC0Irhx^JbiV0R#UFestlJ2YgtL7uR= zE8k{pY+Ui3=cC1?N04i{p9V@yVI39|v{*Kue;z;<_vf?(9x<`r`J1(;?4MgCP-;6r~Xsu?oi?9cIgD(2|LM^TUVQ=(?;Et57Jks%~-IO%_BoYd1C~; zpsQ;-L`sO3^7~SElnUnsLHPU*1dE+yd#g{MK25LyX{nJhTCM4YcMeUx*zEsW3p_{A zAHWZel(?Vu@;&I3?=LEk@XVr0F+sj$%SaR|-&0%9h~Dhpy-DF0hF0za4+aj%ZJJ7azJMj9cyq`MLRk=qP%w2ASeVObWiZ6X|Fa+1w;&7VwK$GeRN)&kbY_m0Vrr^~gwU)eiSA}y33ZP~710y2^ zrliKUDrlBnF4q4n-h^T&0dyBjXU6Kf(tMV`MT%>BjkLKMp}S__RMzAzjGV`&74k7Y zl!>Cim0zC(Wc6rH2))0xg>2DC79BChKfsan-Ui;eI90l(_Osut~MXBj~jY}@G`zQpsRawTl`-L%@Em9T&0J@>WHGi}qy@bVM~jlz&Z_@|5E7I(mhk&d z`syRHKyS^!gv{z{LxyPultunVj+T^b%aJkWDD2p=rtF|{Uult<62+@xyAjtC@XC)c3srQI#POPg-ml6B*|_lI z!(j$+wm7)%b&$kY62NiuRZBUaUgu^bUDLMa@J@P$hUeL7WmM{u$YbZ!H>?(h%FfK4 zDkhY$%E{lj=~&04P9Vz|2n4I0%13Rl_N#-u&j=G=Xo0GQE|w)*)Aw1hG|xEU_v3tJ zixs|PQAO1;uM-}9o}9ewBDGJMY2SJM{Bw3t0bd8Fsz0zg09y6ca4>Oma|<5SL9+k1 zq6M4g$mOQ>g4$Y+Mwa-Cdq)aRE!S;v5oT{r8Cr$(h`2S5uwWNkC%S9p3|`Rp-O(J& zDEQ+PaM5F9Z>ZDVfvnxJi}5`oLGIu6rLG_2rhYj2&4N!i z`)?_^8(9bV(wTf?nt*-1C$}>58NQ%KB^%8{HQ>^}jT#IFFE_w(n^CM!h}LOarJqW2oSp>M%E94@saQm8*? zt>mkAm3Ue?O_tH@Xp~IbOvz=t4-P7OA3ppFAuO+y=3PSYOOW<{K5OWp#`?{#L0l?M z8^z}}{OWaCS+C<3`}hW6LS@;8b;VX-w`)O0GnmFmh{z?2%^!+Wx9&{MM55yBE*Lz0 zyTZm^a^CjP*9Z#_^uGP>iDA<5)wS<&6tZ+jvW?Lh`l5o)%BUbNM8@L&8A6I#ef1ri z+n0y~gDoeh-|}JDKP=uZ76*U#TRZ@UI@Sb~M-hR(I!}LEoQ*KB4R6R8EKpC6i=&TY zJWirOP~nMMw3FTlr8|)zR=TuWNI3rfVIkpEang(~gJ1PZr0hkQu48H>im+lpN5O(B zillw1NY)AE!os<#Gw187w_u(VulELC_s}FoGjk7mrOJCU%Vt_TNxmejd4DOi zP(V;nH_PvqqRHGdxu9Of?l=y_?I(rjq95?;5Dw90W{ZYy@;;=*uu>Nb6ZU!y5zE;g zr)AL_q-@FmCMAyKN)?38fYPT52;NhNADe(@6<-AqimvGF-I zt?wGKrdDIqADqwb^Iv+Rn_%emkn3=6f|#3?B74Bq92_4n=1XV7PNlBH;dW`KbMxBw z%KML`7Aj6-knz|Em`>XQdBj1=x{p+l_ceNY`cg|HhG`N?Dk|Y1Ci`(U!!narfmuWV zDe74u^c$2D{22Z%)S^jV+7%tcOulT%U^(`u-3&#^U5ffRhAPY;o0fNn7?MG+60}% zbpoKY{!a;}PS^(S_p)Dthaju9+*5Vo!IbayEN;}Ay7HAQ?inX4Tymcm2)`v$?RW)J zILXrXiWi7&w5;+;PF4ajDj2kn>+ka%C5I7W$M#HRTk`dBtk%jIMH#b4eQ zbl=~Z(@vG9Yx(ScibZpv>VoU9nBG-$ll|jGo_EIrj2M2CMPe;L3&4Z|gaU?HW2(6s z8=6+G9vf!IgHs`RbECu^P4yp;=Qv7jyfvA1GU6?@!+qT&C;T5eDoHkNJvJQq4Z}W3ur5a?E7FrE+X687% zsrLBJbB8G^@9@6zdMkE;P`Nqy{gI>OI00o2K;bufAB$GHeC^s-;PfOCK*cKl!*v17 zp>@=mI~to5kWTz+8urWkm`%4_p_p40u5g?hk{c> zLvvRv+hVa{L`+$RsO3w0&2$w(@#>3TFmr5izss(3xLwIAv_x$<#dqOFinNi#$+n;U>?3;|Z9Fv1&VgJCuF>I3M>} zmoGnNb_MMQdXr5r-!V%Ux=Qg&;`NgDH#7f#p7p8tv&XrZuvsm)HD2pxynFvl=6(P~ zb;##?Rt*6M{J+k-$u8Rx*`6I7x+1Xph?DT-mV0s9GMl5@C3KQYN--PVi#vCfA16ZD z!Xf}EvkYxtRBuj!_MrOl0J7+78#7hG1uw=y?6nBbMU)qZ+Axw6RCjQ@jl*aN^a?(p@zfW<~p z-q?2;BgLODpVlaUadldFz#mLkae7ng;pdd&JGO57J@33*u6 z_V=Eio`+v6D=GqeYgyWvuFmnEyl}yYz%nA|egH>hU7e{rhAMX;&#|>@TLbKb4m$TC z%}4cRO5B6xFe3&AQKaXsafZ+LKg*oyY2O-d=_Zw1_!^$>fSM>iLi-SRHgEQhX;$86 zCqr~w1eFW>c`6*3nuQH$5c5(vE;csnG2sOD-?2<@@9xZHgp_fGp*a{BWt@O!YCN zqpw^w=;x=Z?2SlG<=~?|(hMg0mkLv(_dRnTT;+t*4{$Uihux6xzk4To=)i&HBNpYcd$d_yZV#K@6cK(Fjr#A}p zmW7xO&^oL2+~(J}nR-4-{qNX)RbEyAlcPhm&dnzcoR~*cfy$_g7STBfCkxnzn0tnX z0ASG|xC@B|T@lQ8m_gI_2PnLkE=#-C8W1kf^n6hXwYL^&!IUbBJQ?NmR;n#8*L%n- z_0fMjfQH6HfZF~O{f{dL>g+-VWK&MusQ$Uc!Dw(2~mU&`@g0`BKlv3;|)x_;+g z_}&mE2PaIpi4<}Az7-*;=8h8v+;I_JjsN$;LVvNJ4w?+|2#?02Xd$NM40vx`#?^Bt z(7TnSY1=M$&!|0tc|6KZkcazPAcnrrAa}mg-p-C{<}TE1a?;|dj!8-am;h*<5VF{tk(|t${Xoae%;EPf&8&==dUl_doWq!3 zhL4X=UB}qCfZ~_@SwK(``mNCw^6`LDnqJ%a^5WBH&kop}F{$p+uE)z;tjC(#jETG0 z?C~91Uo{uLb|__C-4fAQr~NgA9;2|FuN#63#!`c|0tkb+=-o4^XU<)l?&SJZCo(2|9=f zJ23#iJNss@l8tKfEcy1Px63Xk%DGniR01RR2!}h!jOHI{u(#dc+X>csbJjN|IGB_q zaDc|s{66W6{d@;}@{b*%WD;Bi&V;aHhUSj?`j|wvD;@7LtkekW&Z(@B$XBNj^?Vf* z7A8E=6s_h7rLL&4CWmZUXi&tr{kyP4lDAGB)X*r2Z^TZ`IF9U56uh&4$M04V=snw| zE`Cw(@&QB%x|%$Lq%jZG5_|A^){q%4Dk{Qfm9O*QWi!MzjTBesximZQ)I?L&=R8zJ z2ftLc$r$I&&34wF&)@N{bz1mYcIhWFa*%!39q*j(#wHQ~e%AZ@E8WxX&_MJ8GWIQx z@?)x+b7o8V=SSR}p&2zw^$jG@MU5LB$KF?Jq};W&#X{rB1TjF_CvUPR&VhQhVXO3B z+KBJoo>z_19F#$oo(;_kLIL(5^L>ny-%#MH0c9vCswDkB#mrO0Uu?Ld^7sv*U+xWq zg-5K)FAEDQR+adF8MFkw27sae^+zZfTyfGBaQm)OV?Xv8vwZvZO-t=j&8n8D=caw~ z1|H&4TnsJGpMazm-+)9d<6pZ-{PqRt1*%+E8m^BERsV!f=stN4Kza5b8|`Oe165z~ zeD_A-xaSWn`>(oTf_qycTTr7o)!piEPKDFAR7b0%a|YYqgw>2WeQ>-HrGpOn9l~q{ zm5x~UTPN?bhN?|){(>|C z7)7itXWAc((S*K7L9$x$I!$@Sz(Y-PX6X;T*~g9^jU+1m$jQk$LS_{X!HNJ?C!$~V zmL1_f0(H&x`iah2Kgb5TrujSh1s<6Zu?@+hc=Sz>UCgp65bxoa4x-D5+Gq^@y|BM> zLElA}@SapTutv%R(6oX2*RMkz8-y5=hk2W+rHh&$BL=dro^NZvUc7X}^KQ1#_Zu@b zUmH5w&(eky2S21Ri~4JE9&ZdG!dN7a*;9pzE8Qs1_hvY~n$;g7Z!s8uE&gj#ih?d0 zUuk(t8?zn6^7I1_Bi8Z+Pr+T1>{jMFA=kT%%*>}HCfR!i21t8HFMl9|a?8=xqlwfmu8L&G~{M6b8PG`I*$=z7=UoH2!tNOZD* z-8G&zl>|41@(?s0UYM@-kG*a$3Lj8Ar^KnJbXTvr^q3HfbjTj3K_$99a* z6)QEf=A4-E#dk*kJ#}z9jat_pG9P&(Hz92d<%@uG5{#1(rlg#Hb~_|Ps&^h!hDUm^ zv5?P{Y&_#7WVq(+^gY=9fO4HSmzVh4>X34-GUD8R%yv<$xycVm@SclY08qmG=k~LA z9UP>bCzN-Nsqd?99c?xL6O4q3XPNgnf0+F~;yCf;$!>m-He1*(dV06@oukza>vTK$ zxw3AJZFz=U0b1O~h!*bpcLE717hL!?i7b-Dps~oO4oELW+~0qsWdJ7R*)u6XzW|H> z(~4yx(Oc6ak7ekZH3J~U>MqaF=cc$I>oiTwaii>vd@I?4Vb(%(ALZ3S@9inFA@s1E z!pVo*y}*^e?N5`p2;uEW*=@2L$4uCVr(RLaA3!1IOf%qKw;&bE1TF_ ztitWbn%C49B7Mj3h2wRnE3}A># zjcaE3Z}jsd{X1kG0VcOe8V`~s{7(;1Gu<@QI9BWt+*8@ZnWi2uL8zdzxc>~ch4b%V zEzsvNx6y4qj%YO}vL8&!Atu z4$^ZXi!nI76#s>+STPJcR(BLi;D=+$n)r7liV65dhr&BtN~VGg_EtenABBI)Lj_+H zE)v58WSM8_kHTZXUrGQUfDcjQg1s5t4(A$UV1eFBp$PUyv~d1?KCIX}7HXXDw1VJ2 zpV;0s6U7kyoi~hgWwDMGOTg%c@CfoGjWO_@`tB))Are?RT$g_blUYp^*!AZLQ%{Uj z1$!&vX9ZipgM_udjztCOiy!LY4iNS76#4HV9Kl(j$?)F*Qw~)!^MkKw?4c1@g6%R2 zC4NM++vC@>ZD|2bNNs_T~IJvkY-YeJ%3PBlpkizkXE#*efr$%=c>IsrB64$3gwh!VJ>~>F=&ifmOK(5a z(V@=nFAd*OO$*_hC(tYa6_ge#@J7rcWQSOgs^N? z(7xT5-3^h6BAi=4iQU~5(Y&Ieq2cMdn39o(4r1ln=_ z{%%*B&yHu~#H$XOClgckz5Av($6Q<;^-Uf$Swp1f4=C<5g%*(cbFGkozhzVE84)N8nQN{F#yVq%?1Ah`l*^UFk0 znmebgj*Fo7oNwMt;Zo`3l$4aLU1_2^$sd98^~=o2%&??_rw0!iffZ_4oqHR&ZR3>@ z6T`Evxv1gcQM1MeWj?=otRE2V3&i^R`aUsyODO``b|W^xOh~f&sF2cPGUjE}db&%` znf`rZ_(%NqU0&g!P)RL4Pi2y|b!SpR!RaH?SJc!(j^TlO7zbmtHneKr;eQq=cq{^i zQ1WRXjUH1-*%Qb;8v=t0|FiR8P~i2d!&n>~h{preB+8a2n4@{8W_*e;Z zb=|Ag9H1}?VThC;98@>SUzBYnI~Uhh?kLx?6OgbpKN@0U4o3_*Mc0eh;}Z2x_yo|2SD>7tU4zP>(ST}V^$xfk17 z=reMO?2fy;VU=P9erzwC5Nq9YWInjg0E)j`{?Aw}gawQ<%M)JlYd`PklXr4*>PM?t zk>JWrEmw9`=YSceeoI_Z(iNc8kZt`11oXp>vC8J=6QC6NV-;LP_|;n!Og?_}Yt4-k za}P=-Wb+MTnwzkz6d%|SD*6O{@k}#1XS9yYK+ZK^(B{9rMzf<=FNo|*_Ny#wl^JHE z!ooZD%^lqJFV77LLGR>xFr<^vlNFVf9wH&Jv2-|nZSCln)WX8TpbN4%XzpVQjb4+I zlAb-Q0wFq&9}Nu+foD|w!vLWMRUfE~o{FBR^K{eF(t@n@n|e9WNt1GY_^@OCyp+@p z0|RauSI}sBayH2hg58q3%@Gi5{_*>(HhA%MJ3mu?-gJQQ)8XAs_8& zyCloLD>O%B*yUI}e+qqP=xOcY9wq;x36FHLz>OrGxRXfo^^G|hjjJ^sU+?gslWMZX zQ{_DLh^i#C>?I^u-Q`ATT-ts?6X>#}fIzBF$$b@Jn}u8A3>+FEco~9tbCHGR2&*I_N~*$Oi9)q4rMXv+VxUFIt`zD?fKf zrfe;^lHtTRjBDM?j*0N{HhNK7oVdb#>(;FV5l|RQO7v|^kmCX<;fJ$&?fD90VPRI1 z1V>kaIb{k}Y!W3dFDNG$Rm!RUM&|K=vurE$vYFx)O3y?6Udpk^OR|i8xYj-u4gB^w zZa;J!TC@90Fu*uYZyF|3@*8zj-|JAf4jMUXrXXFUbO5Z6?ACaXe4_bRgn&HP-4`}0 zf0>olXu{8C=;MRxSB&W+Zam2!SJm$JlDcC3xVi<<|`Dp3!Rz)&@aqn?qF-H=Y5&n89>?;8cLA0%-f4UMjqFK7Q+*t zslhFmk?#8z$csK0jS7vwl#@o;jJt%*cg2r{{O?Gp!G(^pJ%lnT7W>%9+UCpfOGDHn(M-s^kf>3fX!kh#kjAw~0gFDN5f-K|P?eAz zir0L&eD!LgYSKv0;NYnbR=b)(Rw)-3!xwz=Y9mZJh~kU+sg(|H$R5`^7FmU)-eMP7 z^a%qqBy=lS7z`Ybv;;vWswtIb&M=wG#t;T%WO>)8eLr9$a{?cscHOBsM@vyqSa`kX zq)7~xR7FKah8)WDRWZr#Zt4|r$zW}g!-DDNiPaT9!XaGA4Ka31jJ0i8nCm%9bb0w= zsPsL_7eesGy~TI&i_rdmECMz2oS#HmA_GPvWhv9#<_Sng#Q(bG=JxK9oFX%+da9-1 z`PkGJim)(`P&mL1->15`xI9$U+jqC!h-&UPAEtBayIb*QMH22SJa_bup&^B*OpGJO ziCd2V$N=;Zpzs#{^r;n*_Qw+u4~FoMfuG&)NzO-pcE`VH`15q~QzN3soVSp_3%`Y@ zJ%tXp@S2t;TIt|r*E%365=FZTj%Vw1&p|B>TAb+;fFX-bHhlbbPR%-?-Q1QtQI=C`TRRl;jfTz-d%u^H?BDPP!vA;V=? zR(@+DYvrVgd6%Cc0uGykTPnX;?9o#%Gex`W6X3Psr2OT58$|nMT=CZK@B|?Rue0i! zV0`Z0v4O;Qi6P>v&vLtUdK^D}uKilHwB&GPsNnT$8(=FyJioNK`0WNBle6Ot3d8ga zySqY&sjtrO_!8y~(zX73kh}TU)%hZyO-@MLPz^^wUm~1i3sJ}!DO%_zVem$`&@6DTtj~_SpDI2KU;XJE^`{oJrz;W=$9)^Icr`m%w z`kGuoqDuAV%llbD<4+bn%d75yfTX~tMPwqy#B{av@0T*lB-apyg_+`*d{;W<)9f~| ziMi-f-hb}|Uhi@A9aB`9)T7{leK2?JqY;@C9pu zV=0V;qxbK&1zV$p+`vwx*bm^+b>~KckHO0krPAYgk(3!;ULB&w)_uxSf(@*>>9K8W zBAI5{+5dTU!gisaP{K&2{?D%-jz7^!LO;~h?^>$$hzNbLa(+b(^wPRV)U=o`qmi#) zbBdr-_?u%Y0|t*CJ<@t{P7XvGpFDZ;R#>bI?-&uis(Ad`2q$4$=79Noq^7;x8ayj z@X9*^XS7Y}nkNku9SC++tya?3d;}E&_P<>(^f~oE)?viINZ(uMh!`%eEF0VRsKkMn?MGVe64&gVa3tH&H(8Y#6l<*<;aTZ>9e} z9`-yVVuU0)mI90G##(hUZs&|17ZK5B`^04BD;&is`?@v$VK{&adzE71&A(XX1S;!L zTy}OY-&8TXILGl9AK&?HE0$S7{&s><%*P)~V;_u(aYFZ@-<}=~&q0#a?h$`)3maO@gr{rC%B`%I zJAU8cbnhOQk(Cr@+<^srMs)Z}>%2XR@b{+0FkrgWsuH8+~bJY*jUIhyLcpB z&?R2D#r#sd>*)6GXvgH_WZ?O-!_F`| z0VSDhGessfdfwWLYSz}Tb_miy{E;-T(VA--w>6PuDnpL-TRDzKA>9w!x6~9qtQgr` z{aH|O{a|~6+okGrEbW9|I4)zzfClxuz%9{K@WY7bIr;$a-4Nlwqb5YqN*<0Ha}PXJ z2o1#(_2P{{6bd?_pGavUao>Z?x3zH|Cxk!2;LE0iyYVFt^0l+@bI2a0JqY%J?B)1m za|WnRo;J7g1GW}bTYcsmLqJM!^QDuo47}Jn_e%0D$Jp-c7dz7cAH|o2zAp~sfQE*? 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 F{0A7tQg8qO literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/google.png b/v1/src/simulator/src/img/google.png new file mode 100644 index 0000000000000000000000000000000000000000..2accb4e6e56d6f5bda516a6e81594602d7a77ce9 GIT binary patch literal 16985 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 T!G!MXh^3;asZjpLD&YSB7m+7j literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/grading.png b/v1/src/simulator/src/img/grading.png new file mode 100644 index 0000000000000000000000000000000000000000..166ee57eb22c34019d2f4ab1561a99bbca71ce8a GIT binary patch literal 26275 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 VF*o>azzwT3E?&Ekea_tPe*o)2^NIif literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/halfAdder.png b/v1/src/simulator/src/img/halfAdder.png new file mode 100644 index 0000000000000000000000000000000000000000..7c9f3f0c1b59a3854f0deda28e7351b5a23b720d GIT binary patch literal 26281 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 Bzrz3k literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/help.png b/v1/src/simulator/src/img/help.png new file mode 100644 index 0000000000000000000000000000000000000000..5c72dbb733500993cd3b7ca00792d5e5cc5b221c GIT binary patch literal 18810 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 literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/iDecoder.png b/v1/src/simulator/src/img/iDecoder.png new file mode 100644 index 0000000000000000000000000000000000000000..d55e9bfa1923ca43ad918f91deef2e7a4533ba8c GIT binary patch literal 68782 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 literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/implemented.png b/v1/src/simulator/src/img/implemented.png new file mode 100644 index 0000000000000000000000000000000000000000..6766aaf6bd9803ccea6e7f6353f438950f924cd0 GIT binary patch literal 14155 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

Nlj6MuMWu!=Vh&=o4a;lR*bT+xR?q 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≈Lx)S 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 Pe@xxdyo0Vp*@gcP>R*Q? literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/logixBanner.png b/v1/src/simulator/src/img/logixBanner.png new file mode 100644 index 0000000000000000000000000000000000000000..b9dad5d557ba7bae511bbf9ed94157ab37852361 GIT binary patch literal 25633 zcmd43XH=9y(>4f*l0;z08D|DXK#~$gKpci4DX1jLQKICWlQQHPkenrF5Kurs6p)Od zf@DQ<&N+NN_&o3K_wBDeXMe0574K=ftE;Q4uDYsj(W;N+$w`?=@$m4-6;OyLcz6V3 zczF2h#0208DOK37#Pw z4-ZLz`wsU2dYhdGG}3Ay~{u(DF{MldB4$@ONk zjQ;)Jo1R`?RCP^F@flyge$7%{$Y|~9?Hxcp`P|-q#o5%_I=qmh`5GAAx<-BH&K*B9 z1|c>tatl9iZ-HC|Cr3vD7|E5OJ-*J>N=hol@;D}{c=r4 z66M^ovOa;UNvi^mUS7p_3vNACE=Y7(o+&T2N zXqZ@g{hH`TY)pg@MD~L<>}RtvJUTi$@o;H*SyWV1@LWY%`B#6M;gNC{<{L^Ca+L~U z@8+fny?5`Pm9n*UaoKW~YC&Z#(jp>~&KTcJ5PJ?rf3w7ARNm0c9_P&Nmb zfb16mRcqKX^ilp(p=f?=LPGwsgq8h_ee{x|CUF*q@-y?`-rn8{W_H%hG9e+sq{yjZ z!eV}YUa6v}$jZe%PoeKcd~W=beUmu>`<{+A8!3H`v8=|mq13fl6)P4M*L_V z9Uc9#H*#|Fad^3R<1Q6$$BB8C46o{cvs7*Id%d`1BImMyPHhsQz(EliK$$&Y6QN+i zHuej3_th1pFjeE^p#lrXOZayy@hg#J!s>il1ywYZa)p_{1JyNn`KLuXx(O({3CPIE zlrWd$_w|C!=(Xa_4Cc=xn@?^IH%MsP@w=_*N@b+R+8(R#(;r~ zo?e<;&?VrM{6E9Lyry{n`}Gm=51&kI1mArEoUignzLVN)rS20~IaPN?oZd5X>BYP7 zYZo6niCT0)Kak)&+=jqa_Ll@WCntIJ;p-IK$1QCRvYot_d8d+ z+hpObBR^K^*Z5OpH*+v=_ziJQWGIG9%xGTv^gM4&I7;unMvCa;#>0(}FZy_YYG}!O z$%~TQ`2`?&5riCVuZ^tbm%nF7uTHP!-4b0DYkbIQz;Yy;Qt8*mr`IrZnKGbuKmZ%n z7u7I7S-Q<$?H-f*iFEAV*m|;40_kf$R;v(&;IX0iUmm)={xR^~&Dr#1<(m-&{NqZagfUeauOIPX)SDI|m(mYm#}Ea;mbi>DNWg1Z|& zjD!(<0Bb=BrRqwGn{9o6_Y)u z%gxia8hx=Zl9?ktVuq)TPNO>{{6Ju^`o*>=kObiRgFh4w z{_`+K1olUh;XiX5!mkHm@W3n)gaX)&7L>o;wf_$Ox6H-vr7mVW$qw1R;p`hC2>CsQ zb0wSZk~Ic*4di((zjt$h`CI=E+<}~@npFDxkqNH$zVU1R16vs%vUBFku6sRu*5(Kc*yME!6Tn` z&Qo4K2(K*uYPCIAD9YYs|BH;{V{LX;-2-8tH;e{%+3tKoWs~A?qk{a4uM>kmX#4YWvaDK_J&1TDqe3D~`R#e#pCHTy812A|GLU@9sW2-XDXdTb*_PP?e!V1( z3Edz0sVfC%WI&4H#MV)m^=eBka1rHXj5aCtm;wRuTv%s>Fk?AoglLHI-zqO&@TnsS2xkIPKU|J1af)RKWDrwuju z;kluea-u-XC7`KMaDNqcT2P+5OS2QdFK%?B2<`yG+XkzAD@C5RU-C~CgczFgAR&wl zBTO50xN!Q;PY@Cj+(3czJ3t-axcf4s*UgB^8~2i(*7nBi0Q9E#^BMob>EK7edHM7| z7LbX1?i3_kuCA$3Nf9Z1oFRpebX*;+sjsi^Fc8BX5`$!{05)$ZPmM?Zu>8wa-_rMc zOOYwD;Wy_eC-}L!2SYxd?v3fYRv5R18N#&doh{GLPRGW^-unCjA^|xJ;d!ve7dt~r zg1c))fnfw5od?;QwZ#Wo4jCs>_xe|MAfa|)I%zBo$7yM4(UM!Cd~kmL^`)Q16IV^# zhhzJtj(LBfq|Q&a9|T=l>}e!~b4gVG;AgoAK@j3Ll>W#@m&((ZMUtA9DZqf<*sl~$ zygi9ic^a3|U{YpKw;_|I=s1Y7va&)(FjQI$K=r!gZ|gv6VA9eCA;v=`+N`Xsbd43* zfw%I0+r6UwlG{BMMqj`X*R}Dwsnaz#fO-t7OwmQX>GzK}zp}GS`<~=y_!f2D_uA8K za9y42O(`w?som_`IC_mmtfH{c^6ccW==|G5icVQ!E^~G`Go0 zlO>k3lX>ao)*tBYqvi7Bo34L8Uw*SN&gQc-(0saT7kfkH$>HAWSc3=9pv;`TQ4mIE z0h!I0h);H9rt!`2(11Co*^4eX%OU4s7qIg9;rRD%wPSpZr#cO_slT>1reA01Z0kl% zobFHg`AyWjc%Cd5mgj%C%(gS1C}@&HwuQxFA$oI@ja~o}s^{0%YP@}*US-%4`0(|$ zLPS{Rjhl~BRV!MydV72Mn+~#&z7@*AD`H6z43#ELoB)^>^06zF_JTsluWjV1mf`=(V$;}|zo4li- zsA!Pk@orF}eSt2g?~LJ8laFURySO7lm{wQ~ojy$=x$&tzl9>~qd*^m*|1m2Mowjz3 z)tjgit%W1`+sqk<2zEwVlz`mzd3i!D(#JpM3Vxt3Lr4QIP{r~rQPEGzVG*1<##tI z_`C(adfL*QfBT{(7%`vWr?1CQpBflQa4yJCyJ4Md&&4;*NofctEl9+`8DB-E!s%KL zV{bk#+Mho=ULRI)E&aCpth>A02c~A<)|Y=wf9)c4G73W~kG@&m>iE1B;@g3!q@<49 z@0$ExX7;8Vcs#D}PM(id+SS^zl6ke2L+9fK(U$5PUnrOtTFTcbLa1pvzvY(dH;%e$ zCqDSRxz){o%t@+NaH(yWX4yzhN*Jcbl51TzO(#MAj&!zJ6lt8l^c8iDU5dp9-a@~I zkAo31uObmW+-aO&80wuZrjmSS83BCLKGYeT5`xt^uMTR;H$QpqWx5LRHxATt+ug5I z_qi`_zyI@A?A=}jOxZ}AMzsh+Tt8`pGxl2B;i682cB{CfA)yjNSOeP>AH((~Jt#x6|E%<3v`wN6AZ5jm`2Ovey`ZwFDr) z=~wS<@T4;Gx1g@2OBd{qjteeF4HP3AK6o8%=bsK=hH>H$>?eMv=FfbW^aC+m5`%vF z=NWy+h1#giN@Io2`nSuWaTf@p*#eBT+=4{ROjNn;_Az~rLNFyW@5maq$=Ph{eiv^f zJm@asXMB1g>q$1JKPKmkk^rRf$8ek8q>hIztL=u>13Zrmz%Te&as!YHVR}2 zw(;rQDp45cH`uY%@VeiE?*=&CBP#fGQ~vn!fzS$+gM^;Pgq(;1`BFc)%YHUO8Vf=? zUyBgkX3P0#`#dB|>GfXXzACGJgGMJ;SU)uu`B8d3OsIEl5 zZ`9!6T&_O-beluNZslhNBvwrTLN7AHQut^@=_2%IeB6vZ!FtOfj`~)3V3n1yH}l-f zDa)mORb6I$YsfN&!Zl_y-_2-))Fy9<--$)Bagqt$i(X}-Fz3^8JjqawJXm~SGu{Xe zN*TfnJ%H%j3>Ai-LT6!deoo6NO&ItS0EgQ29>@i3m9mzS#{6<-2B=u!%D+VK$45d~ z(#ASTv+j;kB+a4~Tyw1Kxj9Jm_|}Fr%ipW0YY2Np2u-Z2gwB4zED*fQ8g6eBz^1O& zFpf&z%^YrT48_RQD;$pWYv=yvWI*2-_|=~jNmXh3R^v9Gkn66N`gg2FS2Pb(zJFM$ zO18@GR!#+z&72Vq-MDyfpPn_Eq;W>Tbv~iQifMo-7$Y00Chg^L3(ld^oA0d>J8bPH z^DG-d8VZR-(6DjE)o@vQR&?DgOGzBByHq%N*(I1WH-0a^;GFC-&i?wiUHFaeW0S_r zi|(}_8H4K|2z_OKncZ4UV?uS}*Wf}fNd)3uNi4xL-$YUzSQ5aZGSrvAK`W2kmAm6* z#-^Y531t)UXt+AhiX3-O4B-RP#S2~vT*xP`c{U1dkZ_FYl?a5Mxu{B=f*)Jay&Qar z_@=VsQHhs0jdGkA+->j8_0;Gz;l8xD=TleSaNC=oWD3P02~*Q8dhDCw|A7WKZ?J!9 znFZpd9E$4bDDl>c&+jxMC^i3PB>W)dlG+_Cj!*ayhg{XQY|IY0hZBQRiqD_8q&ZGJ z@Lc4{ujT!}rgxe!gnu76Mm z@MzIV@`9NJFtU=NU<8jDdRDc$8GP(y6JDYPX7{h zT8pZ?Se)SFvSb{lw2OD@gJg-r1qiNpEIoY=5W8)NE>86wBU25HFZMO`3c60_U!A|F z!iawYH)%SW7nj!nUBd}@UGDJ3BjT>+Pzbyu3W?DMtV;(sbfaCiOnL zs&z9jgjn&dwU;mjVJg@Z;{7ov9;X?4=@P=xH|Bll0c))xp)F;vXl%MXS>Kb$0NQ z5hf9a&H}Z!_0-n}j$`%457+hSj+;jEA-Mp~;;f@&ZZ^SSZRFhxb@ey4WjgQs#5FZE z=5oSmu%h6CAheRTj1dXV7IeQs`U*UDt$ zJ%0Yjv@|nX@600=hsq74ZGKe*Tq5ccnCs8LMQJ4insY8bJ~k=u486TIY;NDH1ns4Sn_M3TsYgrVOX?_y-4xsHxhD3e`9A(QLQ1fl~oEyelCt4$jnB z_%z@5blIR7K`v@Lnggln?eE`@K3{p)?|ZbE&!9m1;tf813o5g^&iTu_Ct#m61|t;KF$y|Z*@Yiy|ljLc&}dBsK`uH|4#z4q6B>Mw?GaSvNsZ-?_Y zZQM(Flqy!~IIEa8c(^_9qS2+CA=Ow}Nd;5*QzG;m%0QABrB#*kC*Qw@kdre>_lv;8 zDRSJ+ykFaks$atjYJHHsk(GhBETLU#9AbAp!)Grkqr9xF_M!IUNOI)nu{NA~2tNl? z^jLB;*jc{SSn%>QXXWP7BLhC&58rBrk@D`p1BiH6{!n1mCEHUKh(PN0L_aGnS1F;( z-FcLWw%CL_8C%b22p^dN!XO>z)7*|k<<8&ZoIvNT8vv`ZCB2o8_FZ2fFAO?T>_PeN z78{J1XNSP&ghfOI?U2|wO`E@yUhC@5kPk4?Qb(u&>cik`>A&{8`Vse~jx4k>*J{kV z>3D|ot)HsJa4N+w_%H2&1g9xKjO9NZq`tIT5dfVXFE6f1Gcudz{QJZyo2=Nq=Rh|Il&n_i`0wj zE#Y)9wQ*Tw_9WwMUe;mr9$ zS=&g7t*ve8@MYnFPgGNpd+Sr>b4*f>dn?-H%4+&BBbOWXlx<#X^TBqDs@E+Kc%JLnJ|Ak!;B+!u!2U~LsKgNMCM%M$n<8Ohv z{mS*iv$k-0>Sdmy>rWMilPe_Ru37lVELC9)54{Y0cGZ_R6@276exS=R@CITeK^8N5 z5&XqKg1D3vD|-u6Ebd+&5QC`DKmX{y8U36J0$W@H1|0kn-erPA#Br+9QM-(moT9rE z-Wx4MRk1W0!B^eJb+t}n!a=;O#}J;}dxA`{90|t+14lvm5o+2#Plp6-q^u~`-%sB1 zS4uL#xzkUS;7lmyraymdDLM{};U7~WDWW;}EsP|9hwW5sFlVk%ic=~tOttPudb>FI$u zQnpKZFyXdhqX^!gvWqo7iQ(ubnS*9G+#)!^0P!aT6n*h8JftyD=8b=k(E%8l#0#km z;a89Ze**sH2@DJhSJ3odZR0gc1m+&>pOuY=^Xb_F$_jqafExng1_KWJ6h%xF0&cCH z#4R?zcwtX}pl@`6S{X=4VAqY{!z4JT7=cI=_H9jk@z8$I0CTEGt}h@K>DLdqXdX{n z94!v$RBxxulqqr`@;?shLPZzb{ioIca%2}f`OkAO=HlEgp5c)4f7AnVoc}qB3qtFk z2L8XA_&@oX?)a@+Z&fHR@S$iZ{nyp~iAMJ?jDYlu{`%Go-V}B4WZLWs4n(PQV#@5o zju&6ufkd>*MY%gFMv_q9a0h%g8B!K%gcEzPSd*VZ0J}l}yN=O!-s_ffZ~4vK3-qGJ zJC`lDa!(?=H*OOTh9-`{QQuHJn2tx+1<`5GI|_rzBmcUA_~AiyVK>;25VRPXEYs3 z?evlF_1eCM9nb8Kc$nuW$ap^;U)qQRgefplt#w+M0y9G=53_!qWtR#_bZniL<_h`N z_I|9X`F7>q>gt~m94^;&&r}6TA~=l-HWKvDp8{CtKuiId`KLg954+hKmuhW=kt88{ zxBs0YD+8Edv}U$7{x!Yy$$0Yoplc(}V&RaBQ@te3!UYpttw?8*Cd8s1It6*U{wOtp z+$pnQd8`etUkeIVvLA-YA&)TqHvQoJM_;9hpAtMH&fc-%4S-BPc&ohgLdi?1xp_aO z)+|}r!~Rc@<#G)uXgJ`SIt<~)yIDV<#DvU}oyMSzuixNWf76(+*Ug>qCY4t$Z+<5| zIpS>ur-!nwi7nHA^oKL_|M#?u_Ho=qrODUW$5NoqbHUG>Mj-CK7uFPgmI3lZOF_tT z%_bUA9$6QfMvJ@3cr$sJ3iIL!gdn7}fX=%y3+HFSV?%hI4ZN1SbM9|SP`Rix2+E-7 z1K4Sy|JJFP3yUH|U^{W-u2eX?#Ottxp}#tHqP$r*bKwM!M`Y;L&|QMS@8fX{N4D1K zD)ObLKDnW!+sZwj`JWXofOS=i+{>#M7K1a;ga}jAN`pkU3RP2F&KmT>r^Iw4KX(k_ z0SuqS%lW77zw)UGVt@SK=!KwMIO2b#Oo*KMeHi3f-pl%KjiJ%1I=mrY+V8ni2a%Ej z7vBXP0328!6FM6PaP|4($Bg6<8g`!exRQJId}2=^VIVpHhXCA?2h8LBieBTp_G%dB z)!davN-YPfG09=)NBsC_RZHDJzW$Gt{+O9+%tCGx-x?^|S}$9CH&-!R*fWY9<>dEBl^YQS30PQQ5UIOShEs_bDG+WOZa z0!|DrA26Pr!kWdKb|>&=xB(TW>CSO7#$p9ETi10o=UM!#zn0mFkVIz}cLocyKF z=g+t%mbV1Y&B;}D6-%&zo-u9cjosKV**Cwg54li9Af`j|3NM3z@gec-)c8@J9UKj6 z%k~bMs%n|u*7C&!aFK}{!Y~qhDr+y`xi0EQhHy}K|C12zTZn<`Mb21_sdwAltLbf< zI9l4RE$k|~5v`Wju)Yy~8p?nk%`3(+2RMTPpwkmJ0B7=Y9AltT60!O@4K>k>Ru{gF z&O7;#?Lb=aYZN~EjQ??0am$rx*rCdbD8WIg z<9lIou3oih1P~(Np-e)^(H0!?Vh&0 zT*ej}8q{Zq?S-mH{^k#AGCZDeQrHr*%KN z4~V<%ET}ajUO51)SEM>KJFC~^Ju)TiFpc1$r=_Lk_5k$#DYmOi5ho0`CjbNY0&AOv zg@vU$*)^ZmCirKwf~tuhAW=ajD0ayY056}T9dWm{RD&n_`g{&`p1a%tS^%anIA?$T zvE%5+fJiuw?BW_689D5LMT^bXbGKb2uplc`P?0)bxx=X7{}PROEPQ=qpga`$&m$q9L=}h ze12B%vYbPYjd+pnfxJ$Av5yiFECwboLG}2N@s9#EoHpe^VFOeJ4Aj+gTS|kjkYiu` z7#cE$7hVFM<3=_NiHoBu4{34d;TRVe*Ku3l{Z9yv^!E|%s|ySa#Difx4v>zEgSoAB z;y@4vhR)qtzq5J2l^|cyJ-0Jeh}oq3IXTbz&*B972Lh1xYBq7l*60KrAwh9}C#Lk) z;7`<}G>KgQu;`T?1r5IhpkFNWV>a z5kLS6!QaG&at?*J=lk9IO7$9sGER9OsGWSFQ$Aj`^D7n$t2O~;x*`$J9Sd5kgnGMY zwm*y10bmA4qAPFSpKhBWWb~P^oQ%7=vFH_uU1}{7(8xh}eyI&O#SVhsh+Hz7(IJ@th>5LVGfYKj&oSKR7oizUvhCN`zv!jH2hP28Hg8 z{Rk>ZsV1OiO8^*Bc_>CGQCXhXWB9TL>e#osyW3I#Tk!Yu6##hzuy?<3Zw>kU{r*;- zLIZOSswg1D$DrUYLy1u{qVp#3;po@wzQ4}LDfQiPwP*$sfY9+^12oM0de3k*OKpXN zVE}^gkdBS2s;yFjf;egh%tC;71&Lk6Q+UFLgPGux;t^i_d+Wx3kRjN55=D&j?SG$M z#LKt%SpUzdIKxwSQGXbJ)xjZu#`qB^p5w^`N5XHhKy=w;K8n5Uf2C#A6Ha_4-axNs z+9%HT6?OGHm9!-_m?JbDL-^y3a*v3<_QQTm;s&uQuwA z8bA($2U~RY&tYCxIi-}4^^Al^TASv!2a`|>U=6jd_vRntk{RG|e&Z=HrLRdm;$u`O z*Kfof0_b`Imdo{VpqEylhS5JN_6khFl6CO6(<8=+oRs}gVV&Iv6DLFDY?7es1TSKy znYsLZtL2?oyS@E#(J#2Rj%v0fOey}qZJg;a24WC9hmjb8;|oRL_Iq*G{}3%$4@^P` zv$V2hs&R}9Z%E0Xl=K@uc~pKUvuY35bkNxbOdpI;V7@?pgP6%Xo>L%IcN<>eE8vPr zh~Q_kYY2;`-S1p~x83uIKj0wm!_O8J!$?=hkVPqm2=6)r`fSw%J~8u#ynOubY+jes zn_6*~?Pv6EURL{D(q`XjX6M%umo@n$RSSUkkwrrIqsDHB)3!rF&%`xmbhjSfCsC{+ z(AEE0Hr5@VO_<@C8Xb79uQNG0^0I-uPs3t3o?3@Z|763-I{ga@Y6w^8#zd+pYgfxM z0mHZkc7MfJOciMiqMxuYF&u}2c2^2?zQWCQ2gJZOTTp|wNVbbhpV=1l(&IF~zSu>h zYVqI(y&KQ9vJLs9g?_-l`}(bm+IHWy-unHSXt4$zh5;6uezexchZO1@u!iX_Ox?!A z*&EkShDlJZsj( zwOimI0~AK}PVq(E!MVx0r2pFwgK`t1H@zNK2F%+`>J`z=uUN0>8Lf{B`T9z-XgNYA ze{+iYhujK8^mP(%$l@ar_&0df2&v$|72%9VLxgB9M;Z>9j@_nd{*0yWh^X9jM)T*} z=fc7+M>~saivmtfhi_xWZdcBIOSW&1pT0dPZMDsH9ZROkZ@Sh$Q)4_8CM;*o#&C!i z^p3*JWEs8SlE;=sgGU<9g|XNvrwE+^)k44^Haag3-aZw5Ii4A-4v1FXSA4@|da5LRMGMM38pR4Uns1_ByrPJUk6%l4${M+Hz3lUSl<|@Ga{L;L3aO%CyoXTs~N5_#WL_@6a^x z;S_uF{-xeXt;65;+1Xk1*og)=CF!93mCdrGXKK)a)KW?k35ZaU+`@;KbZSsFDEb~N z$x}@bM;V?rxY}+{9gW#FtDsPsPM`eojZP%%>graU0EblLKEP4hPJt8I=`AZt{3{Sw7nSl?_ji+rqc&@4kTGJ$Ts8Y}awBj$4gH zu0yeE?UTf@!^0O;oDfc|*e>jFCid|aawd3*;hB2(x!qea!Ms#ebK$I*j~^wqz0Xhg z#ajWHIAQW58SqLhPTCcpGpRg4Q%IY4P*ZCOBunM-@!o2Pnt4y6p!0&N(_d2xKoi5m z_*|i3)U>!YWY`}v@lK}y9n}WMf`eNyl&jQs&mEKY z2tio>qcmzvI6Q~C$$d6^t4T7Z0dhL6m9!^LE4k)gV)-2!OAOBMQ`W$v% zw5jKR`zl5`T{1~wt?Lbs{gpFPy?W;?Cr~I^VNw6u8GAE{tnIG-&ccAl_8j9DF&qo} zTyCHW5xWjajNn1b6Wc}zx3iia zZ2Wm2@wMtz5|VEs?$%R4oYs0DIwD_A)W1o8Kjq6T`YVd{9yf*ye0kfIarXnc(Os<1 zpy)s@j8-V2zv0YiN?;%RHJR<}h(ONEjdE|1k-x75k6V`*Ecr&cPEij;pMZ8M+rqab60_Cnlu3y!7aFt8$TSz7Wpztp<%QCd<|E}%msHLSMaaU7Sl?f6bT#!_) z{&vT5FlT3HNBf<5Z-zAcRoNhdUw6hW*(YP^xMKRy9TJHgu!-Xk$!IOvI1HFrkWNI@USG=m; zA?+AI`&pvr#`IfNb?C@@y9~xy493XVqxA)~Nz546L*{k5y=KrcrK>#sLL{Vprs%Ub zfz?Ka10z*;G9zyvCs(YhHu}Z#!ob_v_m7|P<^*86ixJrfW9nU--Q=2g>ctv#T$`Vu zif{}R%RtWwsqCO!==QUIcy-$EQ$&Y1k|B!F;VO$*jQYsPNcH~uRDT@0-5A`k8{eMU zkfw;(VlA=wTkGSue+4nX{H8}%+0PH;=^PS;i}5&))H-EuE~p`NWLUl#oNXoaOP}jr zrT(c8I(gc)-%??CZs~tHaa1^C*yN>i{+njqVMx8Klu6FSzkuL);*V7d%OW3U>5a+5 ziQA0bQ-;S8+^}7qyyLa1Ivpa1^O|v}*29N6mf!PwOc^dG&Tm{7KE(k1+z_Vkg_RRB$LG9op7mdwz?{ZeF ze@pv)6hvg5Ly?mW_891z^XPfn>p?aMX(x9VfuhEmf#pD)r8h(>MBZqhcdtZrQA8~YvsPbJX7ze)C zL%y+93dcCoe81Fm10x0!LEO(X#WCG_RH|0f)z!Vg!*>hGkBv`3Hk^!YHN2X*95Tbw zW#sVvk4iSI@-X~|edxHui=dkMuo}(ceHi9fKMLnR`4Dn)XgDV)XH+PBXWJz;NZR?V zG9QM3Nf$Su;W{9g5_+3IiHxgI67?un}$6ElUKDMU~GLs;#HHv%goB>mX*Oeiaws3Af) zwuGWAC)ZmrU-j^gu{3U{g7b@|zIV7i{eHd^&X%Q&?7>VUp!}Q9X&X@ua;pqT#k-@c z3AOTB&^iSz7VMqYY56D3a;NiOCD-NqHTvZuZYy3pJ{;Z41V)pMc;ca^1{JLLoT5TQ zNP;WZKGl~HrP7{{bvE_4sN}R~G6nCZH#v@~z)|gGS0!~ksMwVKwz^E8-Fnm8%S3cy z+n0uPcEwGUodJ+a>+-k>6(@F~V&YrmL&2|xae^AmYGI+2w7Sk^1sl3Xoi&jDnjJ~W zRo`bZ2&0SL93`p8p?IC5n?r#$xY%-I8nMx>LBR=1J+GuRz#vWBmKEXLitzZluQ$O$ zShu_U_oXKmP}$v_=G5mrsE_L^I7=e+RgeG6jVU;YLP0-qD#F!F8Y~>pj4VW?knU@@ z^(&j8;4r=R8W(1Vw|#Y;kc6V#nAT))yOO;=`Zc~mLH#)2c5<3)NphihkFPpNDRwGi z$kU?ZP}z#`D9uXKb+o^G4_OWZVx5hcwp`ov{jt%!!wF&5HNMjNCa`s7C|<8rZ`NRq z{LO`Hc{Uw^lf(BWSe0MbSmRLc!4nOQTHtL!_|*Mi-|}U$Ouw<-Zc6Ii{1OuEaB^Fu zN^hrB#QSP91RVxZXssjsl1qSaH!!``*!$h%cFH^IJ>x24O$BGtF1Y`R0@hS;b`6L^wLcZ$0qXBun(=g zN3sv9K(9q`a4=wV;?+UDlugJKrS2wX(tb4*-f?CvX4_iFr)d8@Y-IWR11F^PYcXOvO(_mF9gX7ce`O$Ra|EIas9J;aX%ncu0(h-1 z$1<)8*pfbl*c(PiBtgj+;hKqZD)r2KYQ*QqD^+NnKFQ%+ik+jA69t>(!WzxKV>Ex% zvbyZJ1{(gPGE))mAOnwo@kL%71^TDm_f|$a*p+~Z<#6j_1vp#Opq1bSx&atyCs`^k z2OYsNEeql#zE7cOM(C!#@Z^_T;f5d1R=?_iQ8tCP_Hs6<#<=&FSWSsI3jU4J~ndDBZ*uEw+grVQKXG~ah0 z1c3!P)6Jd5?$<%j1L(Qr0& zjzP2U%FTQCj_v%8bwD=p?FAlZAk5tmuutJTfnY8iv^L>}LhNTk==JfWeszY?@+`1` zCgKGYXbC3@`JLGZ6%PqqMoHXz#2P?Bk2#r}Gsgby;C~qV8xiP5YAbtU3BPeeu@8FG zpCO%*ntIYo{kWpmZmQ|!?-*Nhl+RY@%^ePq|A@0|@v1Z*_SyxPX_P*n<%eR(O;S;;d`em z@8U&-T$Y|4?XQeHWTrFHf3XP|yR%t-KXKoa1CI34`>gpXe@_g6#3K((oku8*5*z z0;6~RxXRJD-mLTUIb9GX$w^DVw*>}&$^*PwI(~g+>2O*qbSljf%N4uv4^)OscP+jF z6tt*YWlB=df)}y}0NDu&F1RqFXtI`EM<)&0wNZy|dgZNinUa9g&B9c#yvXBGsYQe1 zGoF6BI)!#S#tc8nDK~@=$iPG~nQDe=GBco)Js&^0gZmll19DNJhV#v6zhD$0S@0Fp zyo6iq_pYS@R{OyN=pT`($8Z&`d2aUImfkk$QAr&mVu?;_4)(tQ+QX0$GENU4%OR?q z<{ypzkb{OpC9)zSu5y`zcL1FC7Qesfio3PbpDG@kIcxP8j+uHl5N=Tt2|?Sn5>2V% ztO9Gz`5C%KU#IZW+v|%P;`1Zd)ltsyxT;nMT>4Ud&w0VV|NcIuD}S-+mbpHKBK$*~ zF%+M`0tWg-=zj*z=0y7IA^q3Ioe5+5uO0&qX9<5Pk=st0gvunca0?+sf6Ht6+y^%hx-#%~qSqQy zS2GkJ!DCSVw5qQ#VwlkQ%Qcj|P>M^=pXUm+KZaWh(_CH{=u;x?+y4L7g7$KDfK7 zLS?6Ga%JllMz_hgZZ~kKy&|+`;AOat(0hgQ68-1HNHpSwBJL=;j=98zuf`#UMY%~C z2Op(NdYl|M#749dD-s-$NEa%EzEnc4;ttL2Gtu)6wr3Jy$QP ztepZisopDxC@cUxlwPU`zdln)!zGxEU6}p4W6-BjKF#4u=MhDvW&4S$cjWo3ZA0nW z-hQEPhd31Yf+ zr#rs<23FO$pDPzJy#=#0^Olc86@6Hp67PTHUOQCq+-%ltFvIO`^s)&21@Y?g?C^Wm zF>{tm5^9s5M?uTWDuw&`ZGKxDg_2dF5C!j02uYxy&hK@GG|x018cyu-dh?W|Rd5h8 z9Kg6kqi^-IC@bh)|^>Z>VnewaO!8kDC0}w)^wTQ{&HSh=#T* zdZ+GZ)QUB3`L4Ftfb`*~osaaU&1pIMT%EBvGDPl~JPu_-3Ro-WZAw+2W)ExM*SRd8 zy*RSu$4YVrUdkyf@m#B$M>QkGqTx22GNKXnq(3pg-s|o3LfId``Gld?|L;Z#L z>{yD;>3jOb;~xI)J9C3XJbb8c-&2V-iNCLD`t|{TwlDlWF6-%}@H=?OI9{Rm(Cy5a zE;nN^(KGFm+*?2LD8z2ko;2nvvq*%Nv19!u=(G128_S#{jx!DPjB7jHwW+(QQ%$Xw z=$!SSJGC@+7{Rw9(GX~z{jTiXnX*35Ua8j8>bU?6g@D+xs_QphKUclb_EAC{Vp7o1 zh>vLHU|KtQwZ%Ra5`@VU@ zkvN1=V0ImL&t-|`L;NG{Zh^)=kfYPFpvj=uFa7%65|n#zHkhk)iAXhlZa|)$Q(E5a zf~=$@p>;FETrIVbUon-biow5hrGqH*Lz>rB>O@lknA$0LgX(RqEz68e2EMR6^%iWxLo;$Dlr8K=loKJw2`jMEq;K`L8{L0zW;8>3;;rW(f-l zV)_8NxI5uC1p?!lKM#qx`Yl1&^H>=uK3TzoAhwXZEGW>hZ?--9q-g<72gz9}hP5kjKyDCu|796&wI+0Qxra12M%fx^(E=f5%$LZA#P zg(n}^2f9=TqxVS|HAg7Kf2%xKf5y*?^ch=v0M}37dtKN0k8bOdb3 zA`P_gBRjgVMoHMOhy4lDjTlsDR~C)H8;g$7wX(0_rSeNxo*K7DeD#O&-5Qvv9i>9= z&yRc=1v#C8u#bYGVjJRf7Y!%mSWgv-PFpY-h`al8JP`?eY_9xUze^y&R^?^Xd#KL? zVU~ad8goFLujg%~3y!NQCX|!6y)06M_e{NkLvFnxVobybXq5U=*RX-#?JES-YRcj= zQtbd-XV;WAhqm%vms(wed1^6_M}0ASpHDgHESA1*n0vYZ3MUq2hN3Rys()Jk4rj-& zudx;^lOa2@Er@@U%w0`YD$}i#&8H+$46Im2Auc^A{SEk6)I4|zj`O)z2VPs=^&s#< zUK8LmErhchY- z1*nmRq4WpWFe;)qBpd|ZnbMi(oi{U_bpzK!(oi|mWe1oJXv)bneKQAMJ`@W6Gl;B8 z(@sdznVMdOc&1E)exv8^@^C^}OZG>F$B(1;Y6VenHv87&?`-udHzOplbhi&ox%cid zoR+jI!jT8I4$M5e5Eh$iUbx9pTUq5k}>~46-p)8 z-`t>+o>EUc0b@Y4q6;tV9Qm9Q`a3ZGZ85Q^mmn_Z9#?s*HSG_>Lej!A+ z1l){jS*Qe_A?LosN&F^dewutrkL@5&aRNjE9@?7CL9((rd$CmIF#{bfE#?8C&lP6u zYx$~(V70p^LLU)<^kj@jBR9?bi9=VB@1Fi}%2@sBFW1pR>!+5{XaB3K>i}!2Y1S5yA|(kZRZ2La_hzFAgqVb)AYG*k zB7y=+5d_o-gla+u>7gppK@|e&&0qg! z$)ohrwz@g+bIojnN>si^(D#m3k+t?!)l#s9GbCm@i>bLP+hL~$)ZE2=GS+^r&J!;1 zR9xO!2{0?xd|p2lcPGedOALirM$ejR+1q^D1m;yXTKoOw;g4qr3yef~BIrYL?QMvHM&Q4TVOWt4aZ=hi~qm1@@?8vC*CCugy7$&g@3O;u1oi-GZgH^$>GmT4ZNu|wY ziMh>FmL0c#ue@V;7RCap@GK{!H@Yb)D*nE1QAoqiKTu-l8@bt>vywrKu#r*e$;4=Z ziCT0p_U6^r;-ST}O{~8XPOF?hB{NTb(%H~-0UQOM#a$+~wKemN^%XUlmUq~ODCiB8 zZZTi9Xeqq1YiEii3XyDyn_o0`12(!`zFGR)${hFES^9&qYul{i8~MTiy{10n`u&Cq zD>q<;c*}&{4YqbhAvCWzDW}IAfE6fD@{#~`#q2ohla!p?SqeguXF+_>BiMyJ$mz-~ zWg9r3lU+@Vmddbb4{*A>_04!(p24y;1=t0)br$-`d}hQ(R*L;$3iF{0{f0AVemB2& z5GI4@=eHP5Lc?K(J0R474j;n8qn&LrdG-v4hVe}GOvholx<+o}Dl*!}vtqnYx0De`dN!5V@{r-oHnUQb!+9joL&FZ2L@vcAE-_9>}G7mj_4-2rx1&4r} zX*7s%VVZ%H53sSP;;)|9Oj6L#CNJ3oUF!WdvO7$a+AM9Hiit+1R|E2aX#=M(!#8Pg zRpj~W0}SPik^@eSh09Pu`av=7YVBOR-_2COAX4p>^;wTeaA2`A+*IIT)sLA&!o&~X ze_o^Obx?p5ZFXv9E;B=|D8Y;AA$H&Cx&R6Rmfyw$kT=6ea0A?^v!y8IHp6gMjTndP zTGsVR^fi_uEepAyvBHRtA3Ek*A{yRM#Y*&drdV9G+?2C47x7Tmn;!oKkw+a)UNVoCIdmkM4ArtKZ>XG2J zf`vR!AD{rfnUlX>yvKXhq;kg+D?ROn;E@gBMvp={U{*6K6h0pTRRDyj& zBm^(MH7hO>!uO`O#dpyr0=9*7EJ54(CWKp{i7oj`4CwpOgve`IHaMU+QrI`aevBgf ziXfC(L$Iapb<{yU;9&ssG5UDoK#sg;TO`j>BpgNPo&`8hz)CCEz!_}*26Y${ngx<*z$6`S;LwJzXyh)k+)iWh2zcWPPZtSIbG#Rj*myV zAJrlfT>fKX;cFdDax(6CRz`I^mAi5YfPgEDGvWyX>(wWo4K_Z5(lTTA$AQ@VZeI%d zyiMeVB{z_v?W(k8Ia)(glB0nBOj(8=l?dHIbRY+47Q@RCFO&3BC`3eWb6||NX)Ns+ zVgaF~bko(ohNAft}=OQY^R3m_UKrnqvg@qyomn6ISZLA_c zNi%8OD5}4)s`d9Z6Evj1J9=x50`;Ow#R}NN38F}SH;r{1=y+gDC*7BlFSxDyf z#t#oVxNy3HHB~`0trMUHorskn`HCWpZu^QMmalIP9tBlUKnU=-#5w0P5L3@O8i*G!Ss-Nh=p6I%9~5Z3Q9u~ z%1HMkO(AzNkFam+AF63R&=5j|Z)E=|P$^0qfEe!RACilZAZ7e9!|M;Ql|c{w@zQ=?wP528q#)3EY>jK-!L z9v}WCzqh*h@3_XT6$A4)QTDPUNjXm_Od6k?I`qUGK*~8T3Yg0&Lzi#uwjAUIQg#tSI2bys+}L{PFME_s$aRhq9WHua!GNz z`Ap^A8gPW9O)}Hm$^yZeug^{2|NNSe4&>gcnck^9!E=Dh)7ig*)(<&QgW5$?qlZI}}Y5;b;@--;PO?)pv^yedM~K zy}6Jd=AOVmbrLs2uE?e(+};?Pv-u!_z(VF-&#(?3KSWLDnLd2tNP5lkz~QRNaQMKi zDx8TSJbdVL6?H^9*|Zr|Qnw0NzlSuG>;701jOp300*w3Qb5dNK3Gk(IvbTIVOsKkt zzJK)Icx_x&PSo}3`m`NZKGlu|4Zl@KrI$6=$5vapY&d%e>@`tfIW4Cmh(5w$7^m|q za8jagakw?*eYQ7?2#R-cO>ZLSJZTb=w*OQ}$jPLON}`cKC~%RM*>6$%d7y#jcjHwP2BOzPmZ54yhc+nrLey7Bg0LAtx1Dr=9& znujd>Z5Qh+HkGG(&VivQQ{}#D9khM>ItKvw7Q6v#CZpk#?p?(!^27Y-)P4v(Q4tT&{&6!f6BI{XA(;joj zdi46vojr>%M>qZ1`SNu)ZcYj#Mlkpe;6&`skyFjSmsrNmGg>)zW}RshWnz4;60|g0 zMpX)4yH9_3RBXrZGkf|!niR(mBevRtGLE0q-Y(@Je#JtekT(xm>*8N8Hq;QsH~H4$xG5X7pY9eQSuO5#H1z}A z;+*Do+-p2krVDw75&)!TAC8^X55Pgd%bmS@6P*v5j#Gii`z|xCoE1HK3LL9_82^Ol z=_emZfra}5gn#1!f+ z8e&haHAdEMUjoxQyS^#)Yw!ROeeDHpm`ya13h)L|xl40TRXHbx9GU=Fqs3Zh=8?b- zA=Y%{MV85jCl>i420}Rx(!3h40T)Urrp?r>EBw{kxNEin*n>@xg=&dlA&Qg2ywQ}0 z9LgN1gS2%42IsoO6f$PLJ5A~R_N$R!(fp*ap+h9jvoOs0V@!v5S7j9&-_1ViIgIA2L!oJdrFM8kdoR+nxkSX<2tK-0q=spZ~_RwzXLcLPXmu{@() zz+d|2BG8g@t~@kHD`WLl67c$gFD$(%lG@Tzc`fRd%I!1qLx9VEpGqc!{DC7KX9e#< z@q;%&=*Fmg2vPXZ5yoprk~<=mqz$2`2efYTzs_q82EKvXsv!P-?5SnNS1^*7ktALA zO9u*8efrhYbx*}(O^T#Qk=zQ}Yi|L(+*k!@W^xtF1+beJ3ZRkawd<{FqRI`ejv?NK ztUoulYnGYAfs9K^2lcU~JdZLmkxrH3A7*J4Kt$;TTKih85!22 zS(#}C${-N}XWPNTJuurR$cFOT{7kVbFqec8_sG|F`Sg6{yAZe^;nxU-;Q~V>bOg3; zB&7N#@x(ekxxKN0#W8eEasm&*kJP(tb-~(W^b#j5yTvuZ;WVx>G((Pld3G&EUI^1` z1(s>c>YL?vVQO)s&W}4He&;=+5R_0Qq5p_n$X<^^&W`NTN9D zhvu0b!5KGMNxXDnlF7<<`$phL%_CB8n{7~-eKn+Vrm09gJ&!gCo5$A@GNx@$Zo4zY z(FvFX8wf1jwrCDl@Gfc(>LBE4aY;+OCi5dD$2HH)vEdC2a@B!ti$bucApRFiMi7Db z(d>|}{GR_QIvguMe8O{6lUa!T%rKa(=WqmUUa!GGDk)HkWc!p<()DOi7$9vT2!#|{ z);i_VtQQrcIU)*?+GiRdA!Fo<=&$cXUO9g6&e60YokLVv2Zzr-4V2z^5F;TxDK3zEL+lBJzEU2vXsnj(U-vU4`{jG7ktvltgTQq zIeDoqsqAz?l9*h{t5Kt zT6DLY+orZBCpP4?Y`>2|GC3iT!eqAfL@cieIYrkK4K3bCrk~RA4qA`EmM0Uic(iel zB0&R1UJG*+kAUIkQhk?hTw%j0#lmnz?Dumajrr(7eo`scg*X505^o^`D^$2Ab4^TV z?k$4!P6TmO7y;N=XaGnH+xv!8Fp~I}1o;_|Osr7tUg;1qotXWil z2?q*W8JgWq<(K z`yjOT-WSP({r<(oJB3z9?}T5iw9QCe5BS}$3|1t`lMT98@p;Eh6tvq?RAKI| zT}zZ;XODuyo!>rEw_jD5BRhr3zmGv=^1EG=f{7p>N1D*dv>vamPaBS3*bJrU?(bu{ zcwe2#yUc*Hf8Cww-?!Wn2Q!u|;2SWU9mkz`f zJG*XDeJt!}yFP?obtJ{*R`zXO=ymv#`?EOe)*m$v(E3zrbjusF|7|4_0mlXGwH!_i zgEaQWCJc>62-1XN(MTjQhSnnp2`BMS=~yLr*5G&=eB!YH2tmM!#WrG#9r$BFF8beD z0&-de1~qHE*-Dy4fjm&x+wtj zeFvn41?}_fLnGn1k64{fR7d6 znN!)~EYsuFK8jA5s!*PnZPD}5^Yy9b6V>lWY5x5lqBXBP4z2X=>V84qIW@g7rf&Mn zw5YJ_1Ye2ZuG$YjFFh~8Y3!4iLCeFnUu_|Igd?82GZ!xe_R zESnuCPP^Z|wBUjBu=I7!3Q7plV|Xr==#OERCu@D}d}FA@i@eZ;4PgY)a`NN~L+5th zn5ga;&YyRVtACV+#0d5d<__V48|rb>zm&d<^;`uBkRXvlF*)lAJ5Vi%YjPM(F?VGV z;8s>v3HuZLbYI(;Ovy#gk>f)QU+9jj9uLngos_roJm)pN6S!&jrkPg>!A&F*aqDcp z%0&H>oHTi~T)++Q^)cGx!cr>g0tX}tC9=BM;%}#1Ou^YlTME7k6st9(jq>8MDn!n(p zS9;dVT_Py=_K2Upp>8zDFM&~X9hM$$i(NiFZfB&^2X$q z$2@mctpfZN{4loOnWH}&*YC-b%f}TrA^$rydX-*=9%f5Ym19cpW3Q>_ya&CPm6d(U zs-x4q^h8<0%!Th?X>2YktSX(T&g4(Y6%`Ny&r9IpH4gySCCEaxL z2&70MFo>DXQanUY8zTeLC?2Lr!rVa&$a|R6h6Q1EVb37Kl} zx^|>URh|r|qm3kPJw2VX|7Im0QzV5#L8p&N%2D6fdga$aNtvvbZd7MH$QDMrxwCv| ztf7HEvh?CXOg1S!{ciKgND4ck3)**b#JhlNrnm*j2K$)8+7SoDVg{MF=`sX=W@*jS Q{>=wY*AV?o+xGtd0N(%-x&QzG literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/logixBanner2.png b/v1/src/simulator/src/img/logixBanner2.png new file mode 100644 index 0000000000000000000000000000000000000000..9e7b044a64ba1e37cfe733310ea9209377f413dd GIT binary patch literal 24713 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 literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/logix_banner_new.png b/v1/src/simulator/src/img/logix_banner_new.png new file mode 100644 index 0000000000000000000000000000000000000000..13d7fc635243f79d707d0043c859f32e74204b1a GIT binary patch literal 143965 zcmeFZ1yq#Z*DpR;Ac#mC3?VHb7J>{VphHSYw}2=}cMR}V8flOQ=@#iu>F)0C?wI+X z!T5fEzxQ2tz4zY#TKBHIUY5%E%z4h)XYbGc?0uf+?BgN%3XY3?8yfFyqW+9tvIuBp@R! zCx{9kB_GD~o9>cV5{djFFZ{DLC7tgY27PHK`4Gul!l|q^RB*kkx!+U!W#+vC+A*R+ z7TL8^w)Y{!7HK_-Yho+mVr+W5I|xbUgJ?4&+W@vM=K&n2;_*m3f=Tkpor;c&zYsNy z{~KC)f1LCk{P(raKg9PHit+0r-yd3Zvb^-W;o5J6R(*Q$Kl~o@Zvz@n*LvXbo_;Sa zElp3?A1N@n!)|DQG#3(Mw_cnm8p5+bsFg0CRe?CMye*F&?0ih8*x1;7{eibutuef) z!>yV3r>Yh9#nP$T-fa==M%LCG-W2Gz=aTZZ?pvR3HRLMAI2^yftvm2dRo~E%yck++ zu_AZQ@8|QD5mQ&6Kv8&mk+M244HO$s@!#XH-qeu$Zah`BCJS zZ#)#f$nVEjaDf{d3BW(Y{``dxxwyEh9lt1O#zQgA)%{>^1Z|TyQY|MNl@sIR(QHo* zhV$grZ00&+1s2+)N-fuv;#YQecWYaw>l81Fi;J_C?{?d5l!uhIH^TIXhljhJl?y(E zSzh|8q;0R;5sf$)voeeEqb0uux_xl#+yJhwuF($1OBr9KQ&mdL8G|i%=G#cstYg>T zPrKldcDuh}7uVOBjq^*9WpWq#MJ%+bN(}Jz8uw!{`Tk)VP9TyKNIa4H6W_;m+XGFB^jpngk9F()0_bDxx4l>^gr+d`;SiuTyqu3WwS(zc z!CmLdCu(qTj)GbFl$ST=QwQ>;T3&Mc>#x7&=jSuz)Ya9)dqKN%%}9RWv9-08W&x_M z!_ z&NT-=)@?tX@o_}%#Hb_o`VRA{1q1|Q9FaC-`~&GFkZVScF#E&J(v6BzvxRo?h^P65g;^@a+aC1Mp^tT6 zk=;llm~J3tQ3@iiRh*Y_*bY29IiN6{Z1krtG@7_S;Zxf*H)2#d*4-V@r>CcP+-BtP zn2ReCsB0n(sAjCx$`N%k(XnhZ>kqeF9W>cn?t3lajIcXcAA1(p-rf#iob=FxUWkjx z@+k>k(GxV#e@@=NC4^P}UT{XrF0P;o0jAqf=qw)WP9e2bykF(%9P8F`M)slVo14P7 znILOI-%baMOtj?qFWH~$uQ8nkHNngmCDRsaTyVDR#>$ZsDCEII700m>3!rPKEnr-< zp=yOS=6!0P1Z6lMT3o@zBy_Tzb?lj#;MMQX z$mma#O^@4gcVQbF8|&cO5tB>L&u9A*GPj;l-I6)3^ND z`n$UPJun^-|Var?70Zcw9xH;{``u16|x}_LU(?Ul~N3hGzLI(<5mCkg(Y*r{` zg_QYxEmhf?S>ZcnL0|2UyM2UxlRxlyRS!l- zfNSpCTzvSQ=3u&@prAxkWL-y9RW)&g*Jx|H&g4~?vhEEXVUyiPv^fF17-L)ER)XZ- z*uK_1qh7kLp;Dip8ctM{e;CTi=s(_Dkj*J%Em%L3cQ!$s0Sa6Lrq*<2kh$eAshPt+gij9O;#IO_>3=^1(_L)wf z&!4u}gqX7!Z)s*IWXEaan*vvOIlzpvvOe1zkkJAh2o*592xhbsI|eNE@^vI*cWIm4faz!JMZ8a8FF!r9+g~j;g5p?p4}vkyV@;=z{qa(=4yP|iw-tB?)#o3sWa$&YZ#&1$He{HvySSJwZ_31!8z8Eu`$)RyNw$_mjUl5;S`A7 zJzQUhy(AqLF_z6=YGe4W1d2fK%CUuX9rZecarbzMQ-t0nZK+B>!U)Eud}26Kv_Iuw@{Xs_+UAJl9_`dh=P@sd(i&9ytW3lF%UPb z6Wc2E(rs%FW-`m-HJcaP8l!ML-70l-#v#2=1BOVFLJQFRiy{n_f#;Sy{=g3}$N$<2zwyLOmpgi_I4LW1!MC`)eaD zT(+Jg2AX`6+asSn>`F5X?(XRc zTtBjvQC3-)uJZzBgP_A}Rc)t_GvGd5+3@i2S5ch7dQfiLC+Yc)C?ruHb(M9ukJu?2 z9ywQNpHhXrjWblIzyEX!&yfK+z&>tGtj9EZ<^o#m{Q&>MtSEiZ1N#=H|9n~twL*1wOU7z~GtMsy)iIh9Ad>iqgClf(FkfHZ zvSGa3ju7;E9)_+aL9e1|N3X8b2x2{Chy^2E^NR1JQ0QwfCw}&IvUAVV7)aBLRG>h zB?!91{vdODP#RxY$c`N_?Pen(A#qO^F!dY-w^8MprQFKq)Q>&^!Eu{~sMm?sMh~ND zYWzdRrO!G*)I1M}8q@FL0KjsouXA8;+ar%=xkW?nBld@MVK7)nGyG;hjkcjnCmx`nQuYw0QVa%^ z<+$BMZ}lkvQ05hC>FtC4UKt5R1(33yGeeP49(6Y3SI&)_y6ur5Z`6ZB z=!&3>mFjd0lhvP!!)Uz&f~u>lcg1;*7vnSfSsjmBp2Q)MNb89Vjrz~G{5=wEpBjxv z&T&!xjjDI>8ehlL84x`5;Z7$nVA4o`lcVi9kjpIJqEg4a3rMU@Z*8KI7ZHd~V9`Ks z2a3MkoSDgZQpJflHvb|+TmdY9KGV?MX(EH69390>kU@BZ^hiC~9wxo4yc!i1rT9FO z6rCO8kT5Hhm@frN@D$tbEnBSgpY0b`B6ix?OG`>XL{N!iZJKaY$+U+Bpb!{Ikt(MT zU5lyHT(?*o3u8feJ-%Jwx*aVlDK`e5R-fbZ47VO zGWjthPt*(rsu6qKdd9nVaDA-QYeoW1SC<|T*Li*k-F$6j*OIN(Abqh*yH?0o{dAgC z@p<;3J6u9;rRuMXsnPQ42)6XTk&y^fk*v%i&@#m|@Nj~ZRZR>S=6rEPm#TpA9dWWR z^b(y#kCJA2O^Z&MOooiW{Yu+`kGH5SB!;LRuc)KK*FC-_l$OFsI+>O781yv&7#=#& zyke56jzOI+xKTJ*w;lz*{Ey z)m*c$pO?JIw@gNgkF)#XEFcHtl?7V;$)_{~5pwr}MV{VX>CZfo`VhiQqbv zGYGrlbi3tX+-}1kPTthaWY2vDA^?8Aw)fn@z^qZ}DFtrmEOY8DOeu;a+x?A+7-BB4 zD%kQ+6(iPd3lG-cds$jQ$5}Vcl@^DEnQO<%$$7rsL1*esE5rHvCf#4W>sPWWqp`tC z1R1h&3RHFb#ex*Abiin>KL<*=)Y2eww%h?u_7W|~LtNU5ZE_s^+um1-?WBv|)OluP zPs_KqOzeMQQ6{LOAys_&)DSF_f^Ofud6VH=F{2#y!^?Wtc6d$KCMi&d4FPjHW@cuV z@DEeMzfBlwEtSr!TJoguZftt`%AHD9WHRp=V>%m%PaL6Qcn=`o)GNtFd(`aK@&}!A zcYP?%7U9_#Yf)C?9s#UpM&Cd(KL<_CQ&9ebLNC|O!=6~e&HDkeN9|S>GDye)zy{z4)Ui)5ovDV>Km0PYQt z=S*2@wV_sQItP}Yxwe2kL7dJ3iLHXN8CU~7kp+bHQ_~QDD_|qjqv*rrN^}D8({a%s zKv$;}rIuos9}xX`u(<;tlZ9~BSxJy_0U4^eH-t;boE7~*h&)86bT?rHA|D^%1c2Kr z!7{h%CY)awnbQOs?Ag?@G+4Qm zK!EespG|0jE@_g`fR53vogVr)2T-C5e!d(ii5QDUfdyC@HDEu~v>{z)mC*v0>;a=)C)SSUP@>LS=xqUV2#eUR`+p zkCM_Glq-6D#1@Dy+@&Ocg8^BudOrs2RDbQa>q9Ng*XvrN>hI{@{1$^p`n{*sg*EaA zhQma02;f3KE1;z+Ka5rN?-^A{aiD@uw92mCf}D`HV1IW6pT~d_K#T8=*%{#C|M3Pd z>EXUAoZV(gx~ixWSxmX|-O`YC^(->`xldXYM6Nj0gw%5>WZ{uz+jOP23(KBoOzW7A zsKpa0cQQblRWsx0`L#x4fcY(-C{Gxj+G?Hb?|=FBMZHXky|Ci+Bt$~xS(h{IMVq-y zgLfYo3fbhZMr^c^w$wEoC;)Vrqal*3TZOF4xqYZP8K&A%E3iu>Kk}tOg4KSw%Jr|Z z?Ico{#ThdS`EJ<~>co^?4stNC6Z(;-#{RXzN(DLgWW$Q@3oZ%cRXvq9$7=#c8%J+D z793HhKV~TIpM7}Wt`qWxv+~Uj?V0OEji8(wDgb0&TVvcqkR;S zqF?d^`j+vF7h}aZWV?C9sceXxAP#1VJU(iUfRPuejiRPE4~;{0PS+1%jyCkEnwxW- zA+cMt!R(5Wi<^l*R*nbq4c?13=jRyd5Zy%^o6m~o6WZhtqHngHdF%>zeDLM(J$j+* znZ+Jmw*B-`7M13eMIW-`f!H*!N((c66z_?EI8ZxIDXH9F3~?1VSf zP3iPM$VNlU{9m&UZWTgfp97)KG^L8i$*g72xIKre-qxtUj$Me(QZdnX^GY%GqR(fs z&or5*2!WHDNL+7R+OdW7sVshhMy4#Z3BIB|{w6{HBiYCj`;+Z2gvxrpVrpkU(hHLe zy(geC_r={5flOR3!WBikxQwz=>;qX^6M&B_b9Wvk@f^d}`olyl1hxm{Ov%U4HbY_@=Z6e_p}&r%T+7 z7PcF~W!uYW#hv#?rFmT4J+0~$Sih#56&2Mo!j1jIrSlZP0ih`|pCkD@d) zslX1f;cFY*t4&qee$y^=CM=Wnv)&Kz=29YeZ+ry`yr`xhQ2lp5*REf;w6L(Sv_wug z)}h={kC6``n+zPJ=J2>1EF-1N??)Zhhl@9PlO4HKkL&>=0Qa4bv5OvKHTwqZp>?ae zMZ~P#&d#dT3##SQxZHl6gxi#&HgkPwiU7X0xU}>>m5!WbeYE&7L^8sx+Ru1gASv15 ztoMu^F6yfr2#+#ZRxrsfs7>Cdot=RW`Y}gw zO>v?)Nle9-KaN~AIjMmI>HV^~9e#M@A&pq_Hi_?Tc|(1})#PkHjBUBnSvDF$t6A^A z*q4V{8V}~Z=H8@y%9#5jfJRS}I7=#o&))qeL6YU^_SWrB`~7X1a1`Q+wtLz3TMbl_ zla}Vpz@5N?mzqVA8-~v>k{brO{B1yH^@=iDtwTIJD~vmE%X$p1xxOZzD_+?B9zGk9 zrur`wlC%hdi@8b29%K51fuD!1t)3Sxmn|Yy?G`LVs}ZhIJFlZp9m4mm6DoriB)U;8 zTuvFU-P{8ncvo`o6e>{d?%k;%-+rNHv*z<1*T;p1M!j@OKRbS_HzS!}ucOW8e&E;z zo4K~V^Wb82$q8yXsCfy}YiHmMx{x+XUFuF!px+(-IKW>4_-_oqpnA+-ee}d@u-N+T z{$r~ALek2pHbcMx!)Umy`alMu7*4m-1O$acyYqs3-b6`Gjn)kB=?kE54=`5NV*c!) zYrd)yxxfAX$HFT@o4I^6pMtxLb#Wm@xpeo>3Kz9Hst=%%&NQn|uU3jC3cx$<95bKsA(A1>H>3!XvNOySr$+fR2#-6=PHIO4 zt~cJXnQcP|yJs6uMUd9Ns`coIxhY+$->ted5#w3*tWh8B;oo5ws=!MmRb?3p2x&if zrKB#bP$(k(Y;ySG8<$Sk1@Jh+QnR7v!G|W$n=C=Vr)mn>lfR_83~K`Wm!?8e(le zm^IJ%InVl?T=ytP`7il8w>Cz6DgzxsAYg`{Ax_Vw36i!BTN~Jk=&7?Pj$#bo@517> z&N^+fVn}m>g~3~)Hb*c&NoLYJ9Yz^8B-jfi{om9hObfrxm3$f0bx0}@#|`sm#{?h% zeS(e~GpH|BseFg!eAm*<-#(Ji-##+qsVp4l6$WxN)w? z)SqISJ3~ToEa3ruWM`dS2zj~zdt>no2F|S`!hcFPpAkj~!^$kolM4_@88GP}C$-y= z$&JPq;6tN6;U~H}@h@oHAA}Yke@dU3P+df=9P}-W(Qde|>coJzYQfI4@0e+*Zdt6P z+)mc`AueIDByP)Yf2ixFTj*uQwD+avr(Am=y#*NmHOI2@!!=wT;k~=QsRl9vf~QHo zt1EH8rbp)EvM|p@svK8>j9(E@9alegfXXK(faqokmj<)@yO)err6FSnfs8$mv0ZeNp_CfB0;_QNF~FWFeBbUQXSY(K@c46?gZAv5L&Zj(taC1?R!AX_ zi@HCWI?s4GjH`a<@Ku#j%%MSBh&?j0gLPHm<|Clui~IZ2h5GeJ9cJA-^h3Xh>D*|h z$^>*&#a7MbE@n8&<}}HbrnWb~13;t7V&{8IRYjHMl^fOeZRUd6S!t;(yrVtuLp0bdXC){`AF@spH8B|TnikVw|pTvn|jmB&T*@| zETrE&>nci)nKT_H+t-#hSgEesx_r;dWfiFAG#SynAn$wD{42Wf!Lgi*AE=1d0F4K! zo}7qIWFg}@9nuYry6-&llST8`;VJ)qWkwo>yt~RQk)7VCmgzu3DgQi3)b=D!9HJ|^ z&Pac=K9mYFUt`R2)oX7073unuDm66bMWnArL=>1RL5W+&<=3Ll44_+S+Ym2HkNhR?1$N}@dd%o%7cLHr#5JRdDQhPJEb)Ki`FRtBqw-KE|C{cZ=d`EI z+RodI@P~-G-Q^hOvxaVvth!R!%(0Omo4!H8qOkS>(U{{(yClQecp(1zB}VW}!SYho zODrd~2ag~~)@b5M6yPyKIOKyfWbrcf#Yxn(A_fw?JpX^F83)-dWD-@jPvyg|m*anUMO4T*nRPz?6b^3v#Ku%Sg`0azKd+l2M_fM5S+ z*gWcY@G4dG^H$62pdIMH^6?thF#f**;{THF{ND^*X9kZGZep!h?)h#R7e1Fw#d2D0 zEgNJlq6Uvzs$$Rx2J!y?z@^nN(v!LvlWZjC0$**`jq0UOpgDTjv=GsSORXQMN7IXx~HlKmT75Y)~MAQ+G zgAxuNjiDNEZlG=taDvw2*T3u^Z{mhB1y5N>s{LyhZ zg)v!!CH^EAc#H>dI9Zy|gS<>d2;S!WMK(ox`?D~Y76&WyN0Ybc+_w`dj2p@*SnCRt zvKnXni|lzV)b3(^FDG>*sT^M>+p89kyaKhPVmx*kKl#&WgFW;5&7RVon!Ah1b6^wgt5^)8n|yq0aAf#3s-P;_q$pKiTuDsC3b9R8WH&IW@dc<1NcSjMu^ia%Kq+`IStUcVtRs=KGx^3ikTYbSf| z+|VBy!Sj9o$Xv~dI5BA9_xOz;-af1!G^Sr}zatbzeN!N?YSggaSk39h%qkgJ_W@fZ zun|7<(fU2sBuCKI*7Ev;JKyIyd_Y#@wC=t!`j_3j)n_RYn-iIGt!pQB4pTL=SoPMZ z&2VWo6wbF9Rx3Ci2RhB!WCu??MQ7RX+HPd#Z>Q(?+d1;Y?0cQn%r)T)wvOxS=LQYr z?b{w5@GLm3H*y*yK_nOAx4Pt~z6zZD*@g305@@ac*Do{*qaOnN&)xIy!yNmT!yuVC zr=%R@T8)P@jW@Jz+_-jG$f-sWD-8oetMDwA2HWY$1%d}8SUNp(s&Ca^J&rTCHd2(4 zAD>nVS5k~iYi})8%58m}{@!5xt-M8X)DDjo&85-t1}@mbD2fBYQ|9DiH`kDhIfc1?)k<@R z8qcNYq;3aa%=#Q%Q&l!!{*i`;bWk2FG&|jyfjKT;OVm}{@oCjCG#(3C(fcxR z`kr$G8oN3`x`MNh|3^E5aEXRFR;$yal9RU5Qrps+m|e9+#G4hu?3zjMc6RK%?{CbOY&s$Qy_nD6s~ZvVG9s{6Ms#?DI=M(?1n7 z;%nsVav3JEeocOAx40*}OyekeF1EK-f4nhWF3wx%G`!Fz8mM*Rk4?ycDHvlX~L+d)j_!+GI zq^s0Um2BueTp*22&`}q~fb!+Z-$ZM$0Izb#n1Kh#Po_y~&$AgJ^Qiv~t7h!&-oy~tt5vMa92V=Zb!2pwqmm0=wb2$!a)BGh|HBRP zhhLkFNsNz2mn5B30wRjuyjgBb|MHsnESGMcEz8pR^xp|uG--bmeoW?Hb~x>Yu}b|* zkBoWLE>Yol>bN7f`KtjEvQJ3QG{(#3St2Z*w@F@NG=D&iTTLL)>x!S75wO9w&8ZB>v>*L!>Is%I;FbOM;e3PWFiCGg@AWxX;8TUG3w%dc{@F;QP%kM`a3trQTO zE*~1IuwhO%%l*ow#w5w_nealN=z^*;9j+|POCS^Whi#NS28*JfmglR;qkcTl@j2?u zadQnbR>RI=@Nt?F_Rg0Tpd55AUGIJ8d?|Havp}g{p%^$6;SqJlI$H7lwBr4nanmT^ zN1)@z`~kH)=rz~RhWxOAgH)UB>+QU-J;haIpn9~*C=g;EJ;iEv{l6RX4*MsTeyMLq z-YH;n{+N&Gk~=)Z(H+l;`Pr?ImX;P;QZPRNQ-(Dmq%NvwB#EBtmiI=v`-3c-d>|u3 zsuZ$1e5Sz{^Pf6PD9wUd?yHYTD^Ie62coTdF~p^)Qnv|Q)JCiF7XYA6AWM_>BTcZw z@|W0PPrJjWy@i>@a|v|E8k%ale4G%MerZ)=*gw9K47i@v=?S!$hV-Q#;QDNs z5oZn~Q4AUp)nN?7_}_hh?)ret3c~`N6V~%fdUJOkcKAF)tefBbO%5YhTj*4p)v)V8 zM9_m9(|KB6`h$EEurUz8re2LQ8*spbyHIW@?eS}o$p2&n30Q!rDWSZW7&p&PSM{D$ zCCweyO&tHOC)`)n$;WW(7t`iZ|A`CkJwAeEj%wlcA9_-Jc6 zW!aI@4J$SIhK`VV)RPCrtH1m!j~ZWCD5+4~w_JF-weIm$noi({w(am_e&B763OEv45DoJ#H->r zxWjD&(HgSZ*JgmCITiRpAZPpBN|S+v?NiS^P@Lls(}Mrg416$xF00tAl48!i8)var z<)jklb$SvXT^HWIMTrsWy04qpV)uH#V>~#1L40&;G4R_nxZH6`s9D)~l^n zbPKq~P&8|TSp%6f)Ukhj#38Rh)Y|JBk3$BY|6}@zRmS8zyE1fyyoLel^0!QQf1Bd0sIt-*T_+8ar`ur6&lj61s^84(XFSvj5k`1!c|Ze*INhFV3$DzKWw{gk6xUC4y-N;(!MK6Dr0Fh zB4B=7u|HhB#dV?6hs?L(l7-3vkPwv0;2Ljy-Y;e`!r6|voD7A3 zP66Ej7$jk=M?H*m+b*E26xOH+UeEtDa|=+yR|Dl3q&p{Qf}X(S_^p$k3L54{R=n22 zadbZy-@!*Gs?H@v%cbYp*U_h=`P?Cv75Z?Z?JLwowaOky0%ldUG-s};?5BP+ z)M)Ks^xwYZ8?cJO#n~3Uuw&5?753c?9nW^oXNd)wn|QTVO~KwIvExlWzY-1Gd4qQq zU~?XwC4s2ljJrU!Hm;BJ6S@bZjJoGvn`xnUdjrR#)L8+qSh2(B3uRZU^=LH@$IPz9mHqP#|Vm6DYZOF9(d zMD+1C!=$6 zC*p)W7@l$9V%^-F&Xc^#N>ECAE};FLHLOr{PCcf(adGVja^K(aiMhEs(WDu#PIggI z3UtZ2t*!0dJ5$r`xjEWj`aI(Nb<^NUCmtpyW|#ZW(9poZz^2XN_B*&kL2`03hfh2{ z_=Rz9-KWh1e@}?~-DCgM)YNyigM)*8eX@&KdDIrF^upWv?+gvsx3(TWh+}S9Gy*&5 zf8Q(r>)xddH#aw+KTsgX+|vC-RY^%nK|w)Pb!=!THEkJ`Fkn^?Y69ij*_EC-gKhsn zAY|pHcY8-iyyL75Ip>A7#=5#XN5qvZ5}{ zs%ZZFVK@)GO@ri6L!6Xi>9E1?1AK_ns?b@f{n2)j$qY7TdNvWLrukrCU|?t{m&lS% zIgA9ml&5$Nz&>ji7si2_1)SdR_+98C!PcYlD^K29USg8VX#D)Hvjfy20Yan%vEwV9 z=XRqHWE2F?9BS|Q+}vE_(6scm;e1i?RRI@nyZyxtm$s6Ul5SBey&E~8pcvGoOqAI? z?yUjkv5%-=7p^_$Y5_&7ED+pi=wG+7yl+0dn?4OTI0Nkafkk!@T%1T74q2y$K!*HX zaeYo#L3QPPgwe;F#3K${Ug|`)feE$e1xqO-QM`^kLBXu`BUIo{Jt2%7P`&V$_ui;U ziGN=X14J8sd#EcOp1TZ+Ms73%`9Z&sUcu*iv#lJiQb)469mh!dgKR1yL;eWNfuTta(Z$^Sr6P>r9{u6@|*4_BFHPnAk8PuW} zIqcl=4IBqs)PpcVr89VnhylmpxK=fR!%lk6L-L%9~dzGTmGSugB_w~_ zI^d73EjB=*8UY+J3vCof~E`}RfEOjS>+CfZmYs$xX+`E3J zMz;3EYH`^xTax#-1E3C`2NX~fGs&TM%~zhS84-Kf?RLR&9$rr53{sU;;p^z|7fMg*^>ZqsrBb~$aw5I)Vpz5%Qjmd zccjF~02*n)AsXfYb1oN9sB}QgQ7sBC-MB&xi{oCtuo+L-#V(4>v+{IZEb0D;u43P) zI5C`>10`4eQxq9r*ASN?Sl^GA+4Ox$AT$LP=O`mN0Y$?68Blzf{K~?ieCb$gwO7f*GqE5ASOtM0oS_?_zsMI2@8yam zcT)WjR(103vYmFA%K$)5ZmcJ$ENeYXh!9M>AlDC<6}|Hr+!x%9lbXXM|INCuEHRNb zD3J~`+}&TecXz30M)mG2sJ`vsMcL1DqJKTbNPC{hWn&Y)PGYg#fIJHu`hD9a=zD#mEiZ>=5Wf5-C)=}>$!W{ zo=c+_r|xW)Y^h6iyU(Ht>5$8ths*r_w4L>~<`ep9u~(=RKZ5G(;0~X`V>e3J^qRr0 zRGQ}Jis)V0?yjyW)ra=R(o3uEoNd;Yf}jddW>C7V&|C#OD234D{sUjW)J!3dRrhi6 zG0B|eq*qb5_2_v;l^h*N({UxHUBL5sG>bI)P+|<>pPP792qDAx&G_BDHa$B2sDVuY$)&yrG3_a?cbmt`2 zA%3DW54NDXv^{B|PJaOE(DiVsuvgHPi8PjUp3R`5^}dlp+?(S0f`o*-M9iJ)wsv-V z0ng0l6E3lCtCnrm-{CFB5oc*~Fb5c9;){PL>aZGJ(sSWnj5GESC@y+E<=Q}Q$NX?G zHeT||i@%7uJ!P&x_gw)+KJT}E9)T^@DJGV)X9p7<_ulb+c074kCaQ@GO7phuXF;tx z+YY>9RXC8YEeQMeQ2bwTay@%c)rXVSmvL7;c(^KI7tvKksmdD;pP{2^rvt|OH-AK+kg81aKXzW`7(1Rg*Q`5!+8R9+LC`uY}u;4ofF z7ed>PxOLY{PnM~VF=5mX8vHC%j++6r1^&=_%*MthE7ueJpydQS z^meA8tX3#={;hoc(R%5|cKoK-bM=tnm*r;7g{va&TJuN2;3Nh&Y{0RaZ?{)KJ=Cu` zUj-o!OdI^&6OvVHg9)XQCdoVMfO2&;-fzJJYIbcQB7mG(jF|I4VRnt9fxbQy_m&8{ z25v6HFzRH=jpDVU@5Ilq*KCTP8axODzBoL$9RW2C zvl9s=7>J=QrZVTXk-`OfMLT8{YtNb58M$A4wu*)3v!5Q&OM8-Uajccj`GDSKb zeMXjuxGC`xX6ifdIHZI^`kVDZ;NS9-ITrqvM`*(}fQ;yj0?@8R8AG}zW_6vYiGZ}i z^78Vwb@QYS9Kv-lYR2Qn6RKY9isz=mHwvD5=0w%*b9f&d z^zqSyYZ_#(-I$(7QoUxDwVz0%p&qQIa{Bv^DJEQ0zx3PE7?3)^Qnn<h+n^ z7=^{pr5=dQMhw&_gC#viE-*Y$9UzUBTYx?isA1@H3Lf0>B4N4x5zvjKPOi{ppH-{} z*6d@T(*0v7IEF*FzGa-8^A^nV167sD+3{ZEqq|lIfTJI$e%I?ulY9a4ZLXjPwL|{9 zs)vK&bzY?Ot8rAh)Jm=H_|!SrfL*Q{3gu9PxZ0FZ1I`ZlC|o@F1%w~d#EMG81Dqvk z()WSyxGv3Xf$b8V#%OPB^Z}GswRa7ut=k{^%yd@hraLd{s3RXxsWndDw+}Ab@GJP= zO=e!E6Vh`FJVDTn6Fncwsu86V3!TL9iA)>z|Jnp<2Du<1JY?FST=@AiH;iE7#f&ce zGtV?Aeb)l}_d!0eyD0q))R{`=QX`Q+TybT5=xI2>c^=aiwli>(Fh_OaxY= zMIagiY4|`|XnO^C&Qhb#;=-84lid1xG3#{u9BRHc#?viukjvXMaQX=TP)=rMTMPsQ z+3S4(!A4&N_`qo$$FqSFpzs&DlpM3ZwwC$9^8rW@F}NM?tCl1bd5nt;kBqE59(-;| zcXmf$)r6fI=5jDf8OR}-TuBiL3nG`Jw|#$HA)+vBo-F1 zcL#*Vl0C8veqCjz1J+}3dIbneKt<@kseelp*!HoBMXih@VdpP=WbUfc={==h8a`Tq z9BKi`<_Tw1;ls^W{7W)#r$GuWY0bpVuzJ+vH-w)gkkePZ%Aw}ryccCb1GMnd!~6hfevY0HJ;ytCf6U!sIPblS)w}oaujYT%#6S}2 z0z0h@xqI68zkE;sD$?B?mLionYG~i_jm^Q*d9@Lo&!Pr${PG09AECUCNN|jSegt%D z4IC%Y6NW8CtoBVS)oayVJmQ{ajq}x}1MpZ1t$#>L{za9Jb3Sdu(OOoW086g!(F%lJ ztvkMp)nMLx8S(k0Sr@V3gVn-e09>3-aQw$!&sZkBb~%MjzyIC$AYJjdphlRSqh~c@ zdkFv7=k(w$8~|oHL{3H~FeznJ|3kbH6H6&iE_KQE^4yR|vU`5eE}NFh(%_b^&Xhi> z;i{3#j1@gSJ%HuUSy;HJ3zVi zWh&UCL&z8c94OOv%t%VmopMo-j@T9V&b+Km*NH?lSMm3)09sLgM%znA4t?y2UAffS zaDdm@>ROYT`lS^{#1NaJ8Ln>sJF9Ra8N4C?A8vRH+~vT%2nj%~>5COsyQjZI;>(1h zeFrS5A~{VALDe@E`aq?r{50$p?wOefAnC6JVuBw%<%+$2<)b?Vg@qwF)nvR5ksVfF zopNByjxtw8p2n#9yb&eP72ZiYmoST{Z|yd z)A~DOeZZYI&T=)XKkhoRyc>Q!^it<%41s*@zi!NZ5pYd!xoW8;v5(#*Hd=iqnG+2lzb_0i@9J*+~h8=0LDO+#n*9QlJSulqhTiFYPd2zlJ#? z?Z50y7@tVQ>Ff2TNZr%gDaWIEH8hx`BYM+4m`R@QdKIVb?mNxLY+*&<1O${xg{)y; znyhyOlnOQ-;^yXOKSZvR(iFa@Zeenquk`Ise{ZUcMcs9TWv!8HhsT$Q8tUT;u+<5j zT0(@L|2AE!qgwi%rymr`;*!+&7kE`jiowDq==#+@aB_)GefXtbX4rHe+~xJ*xG$u@ zXhO|)+skmaHN{J~Z0-3vI7wjcP9hB)w^;|i%hmfm6P3T}ewzmuj42=#twYwl>h5c? zqXykV91$hQcKBE;iokOLXAkvrKrNp;{`}AbXQRW{tFo-DrGQ zjuxDihC}zrl~N+oTK9s1@Pt1V#5#-%q2XPrk|pw%~B~R=<8E5(t4l1c}bk{t-?7 zjRn%;4gJMjY7%1cQt=P&zUYHX0Lsxc#CKP34ZRLQKUCSl4ogd;mxyNmV0n6IvY~{= zH>Ff&W+rbKbZKdc@k8qMOUH=)d2Mh8#u+%DLBV>kGC(h;Z9%{~NinyqEtC-MWAIq47BTuUqb^*HYhx)GqqOu~%Ca;u=EhI@ zhDhpT{v?mvo(|Pnw$f7?6t;`8=#_82cAM*Fod0czN|7;@pu)2P$>Her2+vfM}a z?JM{Qysk&`AUFkSUJuRSJ6BZjyy&q%tOIrJzB2RGCAP%JmMIU!lzPA`{2xl>-m0ab~APq#zqxKNfH6~G{K=vVN&gs*?aDHiFlxN zzV8?~rVU;Q9zAx{_V{?Yk6bc52cOZ7No$Icb3)8K?t`dk9WBwM#UyyVSS|P^A&HSH z4Vd|cdXf2(wDyVBxJ|M#Q6Qaox6OX2KmAj|-f>2r89E&TKRDs;)V&Y0E!I;mqy&!y zNHp_A+wIhe7vsseZSycqx(}ws-!P|ZBMkM#GbQh_#)89&o(9FGGd#9k0H@2i0^dXj zynooM7aYnr)YaA1-3`u`O5j|i_T@rvI-rlX=I0jL4O{_>m!SLVslrv`4$BS{AmmA2 zU=G?GHS4g!^8nP{(1Z7C36q=Q(L>gX!)fqTPUa&WI&~25NwFU(oN#~<>JtXYU{eu3 zwp>-%lT2-`UuxPM)bf>GPhaM^6Tc+y$vi6|L=h}2oPSi7<;spPb-n)6ZE%2_kA-k{ zr+~b?yom3YQSkg=uUDKR_pa^gijY7hSok2%HXO4)I8KXhJByQ7-hBL4Y}Rik_O7Zt zSb*T3?Gh-vwn>VvNCqb>1VubEnXUzo3Bf5nNn*32tmO$TIP`FMh-~N7qS-aD`oU(T zusC#=kkm6Y+;>%5QU@>4SGtb5b!FbL0_sZHU!nj$b-+JrNYzPPd^ClSO$rnh%nq+X6S>rzDu`_wH z8yPp>TFeaM6^fCMyTnKL^4Z05Upd)gnz?ISDN|cS<;ibwmumt#iniDt*YXF5+FM3G zFm!&k6!*_fP^n20kH~YXxu2J&ciCYMwXI6j8v2l$aA)%e9x2ZRI4g=tI8Zj$dt=Tn zFB%*h@eagJ8?BqX+I8ml2IABCJz|)>ZNsbygH8zt=2V6LKknW!)y8cX;VBa@$>hd-1&f?qfLXMIBm6MQ8%Ku=O8|mm znITi|d)O{(Wp22=Qt+Q#2imwAH52ucfnV=d#@F3QEbE|l>r1g?%G*3nxwoB-yTBY} z*&`nQtmI+b59SCO%Q99y0J#)+)FC%{OqMnquG1V}P;NaTk76;+XnR>Vx-fZE#+lS` z9U^c1o14d*H5zWmzmx%-4BxB+S4AqJgy!My3mZqTMO+WLu)=OCW7{QhEJSkTq|_Zt z2lqQl54gKNvu&ENUf=i6Q-c)jAwyGjD!;H-d8mfseS`FWSxz zoNy>HjlMY4$;-loCBH9fO*bQZjPmwVZ)Xv}+ftwvid%pAV+CI-=o2J&{nBU8dBvB{ zzQ>4lKCExc!mX`Q7O~a$@VNJaDvJKk`BI6yGna@3qG-lL3iq%x2riH>*zAIx`#-BxiVDXrOo+WuU_z$T%piNC!qu?Qtf?=)g%H1*_*uYyV|{r0fRC+(c% zo;%+g)Uus3YrWd;YlJ zx1{D&&XVQEhM;}h`@KP*&9jHs=4`fa-%dpYTp1Wr!Q88X6eMI9!2|*gYn;rKpbd#G zVmSbk9nWsw*K`&Vgv81$B)Q+AzZ2{dBxc2m{I|ZBG6km=@q0sC!;i1Q1IX|}ImFRO*M#90$Skxc)&5@@ zV!s%Vgr-R+@mL({UgufyykYj@+ zvE`1i{QEUGDtS2F#7H^zr*Lmg%*BRCs~NGHB5$8uCT>j| zRevbSEZ!Lfb0QKf?D-Tz@19`(uZ24Y(A3*Vkd1&pihdyeLG*rbRHROStU5~>)*hiS zaT()Q6F|k=$~c<){>j|lgq{RR8kK0yfbIPn@)V9O=p~IhIATN^T+nj5A4^(pC@*J%~gI@$w#cCg0#OfVISZ2X!VJBslZ2 zdm{;~C4e{G$c3bnuouHW=Xd=Q?}ZDD-*!V$Umx5{PcB&1qc7F)yx7#yVLezuyCS*I z-e%hz1(8F7673fZY|oOF0}d7q>qC-sv_d={Outvw@CzK+(tbedHIgAZ;tmQbZ5#8S zJ}SJ{T60pe0@i*2prZEP-3sT)y_muBCO^P&eqtBk1E*76AjZc_|&!3v~S_RV2v|h+;mK zm6ZX08$Eetpg=MJlX^r(Mxqy3!bJ@Y6MdWi`Ob!;_0ZYS);tT-847q=OiD_ML+a5rQ;kKq4f zdch>fwt{uyBKI2D1X&u%uD1b1!EHnrL&R+(lPJe=?)q~)c-KB>`g;WP0ixxWJ~F2fQjXCgfvwU z<*9#}>htHC5Pc81MAC-GVsrbdLPZMCjAlO`ycVITL#!|?JrMC-dl?Ael#CVtVZ&2`9%j2Cuk(oh z8)@=xspF*=MO0SHHU4ANw94e?q}Rj%zY+Wi9th?lOV-uXBR>R%EZ|A!xOltG&jkrR zIk{GgM=Uy;mV7JoAg6!M?ri0h4;}01>2vVuo38-?wAX7dFI%Tal$|o zPIk<_DO6=`boTwX2FXInLTNktSOu%QRvX-7!%2Z_#e@yD!=rSgS)-K93q%e$bgxEX z=q~Id)tcBM{+PSFI|Lm4OH8rIeqE`it3XO7u8#nAp%4UiAtNaEEOcXBn@1ek!U~ra zLmi!68ds^x0bU!8x|N<;oEd%htrpfrvTbL3f4Z(<+x{QoxF{!0-7$I47SpxHnFo$o z2vTS%4rlEmyPEq<2z2VUiL%cwo;9(ndDEXLs8A=rPmX=O$;MmUVrnBBv|}!- zl5#=)`OK##x~+pX9bNtWezME0*VeP%p|^ncQR~4Mt|)jlNX+aD7LVU@Z-7(i_gS5YaJaOC(m7|3nr{* z>q}i`O7NAE%niizy4FLG0+)YM?@}rtw3F@D!B*TfGMeh-RM8U#{KE&clgTk^hAAEqp->;FB=Q#)fAj23vz;{qq9{`NFJ5K$XftxAfQ(>PYOab?E2$$^i8h& zPnr{z=*aUH+w@C4nN{v$Iw6gZBIqEAoOGQ5I4@iYrO*?|CV`}ssLT_w!U z)rc^YgPI7RF62@zSTDHS4DlSt!BI4!cVE6bVqR*3dCg8DO4e#?XtjxBwGouTpFeFn zn}r_z+=e&V1_xTLM~~%ghv%AA0sO>oG=Wn}&OA%yEuW6Qc=6(rvYOp|B=Z+Hz(Akh z9?Oh&i_Fax+Hjz}EIgZynST`yljLpE*JnZ9dL8p#`UH77p)El0veqeosvqK;%}ra@ z&Oj_v@xnDknO%d5fGG!zp1!_OXYOq;9P5T1pjXm*@!0vf0rD%Lwx02rvL43poLIA# zz&xNwXsvKotI`QI9hV8SKCX+ccg#RjZ->(r4BUlyNwRV zYL3Y?ppj3+;5(Ae zazoq+x<*ExD7j0PuPh%IWU|>Lm}d*f;1`n?gOU@kGD|Tx5e2187Fg-_4GORMg6(9x zX|G}AEujFY*8?KCU!%+>%0?Sv3B|LKIXUOu?m%_gz8d4)>2IpGy*5)6hX@D7vfAf} zJMC3hTf2W-SYP_y%t6?Q(mo$O!M4}2Ojns*&u{It4zezjOJ0x0PD;k9wc-0P#yz6h z8oi%hj()n`hGWg=Vz`t~zBAxib4Z31TkCnE1BMb))AO~ghVahVKW zuEUt`XE`K8ASngaJ{*#9^e}y?R;;viRVR7W`}dq$KA$oAfPTsQM3!q?3U`l{&M1^m zUhQ`dXD<+({_?W?1N@s*7bP1N^FFens=%eJ!VSYbP9*e2 zb4B0K&^>1ZT2bV&8((d`26kzW6$hw|E$6@mHAX%bpH5a@DzZ5R2N7P4{suSn@i{c}tTWXyT8aYm{wF!jLtXNkw9Wy@6v@oi!~kwTCeTX|J4l@e<5?@dkn_U^q5Mt6ZDRDeqm_cOW- zA#g?bQ2=9IAw_s4FD)h}hV6RBt)~OKFL}ks#{4HS*5$+ILJNh~Sx?a3;gXSaOlS_6-+pU8L+0uVA z1zck2T`@Q4tBSaTB3i0mNzsT$Hx&*i3gRRSDxF~YOMbfHNEUwvB{SntIl<#dW7;uy z&L2(@KUr;U1PESy-@C&K(Ep^UNc123#BmzgCj$yEusPvKqD8c?6OMKC$B#CM#}Ycv zfk(wG2gfltR7^tAM`C8?xedF9{woEG8OhQ2G@+jWK-Wr6C0tGZRxYeh`u8b@^ZlA4 zaN5J_g4!qf`YRs>-?!h9?Uf{`$=b;d)+9e6Lo_GRM?!?x<%Hy61_mirFg$<<?Qe)8v}-y-u)oa8u8PLdHZ`+D}^ z>x%cZ`$=6$#M6!&rbahQM10Sxy%#_`aqxgOZByr)2WA*U{)tE4O?S!@6t9bYecfDn z5o6YROw9|&hV#bE*(e{~Cx2wPW}w5=&L4KJMV3u^jc%fiYU%e@s+U*N4k0Hi(s5-& zlXqg(z!z6yqcaE|I@~7#P4hhGlQNhBuv}!23-0!oqs5b1H_S7T_VcM z%YmOzuSq?0(X~` z{4)N0H1*cj3?VB?ejpv~3?AV?vH6ix8R<!>qqO$)c8&Qh-=rC^eB4yEAV>^>mCl zGSHYcoTBO|c;MQ8w>)Gh2^y0C%N6>dd{)M(wp5-tgQQ zYw5tT27XgiosfiFDv@@Qu?->HBALP~ND;+Z;VTm>&bzJWkR32|G!BBj>Ovw+L-fIn z8|(GMbbu141<`H_RuL8ur>&Dh?j3Xm zu-xGWCb`pd(sVRz#+Dy3_=1lc5&mm(GzbQL_#tPhEBHr zq`I~C-ZrXT%OzBAKbbdye!A)dNVBU=t2uyMm7KJhbXZaKmr#ic1^--c<1QU+{isawe{)|~2IRP0vt|0QC){*~ll zrGrpZ(8#%i1wx?EFIb!W_*xXm*DcaPXrJw`-fq4aGIhG-Wr{t>)De;O<-V1&I=dqo z1sS}*)TqRbfkS5y13jK9ZV(3oBzGDXCBYscSkfz$XEN)4xeXtvA3M9O(A6<8SItu?=epEhwyG)k@np#|@gQ zwL$(bbdem7wMzFYc1u*A9jefF=i}o8$4&P7b%$vCv2tvl5y+83OtI>Y(ADX8gqR}_ zU!sp2+8HUaGOx^kifzhz^-GP|UuW}{i46=4Y*x9w9=;qZF#nMdoG9phe`U@sN8UX> zBjeo_qEzO5a+mc~Wz45P>E$`+zQ#bOhn=+9=n_*-DOhCqb*iL&UVV^s3k|{BBHL8G ze7nVsmu>i4Qa@%}9{%POV=c#pFUs$(KmZlAM`J*RY-iro(92moy8FnV`VDtawepP~ zFeIq`J88qhmXE@5n%Jp*e;+BjV)z>W~;k^`*gc7WcFyG1Z2C^InE&TT+-R_aP(Q=| z%?zw2aFZW=3wy{o6qj$~z6=`%hUqxdF3+yUSSe|u}z zeI_%TCgD@Q@5YS|s0eO;$|Ll|cfP-Nv0@gOhNuUNN=hV1-Ss(jAp-F~{s$vmqrJL3)J zW;zk!v!~!T>z1q&)Tj1|z89Jzc#8P&kRP2;JZDcH$lF2RbI$S9^%9g>+nc`32x^5J zmApZIy=;e>4Bg}7`Q!By=eoatiBCLxBTb?z{q~b4KAvNB_oUM^wN^cayjxjy-RmT3 zro>sjtU|10YZlnp*_)SKrTi!ImxhFg_dJ@kShGp7BiK?`LA31b*|T>O6*Dx;4>YqL zXa~wLg>ko2`MSC7nTRQgpY3$fkJJgxa_igU!M)#W&P5NJi6L1VhjYv~FuXdgVfO&o zfII2DN&KeKlLXaUbOfsp4Im9jzAYS{)G76cVw^+Yz#qD6MHv9i6Tlg-_c)55ON3BS zRFo#v`rdHth>D83b?erANBj^Jcbz|f9(+N59=HzD0zthZL#$vyPhP~~ZClQFk~J$t z8%RvC^{(}i!tKp;b{lqv1k>km2NuZ%0cpdcqc1Df_(?)QEZ?O66}6JIw0qKOgU7rJ zWFlnz&K%4C2EAzB42_62M>gPFJ{zz}2hiw~xwyDo-xDhn{P>8vb(XwI^mDjoTU}() z7~5FZAS)ux{~Xqh_x|I(IrG9#CK9G+vs#&%VRP zf@VQ1EXM0XU-R7Zqst6p*!)qE)2mA?ZTM+sRb!PK?!=T;8{SxkImc>h(p;7B=zBM3 zsUd@TP0nyhe{?7JWt(`Tg2k%#;H==+$R0or0mr(sO%$TvdV2BBd{&DF1aa6uB)!lh0f2qqfVq14&-kn)Ropve@Zo%ZZD~QDimx-6>@EOtik((+x z1=ji0o`$hmUkMypLLHsoxZF%c)CORE%C^P=KNz;Sq zt{39AGn3rHdGoy!)$JaG)t#6%;nt;%g>Fw;kAcuC^Bpm{F+y`v`DDp~lVKlcEVd)I zC(wJ>JGdG3{T^~*peTbN`VsU?8`a+GtC={5pKIfcCju@2+`_7LRLlph+SE%QUuB*lC9&UdB{@rop2*f0yRMjk8%Fu8EtVoD+1UI>-cC@A)CJw!AkwyOihZuice?sTZ2ijq=96^?Ydwsui!Cnm z!%gj<+tFb^yw<@HvAPwdCQn8sYaWtanHrLnH+dR(zklOGsG% zrn=ep>H!XdZ)EjTm^XvJ1aHHpW0Qt2el!cE6UD}uuhc_0$AIm8eRt!S& zTac}yjNf(oGQ3!G+6CPFwP>ar{_3Zos(x%$w{!JDoq^Exn=#j&71K2zKGaQ;RoDXs z*tPG(lpy^%LpDs?xJwjM-wdtEgZDnns=#GVt}8Wkn>7$>nHRV}H+eXSFyr4Y9^6P> zS@tUJzs6CJIigSD$z_n&IwG0sh)xQO@tpq6fA~nO=izU~FLnl##$9-7+*p{F*5Di- z6LW?7nj59Au5JbI1y#;m$T(u~-v#Ict>iCvaEEi=(>vwHo^SU3>Pa~2&(3_SuJ(9x zTAJT&Mjg7LCPnstkVslMZ@rx2e5KRvv3pND9<(1?m^x1Q9^c)v2*t9J@{F>-$&n2? zO0H2QV{-1vqBK=``J#8PE+WL)TCaT?eXH6;#xP?A)bIVD8uV(s3%q&vh^oRyw_a!W zp|T$VKk~BTXS(vPP!7)ldL2<8?>`u@qRz7SFrQ@eR4^&h5qK$iq%!FI*(Or5`wKky zD;|vgp`poP65^M9ZniXFzH_p6d2oo2cH$(;ohn}Ws#umU?|*V>KFQr~GHa;o*kI0Z z$k~f-(CqHG99)Ek5cA!Hd+IE@e6B+YPr32={&=nTel57kjzh+nh~w_Lo4}8zdB^i~ z&Pm7c;OF;1_b&s`%5ib@aQP8VFDHglx}dwa03boK2Zg$>Rt7<*w$BA$+=CO|=UbAmM0XVR0panGKEpY}T-FF3~T4Xj>M# zt)VpAq9$)NE&2YHN(-il6I<#yF&#K>uS^vj@+^+{Tnwf{i!FRah#~F zegOfesWn!)sfR7Yewu36FARQ)nT>Q8>HAA#h`Hb-Ohi%K!)X)y-%x|kg0rRa!f8VJ zs7by|Nm5ix+LafFlzqFvo9n2r?^}k3>$|O(sqgzyien;t zN4jwmA}O2_f=_<<^cVB9e$EJSPLu`tged#t3uGxeLOguT$6-?urMzV_kpev2HdKnX z^m2-J6(wO&d`oB#ocy{C45BIhuH6mElUJLN~sCZuQW~bL8R@>V#X?YNsj$p3ufF8O*!mC-fpPI6hFgy57CPl9KmhV$c1bgq6q-=OXtQO3!$Y6fALAbjr zLz2h2m(X~*Mp;xOc0(Mvk~}D2H?=MZfKkcSsfhf18_{$$ASdu|uzp2u5|o~v(J+z6JLIAFzyGJGu4sa_hgojuYXU#NjcxLQ6f@mS>^#4@Zfk}Xv4#$?^bDh^AGCSJ?ZGh zPj~LzVKc|{<@bBxLhGWhVOMqQq6!MS*2G5BbsNCs|4n@xdG}MeyCA7Zt>vCm${Lat z#-usyru}=d^ZS2$5WNvnn8i(|S>%{=Rsb)Mhwb7;D2W+cjl@l!!2>$Sa_vMJKx6pq zg9vIc;~ZSi6d|8*;*jC3qk;3YUe+~c&*gsE>%LUzE0sTD2;5N0$IZ<>1^l*k)UeK2 zG>$cv2^7rijns=ezTExnS<26Vgb1Vhs#8sszL`L$|8FwTgY+MAwYurI?C3EvYf&?N z!!*pU-_D9^NRcSs3e>%mn@-$u(F)Jx|rF z=?b@9DLZfy!;KISb9dF}m6mgjxn4mVSxeLu-g~ag@#zoP^7om6gO7-6I-;bs2d-+! zyZP%?&QGdl#hP#MM30I5;ZNqkJ%tvDH2r2ScH6aPlKVA``jLCJ%vKx&=>FWSiZWS_v~5sWe=_K%Ww_ZU#nLAO}QRKRtYqs#?c0t4LK&$Hf(DlMl2}5i_#t$X)$*x`urbv9c z5n@A#g%!qhjBz(JGAYEf^rAz>xzL|~9OXO&;V=)8wgnAvGn1sn^UOofn~l8ooG@Zp zJeXrP>P0QCs2Jcp50~D~^C00twt8si{G>cSxg8IdA^W+z)hrM_TCJ!%1%99a9uD^C z(59JN%F5$iAEFD}@c{vc2|K?$dSsv{L86qNmv=#8?Kl0(@wtO_f^v;DV zu^fiZ<|1JbAQSpv*qPfXVY#_7e7kqqnzng6qz;1VX}J6zK|seW!eXh@{Qg9lJA*(_ z!GPsu0(X3xWT*UhGjW?MM_q>|9o88zxCESK#OV=z>8yaR^9vp%R8#HA=Ig5x8_p1v zTB)wyF%O5WP92MQH?GEgJ~B^tO_{$4>c428mt+*XU-vuH3n_jXU$DJw0ly}x^;nYp zu{(N4t(GP;e7{(EltJ|1dK8!jo?Q@Gp#yWztMAPblqKLRhOjU6X^KRbF} zm%{S0snuM_oYlG8hKk0T#ZxY}OKH*~R+fVeKg9ZSH+rg=*VzaH@2}k%46b^wn*iG> zN|N+jM5wW=JAZE{WP1Q%sJ$dcQB3Kx&XPO$Ri5-bpSq6-OmdVo2I#CxUcKrZ;jr_i zV~k(Rwr5NpEg+^E?l`%0b;}k&^nse|>w9w3t_7^6$xjX+hEhO&9;DzE?g@0gxWRet zHdG=0YWyGvebLxY+43!m^YggFV$jHuySHeP9K7^d) zLc`vG-*N1P56wzVl%d0BvGmZ9o46J@B1^fU(WB^?V5L-9!OlC?uBb{h+Td@vT0 zpRL0MiHPu5V;9VX4`fc6?HEy=IGLjyu^dTfr2A6WT6?FY+;6s4?~~kxgolcTg@7OI zQ&G*8lp?q8LIzAwI6X7-q^PqHT0%q8?ed8iHTXS0WFmxLw0Pf`otrDJd*XIyreUDTj7kJ)wh9;i@|ozzbdF@cguBkOz6PFQ^X^8Sf^b8u6<;%NX}hKD$C-$prq*r$>d<6bdZ%A~yy z_|(O|I6r<1r7@!)AoLyZKAh^*WTMiA6UH-L7rw*<%LVCd&Uo7S(fc%ytYkR4Vtpf@ ze!+y_gNh%By#(ukucp0zqtFX%F<+^;Bqze|j5&OtX9-- z51fbaR{+1hS+UZZIaHMEh|s+`2yN+^pX6-7bwoY>Akq;_YZH?hsN>C`l(D2EW3(Is z-T3kKv@9l2C+20+tx>&vw&w<2c?yBf98@VwBPP<}yLR7KYe?l(zhM#PBY{bb^M{l- z&iZCmO>`LJHqmw!Ot4bun;0 zS7YJh*HF%vHZ?vzSFpCS+-qQNo>R1TVQs+!^YK7-+KcnIpcDg`5wIM0B@)eTVv=@c zkcEe(^!AFke!XT0fTNYOZ?m{-yt|{d_}T9l))NqH@~x~cqSOaJKT^rJe8cv(TiQ$H zQ2aWsWFr`ZDSN=1c!$$YtV1{+Y7XGMgo59vO^7*7tOBtwR@;x}QpwAP*4no*Nd3KH zI(nAM9A{kH2njaW7`Shdf#`o?sY?$)its$Juvh^TLifQ+AhsKWU|#`J&cSvM%?aFE z*${eiTy68OcjFM1L!2YvT+ZjCZ)TuBe*Bn2=Nt-suDyni#|%s$FLeF&LWSdBQ-dIB zi3s?VvCfdk;k=S(y^`93lMwE!-ZymLT?cL=K&4ugH7seXJmM)~a|57D9+Uvq9w60u zvz?*e^PmK{xPkGD&%i&Xg&b^Kqyvx*H@h6@&s}}3ergDQ<4NjnxdU z2`B3)YkUTa5LLcYqtoV6qAekny3XZPvCoj|U$bb!36FPdjxDwlLhmc9uA6XuBj5`w z34Vmw@2sF?wyNKt`1MesDYP7iQp=7)I|BH2vZ2B@5EBQp-PS_(Dh}%E8GUHXV$sa+ z2osuS=v9qocU_~C>b8H8=Z78FnBn5r&~LK>e51+-{~8;B7_h3xdBfKoTOgu*&9u=9Gj1c5f zfky9bZL8}mroHAuv-q~wryr;`{Pb3^2L!i^_v;dw$QSK-y$Z> z2GF1I%yWxWl@r?kAwdL&W!DYp*(KM>aki+P}>rFHIE zud$$^aQ&k!%Hzy4_4pC&7mI~m)kSi`#L*vTu&lmmc1Z<>DKZVll~jTkhw+lHIOde) z>0>m}sd{f}8rW@!dDLlDOG^KRYUt1|=tv5-{~?q_=I}y-|#Dk zulw%a`g(I{l?&3Xpyo*%6+Ciwq70nN2ZtwcR)UN%*J?eW_JsIgI(p$}IviP1rFN4~ zjds(ij{A~Oowgo-nu%yD1s z*`v%xR8}WcwGU26vP16ekNHW;h_+4OuA}V;#)8-9zEnE~|DqBXHGCeZl*|uQqJ4-I z4#6I8Q7P(*5u^IU6#2pDyo9GD+C5&+K>jBrS8^La;UDn@5|zQAD_rj^ksy2c3axVS z@p@tDlKCZnyA%iCpG0_CaI(jUfh-8n%S$0%po1Mk3X*H{j2(){iZ>@Y<|q;JYXNVC zF&+B28vHFC9U=hyC?5>Nhv9p7F>s%Y$q%a(@hUn*e;8?eh0`4WVGhjrv^mG!1PdHHtRTi z84dY8WXOGe%9*_P4%u;i>waBW)&2N_(N^UE%2+3W$z#6)X9RVf>%9#N{+!i~Z!!{N zPMyKMzdqAh{ANSHrs?guw+AP=)&+eB31zB7b_t50f{4RJ0cI;o^hWQl$?Br+bBJyn z<~;q9P)J-T?_F2{s#g;D36ua)9H>B_Mu84OR8FD?j*=ay03|QJ-Br<8$TL zs8pyk&Cy$<$}yVYb}Saj9fr0|W?1A0Rix}I15b)(iJFwO9%|Vxt_#1cWvYXpZ79>u z?IXl5a(D=0UXc8`jujH(oRRCB%htvDduySj$vRp}J%0!aYltsHU1<$nM>{-*s=S*^ z)1(i)hAeaIl}qNN@S!uRIa&XF#SDuOWbTa>!~fkYy3c_sP-4@o^K^aX>EK4iHxZRP zJ8!evI{D6gTV@aC_Q~0~86Qf72b4=4?AgO>N{Vux1^eckvAD-tQebFyi5}3mMU<)>Xdjmb1vrirD!- zw{!?)pF?|>@U62A(PEM^UCMYDOaZ`4zmds7M2sH!9>O?Vl>Ap))AhX zDdwW(B+W_Tr5@k3_i5R#XLuF}(E)}MW>^Uci62Ic{(kfXBHN&bGBBwf66Tr;=A`7n zmB85FtCMSPK05PV^|6WwTI93Sh=-GtQ%T%g!RCC1eAi=gL^f69`iLHrHp4bO!G^t_ z+y%50O|)zET-)h9s*Ib>yU7xPfr%Z6R9sc26A#;(oiYxa3$NHVGd&Z_MI)k=;qB@@ zZ?y;LX3=$ms*Z_@ipu%MX`7@!zp~RE#NyY~x;(nRR=t=nZ5ptMl>mW}kYK%%LElo( ztQ3ifK%^1lwZD^!;{%bpVHg%fQdwXw2Y${$bhDGHCILjElL}$UxsZlPnW%Zx zrT<)$Y+-3_&iJ3-o6q5TB}$Y4` z3^MQJR93$rzsJCtGGS$N?&Dw7Py}kgRsr!|{@N-Zt34C%an%A+TN8VrCgnf&V4Xo$ zc58k#`ktH~3Ag>>apDTX6yUmb9%0Alub%GfMsI)aRm(Y(BnAQG75m|{H}_#bzx@2t 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 literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/multiselectionDrag.mp4 b/v1/src/simulator/src/img/multiselectionDrag.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..6a193d8e5bcafd7010b4b8b533a39045b5250144 GIT binary patch literal 79933 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�aW!}f{*=(ph63# zDnVYt8W%R@(^jcw?nq@$dT)qqEGA;){=r70YTI=RlV3Mi)>q{mwm>tK)jmyVvp^3% z)r)#XW=h)b=w;jvT=njAjF=Z0lq|-hB-nC0J=-kf^@zC~l=1V597;qqG#){3~cp?1EKzP*z>^jv_QX4#(pO;g+RZM{* zt@NpA8~hXus?{pZHVVgt=EqHK|})@ZHAogJhP^`_L_6$GCaAPiKueo zj(Cd1xx07Ad@vPc$o;LLN>G3HM8=OU-`w223qT+#T%JFLJkpOCBFLBS_Sg>|#cj9ODHVINg$X>h@H$Q=$N zW_pc8nwTddFvhUe5TFc&0CzUriG*;{cIIae5TQ?-s{QqY8>QY znX+BCE-l^$9}X7{9worP*egCFuJ6e$46@Q~(#Gh@j}`ll_0e{9+Myd6O*+Jy&AZ5xcJY$yXTg};Y;_(-jSM<Ui3^UL~|f}MMp}+Zym5y z1s?eAP0F)RpCv7G5A1C7Ua?A0>DC-fA=~MX>7>TG2NB-IqW^1uayI`^@3&x{81%+Se+CdU!VXmn4)yIx z_`W3anJ(rETa+Sia81o@NMQlt!2REnAXbEJyi`PKZ5g2=7_j_1VWWZE+2Bfy+YC5AB-SFoBm!uEFo-&EpFZJ9MaXFTC#t_nQeyY*LE> zX)*b7QNh;n=(ZJr6U9QLRkqz)9?|A_@1>agTVfcs6V6xri<;8Cwl0bZQ-5%Aamfzm zwalYTER$oGNbw&nUkjD^NX9!awflT|=)2_dqMO$FhDkVktTL>FS!T<^xcV+RNwTk9 z6D(0#uA3rCv444q;GZTrY)e3KVFGoYK>JJ6T5b;7(Q4&pQR|-_!5-<$4Hg;T&jzqy z0?C|&`kdBR|Joe(*Bo}?hIzhdC3H9IjR27Y zmVOn^hH4;3gET&=atj%LggD|5!cmG8*AxAuh$b%Vg6xp~)Vf`{M$@YDSFVO z@h{&EGVOHUw+{V6%ut=xv&p*S-4ecl+AW6^y7++w#Ru9hmc&b3sJ){$dB1;pz2aTh znmJJFd5U1D=m7%&dl*;NWS;yBMgw$N->Fkg!(^k<*WeqBrslaP@tu~b3o*_IQ;vup zi(xXZ95aaxY_WCjv?lwbvbn>7-~}GE)ZVqdE?R+ZIeR{IAIT6@Pir1{Cx8bVw_g=g zeT@<9o=s}{VVuPN#KG+9mr?4rFm6&8QpmFZ6f`P&j^$mb-q3ae0P3MbR?fgaF z$HwPVHaI520q+(Lg6pIBy~=|n6mzT}po!?*FmCKK=QvDN%D|6n=@fWGC>=A9#jEBo z9Pedn(toWdoW?1Y5C987vL?pUv@qSOA=vPrtvjl*fZ9QBNA@>k3m%Kd=jSmVCKu$$3D#!eysh180j-&kcv zypgPnw*rl*0lpDI9}O|ZpnP@d%#^v7j3|G|2%5aXWW`~x-e10h5bwC}EpeNt zkv-c+v6f_ETEH5XN46;9?ySb%BHOMqZ76gI7X{9d1`L!^bRD>2q{Y7|d%#1^l!he# zAeFqWDq5^J^>o>1@#A| zwP(viCPMF>tSaN#tUym`8MFlGU`hgc2a?LIh^98(1dx>r@gC&z)l?hJybom(!=-{#Jbsr6(`a6|yekAFdLkyP-F zy48F(#7)>(A!kN|V#Y%nnGtR0kWfIu6;3A^MXb+2)@+_B9Vj%s%$=1T(ETJ_AN8_J z!IQ>+LOVg%=O^Ipp*i09F5YxH%QYe2)Hku*CSChseS?B3Mxd_^nc0b^CKmNr)WFqs zVBLf!mp)hTvaW^+ZM}8FX~d=8(LM9(qR9U6n_0sH4ijK^Zncp=BIY%4gM@W2Hf&~ms0y3hS3N-MXlP!<<2eN^b?y;{ zPBj|yEIvT~#w_XR%X%aqZ^CyBS&TpuffG2bE zio^aOfe`8SQ~~ic>2Mbd83=bX3|a8u>!5{#+LIlYK#^hz1pe9NyhA5f2tXHswWyT=tt!R-m}EEH%8yR~WDC?k#pkEwC= zHlFty8+il`Ez4@^1Rb+ouJiEnufGIC-ZsKauG=-T+1Qv29Xz%g9HWR=+dS<(OXb=4 zT3vweJHQ$dVi3q4}pGU@Xk908kBn(3^`P&=%?GXJ4350n>4Bxg=>$vSg z-GBOx+1Ap6bIYGX`o3XjZe&xo9(5v(;1TYCK-HB948ht*-knO)y1$CpZa`K+!L_s+6Ps| z+~}F787C-a3O0k??IoSvnBe6~71j0P>UBeto_iz-`W};LIu^9i_~3vMTFdP>FH0nN z2RMKRp)FARPC50F9dlwQO@`~Q5n!QRX*H{eGfJvh_|0z=YP)BR$i9t5d| z`eOPHb)W(kv^X3jl&R6*L4e}hiT6`3z!@Nf)J7;6Nu3^phTTCA7IpybhZ&BGXM5@N+H@u?@MSNBut+-^I*q57H4Vm z8U@81L?&3jef=ij*g@v?Y{vOm^0fQ1g8G?M-hW@BC!E5PUBUqt>=XL}0s~yBk5?$) zA?;f)WOqlPGmL&WL$(vL5LvoL?%`GZ3e;#Al70)43mt($^JKOv&9cq6@?_a3@! zJ|DvuRy8Jx<5Fs|4iahLF^HbX|7-M17(3#0`Io9&!deA4=sYN<8*b7u&%w&1+&^LI zMI>evj)#08x!JQ-*+w*?+D*%_!Kh1lH3J_za!h%xcXm&9S^=tCVlSV-h(?!*oInI; zl|j9*lsxw}$5-=rju4UtgfN;sDn#-lZUQa=xkF4Z70si{SMb4r*^(1}Bdx$-Wlybx zQ6hTzPEo?Ynw~Ehe^dP@(fU@EYt{*fDi#(qqNmBym*5TsNpgJctu<7)MUEPw9-t&U z`9yj(od|5Hdkx6R+AX}o2kM3(FysWd$ZJ-vH5-M5OUP+k^+RPS#n1gkC0%{|E?yvuxvR9#Gc8 z^wwTXqqcMn16SxkS^v9nNbZ+{{7zVj?GC+DujLy5%QI6n+jW1QAvc<1J9FfLj6nCZ z(42qPNUUJpP~iPk9%lHS~H+{a9IxBJ}zw_an#5;*$}T4OTBdD=n)qHW-iw4(}Ra_pwoG%CXi5Xe+AgtFJm;0gUY zQLlCxX1tT%j3k-@@`2fN;WkEHs~b(nan!w4+0G75?Fbk(!H!KzQVYI%LMbFM^n7kA z98h|OYA4)GX_sOS{!%)}9-}ir>sKJ*;t5IrXnE88YvjX3_ZrPRQiDbkNwkI6?BN4* z%M8f7oPCcFH$h!f!U*m8TSmcrS|DHIDIvF14Ms{cfW^VJY~{Ktu2rQq0jidj{EQ=aMzPhZ9(;v3V7GIGD*D*? z>_&aZIAd?`t<0I2tg#i97uiadL$4}msls1G^yu+)Gud>TD+{N8@fUJ_D>E_~an3B9 zx+I2X%ClYIOY!~IKy?s@bx)twCYA^&mg2WpQROwOP!&#G#KO$a?A<2AFhoM~4a)buH#uQegI z=j`ZrqDEjJ4|ZxP^QuBlPstV#e!Byz>R6zbE-rqXl)JcZGPZ7Z$&IaV{3q~6o2qC1 zT{2!L?L_qgVaP!(Z(^!j3ayDV76&c&=;9w!(7GRPpevML^0Pvstds4$>_#)WCSk|zKgHo0Ay&gpM( zu>*1eriw5q(_{#*BS@+OJxPh(#ix&3Jd1_dH0QNge#$Dcw%vQ1cDR7Sni`g%8U!CT zGgOY<%Iw?8hp%1L(k(S$GVKZQK33clp@+tbk2y+@i}bcn`h; z5knkmptmyQSG{~N(2IBE=$9NUUo2RTxIP&(f5|$J!nJPUY`AMNsh3#n%_N1q{5tJKN;mCJ!25OD#VKmOnD*7*>z=G=Rh3h*h-6}}P1N_NcFOp^{xx?|3h_Wh%Q8?n%{ACr zIWy4kxWaW>EKnjSco!{vHRd7IxQ%6wKeFCJd*2p`$T4vTX_B| z|1OBwO;n!5EjfkY^`)i31xh>oH*GOOB&f&!Xj1{f1Hz3iBq-}?H&`rkR9RW^arq(r z@{zH1UsWO|@DKJVF~kR-S~xYjCz{qT<(RO_zTnnvLW6y`C}v5JG@cADGcQL2p|soC ziiu~ly@qI_&vFcq{Wik0@ALA4BWz~l(;GBnHW_XUr~$Dtu^lMH-uZ~jF}0mWTz>lr z2A=Ob94J6a6C7iLaj2=b7IDQQtBFQ{X(H%NZTG5SBf|QP4Z+tB-EgRH#|5it_F|@> zh`XR70Dl&asjFyyGw|f?d=kOX?7~T`5k4mig)7ei9|=SUL{vS0q+;Wp4jpt>w`N~D!Rt5^M`qvL425}b3zW!fO0{Gm;By`S~ zS%;a8ja68~yt#M{e#lP5aL|355IHbpLhJ8%Ay9h3+WwsD1#TxdY^^U3a*wv@<-Ml| zjM*!-KI0P6qTTfbQ~TuO-Po5ZY}W4{bC&>kc{FB#~Bbe~=Qvk-MnFB?;$ zCv0|ET4%tn(_cMeyeg7w3)4MA4S9d7?VTepz{`4IPHTVG<`F<}wifOuW3vYRGarm| zIs%7EsD9xA{LXMmXsbU)v1KdU^Vk*0itnDuMMF4&y>3q9P^u$( zG(r-0sr`oII5^$wrTlQ=aEZ?SjJG_x4W6RzyIMr8US?$L=OCf%E?@Y#Wz&#-wSc{K zP=^>b_cx^-<@;O$=4r<48l_eRs+Ylvf_2-GMM>`+>8^ZomRw`&bx0Z7F?kQObk6z- z>WE$9)KE(asb~~Trq$5HDc6Lk%k_JD?cJ$&sYl0gL6qs_NVqyHzn8lKc`MjC<{qy4hN%`tD@NE_gCjB{HN*ytURaB7+fhGKPKrQA7Vp3hxT(|PSOo&G9+E)CdkMa%Ix zIHrtJF2NeD9@9=!pADJ?7V<+tzTf`1n~e~0+%1BQWlet*1@T!Z$3rRX`OjqBIa|7k z<6N)k$Zs^O&^{FBn{6*^iIx|L8&{gENd!$9QzEWiRdu-}qvk1naYPXAK$u|1w!eib z$aMEq(dLVBAw!ZKjH;{_AmFShU*u?h;Ub)3W~a8P`UfdGFiWAL*eO@pN)ynqbJ?#FN zW)s;h1Fb+$K6j~jJotHk{>0)k{JcLwmr*B7Ey^9R`Ufm@WS+9`N#+BIPQmxGDh7)e z^xO;kKG!Pb>JlsH>OfpRK}W#)J)$Y^qW$Y4R-&@6NI0F*$|ElIcw+p9GoXM}?@ST`ro7{4#4}gPKqJFBMD^CGYC5sP_k_SfjQl-VjJ+9o(n&?TZZaE@}N4@k)j<{ zI(ooESYbvkNO<>nyymWgZ1l#OUu?X4%?ca!C{zE>_X`WyiQi2r3%gX+xKf#e5U;f6|F?f%9B`HWfGpl+mA< zdVdX!!EyA>NM|yqxCZLy<0PRhkN>M7G=aB3GmBAQtivuJUc0nU1HtnwTAoox+1d54-nJf^*8;vW>ZM=TUOkKssD6lhWifcdYR~{X1c+s^&i}8 zHlmH$mF%>2#^zfSkNZdG|G9S|(^B&H%4sjg%0RJl-Hu9C!yqwop?#TQy%goo1_}j| z_)p#V<2aD^pP8|r{Q|r7d}(wnF3q9oLKCVM% zsgmH1{EEto;F-cWcompawkd~^y!~t}nq#$A(NY?bqAU_HXt7@Wn>TQ>utJTd%dX2q z97Xy{D_oh#6cs=U^Odn@m_TrXDH+V|_>S#o>2&wf$0Pm^^Yj z;j~X4SU8v}Z^|B=a`tC2Trb+V`Wt4{jtCzAj~J7U%$SyE&wy?Ou_7pO0Dpnr(-6zC zA(fpxY>uY=^AQPzml4YZh1KQe(n*}!XinDy+E0`fC?q%D`qMZ^hFUThCKxr>VEZLH;p95r$#=@fl5sw#wx}De3UKu$G?gp94 z#@9!sr)W>^eOOHDQnjfig-F@(U^Sguie(Z;2-y`L3T&AO`2|mFnMBC^`1|kCNNE)f z^cqrfT-QL3Q#Ock$09`d?g?BxM()JKS3eCMQ??IY5r>qf1HKSqnbK=>@X)+&-^ zWVUdt)&~wUmX_&$!gCuUU;kL38^|#wcdNM+J_yW?r5|6W3)RSz%KSM6Bfc9QDuni? zb8<}Owiv_%o_tV`&xSmc!UOtO&IW-uK~Hx1kqgGG%GD}JVB|5qLHjoA*sS1m?hv~& zTO0C{Su-fSQWx0v*DY~HRm(;8oArElEWH}sP_|rU#4Oi?(3uLg-@F&+Ey%wFXv~>d z1Y&vpm<<*3*iWE%92>9|Km;Hpl?G4yp2E~8oWGW`(@Sx)D3&Egd6^g1i&q_~x`!+9 z=*aqJ`dD(A|E?g#J{`V`X8-{q2?=Fw{I^t8QXc)EgM#4UiL35KNf%ECIPJ&ygVc9`6s`Dnv<3ikHer3aea9mVeGR(aQ4rygmq*Gdo;6=ryTGe1 zEZ^J8OHGUx0XGx^xUh~WCf?r+ zfgYAHN4>>`l&8;Ff^`Mpg*b!DTnfP+*jnH*CdDG+cIKboFn@ek=udO-n;&Sp?z@_3 z)7ccBu<_`LHy)sWxzry)>O;{6b)&|3#%S)4mZG&A-%-`$)0C%mVH7U?amtAKomSGy zR9ta$KN%P=WHMHK+GfsN_T(K)MVmAa;-Y$2*WF(xE-LQJYIrEec z%Ew!o+wf*Z9wtZD@*Nr6f80exz0JX>C-&q>|6bwULN3;oh)AYQEEdgx-H}dSO&(f6RGw56F><->D8%;hl7=(MQ6dT7Y09B1Whz zkU|1%ZCtt$ocDm_U_#kp@w>lW9wOuxCT)u^{ec)^>E4WZe~i^pR&0rR)3Oq0tSwL1 zZ&TU+@TwX49TsS3ca1Wskd|_nb4^_)sJ#a$JMy)A`WA_F_pB9%qVW!mdk{$=EI+E!X99<@L@BySS>P+f;|Knkw7mT7Q=Am zxf~^=z>Hkc_m^vBZg^r|fI=mrSKK&gQ9E~y2_B1%y&#WURZV7f3Y=774^~U$aHQk} zQjlDTfuk~~0}U`IbWx!@zWfIH)=kpt(R*VMpjo)IGVPe}<-Cj1q5dk|L96eO6W!)a z?c-}I#_Wp=YjoduWqP6~RR%Vb)t^6YfV)7{@cp>q)$wgaIvv}j((CoX1ys@>YOnn3 z6|~>po&vG*`-w#?$06o~6>MprT)PUq-z)W~IU^v0I_kb8j)K6MaEMOBPa!K{KTX*5j-_U@Bzfw9|pU^ys<7^3KK@pm>{;R^T^ z8bQjCN7+@gH5WTa?aIZrczi^o@Pq6Xa9Wa2B_0tQ#2oxr9dwXr$;znSDDj!qtOVU( zsav4>L{n^-+ux!sr|8|rni-Ni?$0lw+nU&X?7bFEvP$}St%Xq!rAmH^H8{%ziPTVD z#?DsL-7PLlpuF^;|JbVXGc?L}tB$Po)EXtG1kM-hb1lLXgRf@6o&?#@-W0{yFQ18lG|;EPzjlWCX!F@;nrME{K(t%W^tSU0!h*&XmE);~m> zJLeMBf8{EJSvbyI)~bPA4@ml=N7GF^}nm(^~mA91O!f2J$Ei(1E5YZAwwBTUuZ8=)4As+z4cfqO^g^M-D_|L{fo86*mWqGr|TVSy3Q@wCesq0XLaO#l~p_KuxKB8J_j$3^1ej-k~2Wr{(H(aGY@ zG^e(rqwMPRRc24J6AC1GT){Py#}Rb)ddGY~^PvJMm~qaNcjP~fKjm@9b4DXcn5N4Z z9w0W_(p_Gw70C{B_998N>38;;Ca7UE{S1er|?=lm_X(N=F*#85}^a zD_pjv2;*;3`!VTV9GoLU(bBU;Ejbtr(iz0EmRo!HBv}24U~Ww;_0%Z4eXircfFG-k zbgQmGJyouh$rhOr7MUCJ+;5nq-$Hl?7IcTC+a}!azzR02?KoR*UhF~VlOC^1@p(!_|wbIl6stQWiaAFpDifJ>Z7qV4Np^F-P zhgza4e0J@>{l1Pe5!;2Ei5?~wyye(L>p8Kl%%VJAqCQxVc;Dx(8Z;qOy_7m=s0FL5 zd|{cy98U~qK1n3Uh3md=u%JVu6OFXkX|a<{mn8Me?e+lplNZ(s#02`C~&aFbsLl1}797mSF7-8Mo+FANt6rV4uDQ;;`r8+1GYE%iac%hDsc=wh) zuJ14?Du&o>|4LnLO2v>iyD&`q1{*W~&4hKoaTq9Z28d(HAY#+Y&5{C{D!l2++63jXWCy^#Og(5S5COn1$Xg? z&p`-xG+*HAQy26(yd7DEfUc74`9t^~e{wB}`)_7E=g>=K_xQzEcgvs@4T*aXeEvMq z)s$`R=j|IPJCAWUA>Qb}_o)F;sOSSxT3}$W)3kCgcDa z$Nj#^R*)lBRj==!>wGwPqgY^P+3B}qDH#zs1*y3)U3caf8ygwt(~fA>C^&w zw&|J)!%-$-{xP{(BPM08<7CtAHui)dx^|IU?O<47hm?vVdf!6w}ya6Ea% zhQ14|==lp%_0w|=K%5W3^jS_gUrn7c0&?}&GOvm9+Vyk8aCSiVNQOam-uS0vXkIj{ zu>G~;4l99`tw4oI;Spw}dz1?XOf7Ry>6lq#-({>t(PvW@zaFuCgur|D?D=x1e_@H` ztP^t82?e$bg~!JBtR`P&hB^I6&HFfUf#CYfH+F(dY|Z|q-@$Q*s{*LY&}p$W+3lA= z#QTZOA2m@5%So#`Q!I4nt-JHRzCb!bDmW}5Oo62<##sT&B4h;2fphQD@DNH1$bK!gQ9|fn{(>+Z4b^zTO`NP}1fU7WhF0z^1#Jx` zph0V{x_ss)I_Md=9cz5uN%)~h-=FVvO-hDW@QzAazpg6M5>FAp^Q$hgsF4C7h_R*7 zkd*@&I2LBhF5m>v9l~H<6#s!Bz`*ghQI$}ev;aYw+aCAwS*ku9IY^d3u04H>Ijz36 zJ3qDLLbLaqkL1R_Umlqm7RokMI;AOj%l+GMxZu8$16{!!x*-p)v(_FSt=Wo`%e=BN zyA^EPhH8ylPkQ83m79}RxdTGb6wOaI;4SM$=$qggdYIh}ctr~Rj*RYAKwrALu~ltC zwZ|MMCH&mht{ToRmyZR&<8KF^X;!SCo-JNOx`&m>aLXpqv@Rf0ZZcjHKTBQ5w+vh% zA&^}K^oNZjd$Nz=4`7+h5-moM%y0oG91Sj;$v_s&o z$We@?X!W_tRL}N9{LME&P5Zfo_It~B&a(v^|1TK;PRJV}MUQH$0{Mk-?ftc9K&lh7 zqTSN8jJeN$lS#2BlVE3}UZZOG;WME)M@7$WTOar(NI{^!gpIU)nh8hHGUb4QgZ5MC zXUNoD#$n=nank?8u$tzAGoKbHg&+du1l*M zvGVzJECUQQCmjeP@0MQSJ1#EzULhm-9|S ztB0YLR8@;D-d%K)Oj?3+{G1>0VfGIJYX;7H`ypUIKvVF3(IdG4C~&4_z<8~vUsX26 z5MSDwstY|@AY0!hLrOzDuE+(Gyf=;h?($s8rH*sNvp%rZb4hC3`Ge$Dh)Ja_VzoQe z8k4>r@~-4&i1_%ev028WvwmXgwbz~wd(O1_uqWjZ$|?gSW#~)?GCGzA<@GG8PK}L+ z9#c~==1@`wi>uUU>=eh&fItR!xKRi zg|a^Xt5}Hsu#YfwTOf`-M|Adg3eob4YZ>axu5+S$*52gGO_T;fosiE!1NWh)3k&h_ zir1f5<)z}3u*V11EJ=~z*8}U9O>u~RtOH(Zohs!GcBO6-UKfsvNgacV$MY2IY5fe9`?@T1K0CcUt-4p$J~zuw#6Jy>KI_Zk>VL69&3mMKnBO`9_X7?k0ewi$GEn^c1i zHhwW4gkxGQ0&e^mCZz)eKx0e6_e~7g%4fNdls3-S+>eF~;TUO_;9{{2bUg8HzODwn z+G6U7y7juW#V>abNbt4$^zfY}%;1OmqeB#l`>UA5hc6NkUi*Prl4*D&7&9}R++GC^ z2YSEIGld=XH~(LI*8$a3)20)upcECPLnzWa2!enFrB~@HB7ub7gir+q1Ox#Qq_+r4 z?;Qc9C@4r%1Zj$ZQl*OYvU5?tzWeWY_TO{%?D^)LC)3_}+f3%ZN$$;1i8i)A=dYQS zvMr%@tAtGk?Vuzk>u!8Ld$^Y%Q1$!<`*A+j5mstcocrm8bnJi<`~+F(OsOFFZ{to_iMN1G!b*ze(2Z;L z1%3MpCaqdCdCBCqZ(Cu*mFo*t)sMCkqX^c9!6_U7K+Xf)t47u(niz4s%SFns>>|v$#+L>!yKpqx>4mGFEzDCNR#d}gDif){PdRr~`(0hMSF_7SrFU!0of;@gayz|`b*@`XiXJj_ zyD&2vtv7QgULA8O=Qv^8b<0`BA;6-$&c>3v*_LA>m7{ZJX)mWplEQ1YqYwHA*pF2mZf5MIIbIC z$$YZTDeX1Ks=e~m!zcYdp+lH@lu*f@8&hM%*|npeyqDD45`(L#Vhg13@>1!V^ov>y z4i`U|a!W64eS=I_H%P3JsrH+enGo6@-L5XtT}LtQT=`7qZ&$V`R33B7tb`~Pb|$IB zRr&4pmNtr!nrm0KcT(ud3(7l0WjTYoG8N;#ZGle}INX~`tgDzxEnjZd<=r!{U)Y_j zDRPQ`ZWyEbIwx|V+$2LGt?(EEdwC0)vzer$m0g|_ugjitqR~%A<30DWlC=FxgCgRH z_8y#vQyW2NM4o;L!?rr&V~KD9e{Vzf)Qb&Y#baz3CZg#*(^zRHMM1lk&=`NPpkE?! za?p=de6Gpm#J3;ek;3Dy6jmK0JCgjM=HB$(q>c|d90aR(E=vsdiFn+OUUGnIyZ9@G zoSVVv8$8R}3Q(d@(r(i98z0&1nZOs}>rP{ z3c@LAF4YlIkw|S!@)+tVxV`LH>Y7;{BDi4`sJm!)yZ1E7CDVDiOodC0z?LvL?#jW9 zM>8D#XnV8!I_FLhK1pYN!|)#OM~=Z)!(p}rhg{fH8%Qw_&mh4u>PfWY^HtNPfCYX}l% z3c5IUlF_Q_kVkd|vw5isNOnfiBMzCYiy=yL3a5#K3a6Px9;_N(^TA^;_;$uB_@n?e z+<2vru(i^IxAddXz*A8!@}(NLDU{l1r@)G0MO^T4B<9oo_FeTCc$92&L5;f{!s41U zN@x8()|-<&VEwRt%DZk^f76_#ew}QUiT8u=mH8y<&n7`A7m|LOBOwC#$zESRoR04z z)1A4bllY#(1UeCX3z>ZW$M1s;TgD8El?lr_v$yFL29n~VY}B}zLW``eWfL8C!j#_S zD^4=0?Qhv^*B^Oq_3SM{`4pOXe_qi+!LHw;dQ-BDv+;^#E}2<3r6zePEIK12?EaKo z*8L@g1dE%yv4dZF@?S6dJgZN%^<`;Dp`Dk_$l$u){*6M5x#$*`5UuRscqhRcUKetI zHp=Z`bMYr<<19kao63XP$hn@KLb8iy@LOaGJ+hxRNgh(xt&8>w`>tf+S;glCn^E#j zXrE(Uk90o@Wh79G~~NjlD+apqBY?wS~o{`4@r}(GTZyJ=+Nb?I$WY}P^8@~Qq3M~_Kl|! zaNwfk6y11YS`;fhGSiygHcaEsbkZH9HHy+;g=|MREx?$Uwe6>@z(rjJXT8WychBA#dMy#dF zjr&OBEVvA_UCtBHH{cI2aG1XxuzPeuTSf9HE6R)*pLt>XRVKg17zQ;V#eAr>sL>>$ zoa&?Wq-gn?BXw}brszhP57eu#x@WIykGbhpfL!s_W|IbzfiKN#DXy?%F`QVTI-lXSL2k~wTmcd5Ks z*}0QUn_#TUSUaS<>;rG^r*Lg>8O%j$$EbX zy6&{e-AHEN%m|wok^`mq!hHU!Bt%~KuAZgbd)Hfw$Z+DHF<;4wHzFKfvy3Dhw)LSq zd_u^Iv#oJe4i?kB5m)A?+q7{9kL`I>LGYK=54IoLSTdj!3VPu93A z$TIZ$#Jt*b>lwj|_}7N5G!<%LfwU4vDKIlm;RN35SfV+)>EPw)3_pq!;MZ;&memNJ zZy^t0B|Q|2o=oQNN<%k5?M4Q=CKO^W?8~rVMSp5?H>;n}cs)aD`0h_c>C{VHLrR(4^>%V|H|6lgD8 zGa0>YZI$r#GeaRiXGTZD46D}aU8(ThKr?%j3&RN`tX3D9RaKZXYmb8<<1#Wi+W z6-JHDeMs(%MmD6qIs4F!wz6tq7p_|fy=4x6>#V1pg zh%Sihkic8JEoS?%QZT==;&m4()M7ft!y?gaYR1EjeRMXiu%&y|gr>k@OFdvcCJws}Q!a1jEYtWJByWmN0 zj3(5LAS>`veUod%&#Ez(S-gwBDcuG_pfDb z{yBol+zgD%jgMT$sl1F-y&uZ1cs?-x8vH&AEaW*PE(nCl685ukIw z|5oKzoRc}>cpo8R$xyf_#`v9FdL=F2B=_T!_vxtp^Mc4hP zm-|0i^QB>RK2q4H=RCcD;JwyD@pv`BBt2E6j;^V9H%@nRL@*Gk>@d*XL#sY^eY%i& zVR>wX$RW$Xo$aX`-5Ih(M$QErBWKZ=X6>BhmW6pG^=oz4+TQc^U1@kDeV#9K#b8W)!q|Is1GqKqOT-$2N7Kmv4iP^^ zP?227X!OG`FAuX!^6cQWOg|TTAM(j)FQXY)xic$Grf13*3e77FkS}#BA}xPzg-#G)^ba&PugL%shCmp*4x5 zCOLfP13^`&M)0W~9a+c6QG%o4k!{J#imG@^kBFKS1@QT%z23%*61;n*7$><){-mA( z@NPvWcl^4WP;DE5#{h;t!Daj%*8ss_pid)2U=6~qCOFXu+ucqC7 zMzUYo-EiBqAWocBR>nHSWtQ81=Wg$OEQx8yN|Ix84FMAW<$XV3i6as>3oTsw75UUp zW)*3UHSgz_4M>&!ci?m^&AHmegpca+Iu5_?_IY{Ak?FzM^PR;~uP5219V&GXl6p4D zlQTs^V=+`rYVRm4deFvO{%*TSbW=dt!-Qp<%sL%2+echF7|&&GPW;$Pv{K=Zh5WeULPsfIZ_cr7# zYV^GXV7NFu?J$^DW)ej5HyNVb&s3Evp0I@2u|~!$F=m4y3Y9zVC#p4?BbmB3v}RZw z)KVy)$KM0vu*f9x?^8ylq5TyBow|j$dEtWp`<-l7F#%?d<~#4;)iNS>!wVyb#^K|G zt7pbHuLyqhUO-NDzUx)oj#VkeWdw!CKiA4MO=Qh@{<_~`^8(f3i{)HS#$r1HcwK$B z;m4aMosCi#Owy)bLt?7t3b!m@H->lK<2B2d z7n2O@W|0cvmBX77R(rDU5zC@gasey35U#>rps*X(4 zfgUYkAkaA8b6dvsG1(SERoq41_H9 zYI}3$7E1}`TcBJ9-o1*XO66P%2kaE!X-;4PFqOMtj&-{!2IYjgtmzEhPenVN( zoNr-6J9T%H;z)tZb$p$RnZ}ay8}H+f(i2owcU{(eHmv`CwE}Pv0(TGszcMXqJB9{H zXQw))JVy}nw^LYJ#`L1a1vdP_>3kCdB=p6Hp5lf~cfd`Da3N%p`}g>t1bC0Wi$B6~ zhki=lDLSlZQje_Zjj7YDH1%}zHL2n4G=kt2*`!7)_O;J=VSL8fBrXK8Sej>~el|gy zZ{v4&^$-jSVr0DjY47&f?;2=#P1ci69b1X49o3bixqA`<1#F}Td-h(2s*~1(+uO=3Ii6ZIgD#x-Y(k3*?tsE z-1^$gj5BFyfLvUVCH5$BT&{8mWqPf-d?kSKmJ;LOU57op!-o2i`!e zpvuIfFIrr&T`0v|B_aV)r`iBk-~|GA#xK%{ZEk3)!b0og@4*OzGd( z*I^xR+Mb~0^^uY&SF8hLa&h?l9E`~^bh&5dLG>-2vWZKQ^!#=>?HQf=+Vb=p7hjr- zUVhNFz%so7SPH|_%70FOj}mv~t(-$_xpR?lebdMUqpNzw{+=!qvxai8^c}YLQ$$7W zb6^ZO-mCJ@lRfC=+uW-}e~%?w;m}JqS%E}7%?O)WciOMFOsXjc&Ple+*wTi8(F(|< z+Fy5TvV1}l7>l4OmHhLuUBR)ihn@0Ir|j*s_+2~Cd3*W_jO(@_B_dUs8V560-6$vn zUc0CvBLNp>WZD4ODSvfEpDw{{<5-LopLnA!A|vw|g^3L&YtiHdY42P3;kXkwIli%E za9`LDdy0pued;|k{zJFQ$eX+Nim3WLmi@pCy%!BOMKeE2+4i|_lMJYLtc%!!S|?dq*ER16tTCzV8eIh>HCfu*4G@1 z1#e+rZkVdi*2^qty+!A=`BCcdH5h+Q@w!3LI^jHyyZ?soTb|nBrx8vE&j7}LT8Ydl zGNYa^*E;2qjX=CC632LOMcH@INS|rYdV7Q=;aKKGwD$&q&TSGC!x==Pfa>Kjg}X&h z?>o#7l#LVCGLQ?OI{Wt0l(!A^=n*#@cjnLDIYgo@V_V>daXH;Vr*KiK?LiZ?yMn`C zWPe#0zc{AP!vIZ=PSmHUlq>xt;&Q!=ImR<#`7oeQKqj+&_YJfKK)#{bTSBbg!Z-hL zU$uL{dkbrg4?k^|EtzU9@%A+>zPaLfmC?q)xZm^g?uU04N{Y0#E5D-2mUa{#=CShQ z^GS|jPIcE8D#a_?&(mGRD7i|~B)#|ceo5>T{bYI|P0nExb*;CLNvk-rfv)&CE5+MR z>Eyz%E%hmMJI#e^sgu$Lx!h3#FoqtW+f^h^{&$Weef*+0z@bbA_LzdQ>8%p{*=!oE z)#BvWHKg6li#GGgs_Ac;#_=z_^_-RcViqeWD$dd_T~Q*sFYbCcb<9nT_;po%VCol6 zg~g@CS9vc{Km;!wck?e?Yyay0jbmXehH_U_-%>JX^WOG;V+N>s;5gKuoy+TB^ws_W zU!_%(kf>!XXNPa{_60!v9GPtSSDxLQMVt^;zZ1)LLSyZSG!El5Myr zL*9}wrh$pqDse42YX2eWS;7fLf za%m>8*2Z7*VH-jw^~4;s?BFofQtvFfyZRyz}(4WBVLJ^P$*i48}w8l`ayM6i= z`Bj`tjMso<yG>?p+6b6rL811+nKMHB2g>8ahA5;9J@jw!R11-P^Vuj;51+0+ zS9)BJM8Skg*SNvwyTTglTX%IG1oDAS4%dfjcw8zyx30@!yQ zG|x8SkyByic;tfph!Fe^1)Zr+5|uS2u}AOoiDioK#=H4yFcL}66$PCPuw$qsTAb{N zIwc`5H2|}7-TY$dV>ctlpBlw&M@`kJD-SfafkNrugh^Fl`6)u>A7!3>!iy73H7)JD zB0%Xq_nJL5VVb#;h&jVkJ;0`IqqfZ^F)%UCL|&~4MQF5f;f0X9X}fEEfHd})!A_wK zNxGW5iif*dPiF?(fX%}>4KMjRDIg4lKTs5X5JdHaB*OL0`gMdAj?W>F+$WLOd$Nv% z^(|kwwzeJ|Z??5C z0r;z7*ac*oAoK+t{m%=>!Tx8B<|aUUTsS9iBzzZhZm}*|iq#@B(3{iI^=c-E`utJG z`D&tDN2Bq`E!ARHuNy_#VZ8YC3`{5qn5O9fQxG|5{>e|Ok3Bg8O~;2+BS|w*l*c69 z!?|~yV0-hChuFW6f7LEV3Eg8ry$7SgV=CHzcG;avhMvsxdoylkJTpf8lH`iZALZ3Q zCw{ZEn3whgqZpA%x$_HzfY%97b+|9S&nixFQ0F(V5y8hMsf)(k@_IR|>GpfQk z>Be=B?r%LQ$s4bf%Y2vdnA+Vm_%HQ>fc&t$gOigxU}W#$ZjA={Zxa4AIJin11_$Bp zZ(4s}0Uf{Vgh7W8|5phQ9N27&bwSwyA``6LflRQC{E~if19JbE{vhYCD3bsiiH za~s&=Q(i{7Remy`A7kKhcl;U@V~jV;vmjb-?E*JyeDG z{-pm`{XfV3jxShwf7uQi|FZor^!gn?(Epd?fRcaN4(Ja-c7Xo>t{s1r_pj{!zuy1v zw&&l??|)(Hl?d<=Qt_SuOf;Qm)BS0Ux8K7AN0Q%#BdBt-F06v64@B;w)!z2J8A3!$5eFq*F zxLhlOGMGa=$S*)9o*u}7JXj<^9pJqO@+ScA0DzD2u7Vtr^$5TOpdA2;Y=C~y`ha-? zK)we$9QXy2Ee7}iz#!h@0CE6OyE*_AvPy#+WkYVnI#-c#^k^|--hx%B58_j_T z&;{k}4DtLW3D|rO8BgY7ogjuxXw<=Ah$&11@bg;n+^J@clWFK zT!rbBYl$&Y6U7BGXFZ)!7Iqjc!W?5|<0#9uSl7UXutCdm8J*G;)^t9Hv9?k1cERX* zYw25f+gV7Vxz5Uw%6Lk9Iygg`B0L@J9bKh8Ww}sjCv%K6C_~LcT!;e_teq^EssqXj zBQ34yX=ADHW0bJOvzG*#QSq!~u`<7*`7y8)vMIlOqD+i86O`!^(1Tks^Mu z#@bl^%G=RZ@IX~T3nvF5s7FXdP*@0XLm*_Jsy*#SV~Z@nbLx1CW= zQA~oKm00MP$T!jCe+(ja_8!(iQ)gmkCMFhoW+ni~H{0CV*`Aw`(ap_`!PUY9XlHF` z%V6hd#`xbR4Cc-@*54dEduIzfTPJQ}V?!fDV?F?}BhZwOh1djWWNl|`#RuSK;$|W? zv^BK$a02o%xwCLHxdQ+!#5O=abD%r1lZ(+e;vlwn^7wZBp7k9~_y7z{-%j5Xv5kd0 z&_w^gh=6YoeMduEGaw&;o!Hpi(ay$D|JxNn?Cc1%wzhEkMx5@PCdSU+z}UftkLf!F zLlaLsTOc1ZfDQm4HZ^o|*0*=EvatV;@xK8a?Dg$TO`U+weDuu3&gPEa9^ZkOh^_7H ztPIV+CH?=eBzCg4F#b;F|0$S=Z5{t-6JrY-L+Aezv9NUpI$9fklfLyv)-H~Q9{R?1 zHui?j-?H&{kDMJ1Eo{F-d=niF|KpfC8rlGzzPn|lZ}0JqEll{Bzph``zuf=qj>de(j;6#mM&FJ7udHu@kC}ym ziP+)4V)&RC*uSCue}VsJHFW1==lWJSIRowaScxs{zfbA=MtmRQcPvAP?+ftXaf0}R zfQWJd!-7G-+!-!ue-8V z$T`aBI+^>3Qr_Os?okgct^LxH`H{~`IM z+3epS|2RCXUDPKh&Hu2G%nr|xv8?=Ie^1y>ragmn0Sc|nQ``Zy+bo^qq40@` zbyF&l2__XATQq~>)H$iq4+j|*NYHn8)>^W3Tk{gbLgQM`-Acl_=d!D${w`(3#3U|y zO=^XY!)6;JLzwFVe2))~8v1HAuVlINshEE)a>%T(uHAKnX42xqnbeVLg)TNo;N0&B zcbPlz!J!Tp#A6iNN3-&+>v5NX@K>|KIIe|&3-7hzHw;3A;fvhtv$0+a%ct8 zbHov7vGh^}PPKYvu)Rri<4V|ZEPGidZ*FXKYzV&5j>qXw$T!mxp2g^62N25yRjpr; zp1;L*0}LIrjZGREs780Y9%qjTdN`(fax>4~Cl2NrHB@En)($LDrB zmiAS5U5!QarJS`(eMVMGBkI^8^c-_E)}1j45IMMgkjU^7dy|4OSCAC+zpr2&v6w#p zHsd@oyO%Tk9Q{F3Gj=O$d!gFp9JafYFyHyH*rb}OtF6cV&|uK;K4*Z{fetqh;b`f6 zK2MeUku9xgr~hkIQ|hxAzUE3iQo#IO$<IBZ>)Ly<7ImVLs=A1ubjatS?Gch zIy6cB&rg#_htbCm%Ah-8VY)#<Fdp>7XMSUxp)_Qk>Y7jINZmb_% zgahzdBOE9ql_!%4bxO<{h3rI%Dk~aY^fqzJ0VE>#jfKeNj0+BSwSoc%6%&7$pAK_B zEtyZjIaFI?4XJJzd*f7`uoQrhW$iHVij*n&_ZT35d;~J}Om>*W_G*^;O6S%?ODnDV zObD?2esMQ%P_3>PmTK~*+}z||B3K`WHVQX6&gzfgLX0$S4Wp45`g_N)KcRz>px{D~ z+xRv|k8QY}_-L?+SBKb=0Ihj!obeEz)Qn|m2VFY!?r1RVthw9ls9+c(^pa%JeNa}u z-T{8ox)5Rd)1${#7;XSpNYcIlVhft2tHw7;AltTwv+r_|+UaZ(^~ri@#q8=PuO!&B z|61`EYQN= zCP;QulZ}{3|0hMo8YgmLlkQqv&z#G({=ZbN{L%>Bd;dCNs-VAapp8Q+ z!_@|5&skCKiL9y9zUD3%4*m&h8ev!xbJ$jqsgxYms8$U=pBhCVi18>#kFY1$6E+h5 zoOr`T(7$)$1m4VltD;NhMu`qq#FIPPPZlR#aV@m5R>}LpSLew zWgSw;#wKaO58H?Djd(mtjr8VWtLu$TS=&1XK=lYkNo@VMLL71k2U9?^v-Ic;V-^Roylnspq7 z?z{l2T>ZD%6E9{-&IWa=;hhe5&Bc_!hirFoR)bN2RlsP$9sZ8yn}CQrn5xxE#d3bB z-O`~Y&q`)r4?Dm9MA%nPl=4`BtVoFvev_bh6xnmP(NevK7xPcJa}`&rI6WnT;W z7GwZ}VSpc%WNmRZ2BQH!T}6)SKPnxIW%VB0Osy8Dx3rQ{jr7w0)=2q??rPxl~T*xk6&Mc9`B2Y^x)NkhVX@AQr zo?{Ec{O<;P{a8KgPop*_kTR`MWszRW`J&5xP{qffC>7^+r5VliFc)2^u%Tm?30tAfb)W$7{!rh0Fhkjg zGYnd*r~KLAOU5|4MubevuZimvjxjSQER1;@T>Y+ zE!?0BAC`qoo=F3<>=6h;ln!|O}T>^wWLD!;4nj{)}8vV~E1AJD`yY@|bX1nBXND)NJb`3cRg zk`&!)@&O)uVYgi2o`4kPbvL*wJ8>yk0zalVbkqE}PU$hs?AG%`Uo~QNvyAz!9 zX?pP2uMCCX-nAdg^0UOt*Kn)@&hV@{^btZ&W z6TX=DH&ajawtsAU|GfPt-6#$_R@vF1QzI6b@u_3GqoJektcNd(R!)FtSWnQh6;as0 zn`|y_Ii#*QazTD+Gn=I{lC0peMSWhPT`UF7L+h;VhdxIWod?_bFc!fyX_F!(DupNJ z)*JvxS`!&XwPHSrA?!ed==WuBn#lJS=55g}bHlhD+OFDywTU-vTp_yEV> ztO-E)^|~~q*o*#nG7Bgud2YG{1seU7Xfeemo-+|tjj(J-zfMqhJVX-VAB|ln>)&na z)2omD48=@Q7UUSRK*~CZXNJyq4x3iZsScZQ3MReNLB(``uZ5xS@A?1I1Or1XD6@tuM_s%2 zNa2?#1=QQ<%XOfXfnPCDLz>HswS>qNFV+XtFu&5h&XdA~2>i@7x}z450hTkP!p78( z>x!|o8is_Ncj22HVXaau^QZXr>v}lTr*qJIIWG2G?>I!g(-~ywfke&*$sR3k$PM|p z?|%E%QR8ds`tNLN_>%A+>S>V6E-&%TgqYx;p}jsfdZEcz1CZ?8-U`*J6g+Bx(xAlq zN)|wsNU*q}=-v_R>0}vZ6LvVLcE|`(&+$wvw?;vVIqwx0`j-i2PS>Amo=%YJSArCU zGM>agPD?77W=-MMoXz(jQ?V!^@Zj|oHmPo#$f;(4zki{eFq-E7$diEvqiGTi%b=^V zq(Pjn@fLqsrK`+h_crDX+}@ngG%u)+BN9?d1eB<@P&6YR_pPKi^-^!=$Vpg2{CSVW zsQS@eK+@#ZjQ+ERue!4F$vE@;x5uwLJQplt5$QqPcp>Q3r(~?s!U*3dUuDpnb@B6P z$T{KQ-}Q70vihYwzpI${a3<*rc5_w|UuFM}OG4c{zKN2kDcOFJpIjTV4FV-(l>*@Q zv{+`bp6|}nJ`ROsxYv7N=F7QEacR^9wBGHgV9uF?H>)4WsSFU4`AA=X!{R%1YBrGH6P?c5PAvN6qT6e8b^L9AI{{AVVql3`3mh>ELgljK$u1!uj!J61zWBR~ zuMD{gPCJrMBp#;1a6eZ=buocWpI@V-AhI%~=hSchyNsemULU_()l~RUMH6dcb8K7P zx+~N}k4x`X(+y4U-z}HM(TAGlN;a(F>Pp#9g`P<%lMGL(aUzaCw53%$d{TiX(N>A_ z*#L8J%N7CmE~E8W3(4GCtm#pHx{!uV>aYeEU>AKY_p{Pm0#iW3H-U7m3@LW4v zqob6vA-q*#K!#L2AZF&GQA9t4OXv`>C7o^W;mTrkn-D;(=?*#Jmj;E^0>k3&3fJBG zJ5y>MJD}e$kFdQlh?@$?Rg-UNk76jba+q2hA|s&d?Hld1*>SNFVppR#P#g`4^#8;r z*-#np_{TIZz9d*_gwVitTviZ!&2MIu!%SSg`+zuRLwN^r93{s}+Azaeg2Y*c;bpij zD3_&RmBBI!!6u%`#qF*xyae@@)t$f>XD>a!95nP4?8Y($r{RO`E1{glzZrS?ET!Jr z7`76eF^2*Ia%;a`#nX(N`<(V?BAVm37sE5O%z6$_zMBBx?^3D_jHzq?6?NI6QdatHFOt#gdQ-;bUI~R4aroT|1jBRA|!}fr8(jsoZSw|3+ zcS;4*ZMcWtkeW>A9v*kH{lhQRnV?pjK-cT>s>dtP*!Z^nDmWO|1*U^pX)lbl6Wgud zg~^&*&338U|17kl!AHwCi4>j7L;I~b8dcqk+kNH|;=tPwv~ zZQ*R!gbqz&h;&E_!!=M%JaBAmERextu-+GeBpClRa`1#CczYn9hr!7v$`oqIKg$Pf zpzXItK+54+tKf$@>O7Xkv=gsN-5DQ#nqt{eFX(@UlTsEM21zi;g~TKs7rEn9e25yr0DO{E83dckT>K71es@!b}TlF3c8|yGZ{|m9|acx_XGlwM{tJTc&0U+jhg*L)YA>Ieyf_H&*h=sFIVa{ zM>?9`ny)+Kapdq6a|cWB-W36G&P=LD;^WW|-O*MqlEcy(bpB!(_|epe>&GCG&n*>x zr7t9BrP%01*x_Xy>70Yo_Cer0u>c!vII)-l$FMQn9fLTRq| z;|Ao{va0dw!dsi;mnx@`4ey1c9&%#g41)%rt04BQJv^+$c#$$E|3|HJec#yZLj**> z?&j09C-wbl^s^CKay?vKBA-Oo@!MAgGnK_Iv&*7YSCMF-SU=AgX&=zcswQB2tEzk6 z1V!0G^m^6yu`HrT9Bw$#|H>E>pCKVQh?2<8Q4kg90u@RfCH1|xT~19pWGxqOh|6b+ zE>eZ!5OU@aS=-MZ8`RtfJpGjY9QxVFtOj{rK_6>x@ArpJ>@nxV5{i@J3uC*(EpyJ> zr&tD=7PXvl-)3 zHV(tlKUy|XH66r^4`AJJR>Kx@)hZZb6jh5QWy@|~L||U5N&cy(1-Y>VYz#cW#;fAi zY+@Ma==Y>^xj^dG@80Q+V|VI_lhl#WuLmfqRc}@m)+y6a*?@Vm{fisg@Fw8-Tz0x- zT~*g2C?O{g;D546MC2L*&w_WKkQ*NELqxI%ZyVc(=W6m&=daHDa)ydn=r*c}0@o^( z!NoSvsq(8*zmCvngH*uX0OwvL?u7Y)i6y#rzw~Pl+P`6AgK(i@Ue|#4tFrT51*~_P zosijEAi?^)Wilg%9_IkX3;$x=fH1Je%pox^Dk=2)7Y%r{YYvl;9zm3%oCDjh{_& zcuP&#O^D9DfXV3$#P0_{S+8jqoQ5Gr97byh6s|zPVCLeJ%;gIC?^$AUg;FxckPr?0 zxReg)j&O#(`1MmtH=nmGJ9TtIy1d|_aL*>12yO(Y+_K^RsRrOm} zHE$YL@7vu(&F3bPAmFlvD+FMoOwlOufwY#%b)=!XJtNOeF#z($JzJP+&fu+I<-?dQ#OjlxF`o zv_5DCpHWIbka0}r&8#`HDXCcnX%XwK(K8(X{Q(<{c#cs?It;b7H%pn-og0}DK7J&+AAX%OLx8gJ zz<8n%+gR)zd_o&ZhUUp7c8%W+*(uM6EQX_xMEoznV0H1$9TETW2X*7AOz5)x>n4Xk z4**WxfeheX9y!J5G7PHI^T{x5!O1Y7T$cP9Qi9Y~iOLKiVo@%wm^8X2wIKIfMUJS{?-pUawjdqXyeiP!L}AJBZOE&(_Vpq)FX zd!lts%x#lqhw$l0lY$I5_X+wC%`;hd784Eq++5595hp9(S z`q6xr+*IscPY4UibLkU(EW#dUyy>9gPEUUAu3zoX33-YANb#a(K5GjK+3P5&TK55% z4Am?}eeQPEyEP!m6L4JH&Ki+aD4FM&+PG(Sa)tx~(L5KQQ~9C!&yN68d1b<;){XjolzhQnH0EIR!t|5P$&ovMAHbz7KD zd}|RYEA&86(2*2+GA(6_NG;(|Y+4dO0tmq1Sz_LxTdf=7hmFA1+jey1@B+j{DF`u} zoe@;fR(%+f^2}>6tnWL_icU+m^m%M@(#=Pz@+tEfo!Gzpz$=)yG|>Z-*^p-`qA*Zk z8t8?^D+@(&`3#Lk`}ecuvbd8Nb5MIOO)K5moeHt2=7IG>z&(-1BT^jduCK|X>16j` zueB-dy;up>G&Wkf`+091+P5be(9Z+uew2>)ttO|HBCg_sdwcVT5`Y}^wAn}vQJbD2 zXdIvX);Fn*n5m?N_4?hLG?Oso$$oxA%}LI%80jz&<4!Q_l)tmS(U9m&5CPB%mPl0b zX}GCRK?gm87d#^c6sH4#wgNxuWM#;teK!nZ06;K=?hJSG%yjM-AE;n%m;x;H%k`A{ zeFvCj-aEIq=|;;1u7w>5h2ZfKK%zYBS6r&Dj{ej+UNyx4reHl zieFn|>Xdr>BilW{&F`NPEZn?xHgBo(eZTLF^MMPUc|X6Bw6mpAqT0c3qxXgnt2t_s z7Gb&lki+84(E{8za8-wMJ}T3;%(k~VC^&(!&&k|V6}f~Vk~92hWuPd+J<~qsTLCoA zieOpC;Nx|hm@9;qn|i+n!u>)Oxwk-(J?uf_2p4g+_3Jq&Ra<_V6TQ@Zs&eDz>p}EW z-;H!}xWCv%}$GnPuH3B3*Mij~+s5-Ivd zrJtDwqBUW0&*G=RSqjU+u4srInT^^*Pt>-!-r&G~h9Ar%@PL#;B|TW3t2$XtBRGYx z$BelFQ9Hqqc&JSqEjlK@PsVK>n5SB^(x_h6h{j0v6Z& z3+%#1FYCS7;B%v@r;4|+^g?z&7!;KL=g5zGWytu4v2$?Yo-x8w{mSCw`7nX|FCOqm zDgpuwR{tt5Jb%V6wY=IqtH8BM#=lM?%P4)fFrAt_#HX+yPQ^JAvs7JUT3LvCCciRW z5enah&KMz1`FD{F7=fgiULiO&nu!ld$lC{)LK9bP=V(^h+AKXtM81>eT(i7F*@Fx> zNQ+L^s`aZWLm)u(W2;Ho?c}QaGho2#Vw`7N`7WZ$9$mb2UtRx@`8{7X<#;Hk z_ZP9|#3WkK;k8^CV4ht1HnZ!*w#8306BOk@f?NTb%TLH9u%Cbxaqp>|#{vI3W9Y6+(kW*XI} z$>Id*9jHx-0U`;sQ;g8rh6P%jgF@pgc_vuPkMxj+RbZS10n_BVBj!A=I(C45tt$=) zwMY1jjmQD=AqY4Qt>Wlp;%S=Q`E0-B4twvc8@W>jb10A+Ga9E zlPVhGw;UrZ7n!|cC;yBQF8KQtdf8JufE}O8yS(zQoEW5bx@k~4+Yx6- zMYi-ZBZ#obDf9y}SS$ZI&{CyMpsdg2QmGma#n<;1F}4jB~weZ49yGV`e|dOwhR zmjM;ZY#vmFCTwP?dpe+2e#99_o~r7p=B`biLZi-z~n}@3ysD==;A!-l4)M?K2`=^I=h&H(Ee5>tU7Z~; zgg(=;Pi_bC;&tp`$rq=klC6GyW1Y|a?WP*-!{B#I{s>MO`uaHA0GyL(+5WOR=d6Z| zwC#E_Q59Gv=I*DITftp&W4dpv5c*xe~Nc-HNR>-v|Y%m7uYGih4%i} z?G3sl&8#S?*BwKS{i@4>HpztK@80LNx_{T*JG{T_9JVRpjug~y;djVOJ<&k|1TS*U z=dr&FMp*~qz15x)Fcoe&Q`=Ep0hFnhVsv2PZtPn|G=EhV zSk+GVC>v2-XTqWD&IO;uM*~d$VdJVPZVuOVikrA1($HP>H6p9z+zMp*_E#7c_KS7erk~t7SFi{+o;pFM~Ko*$!^sF-Wz-j%ZH(<>QpLqCXVcscP$ab zJC(z?wziSf^5zjy88p4m{l;j5(}Q~XgMC!H%}F+jmAiQROFh?;rc)`0L^wBHYFF~| zac4C?rjv~kX})h_iV-}kN3xzQHx|`(icpkV;-Ar^0y{KHY+(nkztyx*n$D4K&( z|8ki{Jck9-hZ_4{^#HGn+m>fj?#7h9wT_%fdh<(vO30cE$_PIePsh|Aa?87&C1FpF z5eNJ`Ch0~VzhVWE8Oj_cP2vpPAm`{r(7ABiZb>y5ULGJM9j&pp>8DO&dffDx>@L|5 zhf%(VDs$wrD6rv3MES1l2!sBEpt77ZMe*J^iYO`nAvb+};&7f9zs0={B$OUKYvLEk z#fBX&IC@A1tXHwhmU;`K`7?a&k?HCA6~+U8VH%bwO7p~8ZfJxj|KQYVHuo{D@&Rx2Ss|2>*mk~wAc)JIL0hauy@@FuXtCbQn)8YFUdz$XGp1*4R~nK5geh_rvYapyl<7o}5nG?6qT zr`o1<=x$%W`nl^kH9gq?+IZz9<4;@nh@Xgw%~?LuNygQGGtBn?CR?^haA`h7iD2Tr zwLGXSM;?84!W~9E5P?>=`tzy_OtJs)Qg`xs0MSD3{CD)B7=B=MI1eS6z|R_5B~oaLFQ zdmsBy67R3zjI}ztvBFOFLRxNmcgi(LFYLKHTvX*71<#7Cm2fqh@2Ypx&}Jgo$%w{J zloe$7UCco;1VIR7_s1HM=2B5#``pFaJtzp1Vvb1rANBnbbjk<2m86WJ-FX-7gDR@z zv|;Vh0L1grh{y=HpSV9OXh`@zVy49dg36|96DMfmRZ*7EGrgyvFJx=kQmNyG2p?HF zElT&4)t8oqptsnZ0*aCkJcxz538K?xoF}f(OHkbI1qL??%Pk0$9lO9mFZF>zM|)Eq zM2c>up{0`7NS3l3XSSE_Cmz3oABqZ{3V+c5qa!QqxTqkGVVn1FEl8H$dnsnZ@z2WW zR;^I-g?@oBoPZ;aLc2zcjt95Mk-fgk3gCDml5D1$0Wg%oV&{)?pc8t#X;Gx;A6vKo z@!){`bJXOp|L2l_#*8nWb#bEQWT$a1R}oV2KBEX1bW#vQtg%ZufOwx)cl^GX`*&Mp zVXo)Mz*DK`s;S#N`Du{jHZ%)^VD7A>hvz*GRh{X3l<#zv3puP*oe)%x3F0%&`ColG zM}9^vRf_)iu#&u&%bVd?YsO(!O#$r{l3h&L0$f=Q!zWgd6jVvS>iX8%fpc+9q?2=0 zCMhccs{uB4*JtJrp2bqhl3-;R;16LSGmS4JYHiAUMUR}~Mq$Hw5|s4U78hMZlo|5O%3remSW`^o0x zF&~#0HMP*@ACh#Hq0U*Vw=Ei+W<{Auy8SA!AOz9uDdp?8Uvn(ZP|VoYgxo)xG@t1s z3-FLUSuPBv6l+J@mdy7Fyw*H`7l%SvVrAFKQ280y8)r6+Duw~T4y??{iMxHwd6Pg& zcHJiQs!OD^MY@u#0HF;(27L*Vv1tPNPcdVaKDEOaSKsoP*WAi<*k^8!=O2I{aRHlm z_d!SYHq{^&4qP{;9lV=v5C{RJqxM1!%hl*fjNI^s{{kehNt;t`BF;xtXZ;K0y{7D7 z^P9!8+WGp&j-i+s};cJ<9~V>7-#Nag$A8S zDAttz6&y_zpwC>%dS3Vy=RV~sliA}O)|1Mb%-%w>X`~WtV0uB#S*#;qX^w<|jf?NovCtZ)&SDy}Zo zr${eq!({}%4O)cfV0JR>W-WNQwR|+)f@D{^K{R7d(^3c@%3qvoj!Ds5#xPLAG zx_MFfBrhKM9nCWA7lYY$ZP=|SNi&5SR%vwV+;;*5B{6)fuzOUMc)=>DxIH8E<296` z%ynBY2mqNCuhQCfxvpl&{HnR~F0hI%_t@k?+)$e}C~AFp57=3!2|<(FALH%&QOIrf z$95I-$k~xL;#yU5so+B{)E&JTG{^ON&DB+B2mD9l*v9^H1_=lwTfBN{|?kG5WxL({nrYB-7nIV z8?UuRUhPmKur+7;;S_KMO2x4~)a`~FTgT+%?d;(7FO#p8K^w~kSyiHNZsXK$F}9IvmBaf3ak#%n6#!=S z*AsL9LhFs7vj|v7gYb<6#4V)`_X;B)41&xbBj~=@8ZR>#U6{1v6Cfzd-L@;9d3h|U z)%ZEOFB%>swvIffp+1h@&jftYnIns{*tJdKUsPq}ieTXVxPi`~r~8Y?qhr;IW@9Sa z;sed(o{XiQwL-$#PqM*}k6xd!k#kvVLn>Pe6Y)Db+_rybT93sZ$~XkgC4~;>O=I)f zE2Z#;YH*{9K&q0oim!jy%t2fBE4Vrr`39zOtyibyZ~{mk7F5T~H`u4~7xcp2 zFQ>NGFjEJZPy{esHiFdg#}h(io=!d29sAV5jG-L#!?{I=H`wGFTHh5u zLdTjW%QMdk7!+rTZiyf+d2sB=iz6T$IjV+3#HmwWuIlq(J$AGN!G&6+&3#&n3B0L) zjeYWr)d%P2AB${-4^bufAo3$GQX~4`LMSk%Ew`c9zH#yXqFwXT72O<*tOAGPgJSVjYoW2MWSBO{^-`_f z{9-)^LFee-BpE%~S(tiC7-i{=2#X55$DKXOuG3KV z)PjOmVe1NOWOGeuW>G_Xl8gWXi-qRvd#9AXlMaV#rvm)0#(?(ETqGC zCqGXAakCbhtn|<<2@F`CR062n@M|Xa+!NZqnq+kQ>|_l0+TZ%l6O%=V1LX;)KMSL) zQGGU1{TjJSxUl?)SIg$2S?tk{+n_iqt^=@lrA%G+(CV>f-`e^d--r9+TUZ4oq|wnS z=+kaeVGdzn)aQv}V|28Z0}hRDW@=nBBp1`-#pS!OYVeMhRRj#&R_k zng&bApEEULdWP78%N*`LabA%sG{2x{fvOjG)vrEHg@Nmh#Wc>@$DHgo=p!06Z}R-N zCRboLqHHeaOMDnl^4UxZKY2<+?K)$U@or#GaTV$j=LYOQkF_Zy1R$~;NNW)H*U2Ln z%xA85Fz{6VXvvrlUq z?cm_-qG~o4`Aqc`!oOtj&8dI9sji5|nO_+$IcI4H1 zXi$X#Ce70_p@Mn9F_*w>-Bbb|4o1zy%}e@u7l23gU^VxiU}7uB^6 zyf;MX)4NOXMqKG~f&EL&7stUBC65B9w1lP+E{A~6``xC%j^Pj~K0Re$p$ES**q#3- zV2n5nMN=mKA$WKl#AC_wX`4*uwcDIwrWPeu0{i(fjNwnvOaIsz8zpBqTrPu59)BN0 zi_5@G(HWGKO$1#}LBtC89@&V%ee0fy~qp3 z+tP5|G%R89LSeSep5I#lZn%E-T5TlHD5UEZTfs*t;S}sxxP}-u>iTFOJ4{Uu0+=@& zki0Ru+ITh54Zk0ch7(yo&vSaDjo%&9)H;c!eN`cV`0MRp3s5t)O8}MsXxNrqi29@A z)Gs=y@b`#ZXRB_goFZ50Ur0WQ-ZAhBZk1|}IJyA8s`MRk`|hm83A}`(a6@GBbO{`U zV}7X0w+9g~L8AdiTvSO~RtL{L&AR;g1#r>C;PShU=uv8vyj8D{KJCm0g3H)(M7Py0 zZ0cTo7Nk`bbWwQcfD7}}^Obk(M?k(KX+i3E{DU7{* zE^1Iad#I8CdBV2&AQ(5kMriGfH>0zXl6~}(!vKHK?)t$<1UskD9(pGGTWY%gl*B@< z%oK+T(X@^fY-*it`c_1QH13J6Pq89KWKZo@@ZA8Cy37fFOM#>7cmFvNLzNF#`3n*sE8I_ zG|{xyTE>2J1Ez4#;5`hL|MKt1ghO8n8T^vEj->lSE{u9ATQXPdHqtkis@`OF7C3w9 ztFu=+l0|eiBu7I=0!#T*WcFk-nL|~De5T|w2GANHDXAQFC&F6@NN4E0vTWcCa;#N2 zD3zPG5ujvXJS`xG-<-<8@)s0#8-vZI#xySS@8k_UQEDp3%iqqVnmvX$0INnC0nzP{mNa>s&I#meo`-h6A822jS1;m88lf9**5svSTszq^q*j@T2D$b&UX zh0t@2&{E)ofEaIjdS3k~A7?qT-J4ypnX)Oma`Pzm24As> z<|s=z$ds2tc)o@nRI^atP+zYm&Zkx3Ddwk`_4uW`hAPFz$*QCcoRa4u3mr`BxUyL5Zn==c(R@=3S+;j@q=!Dj`i4HDpF zF0)bN)(dXJa#j-Fl^0|e?%+o;!bj6=oNH@%_vFYDidG`$A#9iDcXQnDpK!ezCq)65 zgN71EjyfD@;|yLXmbGEJJgAe+*?QJs1(Rz?x_Oez^2A3p7!A|5Ac%qw9w4n+xUG4i{l-? z75sS{dg~{^Ev`45fhP}^n2A-`ydy<~gTRPSXZ_=|ooo7xv|BDkO0b@;(8xMyn2BBG z#aLo<1Db3PHc8Q!0~m}9w}+ATdol12IBZ)=-K5@v1rB_crGys(8oWWUxQ-8IO|@x8 zjYELb62;fnNypJ^{ZNwV6Bc>zxt$B_Zwq}lnPm{rxEt1=)!?kZp|nz^TN?xOdb2np`uEIFOY@Xd-X^LUO+#M7zwb8W03$=xnM9 z2bH4;2^BMi0##Dv-OgfT&JpoZtr*vuPX z$1cdOQ&f8Jw#V3DPGb88zOkK6+D*7u+ePTdpbuURsg=0F2~E`)&`tm&Qh=^Bk}VmS zGlXhQY+9-zZOeEwud+$ApQawX;(q*_H|MTe)ljD*4AJqz?~CV67O8N<|pfU_u{l4?YVZiiXxM8rbCh#Kb0jL&e@{4kbTb%_|t(;UwCkMHRQ8{A}7%= zVw%YiF+>V?gudKh`*u1j^n0|D^bDTC^%fYA)|dGhx$z!i$%bdVa@IH-RV^!nXM;`5 zEZLWy7-)42ap&L6DXVb{gv0>VkE!Xknf=VJBv!|TLSdfgLpr1+U#1oO%eB)gk zVsj)dF|73{0K$i;Gkg{v%kPKa2=padGw?X=*iVcj*F(E}2bIrqBvvY_P;6)iiw1`Z zYd;CkR683*nmpYtQzOpZv14?A zS$16pXJ-Sguw9zgyQ%0fG?#=F0lC`>A_p!^eSw_iW<1&cXvTCt*jzk17xAV>Mdchv z{JmM3v}T({B&-U2C7XNO(BPx)1dOUF=bT}50jM(8d4WNO*r1KhIsWpI9?HamV36G@ zq)T|x;1t-@e%>rYB-ohpN9tUwP)dx7_6u-%*rjM%;tis&mQv?MAzEHzyqBB4t2IMn zcn~LLsP+`g6;L~cxKN@B2(^tzTcFj=!R^S}@ev742!A{d#CE^JJ~s0y!D%OEk{Dy? zAPiB5$-=?kkeHv;4Ke|U+yQBRDl@h&R)Lw4*ice&Y0qN>*(8Zaz&fCZ*HsiHvjqtj zP!an7wD;9vRW04a=g^W$cc-)x(%mK9CEeX3CEZ<8A}J+}bcdvXbR*I&2om2u=)JG^ zdVkOFdH?wS_`c`P^Q^OHX02JXV)o4JJ?ESS&gIn3%xWWhFFJfYrj>EQ8sa=Jf|_Wb z1NMBxhQHaBlXg6JOG!3kA{9G#wHr*gLyWL|}sAtHTFW!OIML2|+ zMs*e^r z%c5{DTD=NtZMcYw!=-U$S><^S-jl+HK8at>-)38gNV|X$>3h8t`J`*pjIvY8o1rc? z_CWtA)0k?859gK6)s*?*kbHe-ri2+weKF`w9zn5qOZwPbvW+N&CbkRVCoOjVS50`u z&GEJf%A_r!(GF_&B?>-Knd7kSF+V@=~z|KMLikG+k~2e(^B$e_TjT0MM3Bcy4850NEUY; zn@FYns-WIQuAp!U4O(Xok++n&+m7e8n}V=_n*jrD*!;TZ?4Ch@5%O&3XD$h!=CZ2m z0ApPFO{o^-xX$lYnls}Qc%^RSzH{kr4n(PEu0Bdo$Dupy`JRh`Fmc0n`|4%(sL zO_dLHOQUO2rqgxcf>=am1PAhK#@x=YE9O1BX2V?%BX*! zM`Y#d1=v6HvEjxnL7;M|X27#ioA`<6WVomw;1Br=OU~zfch9`CnP*) zoRVDJo{6gW404mNeeQzwpa#*fR&$a>2=l2^!T|9;y*-pkbs7?#5UmFB4yb*&$X9cp z2f2RAUMsW9JMdFVM^={9deCKKQ}bG*26017U%gMu*Mp7m(&rSyXDAcFZ1)jAI@5%O zPMr>=?Ygax>_!J~O!;h5O2(X)ZyeB*)rFAPOI|8B4O87eJ}eCn9DF~#eB~&>ru2G& zMVTn0q^aqO1vH)FmTCV~7OmX+dcI}Vh|;|x!t{oOsUY{w>;M`Fc?JqG1NU1&S=wjc>t4Ts5JMG(> zbo*2jy6Ge(tYPl`rou9_P>YI}YI73aN>LJ=KEjX3d?=t1_-}_-pFAP`mQcsIVnh?x zVADUKOn-e(o%)0Y>%rzK2%}T}M81YdZ_;bSig_AR1`r0Ka1D{PEi`wX?YL{{MpB6z)_zQALy@4b9k z_}YZLASqvecMHE~iJINVMxlL;cM5qpG`u9O7mQKm7FzvP>nu+8aucefyo`l*%E|%w zyBlMnG;(Ww5PSdwGVinx<9-KgRDA7s6;^EDfm(G-7K%4NB54Q zMCf?g73qSyU#S})bD_U`kk6{-6~m451yN#k_mO`Y&u7uwEQ*e$uW7-yhPo?h;`}|T znu8gH?cz#ji0)DH5*-@srARpiPT|b;ucI)N%bzpkitbw-?4ESzeags9Gqhli|Ms{- zQh7#=|MV(4daE)JcR`{arI%(|V2E!;2iqH@tvER;SXy^|=9w9&;-pFRVmR31HlNxU z&NM!@KePYowN3M~59UkKb(u^@pZE0lFVjm$Fkj+&oC~Y&8@$pG=UUiX@w!RFpU%Y; zw~+&%B5j;&x?&2&Xurz3%uF22%$*fkwz_#qC-;#c;cz1|riT+%Gh|F5@b<9hovp-q z5hMCibGwnk931tV3B^;Fy5+`6QvIgSEZS2tLVnbI_me6HYjO^9bZ5{W%+t0sn34p@ z3YG;ONtP6iu9i&-CKgH93v03sQ@z6X$`xKX3zFQ1Ns%`Q&;}zI*XV9W4TW$T^Ch8i z6^cAlgb_+lI+-l9NQ#HP(URyjkLUVLpwtU>?Rk#8Z@a`jMH3TC#;>S zD)o{8ePnS1N(MT_-wow0`wm6E z$>@wc(z@>cgcZ~*mNaCjYdfN}@tz>pKvYqwyJMY$+pjJ?6q}QJzxW`r>J=2-unkS- zE}PYsk^rLkL-s5cYBou>Bh$dHQ@A6qAk~)oUcYI&nL0SfhA_{j9qklTy}0FR;BS^J zz?niG_k1Xs$aNdJ^`x4MrI~#(rsGlPo=txZzp$qF)6F(t(FM~P3(&Nlc++Ldv zT4TArqG9Av%=M)UkT4*WLq+!)j@&X^waN|d(X31k)gCtq{Hj(~Cqe40eL0zRj9oR2m|O&w2z1CY+_u-G!VaEy z1nyZ(&%O{2X2p#YeHKtIoo%@!%@JfYD!q67lC0sf@~fpauf8-FRS!}luk2&qT3S>^ z^1|m2R0yK2XR{7pS

WO&ziU3fc-~8e1y&`hY;IqbI~t7y4cM$zIqmKo0`5Z$HbN zG<@%g@-2|&+nc2BG0Nf(WvSYskI{c4{yEiq#zL~y-qB%Bh9)n$TEjL<*guoqSnt5{ zX?jQrr9t|Ow2)orcbZ8@js6Zpn*Ib#l8iiY2SATP;LHGLVSNyoST0!dA^nCP;_L>C ze-{{$1Ls;>r&P5==NrTBt1&2N8DTqVm1RrrPbFK$PDkJO$4$+;ZKeeYAbwE>X9imS zok?(V<){_#e@$#3*4|uSQ@Xk6;_(nv+F5)$X1Q)fuxi(LBkA^unxhXE*5cTVf}$2! z?8A1M%Q~X!+xhU#yd7ZMEtD1_RVZYhDvNo33wb1gy-oL=P*ah$g!j)=HVsDLcC7~s z7)>HMd}&|4k<*&rJTuJ;MiKSheRy@uWx}hX z+Hta>UcB+sk+31Wlz+&J{le8OP4V$f729Ev;TZ38u3M~Eed*P>%Me$0jxNn3@ z-D@HPw676LE0$V8R5D>vTKbzE-egOkFTta_7j&(Y?c<2jQA}KM&sf5nFU@HQDo5!q zYci5VSFx!$pbaWA2tBqtiH0SxcSRLdGC2W$-zZ7pXVT6s);lQCOpdx2T#78YU zV!XoXkU1Xo(HYM)bE{?LDgz;aLy=J0pwtR#XhOT_o$Bz&X(sQ*eU?#mYo#-gGPCVN z2Gj%#?bv*Af|C z4Ua4c?{ACRPW;$|w;(dB-7prVb};UBkkGp>xyS5czHz|17mK%?V8@vK`N3e{)9)|? z9cU>6@SXC&m*G{?EZu?*IN(^iCKUE6Le#v4Zk{>tkpjX3e%|>_-4`1~OAq)-yd9Jz zqCHEy4zv8UL|zlid*PglM|L79X}CFd#zqi=(SY_JgwhVBR?w)Gq5eAD5i3tAFo^Ra zS<72YOVoCs;mr!X%#0Y9n}< zC<&?+MHpE<2~}~BYu1Up#|5avC6t9K_JG&zud~@3r&9#ke8pR9u<+9`7kxw3Z}txD z&n`j7`+EqJc<+c8S?nN=rvqm({x&gXzsWuBxFvYr&(DI?kVWzIBUGCdWTqejXEFa~ z_!N1n?hX955nq5HRw$kA$5es@F)h@1YMd}D(u}5C*0JrBF;qaUytpwlXs66? zh|#N=kuP3HVi7p9f9^ZDT^%P2uUl8itOgC1hppvCaDUFk=M8GVkNnJq)T{{0YO_Jg z06c6_N#bRWuq&pq7gIfV!GJU&ZZes!6$_aJQ>|1uyH zg;17~*aL>Y*e9@p2D!E$DosU7zWlfVE)O8X17|t>%@UgpG@QPcZ2%Gr~kvYEPhKYlJDE^v%1ZR^g#nvkNqQHYh2Z-I+it5z+a$Ti=&x zlE&{WnDz*znmHygs59bq4jo@_R+ULKiI%0VbsTV1c`8;CaYk-&av2U**0N=eKz~Q& zI!p=`{|?VMEIjM`HXnRt#=2~i&NobQQv0m5!gu|3DO6c1%)Xb0*BjB65~e%ZUxZ&Y zndN+s3N_6<#rfb=b~I+an`vcv56YbjM$!ZLAy-Q&VLCT9AxR#eXA-j0rY={v=X%?= zbd(ciOAymir{v5OY(5MB*lQ8u@MWTm13}UNKR{U`p{yh^EWn&#e-xs`>_g#WdY5C^ zV$#*e%a~BJ00AyItLDy-OX2elpP+7ew@i?B9~-DaMi5}+y1(0TSzW0DnjQo~;}J@4 z`qhl@$sJ?$Qi#`hFw$?_Z*UbQni@K3whW~^^n9JNx3xyzJu0d3gjm9;$|+;{0!dIYy2I@99hj!-gJ%26nnnC2B5Dt1ML`$0068PJ5;%YB zJ{HXHjvu{;*Qc=uo+SJ6uru60vZ&H@z@v~TFn%4?E92wp zHk2|WO=CpNnMvY*6nL$b-;$5!#7L{qGKai=9TP4g+Ng(l;ZYZSwmDKNIoU2ODhN+k zvTEEk`%L30T)_j8=|hDCTN~wk3DN^Z^Cz+UA*v1j+wNl{T;-fsun}Z(O||4JQ7SUF zCWLSM!!llBqt4e3b(0}C!#Qk{X!i-In}!i0o<4J_rB$GoCXuBUV)z`UUG5Wmx)Hh8 zfX@BWy~t4~<*HcMYTIrv^Ux>x%?&Kqt;1y2WmX96@GC<6OVQBmob$7;VfUenqzn(w z_Oz#~7C6JRjM9}=55n^%2Jv}a10(t5pStegfBW_XZO+6Q&L-KLHaK#&!JjX411{yU z?M|S%ZS1zJ!~KY0>RHZ-w;^@h16_Wl%dzb~Txb`xjJu7Vvf6SM%0XMn*slurOsth{ z2$HS|%&y-CC8s%;R=iOz#FB%fppDKV8*gc>0>N&332GQCIBto=B*99n@1PE_8glYJ zq)^j0>K}W6b?Iog{e9=#*+*oNDr&|seP^fsg8q6`zm<`Zi*Ee#vwE^F+@O0smG%yX z@Auj6Njhz%&8AA*ih>(Uk?YR_fIFI6vINSG|O*=OHbdH=cTBD zaj`HsqeGNXz`=1&qX=;~{hnI+4bQ5%OoEbT+@k-H#K(ko8ds+r=kFubh{kd&u^kg` zE^f~;L$qj3KcKHEzv9>artmte(wQt_SxeL78|L=o#x3zrkC>*mF31^E><*K5)v8W2 zruzzY`QP0ewa$BMSG4$nB=MY=xQ4Gcz;I$S%&<=tMz5{m8Jr?M*H~$QkZ?T4`W_F# zp5!zSpEg2Oym}hxOh>n2zB{212qEYmW9l5V$7#7 zncdWPr-=oRXK?!@wTE16UWdxc=eiEst*lPWCT*?jS+S4b7BqNG+VZE19;)6m+*I~I z^>2IVRV;#IWoM+%5ltXt2rDx+YCO$)Z8JN;8#5sc`WVE7iQ(2+m`X0); z>vs6|Qc1@wIsa$GSnv%tv}YPydoBy2aVXBcI!b~8gM-weN1`@2ic((6*rcsV0oJpJ zbGNy&Qm&(_Y+h7XS_0M82g!--2ytRMTMV++jm7i4m&e96CBaH{F?`v!5;qLylU$a_ z#}9U*uRgyY(p4j5@@{jgKSg9=wEQ@2VqI1&QL0uJj(`%wV`V1nM2qYE@R&^Gx|WAq z@oTrNWd!9D`%s1+B4Q=j1na|XhKpgM`+}!|egyd4U!|z3@}Y)^oj$B#_)=l3p)B^i zVv-efUs`};9mzpANqh5wlz1<_W3N>pee9lY;0IBs)XA5PUyg%IpHmxJnB_fO+#w1t z;e8^%+HF%Wwv$KxmEfe;+>Bt&V@P;qBs-?X(fVGKd@nBbT!(dnKq<7trF(^zO|_RE zy|p;l7v+WgcJFb+(?GE#es*z}WeaCKbb)8r3;DIPQYgAn#Ao98p1YXqa||we7Y&Xz zuTcc$d+MrbjlD;;=!%=aGH6dEHb*oIVZmFJE|e4}#`KJwU|6Pyc_6hapQFWUotD3B zc;cZLFBXGC%q0BC7?1WkvF|*rQe(3j%VnKPJ@#{rl_=FvjK*eVy&0k|h`KxGX4x`v zBUoZN!$){JgHL~O8k0bG3ZsvzT`V3c4eCv&&Qup%O7bV*K+jD)Q(-IWo0FUA@oKja z?*)PrEWSZXGN|o2GKfEXiFly+`SMQBgM%fE4HJ+yXR(ef37d_>LYzNRD{LYhqOmd| zMm?Ivcg<+=A={)Ij7xoM0|btj8Y`x41Fd$b&Jk)%*)P8Ee#E+_cW6pINp1Ec*qNYX zZl%mLTz^=gB*egxAVu#>I2trwHX79xgXGwp!~$xDK2GfS(5whVhE0?c$u-r$P?o6))*f6-kO+W#0k1{BS_YyveJUr**{^d;%E zoWUKDN9^hS(JfZONqX+5=WJC4BcHB28prd?3ywq@hE|ncOFxipAFo$L!^Kx$}-`YaIrYrrJckYrUhBu`qtkBQdQ#4_X;Nr0q!Eax&Gg7boklhza(! z9F@2ZZxk(->MU7~I#d~=1HY%PXZAlR8py4#qYHa>k)#vls?+&gOL4a1{yipQbVR#x4in;Ii;wt8+tXE>na4soC;%s|Apwss_z@Hh9St7@1EzxF* zNnru+%ThRzO0A&#I+nz6#Wf4;iO=j-m`&GrobBw=$mexRA!*tgP8>%yUI6=rq{OJ+<8tikZl%82qdzufG?6O&7ujJ*XiwTYLF(sJw;L`oP zu^a1fisHQ9>Z%2=3l(N#KQkOPVr-G%>akx`KIH6zmK#F12|9jNYw#RRO|Rm$06p1# zQ+4cgF4tqu`E?dtov=WI0y&sQ;$Vw3@rV)sL@fEmxsTYVFatN^egra>C*m<)2TiAX zdHA-+>GxJ^(A(`M#}3{TI0HYozqdl8^o2v7ag$d6B~wFAGtwk3kE;3zid`3j{y{=> z#bZ1}qNVNHLG{jvxw*ZA+!y=Xaknnx0cN8-xA)1mkO)Bm{XNb4oKkB^lfIY(YrOnQ zl1j;?FN3Ej4k@1Ij^@l}+~f^2aLRi0zUV_r(DW8`#O%)U&V6lPlb3ltNBs2mX*WfLTCZcyLxuYVAB zGv&ghlLSRAMd4Rbvv;5N2i;?6?UQqxaG(v^wX?OW@)#lwD#+8>uva~PpZ)0#YV}o_ zkZhVuFsJtzO4);6&QHDxi<^hmBtq2&48mm<9=q}mjv>s2Upwy~Q-|$O@JF$PW!Q9=>H=3f|ya@=chADw}3eOBJa`z#_Ty6BUzGe@^D#Y-)!gT`co*^FJJ_11#k z#q-K1vN#v2>aW-~L7?XtAx#BS$qU;LY3VO#x0jiD(Po0kp1h_lHSbp`lD1VqAMYfr z6ZaZv)e?M}%X6XTO46q_tkM+f^+5SiG5Ow!XgH_JWtYI>+=}w2hc?5A{bwvELFcj9 zfjn6f>##Jc2W_lNL+Fn_3LjiswBn;)$>|H0h8;~ajc^bZbaGW!Rd^j%Zuq3chI$K7 z@Z}&}Gx9tLgw5_{G%{_n0S?Kk38+yh$%qHM7g*(EQ(IHpqLee2%DVT=*^+YKJ}iT7 zWG>H#>bqo|FDc|SgLyB)F&N);#3hy@S&gw8Q3TdSF4}2Pu=e(mEa9u6 z?2IvR!xhvFMW>WxXI;_Q?L=2C^um)54pLc5a5>Mn;!`l%ctj*hBv7Ih^Z z2$)}OpD4bT25pB}yzVy)Des?#brj07yyqDMM?nL%@UcORSQE{8$k7bN+WHGe zA^W1mu-7@-?H~;wibk<^y$9#FZ^A=5OylF_77XrsHmpfw^(Fh*R$Q%UVbA(AT|uzB~{o z9KA-(Hq;Ul!_702&<+1kR`(S~Si}fRu+bug~Uj#*6tk&7H7W;N2wbXB3$}`$? z&5CU!=DhrJf~YV|Y~DWpI=f1Oz_YcmP}c0-gSk26o9y2;Xq^m7HuZ;rLaR4DS(#)ibo4qoKTcg3&NMq{Xyp*@gGHK?N=FV(YAg3U$WH zqLB~Nm`WNK#Rud&+)R}M=j7kT7|TS}qAPAN9J?-Z@^V+N7!6v!@8m!4WF}x!!YxD~ zL}vCne0s8|`ehQSMN?DsB?g4?VT?3&+v#@Ju_Hzz=>LFU#SHeW11-(GiukOC9zJcYOl!2#k z`g0?fn0@c+cUq&FIoZTFLD4!~L1~IpqP$u!6)1Y{~?W|)qCJ>p3d$Z52 zd)lEmdt$#HQyhH>&sc}+kY!>m7pCkn7}a|Orro_(h0$RE&x9K9czCbapCt?S#yT%$ zuYbY|c$skFb`H)0IFo`i`R-oBa8al5UQSr=Z%5wP4~eHJy{!FGjw1jE1JDqIGX?Hm z$1u=!iEtUcU5OX-VvL7UV~eW504WIp6k9@Rl)w57q4@qtx)WUTLTwF`?m9=u&5_OL2bn$Lgozyvl$$gO5*#enh5MzMOakE$b)wY2{O)gtNtVJB-Y5N`UdvY zN?FNwzHF`#OSvsd7OG@529j(?xAyckSH6=p^U?k!5@NIKZKGAa_4SLUf3yhgDf)l8bF~%y603+8JP8&_CS=sKBmO>>iP`)pqEZ_{`AFsB8 z$D__@5l}2ph2g5L(e{R1;LeiKK+mspVly&7(%LHAepO)bky9^SL;95bxHWnjtI%t! zCOc?p)okbe=TEeT-l$agGD=g!gk646Cje(6aHip%Gw7i6L&SSNhM#2%r`1h2u*D?r z!$Lek2F^742T$0))Y;GvkT1xFhXrmT7@;&^0{-(oBM8B0OseD2rrx4D*W1e_9bA4g zKE4fs*cZgYQ<6hUV++SI;(1^H5UCUJP~;^wU!(K30hu zqIR5^=;!X*{lXu@hohvsTyXjU3jIhR>y=-tJ+5> z&u80F$>e9pqF=n~b|3cInfff2aVSXj8``AzmOXqOS8N~qSei>=XfP+Fmn4lXE3>Yz z)Ju4p#Gk-{8jI2Utm$%bq6|AO_uS%%I?+i-sN@07$z%XVirg{72lJ{j?vh5a$9oZ` zBezfM)@A+Sw8#@2F}=T{#I2u8c>u-|7Rn6z2S4E~zVcFODzQ?;512#8Jv8!v**wZT zQFQIFcJ8r*cIrEL%_@9|mDlBg0ImGPCwYJONoHf76x^oB2$TRoK>5dc(%sW63fshH<{IY*Y^n$o?^&2xodl+>n zmN&}{hwl&Tw&B|)zV6Aqz(y}dq7$~T*C11fZ1P0HRIIJ8^NIxcOYnOVy&s!Wn3?kY zE&PtOlyd3ATc5?|l=l#`nq!y7Ts6q6!fr`KC~(hOV75AcRHmrFibh0v_0GKWTHfVi z2>lJ;w9ny%?bu97#(O^8q(obtN(e%3FMwv;uL5?VUq5aW9^TMRT1H9VxJ9it~d5JElL3l z%psIH@K1hR63L%e-|n@Gd5%o3PTihF92U~f>W5n6B)ZON0S*LO0u$HPKlm=;A|O^0 z6AiK|0Te$DiT>g|m_X(0w@*)zfh7`@1vv)#&K5-p`6 z_ir~cwZd)ogTEINiKkUR;`a6q{2;4;(^Ac_oyj}Ir^kqFzao3=4z6M6));b9F1WzesuNYAmukfOn+d1oTU7tAiy65{ya&!69j~FMJJL_ z;@Q`TG)BiG*roeJf}iIPf3?X^310o^n^H5Hc#nQDJS#xtXD7n(+z|0cc0~b5jQXi;{bm zXOV5$kbMVW=%4$s-_&H8T%a|)Bl)>C`CUYatA7~!=N{u%>F&nd4_E)g?&5CDK@4sA z=g#6DFxf(bw2w!jEx{$Msn7SoT^zh(+GpGB*rnf#vHITBQF}i1^Rd`CcnTp;}Y${SVf} z`Dxq}K{@R^Kzow^Vcq)6&6D~2qV&sM{PP=3X7>?u)tAssc;sH&n z+I}ZO7SnHgp+C$Fw_syu=L%3++qjw=1J_>?H1M>JXaxcTYw|C(e=PurzaT*%!Cz^A z&qIMgaPUBIGAjV3<7{=;C-g65Ke++@{yqJzpMUBX>JcCg?_EPm6Juv5AV+9o?F2;9 zyGsBE2wz}>c*hIY$Hv&g5WtYy82?>&2$O7(YS&#mMss6pAa=};1PPM&M;>xjg9Oc! zG_*CgHi6KZ$M=hy@R;}((!s{lC9JIs#{pkDj{XlD)- zfxw-h6#yW&x)=cJ0Q3VO2tWe>!T^*4APB$+0DJ&20zd{pA^?H~+^ zfIz7bCJ?3|SwmM-c1|XC4klI>V6H@>b8)dSZt)!XkX$6Z`N|#lIEbXm4*}u%SofoF2^EgFJfYDA?fL8qUmo5&h2hv z50RAA-NqV-h3d{nV`yym%!C`rL#ml+Nbg9Tt@vo9Yz)mzxVgpLElgGH?5s&yfk3C6 zGyoGvV^eM=QSqNFfD#|gFY#C19^XY?W#!`HVrF^7{OA!QK*8wbVe4$@&S>jI0dPPh zz2hNj;$-A#aTk@96vET+nH>=LlZFP7^e1a)3)BDbwsm5<6O{=F?#T?nFazN_nE`I3 zq`Z(Kx3Zn7vzwu#3BQP=oxQz@F{zt{vpK1WrED$Ty&Yl!7 zzBTV1um3a#WMhU1^NVnR%6Cr m^(s(m3C1anFX-j>p#7h@|JUMw2gLrLi~pe(#PEM|{&(?p3Ux68gblR53hTMF*jK*NLvWCDSs;JkttTT%0 z4JP3X3Y})WpxJpADR&%0&m>^}=^hvG%ER`mr9&oe*s?sbC%dHWJ|eylhdZezf7w3Q z)uue>?5O-cVy;ylQ9<0_Sbdn0*W%RQ&L}yT_VxO3a?#T0vfVpWpd4I$_rq|q+>&*z zaV6TR(#i2sfBE8Vqj!RC(DAEOlg{NcU9SSweDy0GVB-xd5yGiTKZbb2_m8egQ1@DTgGWK#RFMu*h$Lj$Y7 zs1i!Yn;sCp;k8^n^57xQN?~{OZ;SzravgKPyQ?)zGO)HYw8L7Qz`dsDAXyAO4pJZL zzm`Giq`<%2xLU^$7mtBlGKYO`2$b(s^Nob354)Y2&dM=R-}YVf<2JT&o6UG)e|42P zBc~^7xLq4ZV)^OTrtB(~{NA8^be)=o__bj)ayM(Py?ms5r!VQ#_s8>syB70(ee~6E zE@0PZbH1dN3m}GeXot9KzwfzI`TB|Ik9gS2MdvBkN%nj2YoZSh{-<&_6fx{j96egI z__NgH$_P8CW^7(VN1ATn>O1HIdxswP$Db)S3cG}DQ0DE$cADrf&RVk%f2>} z$77H?B-lF}ju_GxW9?vo0bivwi>2~%(?32;#TfKMIero58jm+B;PUuVAE12uj=MS zi>VOr{dFNugA@39>V*#ULUKZ(w*yZ3;GR$!T^7bdRa5#<8(P$HSraYxM%K~7pBFex z$$vPq@ysR2|J>i0ib5R67+~GEg#o;OA-d5lZ(c3^C*k6x`Nh1HK0pULu7#$?AaC*m zR{c^NUteLn6-RJ_GTxrT&;J?<6M2h}Z@#62Bs96u=sjCrnUvB8Jnp4L?Ij}Ik`Ysx z0B;Uy>=Z{bzI^kimuZaa8!;6IO%fLvHqV3cSE3NL$(IBC4eT$u#rogK%Amf|Zl2i{ zZGcM*#aHzDR8EUd4wvDb`GD~%6Ng<)kDRX90e9CM$?#?0P_6?uP3YhFV;|m+KNL~# zSzhZ>+r1*EH^(SxCfV%4vo{&+v>BTM9kly$IS?g=*Y=?`HLA}WMPwhNQ@1*~c-bUjlAar(aiHJhG(|1-j` zi}ki+>{qJa+H}3pM4S8HoZu=}LI*p_D*;UM?QWzgASND>SmV_VQ8ZLg-!;0W}I1I=D zMxG96*X3K;uzf#;+ADl)CX&ECU-}EfF8|u{i9YfPj+dVx6jrzSeIwF4Qbn*KrrLVh z(-iMD1|%ZppY3*(c~M{t;4;18UGEa@=GCvwtW)8r|0MWhILBbEU%=LlhJ5LYXvr9H zVu!fe4qZ0Nel-<^b;t4E5#Idnb}^yxOE|m7zf3uSWf`d_i1f>K9SzeTL|)%qW7s>3 z5gweQz6NZr|MIP5HM1?nAou>0e*9B-0DiZiAC`Rquj#IrwRbH0Yog2N4}<|-y``CI zA2Au?=)C_5Ikz0u3G#(yLEXq!=bbjK2%NTmrC0=O9S{zl-=U5H7(g!Z^l zDx@w&B-uraT*?W|64ur6d9&Rj%~bY9n<@R_K@Z_&pJ?DRXN4Z_^jM)*x`C^{~7 zANa*Gh6kcJqY(dO6k@_`*$LED=Us%~mRYuApZN0Y4YXKtktWoeW;}eqP>)8ZT5!dP z0MPf>Ouj)ZZ|#&adS?#6epS={N7CKTJv#NN>QV{a{V7~ZyPAY6)z7j~rkqMqfw72r z_Zh@y(+GPcta;D-!oN_Rb}N35F`%80!^d4-Q(2hR&s7XND<9DJrt+;7!miC_#foru znqpwk$hwEdxdHV97WKP1JGwLW^J+ekihoc-H8^k-RHXaxU=0mL5?_7{B3J0h!<^_h zJzoc$3v90?li+mXfePIT9#tfznJV+k_Ql~aD6Gu&LBW*+Arh(7n>y<0L?omQO-m7U z>&%(aGfz%B9Cu(jX^}-)d&%&OZSSYlMRVlHSRv#zvdWl_{DYyfswnYT@1xYk-i zXkZ0XT=wn0WL{S~$(wl>kBN0mbndUKYp}Ttb@D^O42HG6%H!PDl0uP^g#>Ez&1|U^s$SJ8nWjY z1CWVU1cD>T#Mdk+GGX|kJalgbIB1IZhEVhg6TG2-S`1lSiasoH0Xu+a)~c$?gn;rLWFgJ^VONJoKxr9( zl}O^aCNlbgGe3dy{go^jKJokP{{H?Nnnavv@b5_=a(9qvvXFU17NOzT#@q8n)f2Vu z^ZH9T;h4uRYEX(-MCMNo6+V2lAtINQ6>SFSPpTX~C^L~Cp*NZDPSYvSPm^U-URYYX zYh&XIoPZutqzVFsav@qG%D34{4hI5^wuWHHhOKTnu9sIdBCblZv9ZC?fY+(X7xapn zi=R_Uj%@$?#04P9@o+!tX$y5W2c*Dt>~r+bnkSQA=WLMxWYM*;>PX2xEZ=AbjmmHz z1acb!h^|89eb$YKrPa}O`y(S{y;YHUj}HvC9W{_79C7(GX|--md7vvrIyUZqGeRGW zyFnY$-w?a1ak>D$-(Z**SeaxuT+?sw&~9lL~=G0K^DAMJ9T9i`c}V?pycftLn8?JA2avHDvJUM)ue;S)2_-J9H7$5cV<)iWH6TRXUL*R} z$n05Fk*hE&5M)3fHU!UXP8KLg2n>oNTZ8m#Q6SvOcH<|2Pyx|hNA~3c^?T=kNPuJH zDEhO2xI+cv8*yZuKhbx@hO8!tYS?4KL7gqx1LUZw?uX$=L3x5!c?lhZe#dvU2_;n^ zDat39wQS@r2CIcGDvAZYjb2!D%0z<^b`-scKH=^o+=7h55abX#3du|?IeLyHS*Qks z?+-^cki-I9m`sBi_=_%KP}qM`0iqB7uV!Roedq(S1<}Sg1cimei0yxA`rjZx6a)6Y z3!?)FxIC_xvAhOv{=F#|=)#6oK;@iL&k074tG*OA=>K_2!E4KY8ucI}!f^1%`6 z7yyojF4%W?6=GTv;VJKQTPSgDyiQs~gp&X?lpQ52V)sPuQG5)bc8BELW?n7q?sooB ztL~nhhwXJa!ZejC`eyl`*+LULsKuTLBC#LHgry#(1XUz6oDBS0t|KkU7AvRgLs`0j z7gWEqkwew~`fD4TmwAD^zeZ$n;OK$UL~wBM_e5c`FfV(DhIYH8u>yjEum9NgR-`Jr zdiijx2P*B3p7`?ROKWQgXyD3~Ml$U>8MDKpY_?Zq(;c}%FLjqbM8xttu-A0YuN51u zN_GG^F^pKH`srw0&H_}*z0llh@8HIGvP{Bv5itdrK#PV@f`cO4cgg85NyEWLPq~Wc zx-WOxvn9O~5;8?~9LATjlk+aWS zLOXsL^X2pDbs)$<1VIOe0?A#hJmzt!SW5J4i?;g-lx%(M0;xce5IOq?7$A1MLRFDo zad|iTHPoO-oIp5LnPno&KE+6w3+sZB0Fol(#s#iQDmCJv1In41F`2>~7XWfpkg+p* z`4w@Jl&13{V9rO#?7-gm@UbeM3M@cm8C>cV33+RS&kt=&NA`F-Bb}ewG;$Lt|G}m8 zWq`W7BoF?}9ndXaJXB6zSYoCR`yW$j4btnS*^1V@{zlY0y+tAq7$*O$9cKgVT0))1 zd!)t?g#||J|B=WwocMZpWz(ca0nERi5((0rc z?M+qReB;Ku`X!k0?U~ox<c^DwOMgNb);V+7XOLVxl^*jcP(H0>DB*`M$W5u zGooG|k~o|d2X*e)IpK$Pkn;!Y&n7<>t~&bOiLaa*&T6g^4Cz7M)y^b9&;F~)T~30d z=_PEK_|{3A{L0};2|`LjBUR7v{`P~yPRp8`FabfPFq+xU=?7ukGHr+dfiTlg)aN|t zofMak##)$``00V3it|9e23=p0+zAhOho>4ZC|AcK?~AH?27R$OvcuVdTBB*;R8~fdVaA=4gY!{S$cE`QpzE&SQP+sA`fk7ksWBDe|(Dm=|5nU@ z3MRQWW}?-|?iMBlr~O-L|1sWC-aYEP$kFJ^BJE-Ofn-dYqnn*c3yOq=EPN2!Jrk<18EF8I*9Y@%?Q3#d4`!=r z8A4;=fpSPyeSMx%K+Hxyfe2Q`dyapE<~2zFA^#iROuy*>*>B@rKKRqR!0-ok8>Hnl z$_MPjkhT|b&@ZIa-)FD;NjQy2MNkRdjL7;TSxH4Pc)2Av5oZ) z-wvGGb9Bf>DW-*G*2%6|EagpNgk>L2JaTrniA%rqV|n?b>}K084UQUoQ-BKvHz&Bf z2pae?G^wjC5*;!LPtFw@+1!GhB)Jtk|I{n=oe;i%%u)UqHC8wq0xkh}73p!IzYM=X zrKP3ie=}PglmzfYR$iuw6yq3_fyK+q!RQssjssxAUXyIs`r0I6W>JpZq1EW!+E!`behO}@EP~QeR)auqT2$ZbpxwjZsj_Ifls;KW=6zb zZalAfG4RsbWBgse+HY5$S2WU;J+bthVa(~d4itphT?KG&_!GG)g0`rSY^KtUry@R0 zAR^iKr-$FwYLCh7)joN+eG=>8q+iF&lmIKT$Kir~s<%==J(x(QBq4PO+gFf1TkDT?Bk=UzW9(+h55H>W#++;rJ5Qr-s*TjQ z(qe5}W7=sa0DfiON>AP9Mb@1h(d85UJl2`xN*O745>{I@?a#0=6^fWvohf8h;Q`c@ z<3wiENu7xun8yb>Sf6)Gjg!yMJXN`3`>IOhSdyfAD>52Ge*`;hga7VaSISTc41As< zx@khQk@z6wVGa`C4(U0W4He8m$KbFP{ZC&i&3lhsKkG6iI>_M}g(^xP`|QHJa2Byf zI%%%ww*I1^tm3M@>%7<2*BLO#j#j^P@1?<_J}TlyA_8cK9R`1Z zc)mKA(L|TpKp7_%wby!x;Wb$ zN-wTa@3+0^L-_rqVAc3aPUehp>XPv43(g|{4=v1PS`R~IpEDN#SB zd@GFwKHl}}H+kpr)nmtcVoK~A{iwc<%#l?cF}!X! zzZEqb>PlSjj31<^k4tC^?7UHcDZLUjW?i25Bw?RwYKz;2-A#&i)>f%v9QM^x=`o-} zlOCA3CTeGU{Gn+S0>nCUrc`X&j14N;mvNVHaFNs!#+;}Grn-ykVORYhiRkE%@`6ZK zGY4DqbzxyxML&;~`#CV^X6R>wMHzs@wTR^r&dhpQ+|;fJQ7}8V5pPllFGqxU9UMPc z{ubmUjOZ;pnW#S!s-k}w$4?Dhk+X9!cu=@Ve^XY)ahuuSk%C<(FLG%{u*w3F8c5M+OBbGUivz_q;V@S*`+|aeX=msg>^|rf> zON*^j4ItzYn=>y}uhWfue)`_E6Rl_Zbm{tP+HHcpU?1b#GI;PnDxN>>O!4~c=&J0l z)xxP(fkAXY`NXY!!74m|axrgbuu--GrUc)HaMp%$y~Lo_OPzH3@i|Zzi)1P7gxQdg zlaXy#ezwhTRbFF`Lu{Q!#&(DvTQILTBhI41 z&(rz5GLHE)kxM1yUCHmrLcFwuuHVjZ<4vE{n#MbMM2YiB&!-a-^80gv$DMJ;uZWJQ z@Sxdgji8wGVJyDCzx=A6xWrjxW&9NpvLwD>GcH}25f}WXtm?clK0ZV8uVSPyYxguvFqCf6!`w3z=ZYYhkRB# z926lh&ABoRO52{Oa>2EG!9UkYGNO9eS4I zkzx~;G70ej5Ak2Nd9cdEx7!{)ru1Ufyzx-^3@Ja4P`}k(qS}IP$A>mwpy%kcs1o3S zcuv$ezFPS(s~CQVn3R;{*qv&dODb4+j-gNGvS-!Ril`(N7i4Rk)v>j(7=iWFoA`%n zjgDCK8{l|f-X`pG3O{spHAPibRLJko#6C#_w=L5!sEehArbS{FP1tD6+HPbj6peNx ztk$u%6I5289^(6%v!N{P)HrCM-_+v33-7gV^&TQ%x4!-Ra6cjzAx?APu{78<>$ZVS z)#nEywDY%RHPHj~OJ=VgN-dZaEtGK2NQl8pC(u>qno(w#BrF@+)Q_a8+lxtCKd>lw zaDt4c$$1OO!U8tbw2{x-xT(VBD>{xNHMB_)92Qel0yc*f`hks)+ZFUDf!W#SCqexU z{u+~$*6e7!5%MQ~nj(i}j=k_g4q+#JfsZ5=*+MsumPx}Y+1&HYhs@BW_(w@|58EMq z83s$rzvh|`XsETrA5L`oy}zZnAX=l3&K$zD4aMQS1K3XmU)4IJwM~@&6NvXpX}p9) z%4L`nmYOiB+B}h)>gL&ywCfvrU^64&*3*8Ajdw5B(abvgFeN3=QrvkS3v70Q!{YkuZLl#pyN^#hq5S+bcfNo^DG^#Q(sQTcm=~8y z?*HISpysbzKl1<0@1L#y zl&96?w?cqcG)=rsvuG=v?s21~)&cGXqpN}E%>=D^-vS(s4-CnRI5ULTLJR{r-6OQo`p=Pj z>yty$JWE*|W zkP}PP?=5G=CWC$b59V8ZBuVE%vc7*M+7Y({XajL=K`+y;%mhWBmeOCp(|AE)@a8Pk z5C2eCnrzEcT%ZZTlA@3;sMDWFtjKXXEvEtYgVN-=u~)#kk+|GHX26iyS5rT1u+_sLr5`#>6~~pzuPpT&ugSTXogtT_e8>*1yd87ML*@zUo57 z0fDu?l&o+zYEkD2nfs#gKmIW>9}o~F-OBEH?X-iyAHiON4CiCg$Sw}T7{sLZ)KM^j z^$UgR>8iO7yv+eulAU}sggv)U#PRV7Tm1}V*EMrHj6<{@86G6TOQy4S@teV?zl%=i zpcs@vRmjVasQd-Nks&~nkVXCHK6#AmWt1wJ26;s_Lh{F5arwD-bM0}2+uhN3YP2up zb(Kz-$;PwED+)bY-%p@1Q*mq!E5yERy@+eG*S=1}{pKLG3hq?d zR&sN(RKt9vT6<*2ek!8H5;@0@>^{lN%pWwRmgVX9$LocRF5wbyq z>GL)#c=`)}3Rjdq*=vxst^$2<8z4PhA2el3WD&uuBIX_1R$qI&Pvd@se7{6~TYZYi zHK1}dV_SADOe|egXO#(qTt0v~Q*&-$xAtA9JjpT&(ftWp8gIdu3vG|V4F8JNjd-{Z zR-zmVZM4&MpyxBu!rGP;8UtIBy978 z+LsTQW1BhPI^ghm&!ilA=U|RfnUJw8NM1*V4%o3xl=k{H=h7;AEwfxCZL~omRk?2# z6&8}yQ&&Z@UF3(by+{NqOqfD>kUrS$C@X?2t)#C5SFg?Gpuq~W(3>$lJX|IamQEn} z`Dm5cG(5?_pou)Mn{e`-y-~$JWamXPx-0`-;`+JT@7L@*c6Cujq;>*?x~EOkE_4UWXUa92{S@bNAeTuKq_f2UT0>VGn$GiO zNkW6HJ4k2lJ>I>e`y^xg(gA?TI52O`%g=u;31WwzXIgDv?`O{ZIGOnf9a{L!AQI!MfEr9-6q&Ichx-6;*Fx;G$PQAO7psL&i1Z4=zT0x zf>%4bo=RhdJ80OLH_mp+J$2IXOt{%)<-x2UUqWf<(jN&G`*DD3yh)~2C-Mh&{Qt>R z%rXcLvdGgCq^t=4m(k94Pd&dBR@2xceN~V-B;)Dh+4Fs`XAi+VvVG79BtA2wIRs;# zDvx`3P40zHEevvC(TI9ZuYD8r zsa82Jhu^pG7kyWycaz9@Ea@!LMdUWyDbs`Hgr&E2+zj9NAs^kkE5A{uR9`BA&>DXh zc*)?_Kn}Q4BS$SQEhndZf$wn$$vEQ4edX5?wc9;tx>?yp%fk;lzY6?Yo*`6>ApAff zQq;V`|I;R*zw ztp${BXQaNVU0yjTSCokgkAGgg8Az71=4l-9mQ@aHf5xphck$ZM0&pY=b=$ShJqHyKK->Si?18Q(Ltn<0;ai{1P@vG(-$PRKj@*G!afU}FJC-#nD<)c$W z2P^6rRCQIsb~55K=l@?U*i5qzNA{UeO9I_#SN;ksb=&tFomsQ@GK%q|+Arb|f`6x@ zQrSM(8@`v*5Xi;cdm#@t<67vEY5V-a$gga>vXN*@BTwqbq9?(_!__}mzV5x?@~p1@ zlKDIKXFhPFN4C0djEy$mhWJUtfbbpcBBHMTQ9yXCl7XA0T=17KEKc#VLUP@`roc!A zFSyM_5A^U!y9UG_*zb9fD4->LLmSo@@H>WQ7rj3h1O@mS%G|DoWH{n59(93Vk|pW2 zjf7@LIZfUD8zv@)h>h>Q@plR5rejdAFeR6l@7fyL3GVQB_|%ya;$akV8~g#AJdwNV z4W~}Ujr^QWV>J4i`104RLd(SO$$Os^uMe2XI9Q(Iy4v)ov}*1u6Frh;v7{li;&XIP zg~vmk??3N7v3m4KdM^--sCNA&f^UzuN=4ue=deU6MDKgKLt?c5Zp7E$MR!BfZi*6j z(Q9GTCFsiUequ`6-J;|U0!v=WhW-JIWj7-1cou#m4hmmyx& zr)vjztpma>tG()Xrv}z9JIiPYxJ3Z-Xap?$udwVGY6!181^fS}3C*5%2^zji7Q+5qWZFKiai+6!@08AIv zci8iCVE;GN8`%AWk6 zYIa_lFsjB8yD5$uh&+6rpk9CC*NU9#Q-L2#dYT|*{@zvGao9j<#P(tn9UVij6i%ZP zrir{Nb|NoxK1_H-l@x1GcJ5#{F^dlvF$YG&gsJ#VAIKB;8Z-~5H7M{UR!O3^$_9Pn za2r_Y6}zc##!qEkMtZIp5OHv1iWj&;VAqBKQm|wFc9VMQTPf-|gP%Ndjw55UjbD`b z#;z+fR$xkYJ3A>D1T^%bRNhov$}(m!B*a3FIuQe0=nkvYuA^2L!H< za$XObG_Xig#=B>62vDSC)MW+NM~{-@e*w|%y{i#2aQBQHWY&T#(qv4d667ZqCps> zn4##E;NCkGz`^Jv{O&5pGdmaOhb+R`u<@-gRMkb6@uCmf)6j>rE_!+w>`s=kPD~I8 z8eVJNogFo7804Xkke@@(YB*aV?QK-L;<(r7#*>y(JDD(MdJ%CnubiY7A5dVj{*1kV zeviN2eknEhgl|HP{br>DVMW{5;Pc>G(fU3=usBz^URkM)b}VXeA0iiAalrB&&e4~? zQ*Awz)4ilyC5!z8t36LYX@9;ii3l9DamomuG5n^fXO|0G+j#?{7%VD(e^dJbp^yH% zS!BRszT#s4?gZQ0=cxUy13N)ZUC4L;7%=M3-mv4DpY8DHz)@4aNJbdq;WV8mQQs2a z<+EXlnRssp^78`NnkcsO7j$e??*%abXw3e$IpVyV&xro`_?6fm9``!R*sx@C*zpR3 zxt07oOiB0vy1{(KQIodtR3*0-;eEFtXW3r!-%Id-&6%WZs@#TDGIX?yVje%0RC zM#BXq3#i!co*)nZQgPAUa#i{_d*>?M=by|PryaDx1zy)a;LSl6Kf{{^3v2s%CaLK? zt*^gi(2+{GGv$yB(w>+|gqT-fg$uEsrfL-H1{DQ&BWCUo%j)ST66K7f<^ zdw40^DU-VR&C8_?#qgB2@-F6^>=B5VYRq(dWaSmO`6hCikAK@Z-)rVXBX=S93h_?C zM&4DV+Nck*D4P%!^FnUZ>(bwcJ6Ok`-G|JxQ}=4yH|~tZ@>S*LxWHIdWk4zAMH(C;tkw*x`XrBc_;3Ls$Ez9DO*W2iXU{w>y|Ym7*gz9>RXtl5r$>5`Z}$rjZ}`?{qyiae$)~ltOq-X3$N>sg_i$v<$v<| z4Tn_x-BHt<<4a@3Q_4$>UfXUL<*Zpg4LbF-F$8|x;if)WH`+>q`g>EHpJk=KcSzOx z%e0NDvK;eTazyiuq*U8i3(3*t)i+eH-f}WrrRd}2Izi!e>=uI_H&;{zMH8p-If~=o zo^wW>;|}H$KOx!o`_@c--NEuNls}iN7oy7y-iY0o51{o9gb(WoA2ucq)#0JRuTJ4# zAbRNuP0|b0fU4?of)W(GczXhPk9zg$7IdMf<`#7C{tY%u4I!bSAeDb_jBhjA-(jCAR%6EZcxC1%gA=O&!)?}-X0!t@$umK zu(}sJ?;!!8^khm9yqV%h4|Vj|r(;0VJ&`2c*6EFh5@!fX=q<*u{YZ{c2bV{ibnVrY z1SQg7I9Y4rVak5@LJvtC3J_~+WlP(GX_!A6UyjTxD$B-xXe~a_ZD=tEkxP>0u`t0~cDur*d zyGb_$1S(t(NLDmeF3gOKPBk!+6|vB4)@H43a@~p5f4_7|c`X<-F0bWwB8f~g!nU+c1@+5D8z zfGr6n{(P~~_=38c@nS&194k3Q49FNuq3w)U<33k8EW96}$Zw*eq9VW~p1Sv*w7rC# z`M3{m3K!dqC;C=fv3`}q2dl;>yRsDEX&-Hdie=pruMI_=r zuu#2X(jwf>^eCmAX=-E7a=hdjF*EZti2iduZJ=Vt)Reuf0DbZI-Pq zHw_FDzf%RpFSdlmjx3l>F$i{UHR`cz5k4)`9JRdsALFNPa6kG{Gqj$dkaazLd_J%Qjl90wkMr8gAYsUKbyv1 zJ5L<=CLF}H!B)>CF}6nG9q#*YKI^f3Pl{}UAAip(41SX%WU2H-ldE>nL9c94FYPSoGqabkJEaqW7JfhJlXkxZ%T zsPaAQGN!l#@0AgInMB}!EQikEhmfbTwuhO~Y=d8?rZO83w&%$RJ2E>Gct-3E6>ivB z9**^Q<`Nd}iJ?vUBZ4LsFvGq;&xVp=8Lx4lUtWHEb3QpaIR>39v&BAf=^02s%ry^1 z&H^$MSK98)i0BpJc-tVbQQd~d7kVBCwtM+VBa`G0JGKWI3ZiT*V1uKEnoZZqcdhCMz328Ak^-!5A ziwgJJWSky$A=*@OS<lUwrdGHcD;0EkS>vif^17EeZl@RkV`=gS1Rqj zWk}Fb>}tJ@u5jSvy%y{PBQG;!$#owt_q?=VVs+-PQ#A z&(B8Ze!P_QIlg()JqHHIf7a3KmzW(gHrPpxSLBS6V$~r%1m9lPVK(Ew&p!SN9&*q5 zenK1i=l50xyEoN3U{DglAwkk0+BIH)(j-=cT)}rI);%9By#~r6q(<}on{49P9RyyM zKFVQ=Q0Z^vO}lWf;&&VcYBE?Ypj4pF>ku1aaF*o`^esLZ1H&1aE*)4GW{XJ2Os+-0 z%`h`VSrB-#9z|YIoOoRLsJ8B@m-3>SUf90Ngi(CL+(@OfLArbgiz~KKkc*l9$O?$J zE#`4VNpOEWxy7Z(^xLBhL6>u>_$7>c*xr50rYMIe*f%+_@OPoL58I;7Hi>?Pw*q@WMs(Vy$3^x>kEdFIP z(HI}<<7J<*^TBkyiw)vJ*Va481B6IWXKB5Yxx9l{Wz;j2RJ(usfl0h=q>bmH>2K+k zJK++|PCnCz4szd~Zu4r>mf{Wyhe`-pO*Imh-~TLaAcrmFy>BpXD} zl+kx&OZSy&YS|5yv(Bmkr9p1DdaeQ54b+LAW_St5ifP)28U$|0`xI)TbF9{rpMMHG zwRwJX`8__1{QG4q(3*+oXN=7DWuWJ&bB#WkV=E`{>b+LA&2?x28sf-~6OoYO14ORU zwjDRjI#|`pdaWA6VRFNF1+`b2x2yvZ!2@_t5Dt1p`V zm6_=o`?#IJLe>pYEi9CgvyLyNxkeK`mu5(K(e~+19KW~CT_GUyvO?$F6Yvb@X$$J> zz;yshIxL^}P0j^&M&Z{1matM5f2V9nu144^Ii^A-?t5d&EyuU!GQN$y$Ll!orn3Y* z?m4y5i}HP%;8CmPb?m17u)zr&eZXs_qR_9GwSgE-!gOwv<4yJaH^LWIBt2}@Ph_vF zQu3wc;mvAkvQb-m9z6+6840vm0TsASuL!(~E%C7;3<*?LaGxS$nw>Q6jpdN`2eya6 zqqEd;WF)<95Ww{K%7-6hV4sYIKvvs+tZJg1XekXpP0RWoD1BW$+lh&D{c(0>_b_Bh ziYn%IW7*`jY!pi3>y64=(Ks%>(2N@v8>e=nL#<0z_g11fo{?G1u*Gu_R-q8?>B7Uya z!eNuVZ3U0rAp{F=mQ{QEW1V$6R^=z-vqvd{!O2Ow-ac+ zzic0cXnb0Iqw8nXGfMa;=~Xrguj`lO6@y;rzS5^bjlUiaeW|B~o)hK=aG#vpW3TSs zGavrmOqnB>_CV}S+u)jfs#LD6bv(-trb*PRF=EHL%#dSxHMEoM>uP7rYK)$!hki@F zlhY_?edv71E_QWBbfa)_E*m;bKNd2-qFa><@%U;3Nf((^Ou7PSOJ2lIJkm0g^z{1f z-Fe1cN1!b?hlF%gu{=$VIudw@l$8xxWLk%JCm1e^FxeRr_BXGTQJ?7^W(%k4vq~25 zoV62=$bawP%W&si-qQ&Ty&NUWT;!!2$l5z*D+3p`%JRbdL-m_JiLz@mCoIp1SHx-w zaQK`L1)_Y#`hK6fP@d?p4!QH;L9MkX!RdJ6FEMP+*n@6S1=5JeMfHxnnZ!Swbteb2e{ZNlrnRKUc$oO(zM>eSn zD;oaBsqC(W_m0uKKC);od%p~)Ox`9PhR2-C{XIo9~G+J=f5a z_gQC2tEO7WUn1QCK&gcUmm?o8Px&?>S}+k|WxUXtVpd%5T^96^7@ ze+8q|re!Z+PZizI0ndsCT@hZTyP0*>xJrxAuf$SOH-5G*_*^~1G4bsa{r+V&)zz2I z#!A?}j*Vl|f*Pl%MP4$DLmUTRMA)q%JiV6*hY6$`c6-a^J;fLM9#!5Zh%(uU?zm~8 zhtEeggH|o~exvi?Iq$P4!uKoqaMGiq;#)RXfdIbCEXFqNcBmAuGAW$nM3`m~C`?(psG*4>GF4z32>)R2HEv*ms8 zYcU)DmCB8D@M9~c90G}|t1d|UbjRZ}oZnfrtZ7(jQj;k*1 z?e=O2V*JV|)sl`>7%kde$ zx$Z)XaKgH<$YUeIhMLXs91{C|c)(K?0l@c#)AZA%?no%nr*?i9i$w0vCT^vH0_}iV z?ga+PdLJ~4A;BX5jf=&7a5IhR^c=o98=2O7B58rgS~#EW#&EtAw*$^p$I_IbL$hTV zxj7V9?ol^nAg+yjr7lOPoyXVljsCu`jUITd^j-}kT;pr-M(!p0c}fgIVEFZWJW6F5 zEXHqgNQ=mlGEC3VN~wz+cE6Pk{#N};9Pv8?m|nv$CF-~_UuNwFUY}@b9p%@}4||N) zq7S)(?;o-cy2|FSOc%ij{L@)ViaMImdX^gnHjvA=_V?Ao)SH&*)G#Gsg}ZO<_GxRL zr{@=1>*7LFTQKzAdmd<>z4ZAY|7d3Bc@VI|2m#0a!;?}Uoh}Ij;Kv8Pja%RsieIC_ zboy(ahbadZ`|`_jq6aqC{FnVhr);KpTdke3{uqug!qY;qJe0?Bzi(~FsW?AR+&sig z+u;+$kwW(Z%!n{73sl@S*-tWDuFE3^br<%pt@4b;nBS{-de^G#0;c`7fp^yM+cNg+ z3pFwL?_L*qpR)66r8**nFv9VZi)_lc(D_tRiJco~cKJSCdFUoOhX-FBUr%WUk7Dr5 zh-o85+l?^b#|~>-;=b%{zKZIEo*dG-F6533r^f)I!`Q^cR^Jwq3t-H1X?aO1{=KCQLx>G*fV^)e$Cq3*A7POl( z8*gVLEpVYfZ0BV(p}U`M#30O%-9Mw(zEL#0pBDA)iKkE$9{W$h#}shh#6?3VLO5tZa$TN(eC_c%}7r;TaSc=iNz>uA4>+>R!RmT6pCACF56oeW12o zUs}#98opcSOx!UxpSJMOS@490Ow85h(Aq!fSD;qpbWS8TKNJLa6hQFg zrj$y!wwSap;3hoKrvb6H{p>#9-JfSr?m|t@N=!LOst@+xi&_1K-5w#*Y~-pv`U185rraKCE2EA z50jhhOo}4Qkd$?%Qt37rYseO|Z!w9|??RV;g4XJxKTaywCHzpN~Jr znRA`ra(>tEoZq>w?{`Y?d=;#`F~)3H(TsiK|Hm7XRy}W){F0p-22KpwZ9wU`g z#=BFLrUf858*n9`X#|n7ytW!JIJ*qElS(Xjc5*iz4Hnc9+9ljHSmQeZiP*p;Zh}wi z$@lK42xFQg*q#Tusf_IT$nlSydrXe_(iJW`&}vg|0LjF~O-EC(qS#OTmqkFDF0*y~ zkUVYS@SbXPP}peL4$6xd|NxUo4PnfTjR^^Ew2HTqZ=S zF00gJ0bmSE71f^%5nHYX^87Y%o@mAx4nN>NilHlR!)HltbkYL3d>fGqotvup1uX@r z`SZ&S3ESAsG2B0xTZzs<&s)FXL{MJ}`ph=;v&Cy0gNmPorL2v#{lep-Li!)zH`H}{ z*?3HZhX1a@#@W)Y9^T3H++{`M)MOo3;^Cp@JYjpvujD6rlp1;oTNP-}ru`zaE6hCm zq);`>QqDP!Rrxt%r#yYN zT-4tD2WB0L-#L@q0#D|y1skh|jf^%E30_8n^E$@*lH6%AuRXs#IBTgvoXfb0Bq#~s z8rmoNYVvo_rcb{hPH323a|{gx7&?7*j>n+3mp$bpmI^_x4EGl0p)K2Pfcv>MyWn|f zisEJ)e%KZ#VBmU_^s5A8Dz1ZFC9-=3fB0+A88xYcZI~00+(&ii@ z1A_G`t+4bsI{5$^TYrXTIq)(HMGvX3&K z;>T24uP^~-4{R^^%mgYZDokI}SDo^X;#SnK>;s)j=1SiC_y*})#6ViG6pF?v788ZOhyRxkynR}tDKOZ5qtI3PVnguoQVlz)!y3$ zujef)$FAIZkixjPmZqc@Y*ej5J|FzoH$0*FjOmU~efO2b>RA6aW^TM#j=R|>6kCQ{JG-!YK#s`yJuyJtXY$B|`}N}C%gmKg41hXX zy>K)b0-JdhSO+_lA0O~uZ;W|_ zE;qY^>dtuli4^GfRqk2PWaQfUO!%I4!)L<&AJHEcRNpnbDw;$j?$U=MSr^D>^T!h* zBC1WAU|A!LmoQ=Kt4~^TkpqotHrM#D@dKv3nNVVUAjQF}E_~-&Syoa0&-oje`#2r! z`y%MRb@wY=pZZ?(EzoPb+fNEKoqOk2%$y#oA>A{uwbcB=-kw?eu5sBZFN&y9azy-W z{fyPKh(n#7qgE!BN?O?QBpn(|?0po(xXjSo%q8NvOpOLD`SKscd&3=hJJ%#kl}G}a za3?!&VO5_G4$~CMspkD`nGpO#1bxaZ<$k^DTGceDh8MwhdfuJ^7O`YC2{{b(fqyYF z|HlnpY`hlP+%)b@{?|#t$kiB^Kx5I|?7Lz~Hb(oEanC1(pckT5j|))rJ`<;RM_*%) za`q^S@9l_JIGLNFZ^gks!1D5##;vpju?*wRc}&-MmJS;*wvt;MnUXjuUCkE@-n(v@ zP=W0+wVu+hTgwBFl9221;~q>#;0~PLE9xkpN0HZFYrCbNKO>H=W~U;p(iC8SO?`E~ zW(#gbtR($|QUWCY*~@i#%Ws$Kjwy{~wj>0_k8^YK2J~If{kEqgo!1n@b?|S~UXA#I zDA1BH7H5^a%Q6xL*v%Vy_m!-H_+3J9b8rn*#oUJiAI5r-G zyr8>-9Bj`hCn6JJbIef;^c2sCw3n^jb8Z!mOLl%msZ?~dwpD&6DwoHgYF1Ju?G4&M zyQa@OD9D22)2l-16-k>}k7;kAa;VXhNYvf2AIT!>e~pelxh3~^C%mymx-@Z~_s&4e z2xPwoqH}KNv7{qBW{mKTD33`MAqge@*PR#m1C43t<+9;@2b^%be6<`ACl5;oJ}X?j zg13mrbAZx+NS7HV;9W^4%-rer_i2Y0QEFz*3o4m*kLDJ9b-w9%w*prwb;&}$o{nMo zjQ#N9+Yh@GDbe^i>-+AvBD*`1Q5x6#)jVI$cdf0bwym}dU$TSQ+LoFqoe^WadjX1k zTKHs1s!68$qm$}<%g3-v35L?%VabR0tCf>{7uq2!qjWjtW7CIzxD}rI?yScU5lKI4 z{cP}av1>qfmJB0KvXhp{B#uYi;sRAZWNZfmU}gcB_NP74;(2)ig>6}2yciwz#Int9 zR9YV;EuC|G-vT$n@@aXKX%0tjZLQplrn;*^l{mj!f->D>qDnNyN>?VElU#R%9n0t3 zaG|HLK79{s!Hq;QIzyU>y{6Iw8L_0 zx>9|t^)1P;$5kr%^Ib6WKVf7Ya0Y9Wgl2MEKZcEfyQqigGrC{B4X(BPNG0s?mLN%b zSyDG7F0~t$ow82o3K%l=NQ+{a+tCV*MU!)|7UgyfNssr49zB|KfZPG?(YZR_#*>rh z?wK&CDfD%+nxTaHiCo>NgD++2XTQbfON}Xqxpfto5T zFO`-`Ta%sJT7624m?dxxn)N*Xkeq^WcsBi}iAu}m`4sXrl5yvR$`n&X_VLz9mO3a4Kovutol@67w7K#F;ukJ^ zuR5U_-%R2pU;8&-GhS`;;v5Hu=IJw{F~%PiMiAFhx>MulPvrc4f!j-qaJE?xA6T_ZB|@p zYOs(S?lUL%0U24k+`D9`txn?eFaAaORP-OoQuHVZPuS!2srQ=mBC;|ai}Ra0oA(6r zB-3uoqb*|?6H#B>E4fSw!OkOxU&9N!VK=R>X(rX*^So2RWum0y$$LOi!^bSv;O&Xk z1HDq2aOsaNlNA|Ke=uUCd8h@)>Agk~ubrcQLQ1;(L#gFEJtL`X%GABV;%T`u)h$LB z6_#QOC|#VYzjGxxwPFRw-;?SgMq!&aL1S!H6A?+Fw#S66BBV~zAAa4PkQ3MaY1WtF zVSlpU!Qr%lIG6d@z`{CR*Y!{Ka>$6GhPKH;O6JnVT;#(f%}c~(o#>c7{+-vYjD5+> zCeZbit<5<&t)YSN@E&j2u9}{Ord?dra9w&Pvo>g#K_i7y^cZYkSoE37_aIu?&o=i; z5b;5t=tvLFs-h68SAl(1Y3aHJHw>w1p+44Z?bO0Es5y7D;uiFVRG)o*)cebhnfP)e zvTXc`6Sz5!-nyF=xGSEPTqkALA)zDrUBu#KDq9MvMC%qdLG&SzB}sQ70H41E;Q=-s zUo40HW4i9~?oc~=ud0+w?z&RI#r0MQs-B!` zrF%l>k!11JUc4^NL?>1c<#jswT7V8=XUnazPZv;4wYzO?am_~z{!ZcYmq^%oI;|i1 zjWCQO@yXInV7^@a0KD1~EnzS;Tpt|5vK0iM=s`h2G(3E3dGfyG@~$9!l!BwA+;lto zQJ;Fcn_{Jn9bd8`*M4ypFzZn)Ux76Zx;uwFo^)%SStYe1cL3rETqER4<-jd3M(3c= zb;*O;o-9O_Y7SP7hecOKBw1{a{lUS0@jM6naeJ4J((4D_z&;4L^e8N}hZ8v;LaQVg z>Io0jQ`x}73uZpFijs&eC~%$ChkD?N3r%J{i>``$uhL=}&){DJwX*S+mX?{2=FX)x zIjBA=x@$I%@~X776!caV&R_*Y5U<&8bis>-HjREzzDS-uK9yHgP*BhX--&JzeRJR{ zO{L|1o|KeSJ~gh^y?m;3s`NGzMJJ)+7^y#(!p84{C*06p)>l;SsYTj7Wy9=l$q<`M zGNL_PLz$=wOLK2WN5^U^U;X%9oLzC>%>ACf3=}j-M;5NAuMr8)s8A zsk1PE(Z0HVkPf(-T0znIK2Y7+8pn>(?|O3nP5!RUc0j;{r=k{rTnix(WOzPbeEIEc zwR6-saASx+kJN=UVBsE@s}^%mQF>IO?&fR$S})KziekbMK!v zAOW+7{HE5-l`;2$)^*;s;*P}-e$dSNtND%dz!w*rcIRE9#?KSUMi4GGFyZN`4bYP?5eVLI*`)h&UJzeS035CZSKy6RzaXT4Ve= zXDYIk=%4=)myTZ)H&e{O9&U9hksFQ9Ck*ljx;lzkVNAbqGL^L$m;p1zx$22C+k!(F zOYUQQo|sxat?p$Q08`A0t$E$uU(;`oUs2#y9DU)A8ZkqpKbNnb_R7Eqj4Z|?dCo)o zI^-xG2{Ij)RKOLp6=liw@%o;mKqW-5e2{3d(a$br%+o&Wz~?UW(Q~l^>8MkyE&ZC% zt+=rvKyioQNm{p0^I|83%&4BEqtPKc$<6h0&PS^86F z1vORB4d)}1jRKywuY&W4E$61=QFhfU1HB>EW<^E&WJX{1xO|!YS`f~d4?Yq-V~$wK zJxL?F6IUHbN{vaKm;cc=KN9wWJ}^g{o;XlR=zZDSkM_rA;HxbDobYKUzykvAmaorb zVoz;*NqudyGd-Rm+-Bw*oQwLAFFpO80H=&XOp;zpmFb|6Hgm&+&b|+Q+yUR&BngnD z6~!`!iT(DT%UtRBxTe#qb0(V14)-tNSsL3qRAXWp^X@?pAc1#BFZKCb^?71ku}hPX zY4bvAYP;da~0!<Os#6hp+DOreS%B}{)Q%49yB;=+{I-O9wM`iX0 z3dXd5i*<4&sD#I_J6@zhIe*VDI{)bs#nZr%{|fiAjV$9kd`t-EVr=R*f|!lFA?tsU zI;$p0i~Bf<`hYn_OWb*IYo5rP!Z zV#=aEmw!VfKn)Qu$IgBc-MJaE{X1<4aG9lSxf$LrW~3M1`t@IBZJe8nfO~xrc!#%g zwrK#~DYqffOl~XS6hSV$n+m(rJ%_U!mDhgRb~f|=;&#ep_Jj*1vg~7*KRAv5UR-;c zKPbYd(}O%QVx|pc(Z-u?amR0xy?+s)v+&aazx)Pg{3a3m5_ms~B?I#C66mW=U)|^& z`0Fb(7b@HJO@ep8LBB-_UkE6O2*qFSlxgFCe?qbR|3dtMw11cT9|q4LZi~qP@x93( zU-n-tKsW>1`3()AyMgj7sT(Z#)!B>WUuyoZk%$*a{iu!&cKqJGRvF;Gq%HlSTYdm0 z{xS%~wPgnI(3a6)+1hm8KMh3IUw!}W;@=Gtzb^jmvH!%;-*Fu9_Ok?RvioQM8+Sf_ z$8VDT|Hk1z%d*YT4+i?rKLDWe`^N(Q+h`2-t&4xp%|E{QZ4TRq1onr(&#;XsqW$*O sKi?m;|JMNdPv&l`=(K5$*&0jxP0}CgWW`KC)Wf2uWu#f8asBcC0A_Y72><{9 literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/stats.png b/v1/src/simulator/src/img/stats.png new file mode 100644 index 0000000000000000000000000000000000000000..700bd7fb9ec3c2af3f506ef24bdbe41e165c7139 GIT binary patch literal 4824 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 literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/students.png b/v1/src/simulator/src/img/students.png new file mode 100644 index 0000000000000000000000000000000000000000..0be22e0ed593b83fcc85ef1aac523eddde932a7d GIT binary patch literal 62506 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 Y#Yem*#``$##Pyz%D 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 SHu%2_0F*5uo9n)2ANyAU%@NrE literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/img/wire.mp4 b/v1/src/simulator/src/img/wire.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..8b246df9b9cdd8ad32a17d4c35843ee1611b683f GIT binary patch literal 20226 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 U|Bpu3KUTjmcVNlu3#@Jb7u2@p#Q*>R literal 0 HcmV?d00001 diff --git a/v1/src/simulator/src/layout/layoutBuffer.js b/v1/src/simulator/src/layout/layoutBuffer.js new file mode 100644 index 00000000..1c339d28 --- /dev/null +++ b/v1/src/simulator/src/layout/layoutBuffer.js @@ -0,0 +1,88 @@ +import LayoutNode from './layoutNode' +/** + * Buffer object to store changes so that you can reset changes + * @class + * @param {Scope=} scope + * @category layout + */ +export default class LayoutBuffer { + constructor(scope = globalScope) { + var w = 300 * DPR + var h = 50 * DPR + + globalScope.ox = w + globalScope.oy = h + + // Assign layout if exist or create new one + this.layout = { ...scope.layout } // Object.create(scope.layout); + + // Push Input Nodes + this.Input = [] + for (let i = 0; i < scope.Input.length; i++) + this.Input.push( + new LayoutNode( + scope.Input[i].layoutProperties.x, + scope.Input[i].layoutProperties.y, + scope.Input[i].layoutProperties.id, + scope.Input[i].label, + scope.Input[i].type, + scope.Input[i] + ) + ) + + // Push Output Nodes + this.Output = [] + for (let i = 0; i < scope.Output.length; i++) + this.Output.push( + new LayoutNode( + scope.Output[i].layoutProperties.x, + scope.Output[i].layoutProperties.y, + scope.Output[i].layoutProperties.id, + scope.Output[i].label, + scope.Output[i].type, + scope.Output[i] + ) + ) + + // holds subcircuit elements + this.subElements = [] + } + + /** + * @memberof layoutBuffer + * Check if position is on the boundaries of subcircuit + * if the desired width and heiht is allowed + */ + isAllowed(x, y) { + if (x < 0 || x > this.layout.width || y < 0 || y > this.layout.height) + return false + if (x > 0 && x < this.layout.width && y > 0 && y < this.layout.height) + return false + + if ( + (x === 0 && y === 0) || + (x === 0 && y === this.layout.height) || + (x === this.layout.width && y === 0) || + (x === this.layout.width && y === this.layout.height) + ) + return false + + return true + } + + /** + * @memberof layoutBuffer + * Check if node is already at a position + * Function is called while decreasing height to + * check if it is possible without moving other node + */ + isNodeAt(x, y) { + for (let i = 0; i < this.Input.length; i++) { + if (this.Input[i].x === x && this.Input[i].y === y) return true + } + for (let i = 0; i < this.Output.length; i++) { + if (this.Output[i].x === x && this.Output[i].y === y) return true + } + return false + } +} diff --git a/v1/src/simulator/src/layout/layoutNode.js b/v1/src/simulator/src/layout/layoutNode.js new file mode 100644 index 00000000..ddf199b3 --- /dev/null +++ b/v1/src/simulator/src/layout/layoutNode.js @@ -0,0 +1,124 @@ +import { drawCircle } from '../canvasApi' +import simulationArea from '../simulationArea' +import { tempBuffer } from '../layoutMode' + +/** + * @class + * @param {number} x - x coord of node + * @param {number} y - y coord of node + * @param {strng} id - id for node + * @param {string=} label - label for the node + * @param {number} xx - parent x + * @param {number} yy - parent y + * @param {number} type - input or output node + * @param {CircuitElement} parent parent of the node + * @category layout + */ +export default class LayoutNode { + constructor(x, y, id, label = '', type, parent) { + this.type = type + this.id = id + + this.label = label + + this.prevx = undefined + this.prevy = undefined + this.x = x // Position of node wrt to parent + this.y = y // Position of node wrt to parent + + this.radius = 5 + this.clicked = false + this.hover = false + this.wasClicked = false + this.prev = 'a' + this.count = 0 + this.parent = parent + this.objectType = 'Layout Node' + } + + absX() { + return this.x + } + + absY() { + return this.y + } + + update() { + // Code copied from node.update() - Some code is redundant - needs to be removed + + if (this === simulationArea.hover) simulationArea.hover = undefined + this.hover = this.isHover() + + if (!simulationArea.mouseDown) { + if (this.absX() !== this.prevx || this.absY() !== this.prevy) { + // Store position before clicked + this.prevx = this.absX() + this.prevy = this.absY() + } + } + + if (this.hover) { + simulationArea.hover = this + } + + if ( + simulationArea.mouseDown && + ((this.hover && !simulationArea.selected) || + simulationArea.lastSelected === this) + ) { + simulationArea.selected = true + simulationArea.lastSelected = this + this.clicked = true + } else { + this.clicked = false + } + + if (!this.wasClicked && this.clicked) { + this.wasClicked = true + this.prev = 'a' + simulationArea.lastSelected = this + } else if (this.wasClicked && this.clicked) { + // Check if valid position and update accordingly + if ( + tempBuffer.isAllowed( + simulationArea.mouseX, + simulationArea.mouseY + ) && + !tempBuffer.isNodeAt( + simulationArea.mouseX, + simulationArea.mouseY + ) + ) { + this.x = simulationArea.mouseX + this.y = simulationArea.mouseY + } + } + } + + /** + * @memberof layoutNode + * this function is used to draw the nodes + */ + draw() { + var ctx = simulationArea.context + drawCircle( + ctx, + this.absX(), + this.absY(), + 3, + ['green', 'red'][+(simulationArea.lastSelected === this)] + ) + } + + /** + * @memberof layoutNode + * this function is used to check if hover + */ + isHover() { + return ( + this.absX() === simulationArea.mouseX && + this.absY() === simulationArea.mouseY + ) + } +} diff --git a/v1/src/simulator/src/layoutMode.js b/v1/src/simulator/src/layoutMode.js new file mode 100644 index 00000000..c400cb71 --- /dev/null +++ b/v1/src/simulator/src/layoutMode.js @@ -0,0 +1,544 @@ +/* eslint-disable import/no-cycle */ +/* eslint-disable no-continue */ +import { dots, correctWidth, fillText, rect2 } from './canvasApi' +import LayoutBuffer from './layout/layoutBuffer' +import simulationArea from './simulationArea' +import { + hideProperties, + fillSubcircuitElements, + prevPropertyObjGet, + prevPropertyObjSet, + showProperties, +} from './ux' +import { + update, + scheduleUpdate, + willBeUpdatedSet, + gridUpdateSet, + gridUpdateGet, +} from './engine' +import miniMapArea from './minimap' +import { showMessage } from './utils' +import * as metadata from './metadata.json' +import { verilogModeGet, verilogModeSet } from './Verilog2CV' + +/** + * Layout.js - all subcircuit layout related code is here + * You can edit how your subcircuit for a circuit will look by + * clicking edit layout in properties for a ciruit + * @category layoutMode + */ + +var layoutMode = false + +export function layoutModeSet(param) { + layoutMode = param +} + +export function layoutModeGet(param) { + return layoutMode +} + +/** + * @type {LayoutBuffer} - used to temporartily store all changes. + * @category layoutMode + */ +export var tempBuffer + +/** + * Helper function to determine alignment and position of nodes for rendering + * @param {number} x - width of label + * @param {number} y - height of label + * @category layoutMode + */ +export function determineLabel(x, y) { + if (x === 0) return ['left', 5, 5] + if (x === tempBuffer.layout.width) return ['right', -5, 5] + if (y === 0) return ['center', 0, 13] + return ['center', 0, -6] +} + +/** + * Used to move the grid in the layout mode + * @param {Scope} scope - the circuit whose subcircuit we are editing + * @category layoutMode + */ +export function paneLayout(scope = globalScope) { + if (!simulationArea.selected && simulationArea.mouseDown) { + simulationArea.selected = true + simulationArea.lastSelected = scope.root + simulationArea.hover = scope.root + } else if ( + simulationArea.lastSelected === scope.root && + simulationArea.mouseDown + ) { + // pane canvas + if (true) { + globalScope.ox = + simulationArea.mouseRawX - + simulationArea.mouseDownRawX + + simulationArea.oldx + globalScope.oy = + simulationArea.mouseRawY - + simulationArea.mouseDownRawY + + simulationArea.oldy + globalScope.ox = Math.round(globalScope.ox) + globalScope.oy = Math.round(globalScope.oy) + gridUpdateSet(true) + if (!embed && !lightMode) miniMapArea.setup() + } + } else if (simulationArea.lastSelected === scope.root) { + // Select multiple objects + + simulationArea.lastSelected = undefined + simulationArea.selected = false + simulationArea.hover = undefined + } +} + +/** + * Function to render layout on screen in layoutMode + * @param {Scope=} scope + * @category layoutMode + */ +export function renderLayout(scope = globalScope) { + if (!layoutModeGet()) return + var ctx = simulationArea.context + simulationArea.clear() + ctx.strokeStyle = 'black' + ctx.fillStyle = 'white' + ctx.lineWidth = correctWidth(3) + // Draw base rectangle + ctx.beginPath() + rect2( + ctx, + 0, + 0, + tempBuffer.layout.width, + tempBuffer.layout.height, + 0, + 0, + 'RIGHT' + ) + ctx.fill() + ctx.stroke() + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = 'black' + if (tempBuffer.layout.titleEnabled) { + fillText( + ctx, + scope.name, + tempBuffer.layout.title_x, + tempBuffer.layout.title_y, + 11 + ) + } + + // Draw labels + var info + for (let i = 0; i < tempBuffer.Input.length; i++) { + if (!tempBuffer.Input[i].label) continue + info = determineLabel( + tempBuffer.Input[i].x, + tempBuffer.Input[i].y, + scope + ) + ;[ctx.textAlign] = info + fillText( + ctx, + tempBuffer.Input[i].label, + tempBuffer.Input[i].x + info[1], + tempBuffer.Input[i].y + info[2], + 12 + ) + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + if (!tempBuffer.Output[i].label) continue + info = determineLabel( + tempBuffer.Output[i].x, + tempBuffer.Output[i].y, + scope + ) + ;[ctx.textAlign] = info + fillText( + ctx, + tempBuffer.Output[i].label, + tempBuffer.Output[i].x + info[1], + tempBuffer.Output[i].y + info[2], + 12 + ) + } + ctx.fill() + + // Draw points + for (let i = 0; i < tempBuffer.Input.length; i++) { + tempBuffer.Input[i].draw() + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + tempBuffer.Output[i].draw() + } + + if (gridUpdateGet()) { + dots() + } + + // Update UI position + for (let i = 0; i < tempBuffer.subElements.length; i++) { + tempBuffer.subElements[i].update() + + // element nodes + for (let j = 0; j < tempBuffer.subElements[i].nodeList.length; j++) + tempBuffer.subElements[i].nodeList[j].update() + } + + // Show properties of selected element + if (!embed && prevPropertyObjGet() != simulationArea.lastSelected) { + if (simulationArea.lastSelected) { + showProperties(simulationArea.lastSelected) + } + } + // Render objects + for (let i = 0; i < circuitElementList.length; i++) { + if (globalScope[circuitElementList[i]].length === 0) continue + if (!globalScope[circuitElementList[i]][0].canShowInSubcircuit) continue + + let elementName = circuitElementList[i] + + for (let j = 0; j < globalScope[elementName].length; j++) { + if ( + globalScope[elementName][j].subcircuitMetadata.showInSubcircuit + ) { + globalScope[elementName][j].drawLayoutMode() + } + } + } +} + +/** + * Update UI, positions of inputs and outputs + * @param {Scope} scope - the circuit whose subcircuit we are editing + * @category layoutMode + */ +export function layoutUpdate(scope = globalScope) { + if (!layoutModeGet()) return + willBeUpdatedSet(false) + for (let i = 0; i < tempBuffer.Input.length; i++) { + tempBuffer.Input[i].update() + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + tempBuffer.Output[i].update() + } + + for (let i = 0; i < circuitElementList.length; i++) { + if (globalScope[circuitElementList[i]].length === 0) continue + if (!globalScope[circuitElementList[i]][0].canShowInSubcircuit) continue + let elementName = circuitElementList[i] + + for (let j = 0; j < globalScope[elementName].length; j++) { + if ( + globalScope[elementName][j].subcircuitMetadata.showInSubcircuit + ) { + globalScope[elementName][j].layoutUpdate() + } + } + } + paneLayout(scope) + renderLayout(scope) +} + +/** + * Helper function to reset all nodes to original default positions + * @category layoutMode + */ +export function layoutResetNodes() { + tempBuffer.layout.width = 100 + tempBuffer.layout.height = + Math.max(tempBuffer.Input.length, tempBuffer.Output.length) * 20 + 20 + for (let i = 0; i < tempBuffer.Input.length; i++) { + tempBuffer.Input[i].x = 0 + tempBuffer.Input[i].y = i * 20 + 20 + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + tempBuffer.Output[i].x = tempBuffer.layout.width + tempBuffer.Output[i].y = i * 20 + 20 + } +} + +/** + * Increase width, and move all nodes + * @category layoutMode + */ +export function increaseLayoutWidth() { + for (let i = 0; i < tempBuffer.Input.length; i++) { + if (tempBuffer.Input[i].x === tempBuffer.layout.width) { + tempBuffer.Input[i].x += 10 + } + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + if (tempBuffer.Output[i].x === tempBuffer.layout.width) { + tempBuffer.Output[i].x += 10 + } + } + tempBuffer.layout.width += 10 +} + +/** + * Increase Height, and move all nodes + * @category layoutMode + */ +export function increaseLayoutHeight() { + for (let i = 0; i < tempBuffer.Input.length; i++) { + if (tempBuffer.Input[i].y === tempBuffer.layout.height) { + tempBuffer.Input[i].y += 10 + } + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + if (tempBuffer.Output[i].y === tempBuffer.layout.height) { + tempBuffer.Output[i].y += 10 + } + } + tempBuffer.layout.height += 10 +} + +/** + * Decrease Width, and move all nodes, check if space is there + * @category layoutMode + */ +export function decreaseLayoutWidth() { + if (tempBuffer.layout.width < 30) return + for (let i = 0; i < tempBuffer.Input.length; i++) { + if (tempBuffer.Input[i].x === tempBuffer.layout.width - 10) { + showMessage('No space. Move or delete some nodes to make space.') + return + } + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + if (tempBuffer.Output[i].x === tempBuffer.layout.width - 10) { + showMessage('No space. Move or delete some nodes to make space.') + return + } + } + + for (let i = 0; i < tempBuffer.Input.length; i++) { + if (tempBuffer.Input[i].x === tempBuffer.layout.width) { + tempBuffer.Input[i].x -= 10 + } + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + if (tempBuffer.Output[i].x === tempBuffer.layout.width) { + tempBuffer.Output[i].x -= 10 + } + } + tempBuffer.layout.width -= 10 +} + +/** + * Decrease Height, and move all nodes, check if space is there + * @category layoutMode + */ +export function decreaseLayoutHeight() { + if (tempBuffer.layout.height < 30) return + for (let i = 0; i < tempBuffer.Input.length; i++) { + if (tempBuffer.Input[i].y === tempBuffer.layout.height - 10) { + showMessage('No space. Move or delete some nodes to make space.') + return + } + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + if (tempBuffer.Output[i].y === tempBuffer.layout.height - 10) { + showMessage('No space. Move or delete some nodes to make space.') + return + } + } + + for (let i = 0; i < tempBuffer.Input.length; i++) { + if (tempBuffer.Input[i].y === tempBuffer.layout.height) { + tempBuffer.Input[i].y -= 10 + } + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + if (tempBuffer.Output[i].y === tempBuffer.layout.height) { + tempBuffer.Output[i].y -= 10 + } + } + tempBuffer.layout.height -= 10 +} + +/** + * Helper functions to move the titles + * @category layoutMode + */ +export function layoutTitleUp() { + tempBuffer.layout.title_y -= 5 +} + +/** + * Helper functions to move the titles + * @category layoutMode + */ +export function layoutTitleDown() { + tempBuffer.layout.title_y += 5 +} + +/** + * Helper functions to move the titles + * @category layoutMode + */ +export function layoutTitleRight() { + tempBuffer.layout.title_x += 5 +} + +/** + * Helper functions to move the titles + * @category layoutMode + */ +export function layoutTitleLeft() { + tempBuffer.layout.title_x -= 5 +} + +/** + * Helper functions to move the titles + * @category layoutMode + */ +export function toggleLayoutTitle() { + tempBuffer.layout.titleEnabled = !tempBuffer.layout.titleEnabled +} + +/** + * just toggles back to normal mode + * @category layoutMode + */ +export function cancelLayout() { + if (layoutModeGet()) { + // eslint-disable-next-line no-use-before-define + toggleLayoutMode() + } +} + +/** + * Store all data into layout and exit + * @category layoutMode + */ +export function saveLayout() { + if (layoutModeGet()) { + for (let i = 0; i < tempBuffer.Input.length; i++) { + tempBuffer.Input[i].parent.layoutProperties.x = + tempBuffer.Input[i].x + tempBuffer.Input[i].parent.layoutProperties.y = + tempBuffer.Input[i].y + } + for (let i = 0; i < tempBuffer.Output.length; i++) { + tempBuffer.Output[i].parent.layoutProperties.x = + tempBuffer.Output[i].x + tempBuffer.Output[i].parent.layoutProperties.y = + tempBuffer.Output[i].y + } + globalScope.layout = { ...tempBuffer.layout } + // eslint-disable-next-line no-use-before-define + toggleLayoutMode() + } +} + +/** + * Function to toggle between layoutMode and normal Mode + * the sidebar is disabled and n properties are shown. + * @category layoutMode + */ +export function toggleLayoutMode() { + // hideProperties() + // lines from hideProperty function() <--- + prevPropertyObjSet(undefined) + $('.objectPropertyAttribute').unbind('change keyup paste click') + + if (layoutModeGet()) { + layoutModeSet(false) + $('#layoutDialog').fadeOut() + $('.layoutElementPanel').fadeOut() + $('.elementPanel').fadeIn() + $('.timing-diagram-panel').fadeIn() + $('.testbench-manual-panel').fadeIn() + globalScope.centerFocus(false) + if (globalScope.verilogMetadata.isVerilogCircuit) verilogModeSet(true) + dots() + } else { + layoutModeSet(true) + verilogModeSet(false) + $('#layoutDialog').fadeIn() + $('.layoutElementPanel').fadeIn() + $('.elementPanel').fadeOut() + $('.timing-diagram-panel').fadeOut() + $('.testbench-manual-panel').fadeOut() + fillSubcircuitElements() + + globalScope.ox = 0 + globalScope.oy = 0 + globalScope.scale = DPR * 1.3 + dots() + tempBuffer = new LayoutBuffer() + // $('#toggleLayoutTitle')[0].checked = tempBuffer.layout.titleEnabled + } + update(globalScope, true) + scheduleUpdate() +} + +export const layoutFunctions = { + decreaseLayoutWidth, + increaseLayoutWidth, + decreaseLayoutHeight, + increaseLayoutHeight, + layoutResetNodes, + layoutTitleUp, + layoutTitleDown, + layoutTitleLeft, + layoutTitleRight, + toggleLayoutTitle, + cancelLayout, + saveLayout, + toggleLayoutMode, +} + +// export function setupLayoutModePanelListeners() { +// $('#decreaseLayoutWidth').on('click', () => { +// decreaseLayoutWidth() +// }) +// $('#increaseLayoutWidth').on('click', () => { +// increaseLayoutWidth() +// }) +// $('#decreaseLayoutHeight').on('click', () => { +// decreaseLayoutHeight() +// }) +// $('#increaseLayoutHeight').on('click', () => { +// increaseLayoutHeight() +// }) +// $('#layoutResetNodes').on('click', () => { +// layoutResetNodes() +// }) +// $('#layoutTitleUp').on('click', () => { +// layoutTitleUp() +// }) +// $('#layoutTitleDown').on('click', () => { +// layoutTitleDown() +// }) +// $('#layoutTitleLeft').on('click', () => { +// layoutTitleLeft() +// }) +// $('#layoutTitleRight').on('click', () => { +// layoutTitleRight() +// }) +// $('#toggleLayoutTitle').on('click', () => { +// toggleLayoutTitle() +// }) +// $('#saveLayout').on('click', () => { +// saveLayout() +// }) +// $('#cancelLayout').on('click', () => { +// cancelLayout() +// }) +// $('#layoutDialog button').on('click', () => { +// scheduleUpdate() +// }) +// $('#layoutDialog input').on('click', () => { +// scheduleUpdate() +// }) +// } diff --git a/v1/src/simulator/src/listeners.js b/v1/src/simulator/src/listeners.js new file mode 100644 index 00000000..460be076 --- /dev/null +++ b/v1/src/simulator/src/listeners.js @@ -0,0 +1,761 @@ +// Most Listeners are stored here +import { + layoutModeGet, + tempBuffer, + layoutUpdate, + // setupLayoutModePanelListeners, +} from './layoutMode' +import simulationArea from './simulationArea' +import { + scheduleUpdate, + update, + updateSelectionsAndPane, + wireToBeCheckedSet, + updatePositionSet, + updateSimulationSet, + updateCanvasSet, + gridUpdateSet, + errorDetectedSet, +} from './engine' +import { changeScale } from './canvasApi' +import { scheduleBackup } from './data/backupCircuit' +import { + hideProperties, + deleteSelected, + uxvar, + fullView, + exitFullView, +} from './ux' +import { + updateRestrictedElementsList, + updateRestrictedElementsInScope, + hideRestricted, + showRestricted, +} from './restrictedElementDiv' +import { removeMiniMap, updatelastMinimapShown } from './minimap' +import undo from './data/undo' +import redo from './data/redo' +import { copy, paste, selectAll } from './events' +import save from './data/save' +import { verilogModeGet } from './Verilog2CV' +import { setupTimingListeners } from './plotArea' + +var unit = 10 +var listenToSimulator = true + +export default function startListeners() { + // added the below functionalities in QuickButton.vue component local script tag part + + // $('#deleteSelected').on('click', () => { + // deleteSelected() + // }) + + // $('#zoomIn').on('click', () => { + // changeScale(0.2, 'zoomButton', 'zoomButton', 2) + // }) + + // $('#zoomOut').on('click', () => { + // changeScale(-0.2, 'zoomButton', 'zoomButton', 2) + // }) + + // $('#undoButton').on('click', () => { + // undo() + // }) + // $('#redoButton').on('click', () => { + // redo() + // }) + // $('#viewButton').on('click', () => { + // fullView() + // }) + + $(document).on('keyup', (e) => { + if (e.key === 'Escape') exitFullView() + }) + + $('#projectName').on('click', () => { + simulationArea.lastSelected = globalScope.root + setTimeout(() => { + document.getElementById('projname').select() + }, 100) + }) + /* Makes tabs reordering possible by making them sortable */ + // $("#tabsBar").sortable({ + // containment: 'parent', + // items: '> div', + // revert: false, + // opacity: 0.5, + // tolerance: 'pointer', + // placeholder: 'placeholder', + // forcePlaceholderSize: true, + // }); + + document + .getElementById('simulationArea') + .addEventListener('mousedown', (e) => { + simulationArea.mouseDown = true + + // Deselect Input + if (document.activeElement instanceof HTMLElement) + document.activeElement.blur() + + errorDetectedSet(false) + updateSimulationSet(true) + updatePositionSet(true) + updateCanvasSet(true) + + simulationArea.lastSelected = undefined + simulationArea.selected = false + simulationArea.hover = undefined + var rect = simulationArea.canvas.getBoundingClientRect() + simulationArea.mouseDownRawX = (e.clientX - rect.left) * DPR + simulationArea.mouseDownRawY = (e.clientY - rect.top) * DPR + simulationArea.mouseDownX = + Math.round( + (simulationArea.mouseDownRawX - globalScope.ox) / + globalScope.scale / + unit + ) * unit + simulationArea.mouseDownY = + Math.round( + (simulationArea.mouseDownRawY - globalScope.oy) / + globalScope.scale / + unit + ) * unit + simulationArea.oldx = globalScope.ox + simulationArea.oldy = globalScope.oy + + e.preventDefault() + scheduleBackup() + scheduleUpdate(1) + $('.dropdown.open').removeClass('open') + }) + document + .getElementById('simulationArea') + .addEventListener('mouseup', (e) => { + if (simulationArea.lastSelected) + simulationArea.lastSelected.newElement = false + /* + handling restricted circuit elements + */ + + if ( + simulationArea.lastSelected && + restrictedElements.includes( + simulationArea.lastSelected.objectType + ) && + !globalScope.restrictedCircuitElementsUsed.includes( + simulationArea.lastSelected.objectType + ) + ) { + globalScope.restrictedCircuitElementsUsed.push( + simulationArea.lastSelected.objectType + ) + updateRestrictedElementsList() + } + + // deselect multible elements with click + if ( + !simulationArea.shiftDown && + simulationArea.multipleObjectSelections.length > 0 + ) { + if ( + !simulationArea.multipleObjectSelections.includes( + simulationArea.lastSelected + ) + ) { + simulationArea.multipleObjectSelections = [] + } + } + }) + document + .getElementById('simulationArea') + .addEventListener('mousemove', onMouseMove) + + window.addEventListener('keyup', (e) => { + scheduleUpdate(1) + simulationArea.shiftDown = e.shiftKey + if (e.keyCode == 16) { + simulationArea.shiftDown = false + } + if (e.key == 'Meta' || e.key == 'Control') { + simulationArea.controlDown = false + } + }) + + window.addEventListener( + 'keydown', + (e) => { + if (document.activeElement.tagName == 'INPUT') return + if (document.activeElement != document.body) return + + simulationArea.shiftDown = e.shiftKey + if (e.key == 'Meta' || e.key == 'Control') { + simulationArea.controlDown = true + } + + if ( + simulationArea.controlDown && + e.key.charCodeAt(0) == 122 && + !simulationArea.shiftDown + ) { + // detect the special CTRL-Z code + undo() + } + if ( + simulationArea.controlDown && + e.key.charCodeAt(0) == 122 && + simulationArea.shiftDown + ) { + // detect the special Cmd + shift + z code (macOs) + redo() + } + if ( + simulationArea.controlDown && + e.key.charCodeAt(0) == 121 && + !simulationArea.shiftDown + ) { + // detect the special ctrl + Y code (windows) + redo() + } + + if (listenToSimulator) { + // If mouse is focusing on input element, then override any action + // if($(':focus').length){ + // return; + // } + + if ( + document.activeElement.tagName == 'INPUT' || + simulationArea.mouseRawX < 0 || + simulationArea.mouseRawY < 0 || + simulationArea.mouseRawX > width || + simulationArea.mouseRawY > height + ) { + return + } + // HACK TO REMOVE FOCUS ON PROPERTIES + if (document.activeElement.type == 'number') { + hideProperties() + showProperties(simulationArea.lastSelected) + } + + errorDetectedSet(false) + updateSimulationSet(true) + updatePositionSet(true) + simulationArea.shiftDown = e.shiftKey + + if (e.key == 'Meta' || e.key == 'Control') { + simulationArea.controlDown = true + } + + // zoom in (+) + if ( + (simulationArea.controlDown && + (e.keyCode == 187 || e.keyCode == 171)) || + e.keyCode == 107 + ) { + e.preventDefault() + ZoomIn() + } + // zoom out (-) + if ( + (simulationArea.controlDown && + (e.keyCode == 189 || e.keyCode == 173)) || + e.keyCode == 109 + ) { + e.preventDefault() + ZoomOut() + } + + if ( + simulationArea.mouseRawX < 0 || + simulationArea.mouseRawY < 0 || + simulationArea.mouseRawX > width || + simulationArea.mouseRawY > height + ) + return + + scheduleUpdate(1) + updateCanvasSet(true) + wireToBeCheckedSet(1) + + // Needs to be deprecated, moved to more recent listeners + if ( + simulationArea.controlDown && + (e.key == 'C' || e.key == 'c') + ) { + // simulationArea.copyList=simulationArea.multipleObjectSelections.slice(); + // if(simulationArea.lastSelected&&simulationArea.lastSelected!==simulationArea.root&&!simulationArea.copyList.contains(simulationArea.lastSelected)){ + // simulationArea.copyList.push(simulationArea.lastSelected); + // } + // copy(simulationArea.copyList); + } + + if ( + simulationArea.lastSelected && + simulationArea.lastSelected.keyDown + ) { + if ( + e.key.toString().length == 1 || + e.key.toString() == 'Backspace' || + e.key.toString() == 'Enter' + ) { + simulationArea.lastSelected.keyDown(e.key.toString()) + e.cancelBubble = true + e.returnValue = false + + //e.stopPropagation works in Firefox. + if (e.stopPropagation) { + e.stopPropagation() + e.preventDefault() + } + return + } + } + + if ( + simulationArea.lastSelected && + simulationArea.lastSelected.keyDown2 + ) { + if (e.key.toString().length == 1) { + simulationArea.lastSelected.keyDown2(e.key.toString()) + return + } + } + + if ( + simulationArea.lastSelected && + simulationArea.lastSelected.keyDown3 + ) { + if ( + e.key.toString() != 'Backspace' && + e.key.toString() != 'Delete' + ) { + simulationArea.lastSelected.keyDown3(e.key.toString()) + return + } + } + + if (e.keyCode == 16) { + simulationArea.shiftDown = true + if ( + simulationArea.lastSelected && + !simulationArea.lastSelected.keyDown && + simulationArea.lastSelected.objectType != 'Wire' && + simulationArea.lastSelected.objectType != + 'CircuitElement' && + !simulationArea.multipleObjectSelections.contains( + simulationArea.lastSelected + ) + ) { + simulationArea.multipleObjectSelections.push( + simulationArea.lastSelected + ) + } + } + + // Detect offline save shortcut (CTRL+SHIFT+S) + if ( + simulationArea.controlDown && + e.keyCode == 83 && + simulationArea.shiftDown + ) { + saveOffline() + e.preventDefault() + } + + // Detect Select all Shortcut + if ( + simulationArea.controlDown && + (e.keyCode == 65 || e.keyCode == 97) + ) { + selectAll() + e.preventDefault() + } + + // deselect all Shortcut + if (e.keyCode == 27) { + simulationArea.multipleObjectSelections = [] + simulationArea.lastSelected = undefined + e.preventDefault() + } + + if ( + (e.keyCode == 113 || e.keyCode == 81) && + simulationArea.lastSelected != undefined + ) { + if (simulationArea.lastSelected.bitWidth !== undefined) { + simulationArea.lastSelected.newBitWidth( + parseInt(prompt('Enter new bitWidth'), 10) + ) + } + } + + if ( + simulationArea.controlDown && + (e.key == 'T' || e.key == 't') + ) { + // e.preventDefault(); //browsers normally open a new tab + simulationArea.changeClockTime(prompt('Enter Time:')) + } + } + + if (e.keyCode == 8 || e.key == 'Delete') { + deleteSelected() + } + }, + true + ) + + document + .getElementById('simulationArea') + .addEventListener('dblclick', (e) => { + updateCanvasSet(true) + if ( + simulationArea.lastSelected && + simulationArea.lastSelected.dblclick !== undefined + ) { + simulationArea.lastSelected.dblclick() + } else if (!simulationArea.shiftDown) { + simulationArea.multipleObjectSelections = [] + } + scheduleUpdate(2) + }) + + document + .getElementById('simulationArea') + .addEventListener('mouseup', onMouseUp) + + document + .getElementById('simulationArea') + .addEventListener('mousewheel', MouseScroll) + document + .getElementById('simulationArea') + .addEventListener('DOMMouseScroll', MouseScroll) + + function MouseScroll(event) { + updateCanvasSet(true) + event.preventDefault() + var deltaY = event.wheelDelta ? event.wheelDelta : -event.detail + event.preventDefault() + var deltaY = event.wheelDelta ? event.wheelDelta : -event.detail + const direction = deltaY > 0 ? 1 : -1 + handleZoom(direction) + updateCanvasSet(true) + gridUpdateSet(true) + + if (layoutModeGet()) layoutUpdate() + else update() // Schedule update not working, this is INEFFICIENT + } + + document.addEventListener('cut', (e) => { + if (verilogModeGet()) return + if (document.activeElement.tagName == 'INPUT') return + if (document.activeElement.tagName != 'BODY') return + + if (listenToSimulator) { + simulationArea.copyList = + simulationArea.multipleObjectSelections.slice() + if ( + simulationArea.lastSelected && + simulationArea.lastSelected !== simulationArea.root && + !simulationArea.copyList.contains(simulationArea.lastSelected) + ) { + simulationArea.copyList.push(simulationArea.lastSelected) + } + + var textToPutOnClipboard = copy(simulationArea.copyList, true) + + // Updated restricted elements + updateRestrictedElementsInScope() + localStorage.setItem('clipboardData', textToPutOnClipboard) + e.preventDefault() + if (textToPutOnClipboard == undefined) return + if (isIe) { + window.clipboardData.setData('Text', textToPutOnClipboard) + } else { + e.clipboardData.setData('text/plain', textToPutOnClipboard) + } + } + }) + + document.addEventListener('copy', (e) => { + if (verilogModeGet()) return + if (document.activeElement.tagName == 'INPUT') return + if (document.activeElement.tagName != 'BODY') return + + if (listenToSimulator) { + simulationArea.copyList = + simulationArea.multipleObjectSelections.slice() + if ( + simulationArea.lastSelected && + simulationArea.lastSelected !== simulationArea.root && + !simulationArea.copyList.contains(simulationArea.lastSelected) + ) { + simulationArea.copyList.push(simulationArea.lastSelected) + } + + var textToPutOnClipboard = copy(simulationArea.copyList) + + // Updated restricted elements + updateRestrictedElementsInScope() + localStorage.setItem('clipboardData', textToPutOnClipboard) + e.preventDefault() + if (textToPutOnClipboard == undefined) return + if (isIe) { + window.clipboardData.setData('Text', textToPutOnClipboard) + } else { + e.clipboardData.setData('text/plain', textToPutOnClipboard) + } + } + }) + + document.addEventListener('paste', (e) => { + if (document.activeElement.tagName == 'INPUT') return + if (document.activeElement.tagName != 'BODY') return + + if (listenToSimulator) { + var data + if (isIe) { + data = window.clipboardData.getData('Text') + } else { + data = e.clipboardData.getData('text/plain') + } + + paste(data) + + // Updated restricted elements + updateRestrictedElementsInScope() + + e.preventDefault() + } + }) + + // 'drag and drop' event listener for subcircuit elements in layout mode + $('#subcircuitMenu').on( + 'dragstop', + '.draggableSubcircuitElement', + function (event, ui) { + const sideBarWidth = $('#guide_1')[0].clientWidth + let tempElement + + if (ui.position.top > 10 && ui.position.left > sideBarWidth) { + // make a shallow copy of the element with the new coordinates + tempElement = + globalScope[this.dataset.elementName][ + this.dataset.elementId + ] + + // Changing the coordinate doesn't work yet, nodes get far from element + tempElement.x = ui.position.left - sideBarWidth + tempElement.y = ui.position.top + for (let node of tempElement.nodeList) { + node.x = ui.position.left - sideBarWidth + node.y = ui.position.top + } + + tempBuffer.subElements.push(tempElement) + this.parentElement.removeChild(this) + } + } + ) + + restrictedElements.forEach((element) => { + $(`#${element}`).mouseover(() => { + showRestricted() + }) + + $(`#${element}`).mouseout(() => { + hideRestricted() + }) + }) + + zoomSliderListeners() + // setupLayoutModePanelListeners() + if (!embed) { + setupTimingListeners() + } +} + +var isIe = + navigator.userAgent.toLowerCase().indexOf('msie') != -1 || + navigator.userAgent.toLowerCase().indexOf('trident') != -1 + +function onMouseMove(e) { + var rect = simulationArea.canvas.getBoundingClientRect() + simulationArea.mouseRawX = (e.clientX - rect.left) * DPR + simulationArea.mouseRawY = (e.clientY - rect.top) * DPR + simulationArea.mouseXf = + (simulationArea.mouseRawX - globalScope.ox) / globalScope.scale + simulationArea.mouseYf = + (simulationArea.mouseRawY - globalScope.oy) / globalScope.scale + simulationArea.mouseX = Math.round(simulationArea.mouseXf / unit) * unit + simulationArea.mouseY = Math.round(simulationArea.mouseYf / unit) * unit + + updateCanvasSet(true) + + if ( + simulationArea.lastSelected && + (simulationArea.mouseDown || simulationArea.lastSelected.newElement) + ) { + updateCanvasSet(true) + var fn + + if (simulationArea.lastSelected == globalScope.root) { + fn = function () { + updateSelectionsAndPane() + } + } else { + fn = function () { + if (simulationArea.lastSelected) { + simulationArea.lastSelected.update() + } + } + } + scheduleUpdate(0, 20, fn) + } else { + scheduleUpdate(0, 200) + } +} + +function onMouseUp(e) { + simulationArea.mouseDown = false + if (!lightMode) { + updatelastMinimapShown() + setTimeout(removeMiniMap, 2000) + } + + errorDetectedSet(false) + updateSimulationSet(true) + updatePositionSet(true) + updateCanvasSet(true) + gridUpdateSet(true) + wireToBeCheckedSet(1) + + scheduleUpdate(1) + simulationArea.mouseDown = false + + for (var i = 0; i < 2; i++) { + updatePositionSet(true) + wireToBeCheckedSet(1) + update() + } + errorDetectedSet(false) + updateSimulationSet(true) + updatePositionSet(true) + updateCanvasSet(true) + gridUpdateSet(true) + wireToBeCheckedSet(1) + + scheduleUpdate(1) + var rect = simulationArea.canvas.getBoundingClientRect() + + if ( + !( + simulationArea.mouseRawX < 0 || + simulationArea.mouseRawY < 0 || + simulationArea.mouseRawX > width || + simulationArea.mouseRawY > height + ) + ) { + uxvar.smartDropXX = simulationArea.mouseX + 100 // Math.round(((simulationArea.mouseRawX - globalScope.ox+100) / globalScope.scale) / unit) * unit; + uxvar.smartDropYY = simulationArea.mouseY - 50 // Math.round(((simulationArea.mouseRawY - globalScope.oy+100) / globalScope.scale) / unit) * unit; + } +} + +function resizeTabs() { + var $windowsize = $('body').width() + var $sideBarsize = $('.side').width() + var $maxwidth = $windowsize - $sideBarsize + $('#tabsBar div').each(function (e) { + $(this).css({ 'max-width': $maxwidth - 30 }) + }) +} + +window.addEventListener('resize', resizeTabs) +resizeTabs() + +// $(() => { +// $('[data-toggle="tooltip"]').tooltip() +// }) + +// direction is only 1 or -1 +function handleZoom(direction) { + var zoomSlider = $('#customRange1') + var currentSliderValue = parseInt(zoomSlider.val(), 10) + currentSliderValue += direction + + if (globalScope.scale > 0.5 * DPR) { + zoomSlider.val(currentSliderValue).change() + } else if (globalScope.scale < 4 * DPR) { + zoomSlider.val(currentSliderValue).change() + } + + gridUpdateSet(true) + scheduleUpdate() +} + +export function ZoomIn() { + handleZoom(1) +} + +export function ZoomOut() { + handleZoom(-1) +} + +function zoomSliderListeners() { + document.getElementById('customRange1').value = 5 + document + .getElementById('simulationArea') + .addEventListener('DOMMouseScroll', zoomSliderScroll) + document + .getElementById('simulationArea') + .addEventListener('mousewheel', zoomSliderScroll) + let curLevel = document.getElementById('customRange1').value + $(document).on('input change', '#customRange1', function (e) { + let newValue = $(this).val() + let changeInScale = newValue - curLevel + updateCanvasSet(true) + changeScale(changeInScale * 0.1, 'zoomButton', 'zoomButton', 3) + gridUpdateSet(true) + curLevel = newValue + }) + function zoomSliderScroll(e) { + let zoomLevel = document.getElementById('customRange1').value + let deltaY = e.wheelDelta ? e.wheelDelta : -e.detail + const directionY = deltaY > 0 ? 1 : -1 + if (directionY > 0) zoomLevel++ + else zoomLevel-- + if (zoomLevel >= 45) { + zoomLevel = 45 + document.getElementById('customRange1').value = 45 + } else if (zoomLevel <= 0) { + zoomLevel = 0 + document.getElementById('customRange1').value = 0 + } else { + document.getElementById('customRange1').value = zoomLevel + curLevel = zoomLevel + } + } + + // previously used for the + and - zoom buttons in quickButtons + + // function sliderZoomButton(direction) { + // var zoomSlider = $('#customRange1') + // var currentSliderValue = parseInt(zoomSlider.val(), 10) + // if (direction === -1) { + // currentSliderValue-- + // } else { + // currentSliderValue++ + // } + // zoomSlider.val(currentSliderValue).change() + // } + + // $('#decrement').click(() => { + // sliderZoomButton(-1) + // }) + + // $('#increment').click(() => { + // sliderZoomButton(1) + // }) +} diff --git a/v1/src/simulator/src/metadata.json b/v1/src/simulator/src/metadata.json new file mode 100644 index 00000000..8ed4f225 --- /dev/null +++ b/v1/src/simulator/src/metadata.json @@ -0,0 +1,179 @@ +{ + "circuitElementList": [ + "Input", + "Output", + "NotGate", + "OrGate", + "AndGate", + "NorGate", + "NandGate", + "XorGate", + "XnorGate", + "SevenSegDisplay", + "SixteenSegDisplay", + "HexDisplay", + "Multiplexer", + "BitSelector", + "Splitter", + "Power", + "Ground", + "ConstantVal", + "ControlledInverter", + "TriState", + "Adder", + "verilogMultiplier", + "verilogDivider", + "verilogPower", + "verilogShiftLeft", + "TwoComplement", + "verilogShiftRight", + "Rom", + "RAM", + "verilogRAM", + "EEPROM", + "TflipFlop", + "JKflipFlop", + "SRflipFlop", + "DflipFlop", + "TTY", + "Keyboard", + "Clock", + "DigitalLed", + "Stepper", + "VariableLed", + "RGBLed", + "SquareRGBLed", + "RGBLedMatrix", + "Button", + "Demultiplexer", + "Buffer", + "SubCircuit", + "Flag", + "MSB", + "LSB", + "PriorityEncoder", + "Tunnel", + "ALU", + "Decoder", + "Random", + "Counter", + "Dlatch", + "TB_Input", + "TB_Output", + "ForceGate" + ], + "annotationList": ["Text", "Rectangle", "Arrow", "ImageAnnotation"], + "inputList": [ + "Random", + "Dlatch", + "JKflipFlop", + "TflipFlop", + "SRflipFlop", + "DflipFlop", + "Buffer", + "Stepper", + "Ground", + "Power", + "ConstantVal", + "Input", + "Clock", + "Button", + "Counter" + ], + "subCircuitInputList": [ + "Random", + "Dlatch", + "JKflipFlop", + "TflipFlop", + "SRflipFlop", + "DflipFlop", + "Buffer", + "Stepper", + "Ground", + "Power", + "ConstantVal", + "Clock", + "Button", + "Counter" + ], + "elementHierarchy": { + "Input": [ + { "name": "Input", "label": "Input" }, + { "name": "Button", "label": "Button" }, + { "name": "Power", "label": "Power" }, + { "name": "Ground", "label": "Ground" }, + { "name": "ConstantVal", "label": "Constant Value" }, + { "name": "Stepper", "label": "Stepper" }, + { "name": "Random", "label": "Random" }, + { "name": "Counter", "label": "Counter" } + ], + "Output": [ + { "name": "Output", "label": "Output" }, + { "name": "RGBLed", "label": "RGB Led" }, + { "name": "DigitalLed", "label": "Digital Led" }, + { "name": "VariableLed", "label": "Variable Led" }, + { "name": "HexDisplay", "label": "Hex Display" }, + { "name": "SevenSegDisplay", "label": "Seven Segment Display" }, + { "name": "SixteenSegDisplay", "label": "Sixteen Segment Display" }, + { "name": "SquareRGBLed", "label": "Square RGB Led" }, + { "name": "RGBLedMatrix", "label": "RGB Led Matrix" } + ], + "Gates": [ + { "name": "AndGate", "label": "And Gate" }, + { "name": "OrGate", "label": "Or Gate" }, + { "name": "NotGate", "label": "Not Gate" }, + { "name": "XorGate", "label": "Xor Gate" }, + { "name": "NandGate", "label": "Nand Gate" }, + { "name": "NorGate", "label": "Nor Gate" }, + { "name": "XnorGate", "label": "Xnor Gate" } + ], + "Decoders & Plexers": [ + { "name": "Multiplexer", "label": "Multiplexer" }, + { "name": "Demultiplexer", "label": "Demultiplexer" }, + { "name": "BitSelector", "label": "Bit Selector" }, + { "name": "MSB", "label": "MSB(Most Significant Bit)" }, + { "name": "LSB", "label": "LSB(Least Significant Bit)" }, + { "name": "PriorityEncoder", "label": "Priority Encoder" }, + { "name": "Decoder", "label": "Decoder" } + ], + "Sequential Elements": [ + { "name": "DflipFlop", "label": "D flip Flop" }, + { "name": "Dlatch", "label": "D latch" }, + { "name": "TflipFlop", "label": "T flip Flop" }, + { "name": "JKflipFlop", "label": "JK flip Flop" }, + { "name": "SRflipFlop", "label": "SR flip Flop" }, + { "name": "TTY", "label": "TTY" }, + { "name": "Keyboard", "label": "Keyboard" }, + { "name": "Clock", "label": "Clock" }, + { "name": "Rom", "label": "ROM" }, + { "name": "RAM", "label": "RAM" }, + { "name": "verilogRAM", "label": "Verilog RAM" }, + { "name": "EEPROM", "label": "EEPROM" } + ], + "Annotation": [ + { "name": "Rectangle", "label": "Rectangle" }, + { "name": "Arrow", "label": "Arrow" }, + { "name": "ImageAnnotation", "label": "Image Annotation" }, + { "name": "Text", "label": "Text" } + ], + "Misc": [ + { "name": "TwoComplement", "label": "Two Complement" }, + { "name": "Flag", "label": "Flag" }, + { "name": "Splitter", "label": "Splitter" }, + { "name": "Adder", "label": "Adder" }, + { "name": "ALU", "label": "ALU(Arithmetic and Logical Unit)" }, + { "name": "TriState", "label": "TriState Flip Flop" }, + { "name": "Tunnel", "label": "Tunnel" }, + { "name": "verilogMultiplier", "label": "Verilog Multiplier" }, + { "name": "verilogDivider", "label": "Verilog Divider" }, + { "name": "verilogPower", "label": "Verilog Power" }, + { "name": "verilogShiftLeft", "label": "Verilog Shift Left" }, + { "name": "verilogShiftRight", "label": "Verilog Shift Right" }, + { "name": "Buffer", "label": "Buffer" }, + { "name": "ControlledInverter", "label": "Controlled Inverter" }, + { "name": "TB_Input", "label": "TB Input" }, + { "name": "TB_Output", "label": "TB Output" }, + { "name": "ForceGate", "label": "Force Gate" } + ] + } +} diff --git a/v1/src/simulator/src/minimap.js b/v1/src/simulator/src/minimap.js new file mode 100644 index 00000000..6cfcf49d --- /dev/null +++ b/v1/src/simulator/src/minimap.js @@ -0,0 +1,193 @@ +import simulationArea from './simulationArea' +import { colors } from './themer/themer' +import { layoutModeGet } from './layoutMode' + +/** + * @type {Object} miniMapArea + * This object is used to draw the miniMap. + * @property {number} pageY + * @property {number} pageX + * @property {HTMLCanvasObject} canvas - the canvas object + * @property {function} setup - used to setup the parameters and dimensions + * @property {function} play - used to draw outline of minimap and call resolve + * @property {function} resolve - used to resolve all objects and draw them on minimap + * @property {function} clear - used to clear minimap + * @category minimap + */ +var miniMapArea +export default miniMapArea = { + canvas: document.getElementById('miniMapArea'), + setup() { + if (lightMode) return + this.canvas = document.getElementById('miniMapArea') + this.pageHeight = height // Math.round(((parseInt($("#simulationArea").height())))/ratio)*ratio-50; // -50 for tool bar? Check again + this.pageWidth = width // Math.round(((parseInt($("#simulationArea").width())))/ratio)*ratio; + this.pageY = this.pageHeight - globalScope.oy + this.pageX = this.pageWidth - globalScope.ox + + if (simulationArea.minHeight != undefined) { + this.minY = Math.min( + simulationArea.minHeight, + -globalScope.oy / globalScope.scale + ) + } else { + this.minY = -globalScope.oy / globalScope.scale + } + if (simulationArea.maxHeight != undefined) { + this.maxY = Math.max( + simulationArea.maxHeight, + this.pageY / globalScope.scale + ) + } else { + this.maxY = this.pageY / globalScope.scale + } + if (simulationArea.minWidth != undefined) { + this.minX = Math.min( + simulationArea.minWidth, + -globalScope.ox / globalScope.scale + ) + } else { + this.minX = -globalScope.ox / globalScope.scale + } + if (simulationArea.maxWidth != undefined) { + this.maxX = Math.max( + simulationArea.maxWidth, + this.pageX / globalScope.scale + ) + } else { + this.maxX = this.pageX / globalScope.scale + } + + var h = this.maxY - this.minY + var w = this.maxX - this.minX + + var ratio = Math.min(250 / h, 250 / w) + if (h > w) { + this.canvas.height = 250.0 + this.canvas.width = (250.0 * w) / h + } else { + this.canvas.width = 250.0 + this.canvas.height = (250.0 * h) / w + } + + this.canvas.height += 5 + this.canvas.width += 5 + + document.getElementById('miniMap').style.height = this.canvas.height + document.getElementById('miniMap').style.width = this.canvas.width + this.ctx = this.canvas.getContext('2d') + this.play(ratio) + }, + + play(ratio) { + if (lightMode || layoutModeGet()) return + + this.ctx.fillStyle = '#bbb' + this.ctx.rect(0, 0, this.canvas.width, this.canvas.height) + this.ctx.fill() + this.resolve(ratio) + }, + resolve(ratio) { + if (lightMode) return + + this.ctx.fillStyle = '#ddd' + this.ctx.beginPath() + this.ctx.rect( + 2.5 + + ((this.pageX - this.pageWidth) / globalScope.scale - + this.minX) * + ratio, + 2.5 + + ((this.pageY - this.pageHeight) / globalScope.scale - + this.minY) * + ratio, + (this.pageWidth * ratio) / globalScope.scale, + (this.pageHeight * ratio) / globalScope.scale + ) + this.ctx.fill() + + // to show the area of current canvas + var lst = updateOrder + const miniFill = colors['mini_fill'] + const miniStroke = colors['mini_stroke'] + + this.ctx.strokeStyle = miniStroke + this.ctx.fillStyle = miniFill + for (var i = 0; i < lst.length; i++) { + if (lst[i] === 'wires') { + for (var j = 0; j < globalScope[lst[i]].length; j++) { + this.ctx.beginPath() + this.ctx.moveTo( + 2.5 + + (globalScope[lst[i]][j].node1.absX() - this.minX) * + ratio, + 2.5 + + (globalScope[lst[i]][j].node1.absY() - this.minY) * + ratio + ) + this.ctx.lineTo( + 2.5 + + (globalScope[lst[i]][j].node2.absX() - this.minX) * + ratio, + 2.5 + + (globalScope[lst[i]][j].node2.absY() - this.minY) * + ratio + ) + this.ctx.stroke() + } + } else if (lst[i] != 'nodes') { + // Don't include SquareRGBLed here; it has correct size. + var ledY = 0 + if ( + lst[i] == 'DigitalLed' || + lst[i] == 'VariableLed' || + lst[i] == 'RGBLed' + ) { + ledY = 20 + } + + for (var j = 0; j < globalScope[lst[i]].length; j++) { + var xx = globalScope[lst[i]][j].x - simulationArea.minWidth + var yy = globalScope[lst[i]][j].y - simulationArea.minHeight + this.ctx.beginPath() + var obj = globalScope[lst[i]][j] + this.ctx.rect( + 2.5 + (obj.x - obj.leftDimensionX - this.minX) * ratio, + 2.5 + (obj.y - obj.upDimensionY - this.minY) * ratio, + (obj.rightDimensionX + obj.leftDimensionX) * ratio, + (obj.downDimensionY + obj.upDimensionY + ledY) * ratio + ) + + this.ctx.fill() + this.ctx.stroke() + } + } + } + }, + clear() { + if (lightMode) return + $('#miniMapArea').css('z-index', '-1') + this.context.clearRect(0, 0, this.canvas.width, this.canvas.height) + }, +} +var lastMiniMapShown +export function updatelastMinimapShown() { + lastMiniMapShown = new Date().getTime() +} +export function removeMiniMap() { + if (lightMode) return + + if ( + simulationArea.lastSelected == globalScope.root && + simulationArea.mouseDown + ) + return + if (lastMiniMapShown + 2000 >= new Date().getTime()) { + setTimeout( + removeMiniMap, + lastMiniMapShown + 2000 - new Date().getTime() + ) + return + } + $('#miniMap').fadeOut('fast') +} diff --git a/v1/src/simulator/src/moduleSetup.js b/v1/src/simulator/src/moduleSetup.js new file mode 100644 index 00000000..5002bc69 --- /dev/null +++ b/v1/src/simulator/src/moduleSetup.js @@ -0,0 +1,135 @@ +import modules from './modules' +import Adder from './modules/Adder' +import ALU from './modules/ALU' +import AndGate from './modules/AndGate' +import Arrow from './modules/Arrow' +import ImageAnnotation from './modules/ImageAnnotation' +import BitSelector from './modules/BitSelector' +import Buffer from './modules/Buffer' +import Button from './modules/Button' +import ConstantVal from './modules/ConstantVal' +import ControlledInverter from './modules/ControlledInverter' +import Counter from './modules/Counter' +import Decoder from './modules/Decoder' +import Demultiplexer from './modules/Demultiplexer' +import DigitalLed from './modules/DigitalLed' +import Flag from './modules/Flag' +import Ground from './modules/Ground' +import HexDisplay from './modules/HexDisplay' +import Input from './modules/Input' +import LSB from './modules/LSB' +import MSB from './modules/MSB' +import Multiplexer from './modules/Multiplexer' +import NandGate from './modules/NandGate' +import NorGate from './modules/NorGate' +import NotGate from './modules/NotGate' +import OrGate from './modules/OrGate' +import Output from './modules/Output' +import Power from './modules/Power' +import PriorityEncoder from './modules/PriorityEncoder' +import Random from './modules/Random' +import Rectangle from './modules/Rectangle' +import RGBLed from './modules/RGBLed' +import RGBLedMatrix from './modules/RGBLedMatrix' +import SevenSegDisplay from './modules/SevenSegDisplay' +import SixteenSegDisplay from './modules/SixteenSegDisplay' +import Splitter from './modules/Splitter' +import SquareRGBLed from './modules/SquareRGBLed' +import Stepper from './modules/Stepper' +import Text from './modules/Text' +import TriState from './modules/TriState' +import Tunnel from './modules/Tunnel' +import TwoComplement from './modules/TwoComplement' +import VariableLed from './modules/VariableLed' +import XnorGate from './modules/XnorGate' +import XorGate from './modules/XorGate' +import Clock from './sequential/Clock' +import DflipFlop from './sequential/DflipFlop' +import Dlatch from './sequential/Dlatch' +import EEPROM from './sequential/EEPROM' +import JKflipFlop from './sequential/JKflipFlop' +import Keyboard from './sequential/Keyboard' +import RAM from './sequential/RAM' +import Rom from './sequential/Rom' +import SRflipFlop from './sequential/SRflipFlop' +import TflipFlop from './sequential/TflipFlop' +import TTY from './sequential/TTY' +import ForceGate from './testbench/ForceGate' +import TB_Input from './testbench/testbenchInput' +import TB_Output from './testbench/testbenchOutput' +import verilogMultiplier from './modules/verilogMultiplier' +import verilogDivider from './modules/verilogDivider' +import verilogPower from './modules/verilogPower' +import verilogShiftLeft from './modules/verilogShiftLeft' +import verilogShiftRight from './modules/verilogShiftRight' +import verilogRAM from './sequential/verilogRAM' + +export default function setupModules() { + var moduleSet = { + AndGate, + Random, + NandGate, + Counter, + Multiplexer, + XorGate, + XnorGate, + SevenSegDisplay, + SixteenSegDisplay, + HexDisplay, + OrGate, + Stepper, + NotGate, + Text, + TriState, + Buffer, + ControlledInverter, + Adder, + verilogMultiplier, + verilogDivider, + verilogPower, + verilogShiftLeft, + verilogShiftRight, + TwoComplement, + Splitter, + Ground, + Power, + Input, + Output, + BitSelector, + ConstantVal, + NorGate, + DigitalLed, + VariableLed, + Button, + RGBLed, + SquareRGBLed, + Demultiplexer, + Decoder, + Flag, + MSB, + LSB, + PriorityEncoder, + Tunnel, + ALU, + Rectangle, + Arrow, + ImageAnnotation, + RGBLedMatrix, + TflipFlop, + DflipFlop, + Dlatch, + SRflipFlop, + JKflipFlop, + TTY, + Keyboard, + Clock, + Rom, + EEPROM, + RAM, + verilogRAM, + TB_Input, + TB_Output, + ForceGate, + } + Object.assign(modules, moduleSet) +} diff --git a/v1/src/simulator/src/modules.js b/v1/src/simulator/src/modules.js new file mode 100644 index 00000000..41bacb6f --- /dev/null +++ b/v1/src/simulator/src/modules.js @@ -0,0 +1,60 @@ +/* eslint-disable import/no-cycle */ +import simulationArea from './simulationArea' + +export function getNextPosition(x = 0, scope = globalScope) { + let possibleY = 20 + const done = {} + for (let i = 0; i < scope.Input.length - 1; i++) { + if (scope.Input[i].layoutProperties.x === x) { + done[scope.Input[i].layoutProperties.y] = 1 + } + } + for (let i = 0; i < scope.Output.length; i++) { + if (scope.Output[i].layoutProperties.x === x) { + done[scope.Output[i].layoutProperties.y] = 1 + } + } + while (done[possibleY] || done[possibleY + 10] || done[possibleY - 10]) { + possibleY += 10 + } + const height = possibleY + 20 + if (height > scope.layout.height) { + const oldHeight = scope.layout.height + scope.layout.height = height + for (let i = 0; i < scope.Input.length; i++) { + if (scope.Input[i].layoutProperties.y === oldHeight) { + scope.Input[i].layoutProperties.y = scope.layout.height + } + } + for (let i = 0; i < scope.Output.length; i++) { + if (scope.Output[i].layoutProperties.y === oldHeight) { + scope.Output[i].layoutProperties.y = scope.layout.height + } + } + } + return possibleY +} + +/** + * Global + */ +var modules = {} + +export default modules + +export function changeInputSize(size) { + if (size == undefined || size < 2 || size > 10) return + if (this.inputSize == size) return + size = parseInt(size, 10) + var obj = new modules[this.objectType]( + this.x, + this.y, + this.scope, + this.direction, + size, + this.bitWidth + ) + this.delete() + simulationArea.lastSelected = obj + return obj +} diff --git a/v1/src/simulator/src/modules/ALU.js b/v1/src/simulator/src/modules/ALU.js new file mode 100644 index 00000000..19cda667 --- /dev/null +++ b/v1/src/simulator/src/modules/ALU.js @@ -0,0 +1,200 @@ +/* eslint-disable no-bitwise */ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText4 } from '../canvasApi' +import { colors } from '../themer/themer' + +/** + * @class + * ALU + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +export default class ALU extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['ALU'].push(this); + */ + this.message = 'ALU' + + this.setDimensions(30, 40) + this.rectangleObject = false + + this.inp1 = new Node(-30, -30, 0, this, this.bitwidth, 'A') + this.inp2 = new Node(-30, 30, 0, this, this.bitwidth, 'B') + + this.controlSignalInput = new Node(-10, -40, 0, this, 3, 'Ctrl') + this.carryOut = new Node(-10, 40, 1, this, 1, 'Cout') + this.output = new Node(30, 0, 1, this, this.bitwidth, 'Out') + } + + /** + * @memberof ALU + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.inp1.bitWidth = bitWidth + this.inp2.bitWidth = bitWidth + this.output.bitWidth = bitWidth + } + + /** + * @memberof ALU + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + inp1: findNode(this.inp1), + inp2: findNode(this.inp2), + output: findNode(this.output), + carryOut: findNode(this.carryOut), + controlSignalInput: findNode(this.controlSignalInput), + }, + } + return data + } + + /** + * @memberof ALU + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + const xx = this.x + const yy = this.y + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + moveTo(ctx, 30, 10, xx, yy, this.direction) + lineTo(ctx, 30, -10, xx, yy, this.direction) + lineTo(ctx, 10, -40, xx, yy, this.direction) + lineTo(ctx, -30, -40, xx, yy, this.direction) + lineTo(ctx, -30, -20, xx, yy, this.direction) + lineTo(ctx, -20, -10, xx, yy, this.direction) + lineTo(ctx, -20, 10, xx, yy, this.direction) + lineTo(ctx, -30, 20, xx, yy, this.direction) + lineTo(ctx, -30, 40, xx, yy, this.direction) + lineTo(ctx, 10, 40, xx, yy, this.direction) + lineTo(ctx, 30, 10, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = colors['hover_select'] + } + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.fillStyle = 'Black' + ctx.textAlign = 'center' + + fillText4(ctx, 'B', -23, 30, xx, yy, this.direction, 6) + fillText4(ctx, 'A', -23, -30, xx, yy, this.direction, 6) + fillText4(ctx, 'CTR', -10, -30, xx, yy, this.direction, 6) + fillText4(ctx, 'Carry', -10, 30, xx, yy, this.direction, 6) + fillText4(ctx, 'Ans', 20, 0, xx, yy, this.direction, 6) + ctx.fill() + ctx.beginPath() + ctx.fillStyle = 'DarkGreen' + fillText4(ctx, this.message, 0, 0, xx, yy, this.direction, 12) + ctx.fill() + } + + /** + * @memberof ALU + * resolve output values based on inputData + */ + resolve() { + if (this.controlSignalInput.value === 0) { + this.output.value = this.inp1.value & this.inp2.value + simulationArea.simulationQueue.add(this.output) + this.carryOut.value = 0 + simulationArea.simulationQueue.add(this.carryOut) + this.message = 'A&B' + } else if (this.controlSignalInput.value === 1) { + this.output.value = this.inp1.value | this.inp2.value + + simulationArea.simulationQueue.add(this.output) + this.carryOut.value = 0 + simulationArea.simulationQueue.add(this.carryOut) + this.message = 'A|B' + } else if (this.controlSignalInput.value === 2) { + const sum = this.inp1.value + this.inp2.value + this.output.value = + (sum << (32 - this.bitWidth)) >>> (32 - this.bitWidth) + this.carryOut.value = +(sum >>> this.bitWidth !== 0) + simulationArea.simulationQueue.add(this.carryOut) + simulationArea.simulationQueue.add(this.output) + this.message = 'A+B' + } else if (this.controlSignalInput.value === 3) { + this.message = 'ALU' + } else if (this.controlSignalInput.value === 4) { + this.message = 'A&~B' + this.output.value = this.inp1.value & this.flipBits(this.inp2.value) + simulationArea.simulationQueue.add(this.output) + this.carryOut.value = 0 + simulationArea.simulationQueue.add(this.carryOut) + } else if (this.controlSignalInput.value === 5) { + this.message = 'A|~B' + this.output.value = this.inp1.value | this.flipBits(this.inp2.value) + simulationArea.simulationQueue.add(this.output) + this.carryOut.value = 0 + simulationArea.simulationQueue.add(this.carryOut) + } else if (this.controlSignalInput.value === 6) { + this.message = 'A-B' + this.output.value = + ((this.inp1.value - this.inp2.value) << + (32 - this.bitWidth)) >>> + (32 - this.bitWidth) + simulationArea.simulationQueue.add(this.output) + this.carryOut.value = 0 + simulationArea.simulationQueue.add(this.carryOut) + } else if (this.controlSignalInput.value === 7) { + this.message = 'A>> (32 - this.bitWidth) + this.carryOut.value = +(sum >>> this.bitWidth !== 0) + simulationArea.simulationQueue.add(this.carryOut) + simulationArea.simulationQueue.add(this.sum) + } + + generateVerilog() { + if (this.carryIn.verilogLabel) { + return `assign ${this.sum.verilogLabel} = ${this.inpA.verilogLabel} + ${this.inpB.verilogLabel} + ${this.carryIn.verilogLabel};` + } + return `assign ${this.sum.verilogLabel} = ${this.inpA.verilogLabel} + ${this.inpB.verilogLabel};` + } +} + +/** + * @memberof Adder + * Help Tip + * @type {string} + * @category modules + */ +Adder.prototype.tooltipText = 'Adder ToolTip : Performs addition of numbers.' +Adder.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/8misc?id=adder' +Adder.prototype.objectType = 'Adder' diff --git a/v1/src/simulator/src/modules/AndGate.js b/v1/src/simulator/src/modules/AndGate.js new file mode 100644 index 00000000..43c3fced --- /dev/null +++ b/v1/src/simulator/src/modules/AndGate.js @@ -0,0 +1,168 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, arc } from '../canvasApi' +import { changeInputSize } from '../modules' +import { colors } from '../themer/themer' +import { gateGenerateVerilog } from '../utils' + +/** + * @class + * AndGate + * @extends CircuitElement + * @param {number} x - x coordinate of And Gate. + * @param {number} y - y coordinate of And Gate. + * @param {Scope=} scope - Cirucit on which and gate is drawn + * @param {string=} dir - direction of And Gate + * @param {number=} inputLength - number of input nodes + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +export default class AndGate extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + inputLength = 2, + bitWidth = 1 + ) { + /** + * super call + */ + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['AndGate'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 20) + this.inp = [] + this.inputSize = inputLength + + // variable inputLength , node creation + if (inputLength % 2 === 1) { + for (let i = 0; i < inputLength / 2 - 1; i++) { + const a = new Node(-10, -10 * (i + 1), 0, this) + this.inp.push(a) + } + let a = new Node(-10, 0, 0, this) + this.inp.push(a) + for (let i = inputLength / 2 + 1; i < inputLength; i++) { + a = new Node(-10, 10 * (i + 1 - inputLength / 2 - 1), 0, this) + this.inp.push(a) + } + } else { + for (let i = 0; i < inputLength / 2; i++) { + const a = new Node(-10, -10 * (i + 1), 0, this) + this.inp.push(a) + } + for (let i = inputLength / 2; i < inputLength; i++) { + const a = new Node(-10, 10 * (i + 1 - inputLength / 2), 0, this) + this.inp.push(a) + } + } + + this.output1 = new Node(20, 0, 1, this) + } + + /** + * @memberof AndGate + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.inputSize, + this.bitWidth, + ], + nodes: { + inp: this.inp.map(findNode), + output1: findNode(this.output1), + }, + } + return data + } + + /** + * @memberof AndGate + * resolve output values based on inputData + */ + resolve() { + let result = this.inp[0].value || 0 + if (this.isResolvable() === false) { + return + } + for (let i = 1; i < this.inputSize; i++) + result &= this.inp[i].value || 0 + this.output1.value = result >>> 0 + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof AndGate + * function to draw And Gate + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.lineWidth = correctWidth(3) + ctx.strokeStyle = colors['stroke'] // ("rgba(0,0,0,1)"); + ctx.fillStyle = colors['fill'] + const xx = this.x + const yy = this.y + + moveTo(ctx, -10, -20, xx, yy, this.direction) + lineTo(ctx, 0, -20, xx, yy, this.direction) + arc(ctx, 0, 0, 20, -Math.PI / 2, Math.PI / 2, xx, yy, this.direction) + lineTo(ctx, -10, 20, xx, yy, this.direction) + lineTo(ctx, -10, -20, xx, yy, this.direction) + ctx.closePath() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + } + + generateVerilog() { + return gateGenerateVerilog.call(this, '&') + } +} + +/** + * @memberof AndGate + * Help Tip + * @type {string} + * @category modules + */ +AndGate.prototype.tooltipText = + 'And Gate Tooltip : Implements logical conjunction' + +/** + * @memberof AndGate + * @type {boolean} + * @category modules + */ +AndGate.prototype.alwaysResolve = true + +/** + * @memberof AndGate + * @type {string} + * @category modules + */ +AndGate.prototype.verilogType = 'and' + +/** + * @memberof AndGate + * function to change input nodes of the gate + * @category modules + */ +AndGate.prototype.changeInputSize = changeInputSize +AndGate.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/4gates?id=and-gate' +AndGate.prototype.objectType = 'AndGate' diff --git a/v1/src/simulator/src/modules/Arrow.js b/v1/src/simulator/src/modules/Arrow.js new file mode 100644 index 00000000..24eeddfd --- /dev/null +++ b/v1/src/simulator/src/modules/Arrow.js @@ -0,0 +1,83 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, arc } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * Arrow + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Arrow extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT') { + super(x, y, scope, dir, 8) + /* this is done in this.baseSetup() now + this.scope['Arrow'].push(this); + */ + this.rectangleObject = false + this.fixedBitWidth = true + this.setDimensions(30, 20) + } + + /** + * @memberof Arrow + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction], + } + return data + } + + /** + * @memberof Arrow + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + ctx.strokeStyle = colors['stroke_alt'] + ctx.fillStyle = colors['fill'] + + ctx.beginPath() + + moveTo(ctx, -30, -3, xx, yy, this.direction) + lineTo(ctx, 10, -3, xx, yy, this.direction) + lineTo(ctx, 10, -15, xx, yy, this.direction) + lineTo(ctx, 30, 0, xx, yy, this.direction) + lineTo(ctx, 10, 15, xx, yy, this.direction) + lineTo(ctx, 10, 3, xx, yy, this.direction) + lineTo(ctx, -30, 3, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + } +} + +/** + * @memberof Arrow + * Help Tip + * @type {string} + * @category modules + */ +Arrow.prototype.tooltipText = 'Arrow ToolTip : Arrow Selected.' +Arrow.prototype.propagationDelayFixed = true +Arrow.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/7annotation?id=arrow' +Arrow.prototype.objectType = 'Arrow' diff --git a/v1/src/simulator/src/modules/BitSelector.js b/v1/src/simulator/src/modules/BitSelector.js new file mode 100644 index 00000000..8c91cee4 --- /dev/null +++ b/v1/src/simulator/src/modules/BitSelector.js @@ -0,0 +1,173 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode, extractBits } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect, fillText } from '../canvasApi' +/** + * @class + * BitSelector + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @param {number=} selectorBitWidth - 1 by default + * @category modules + */ +import { colors } from '../themer/themer' + +export default class BitSelector extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 2, + selectorBitWidth = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['BitSelector'].push(this); + */ + this.setDimensions(20, 20) + this.selectorBitWidth = + selectorBitWidth || parseInt(prompt('Enter Selector bitWidth'), 10) + this.rectangleObject = false + this.inp1 = new Node(-20, 0, 0, this, this.bitWidth, 'Input') + this.output1 = new Node(20, 0, 1, this, 1, 'Output') + this.bitSelectorInp = new Node( + 0, + 20, + 0, + this, + this.selectorBitWidth, + 'Bit Selector' + ) + } + + /** + * @memberof BitSelector + * Function to change selector Bitwidth + * @param {size} + */ + changeSelectorBitWidth(size) { + if (size === undefined || size < 1 || size > 32) return + this.selectorBitWidth = size + this.bitSelectorInp.bitWidth = size + } + + /** + * @memberof BitSelector + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + inp1: findNode(this.inp1), + output1: findNode(this.output1), + bitSelectorInp: findNode(this.bitSelectorInp), + }, + constructorParamaters: [ + this.direction, + this.bitWidth, + this.selectorBitWidth, + ], + } + return data + } + + /** + * @memberof BitSelector + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.inp1.bitWidth = bitWidth + this.bitWidth = bitWidth + } + + /** + * @memberof BitSelector + * resolve output values based on inputData + */ + resolve() { + this.output1.value = extractBits( + this.inp1.value, + this.bitSelectorInp.value + 1, + this.bitSelectorInp.value + 1 + ) // (this.inp1.value^(1<> ${this.bitSelectorInp.verilogLabel};` + } +} + +/** + * @memberof BitSelector + * Help Tip + * @type {string} + * @category modules + */ +BitSelector.prototype.tooltipText = + 'BitSelector ToolTip : Divides input bits into several equal-sized groups.' +BitSelector.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/5muxandplex?id=bitselector' + +/** + * @memberof BitSelector + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +BitSelector.prototype.mutableProperties = { + selectorBitWidth: { + name: 'Selector Bit Width: ', + type: 'number', + max: '32', + min: '1', + func: 'changeSelectorBitWidth', + }, +} +BitSelector.prototype.objectType = 'BitSelector' diff --git a/v1/src/simulator/src/modules/Buffer.js b/v1/src/simulator/src/modules/Buffer.js new file mode 100644 index 00000000..f3e9cd69 --- /dev/null +++ b/v1/src/simulator/src/modules/Buffer.js @@ -0,0 +1,134 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, arc } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * Buffer + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Buffer extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Buffer'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 15) + this.state = 0 + this.preState = 0 + this.inp1 = new Node(-10, 0, 0, this) + this.reset = new Node(0, 0, 0, this, 1, 'reset') + this.output1 = new Node(20, 0, 1, this) + } + + /** + * @memberof Buffer + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + output1: findNode(this.output1), + inp1: findNode(this.inp1), + reset: findNode(this.reset), + }, + } + return data + } + + /** + * @memberof Buffer + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.inp1.bitWidth = bitWidth + this.output1.bitWidth = bitWidth + this.bitWidth = bitWidth + } + + /** + * @memberof Buffer + * Checks if the element is resolvable + * @return {boolean} + */ + isResolvable() { + return true + } + + /** + * @memberof Buffer + * resolve output values based on inputData + */ + resolve() { + if (this.reset.value === 1) { + this.state = this.preState + } + if (this.inp1.value !== undefined) { + this.state = this.inp1.value + } + + this.output1.value = this.state + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof Buffer + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke_alt'] + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.fillStyle = colors['fill'] + moveTo(ctx, -10, -15, xx, yy, this.direction) + lineTo(ctx, 20, 0, xx, yy, this.direction) + lineTo(ctx, -10, 15, xx, yy, this.direction) + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + } + + generateVerilog() { + return ( + 'assign ' + + this.output1.verilogLabel + + ' = ' + + this.inp1.verilogLabel + + ';' + ) + } +} + +/** + * @memberof Buffer + * Help Tip + * @type {string} + * @category modules + */ +Buffer.prototype.tooltipText = + 'Buffer ToolTip : Isolate the input from the output.' +Buffer.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/8misc?id=buffer' +Buffer.prototype.objectType = 'Buffer' diff --git a/v1/src/simulator/src/modules/Button.js b/v1/src/simulator/src/modules/Button.js new file mode 100644 index 00000000..b108afaa --- /dev/null +++ b/v1/src/simulator/src/modules/Button.js @@ -0,0 +1,184 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, drawCircle2 } from '../canvasApi' + +/** + * @class + * Button + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @category modules + */ +export default class Button extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT') { + super(x, y, scope, dir, 1) + /* this is done in this.baseSetup() now + this.scope['Button'].push(this); + */ + this.state = 0 + this.output1 = new Node(30, 0, 1, this) + this.wasClicked = false + this.rectangleObject = false + this.setDimensions(10, 10) + } + + /** + * @memberof Button + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + output1: findNode(this.output1), + }, + values: { + state: this.state, + }, + constructorParamaters: [this.direction, this.bitWidth], + } + return data + } + + /** + * @memberof Button + * resolve output values based on inputData + */ + resolve() { + if (this.wasClicked) { + this.state = 1 + this.output1.value = this.state + } else { + this.state = 0 + this.output1.value = this.state + } + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof Button + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + const xx = this.x + const yy = this.y + ctx.fillStyle = '#ddd' + + ctx.strokeStyle = '#353535' + ctx.lineWidth = correctWidth(5) + + ctx.beginPath() + + moveTo(ctx, 10, 0, xx, yy, this.direction) + lineTo(ctx, 30, 0, xx, yy, this.direction) + ctx.stroke() + + ctx.beginPath() + + drawCircle2(ctx, 0, 0, 12, xx, yy, this.direction) + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = 'rgba(232, 13, 13,0.6)' + } + + if (this.wasClicked) { + ctx.fillStyle = 'rgba(232, 13, 13,0.8)' + } + ctx.fill() + } + + subcircuitDraw(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + var xx = this.subcircuitMetadata.x + xOffset + var yy = this.subcircuitMetadata.y + yOffset + ctx.fillStyle = '#ddd' + + ctx.strokeStyle = '#353535' + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + drawCircle2(ctx, 0, 0, 6, xx, yy, this.direction) + ctx.stroke() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected == this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = 'rgba(232, 13, 13,0.6)' + if (this.wasClicked) ctx.fillStyle = 'rgba(232, 13, 13,0.8)' + ctx.fill() + } + static verilogInstructions() { + return `Button - Buttons are not natively supported in verilog, consider using Inputs instead\n` + } + verilogBaseType() { + return this.verilogName() + (Button.selSizes.length - 1) + } + + //this code to generate Verilog + generateVerilog() { + Button.selSizes.push(this.data) + return CircuitElement.prototype.generateVerilog.call(this) + } + + static moduleVerilog() { + var output = '' + + for (var i = 0; i < Button.selSizes.length; i++) { + output += `// Skeleton for Button${i} + /* + module Button${i}(out); + output reg out; + + initial begin + //do something with the button here + end + endmodule + */ + ` + } + + return output + } + + //reset the sized before Verilog generation + static resetVerilog() { + Button.selSizes = [] + } +} + +/** + * @memberof Button + * Help Tip + * @type {string} + * @category modules + */ +Button.prototype.tooltipText = + 'Button ToolTip: High(1) when pressed and Low(0) when released.' + +/** + * @memberof Button + * Help URL + * @type {string} + * @category modules + */ +Button.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/2input?id=button' + +/** + * @memberof Button + * @type {number} + * @category modules + */ +Button.prototype.propagationDelay = 0 +Button.prototype.objectType = 'Button' +Button.prototype.canShowInSubcircuit = true diff --git a/v1/src/simulator/src/modules/ConstantVal.js b/v1/src/simulator/src/modules/ConstantVal.js new file mode 100644 index 00000000..d5f9028a --- /dev/null +++ b/v1/src/simulator/src/modules/ConstantVal.js @@ -0,0 +1,209 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect2, fillText, oppositeDirection } from '../canvasApi' +import { colors } from '../themer/themer' + +function bin2dec(binString) { + return parseInt(binString, 2) +} + +function dec2bin(dec, bitWidth = undefined) { + // only for positive nos + var bin = dec.toString(2) + if (bitWidth == undefined) return bin + return '0'.repeat(bitWidth - bin.length) + bin +} + +/** + * @class + * ConstantVal + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @param {string=} state - The state of element + * @category modules + */ +export default class ConstantVal extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 1, + state = '0' + ) { + // state = state || prompt('Enter value'); + super(x, y, scope, dir, state.length) + /* this is done in this.baseSetup() now + this.scope['ConstantVal'].push(this); + */ + this.state = state + this.setDimensions(10 * this.state.length, 10) + this.bitWidth = bitWidth || this.state.length + this.directionFixed = true + this.orientationFixed = false + this.rectangleObject = false + + this.output1 = new Node(this.bitWidth * 10, 0, 1, this) + this.wasClicked = false + this.label = '' + } + + generateVerilog() { + return `localparam [${this.bitWidth - 1}:0] ${this.verilogLabel}=${ + this.bitWidth + }b'${this.state};` + } + + /** + * @memberof ConstantVal + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + output1: findNode(this.output1), + }, + constructorParamaters: [this.direction, this.bitWidth, this.state], + } + return data + } + + /** + * @memberof ConstantVal + * resolve output values based on inputData + */ + resolve() { + this.output1.value = bin2dec(this.state) + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof ConstantVal + * updates state using a prompt when dbl clicked + */ + dblclick() { + this.state = prompt('Re enter the value') || '0' + this.newBitWidth(this.state.toString().length) + } + + /** + * @memberof ConstantVal + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + if (bitWidth > this.state.length) + this.state = '0'.repeat(bitWidth - this.state.length) + this.state + else if (bitWidth < this.state.length) + this.state = this.state.slice(this.bitWidth - bitWidth) + this.bitWidth = bitWidth // ||parseInt(prompt("Enter bitWidth"),10); + this.output1.bitWidth = bitWidth + this.setDimensions(10 * this.bitWidth, 10) + if (this.direction === 'RIGHT') { + this.output1.x = 10 * this.bitWidth + this.output1.leftx = 10 * this.bitWidth + } else if (this.direction === 'LEFT') { + this.output1.x = -10 * this.bitWidth + this.output1.leftx = 10 * this.bitWidth + } + } + + /** + * @memberof ConstantVal + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(1) + const xx = this.x + const yy = this.y + + rect2( + ctx, + -10 * this.bitWidth, + -10, + 20 * this.bitWidth, + 20, + xx, + yy, + 'RIGHT' + ) + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + const bin = this.state // dec2bin(this.state,this.bitWidth); + for (let k = 0; k < this.bitWidth; k++) { + fillText(ctx, bin[k], xx - 10 * this.bitWidth + 10 + k * 20, yy + 5) + } + ctx.fill() + } + + /** + * @memberof ConstantVal + * function to change direction of ConstantVal + * @param {string} dir - new direction + */ + newDirection(dir) { + if (dir === this.direction) return + this.direction = dir + this.output1.refresh() + if (dir === 'RIGHT' || dir === 'LEFT') { + this.output1.leftx = 10 * this.bitWidth + this.output1.lefty = 0 + } else { + this.output1.leftx = 10 // 10*this.bitWidth; + this.output1.lefty = 0 + } + + this.output1.refresh() + this.labelDirection = oppositeDirection[this.direction] + } + + generateVerilog() { + return `assign ${this.output1.verilogLabel} = ${this.bitWidth}'b${this.state};` + } +} + +/** + * @memberof ConstantVal + * Help Tip + * @type {string} + * @category modules + */ +ConstantVal.prototype.tooltipText = + 'Constant ToolTip: Bits are fixed. Double click element to change the bits.' + +/** + * @memberof ConstantVal + * Help URL + * @type {string} + * @category modules + */ +ConstantVal.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/2input?id=constantval' + +/** + * @memberof ConstantVal + * @type {number} + * @category modules + */ +ConstantVal.prototype.propagationDelay = 0 +ConstantVal.prototype.objectType = 'ConstantVal' diff --git a/v1/src/simulator/src/modules/ControlledInverter.js b/v1/src/simulator/src/modules/ControlledInverter.js new file mode 100644 index 00000000..c846abec --- /dev/null +++ b/v1/src/simulator/src/modules/ControlledInverter.js @@ -0,0 +1,122 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, drawCircle2 } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * ControlledInverter + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class ControlledInverter extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['ControlledInverter'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 15) + + this.inp1 = new Node(-10, 0, 0, this) + this.output1 = new Node(30, 0, 1, this) + this.state = new Node(0, 0, 0, this, 1, 'Enable') + } + + /** + * @memberof ControlledInverter + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + output1: findNode(this.output1), + inp1: findNode(this.inp1), + state: findNode(this.state), + }, + } + return data + } + + /** + * @memberof ControlledInverter + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.inp1.bitWidth = bitWidth + this.output1.bitWidth = bitWidth + this.bitWidth = bitWidth + } + + /** + * @memberof ControlledInverter + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + if (this.state.value === 1) { + this.output1.value = + ((~this.inp1.value >>> 0) << (32 - this.bitWidth)) >>> + (32 - this.bitWidth) + simulationArea.simulationQueue.add(this.output1) + } + if (this.state.value === 0) { + this.output1.value = undefined + } + } + + /** + * @memberof ControlledInverter + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.fillStyle = colors['fill'] + moveTo(ctx, -10, -15, xx, yy, this.direction) + lineTo(ctx, 20, 0, xx, yy, this.direction) + lineTo(ctx, -10, 15, xx, yy, this.direction) + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + ctx.beginPath() + drawCircle2(ctx, 25, 0, 5, xx, yy, this.direction) + ctx.stroke() + } + + generateVerilog() { + return `assign ${this.output1.verilogLabel} = (${this.state.verilogLabel}!=0) ? ~${this.inp1.verilogLabel} : ${this.inp1.verilogLabel};` + } +} + +/** + * @memberof ControlledInverter + * Help Tip + * @type {string} + * @category modules + */ +ControlledInverter.prototype.tooltipText = + 'Controlled Inverter ToolTip : Controlled buffer and NOT gate.' +ControlledInverter.prototype.objectType = 'ControlledInverter' diff --git a/v1/src/simulator/src/modules/Counter.js b/v1/src/simulator/src/modules/Counter.js new file mode 100644 index 00000000..7ffb23fc --- /dev/null +++ b/v1/src/simulator/src/modules/Counter.js @@ -0,0 +1,194 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { lineTo, moveTo, fillText, correctWidth, rect2 } from '../canvasApi' +import { colors } from '../themer/themer' + +/** + * @class + * Counter component. + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {number=} rows - number of rows + * @param {number=} cols - number of columns. + * Counts from zero to a particular maximum value, which is either + * specified by an input pin or determined by the Counter's bitWidth. + * The counter outputs its current value and a flag that indicates + * when the output value is zero and the clock is 1. + * The counter can be reset to zero at any point using the RESET pin. + * @category modules + */ +export default class Counter extends CircuitElement { + constructor(x, y, scope = globalScope, bitWidth = 8) { + super(x, y, scope, 'RIGHT', bitWidth) + /* this is done in this.baseSetup() now + this.scope['Counter'].push(this); + */ + this.directionFixed = true + this.rectangleObject = true + + this.setDimensions(20, 20) + + this.maxValue = new Node(-20, -10, 0, this, this.bitWidth, 'MaxValue') + this.clock = new Node(-20, +10, 0, this, 1, 'Clock') + this.reset = new Node(0, 20, 0, this, 1, 'Reset') + this.output = new Node(20, -10, 1, this, this.bitWidth, 'Value') + this.zero = new Node(20, 10, 1, this, 1, 'Zero') + + this.value = 0 + this.prevClockState = undefined + } + + customSave() { + return { + nodes: { + maxValue: findNode(this.maxValue), + clock: findNode(this.clock), + reset: findNode(this.reset), + output: findNode(this.output), + zero: findNode(this.zero), + }, + constructorParamaters: [this.bitWidth], + } + } + + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.maxValue.bitWidth = bitWidth + this.output.bitWidth = bitWidth + } + + isResolvable() { + return true + } + + resolve() { + // Max value is either the value in the input pin or the max allowed by the bitWidth. + var maxValue = + this.maxValue.value != undefined + ? this.maxValue.value + : (1 << this.bitWidth) - 1 + var outputValue = this.value + + // Increase value when clock is raised + if (this.clock.value != this.prevClockState && this.clock.value == 1) { + outputValue++ + } + this.prevClockState = this.clock.value + + // Limit to the effective maximum value; this also accounts for bitWidth changes. + outputValue = outputValue % (maxValue + 1) + + // Reset to zero if RESET pin is on + if (this.reset.value == 1) { + outputValue = 0 + } + + // Output the new value + this.value = outputValue + if (this.output.value != outputValue) { + this.output.value = outputValue + simulationArea.simulationQueue.add(this.output) + } + + // Output the zero signal + var zeroValue = this.clock.value == 1 && outputValue == 0 ? 1 : 0 + if (this.zero.value != zeroValue) { + this.zero.value = zeroValue + simulationArea.simulationQueue.add(this.zero) + } + } + + customDraw() { + var ctx = simulationArea.context + var xx = this.x + var yy = this.y + + ctx.beginPath() + ctx.font = '20px Raleway' + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + fillText(ctx, this.value.toString(16), this.x, this.y + 5) + ctx.fill() + + ctx.strokeStyle = colors['stroke'] + ctx.beginPath() + moveTo(ctx, -20, 5, xx, yy, this.direction) + lineTo(ctx, -15, 10, xx, yy, this.direction) + lineTo(ctx, -20, 15, xx, yy, this.direction) + ctx.stroke() + } + + // Draws the element in the subcuircuit. Used in layout mode + subcircuitDraw(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + var xx = this.subcircuitMetadata.x + xOffset + var yy = this.subcircuitMetadata.y + yOffset + + ctx.beginPath() + ctx.font = '20px Raleway' + ctx.fillStyle = 'green' + ctx.textAlign = 'center' + fillText(ctx, this.value.toString(16), xx + 10, yy + 17) + ctx.fill() + + ctx.beginPath() + ctx.lineWidth = correctWidth(1) + rect2(ctx, 0, 0, 20, 20, xx, yy, this.direction) + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected == this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = 'rgba(255, 255, 32,0.6)' + ctx.fill() + } + } + static moduleVerilog() { + return ` + module Counter(val, zero, max, clk, rst); + parameter WIDTH = 1; + output reg [WIDTH-1:0] val; + output reg zero; + input [WIDTH-1:0] max; + input clk, rst; + + initial + val = 0; + + always @ (val) + if (val == 0) + zero = 1; + else + zero = 0; + + always @ (posedge clk or posedge rst) begin + if (rst) + val <= 0; + else + if (val == max) + val <= 0; + else + val <= val + 1; + end + endmodule` + } +} + +Counter.prototype.tooltipText = + 'Counter: a binary counter from zero to a given maximum value' +Counter.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/2input?id=counter' +Counter.prototype.objectType = 'Counter' +Counter.prototype.objectType = 'Counter' +Counter.prototype.canShowInSubcircuit = true +Counter.prototype.layoutProperties = { + rightDimensionX: 20, + leftDimensionX: 0, + upDimensionY: 0, + downDimensionY: 20, +} diff --git a/v1/src/simulator/src/modules/Decoder.js b/v1/src/simulator/src/modules/Decoder.js new file mode 100644 index 00000000..6b6d9278 --- /dev/null +++ b/v1/src/simulator/src/modules/Decoder.js @@ -0,0 +1,291 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, rect, fillText } from '../canvasApi' +/** + * @class + * Decoder + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Decoder extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'LEFT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Decoder'].push(this); + */ + // this.controlSignalSize = controlSignalSize || parseInt(prompt("Enter control signal bitWidth"), 10); + this.outputsize = 1 << this.bitWidth + this.xOff = 0 + this.yOff = 1 + if (this.bitWidth === 1) { + this.xOff = 10 + } + if (this.bitWidth <= 3) { + this.yOff = 2 + } + + // this.changeControlSignalSize = function(size) { + // if (size === undefined || size < 1 || size > 32) return; + // if (this.controlSignalSize === size) return; + // let obj = new window[this.objectType](this.x, this.y, this.scope, this.direction, this.bitWidth, size); + // this.cleanDelete(); + // simulationArea.lastSelected = obj; + // return obj; + // } + // this.mutableProperties = { + // "controlSignalSize": { + // name: "Control Signal Size", + // type: "number", + // max: "32", + // min: "1", + // func: "changeControlSignalSize", + // }, + // } + // eslint-disable-next-line no-shadow + this.newBitWidth = function (bitWidth) { + // this.bitWidth = bitWidth; + // for (let i = 0; i < this.inputSize; i++) { + // this.outputs1[i].bitWidth = bitWidth + // } + // this.input.bitWidth = bitWidth; + if (bitWidth === undefined || bitWidth < 1 || bitWidth > 32) return + if (this.bitWidth === bitWidth) return + const obj = new Decoder( + this.x, + this.y, + this.scope, + this.direction, + bitWidth + ) + this.cleanDelete() + simulationArea.lastSelected = obj + return obj + } + + this.setDimensions(20 - this.xOff, this.yOff * 5 * this.outputsize) + this.rectangleObject = false + this.input = new Node(20 - this.xOff, 0, 0, this) + + this.output1 = [] + for (let i = 0; i < this.outputsize; i++) { + const a = new Node( + -20 + this.xOff, + +this.yOff * 10 * (i - this.outputsize / 2) + 10, + 1, + this, + 1 + ) + this.output1.push(a) + } + + // this.controlSignalInput = new Node(0,this.yOff * 10 * (this.outputsize / 2 - 1) +this.xOff + 10, 0, this, this.controlSignalSize,"Control Signal"); + } + + /** + * @memberof Decoder + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + output1: this.output1.map(findNode), + input: findNode(this.input), + }, + } + return data + } + + /** + * @memberof Decoder + * resolve output values based on inputData + */ + resolve() { + for (let i = 0; i < this.output1.length; i++) { + this.output1[i].value = 0 + } + if (this.input.value !== undefined) + this.output1[this.input.value].value = 1 // if input is undefined, don't change output + for (let i = 0; i < this.output1.length; i++) { + simulationArea.simulationQueue.add(this.output1[i]) + } + } + + /** + * @memberof Decoder + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + + const xx = this.x + const yy = this.y + + // ctx.beginPath(); + // moveTo(ctx, 0,this.yOff * 10 * (this.outputsize / 2 - 1) + 10 + 0.5 *this.xOff, xx, yy, this.direction); + // lineTo(ctx, 0,this.yOff * 5 * (this.outputsize - 1) +this.xOff, xx, yy, this.direction); + // ctx.stroke(); + + ctx.beginPath() + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(4) + ctx.fillStyle = colors['fill'] + moveTo( + ctx, + -20 + this.xOff, + -this.yOff * 10 * (this.outputsize / 2), + xx, + yy, + this.direction + ) + lineTo( + ctx, + -20 + this.xOff, + 20 + this.yOff * 10 * (this.outputsize / 2 - 1), + xx, + yy, + this.direction + ) + lineTo( + ctx, + 20 - this.xOff, + +this.yOff * 10 * (this.outputsize / 2 - 1) + this.xOff, + xx, + yy, + this.direction + ) + lineTo( + ctx, + 20 - this.xOff, + -this.yOff * 10 * (this.outputsize / 2) - this.xOff + 20, + xx, + yy, + this.direction + ) + + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = colors['hover_select'] + } + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.fillStyle = 'black' + ctx.textAlign = 'center' + // [xFill,yFill] = rotate(xx + this.output1[i].x - 7, yy + this.output1[i].y + 2); + for (let i = 0; i < this.outputsize; i++) { + if (this.direction === 'LEFT') + fillText( + ctx, + String(i), + xx + this.output1[i].x - 7, + yy + this.output1[i].y + 2, + 10 + ) + else if (this.direction === 'RIGHT') + fillText( + ctx, + String(i), + xx + this.output1[i].x + 7, + yy + this.output1[i].y + 2, + 10 + ) + else if (this.direction === 'UP') + fillText( + ctx, + String(i), + xx + this.output1[i].x, + yy + this.output1[i].y - 5, + 10 + ) + else + fillText( + ctx, + String(i), + xx + this.output1[i].x, + yy + this.output1[i].y + 10, + 10 + ) + } + ctx.fill() + } + + verilogBaseType() { + return this.verilogName() + this.output1.length + } + + //this code to generate Verilog + generateVerilog() { + Decoder.selSizes.add(this.bitWidth) + return CircuitElement.prototype.generateVerilog.call(this) + } + + static moduleVerilog() { + var output = '' + + for (var size of Decoder.selSizes) { + var numOutput = 1 << size + output += '\n' + output += 'module Decoder' + numOutput + output += '(' + for (var j = 0; j < numOutput; j++) { + output += 'out' + j + ', ' + } + output += 'sel);\n' + + output += ' output reg ' + for (var j = 0; j < numOutput - 1; j++) { + output += 'out' + j + ', ' + } + output += 'out' + (numOutput - 1) + ';\n' + + output += ' input [' + (size - 1) + ':0] sel;\n' + output += ' \n' + + output += ' always @ (*) begin\n' + for (var j = 0; j < numOutput; j++) { + output += ' out' + j + ' = 0;\n' + } + output += ' case (sel)\n' + for (var j = 0; j < numOutput; j++) { + output += ' ' + j + ' : out' + j + ' = 1;\n' + } + output += ' endcase\n' + output += ' end\n' + output += 'endmodule\n' + } + + return output + } + + //reset the sized before Verilog generation + static resetVerilog() { + Decoder.selSizes = new Set() + } +} + +/** + * @memberof Decoder + * Help Tip + * @type {string} + * @category modules + */ +Decoder.prototype.tooltipText = + 'Decoder ToolTip : Converts coded inputs into coded outputs.' +Decoder.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/5muxandplex?id=decoder' +Decoder.prototype.objectType = 'Decoder' diff --git a/v1/src/simulator/src/modules/Demultiplexer.js b/v1/src/simulator/src/modules/Demultiplexer.js new file mode 100644 index 00000000..feb21cfa --- /dev/null +++ b/v1/src/simulator/src/modules/Demultiplexer.js @@ -0,0 +1,324 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText } from '../canvasApi' +/** + * @class + * Demultiplexer + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @param {number=} controlSignalSize - 1 by default + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Demultiplexer extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'LEFT', + bitWidth = 1, + controlSignalSize = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Demultiplexer'].push(this); + */ + this.controlSignalSize = + controlSignalSize || + parseInt(prompt('Enter control signal bitWidth'), 10) + this.outputsize = 1 << this.controlSignalSize + this.xOff = 0 + this.yOff = 1 + if (this.controlSignalSize === 1) { + this.xOff = 10 + } + if (this.controlSignalSize <= 3) { + this.yOff = 2 + } + + this.changeControlSignalSize = function (size) { + if (size === undefined || size < 1 || size > 32) return + if (this.controlSignalSize === size) return + const obj = new Demultiplexer( + this.x, + this.y, + this.scope, + this.direction, + this.bitWidth, + size + ) + this.cleanDelete() + simulationArea.lastSelected = obj + return obj + } + this.mutableProperties = { + controlSignalSize: { + name: 'Control Signal Size', + type: 'number', + max: '10', + min: '1', + func: 'changeControlSignalSize', + }, + } + // eslint-disable-next-line no-shadow + this.newBitWidth = function (bitWidth) { + this.bitWidth = bitWidth + for (let i = 0; i < this.outputsize; i++) { + this.output1[i].bitWidth = bitWidth + } + this.input.bitWidth = bitWidth + } + + this.setDimensions(20 - this.xOff, this.yOff * 5 * this.outputsize) + this.rectangleObject = false + this.input = new Node(20 - this.xOff, 0, 0, this) + + this.output1 = [] + for (let i = 0; i < this.outputsize; i++) { + const a = new Node( + -20 + this.xOff, + +this.yOff * 10 * (i - this.outputsize / 2) + 10, + 1, + this + ) + this.output1.push(a) + } + + this.controlSignalInput = new Node( + 0, + this.yOff * 10 * (this.outputsize / 2 - 1) + this.xOff + 10, + 0, + this, + this.controlSignalSize, + 'Control Signal' + ) + } + + /** + * @memberof Demultiplexer + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.bitWidth, + this.controlSignalSize, + ], + nodes: { + output1: this.output1.map(findNode), + input: findNode(this.input), + controlSignalInput: findNode(this.controlSignalInput), + }, + } + return data + } + + /** + * @memberof Demultiplexer + * resolve output values based on inputData + */ + resolve() { + for (let i = 0; i < this.output1.length; i++) { + this.output1[i].value = 0 + } + + this.output1[this.controlSignalInput.value].value = this.input.value + + for (let i = 0; i < this.output1.length; i++) { + simulationArea.simulationQueue.add(this.output1[i]) + } + } + + /** + * @memberof Demultiplexer + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + + const xx = this.x + const yy = this.y + + ctx.beginPath() + moveTo( + ctx, + 0, + this.yOff * 10 * (this.outputsize / 2 - 1) + 10 + 0.5 * this.xOff, + xx, + yy, + this.direction + ) + lineTo( + ctx, + 0, + this.yOff * 5 * (this.outputsize - 1) + this.xOff, + xx, + yy, + this.direction + ) + ctx.stroke() + + ctx.beginPath() + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(4) + ctx.fillStyle = colors['fill'] + moveTo( + ctx, + -20 + this.xOff, + -this.yOff * 10 * (this.outputsize / 2), + xx, + yy, + this.direction + ) + lineTo( + ctx, + -20 + this.xOff, + 20 + this.yOff * 10 * (this.outputsize / 2 - 1), + xx, + yy, + this.direction + ) + lineTo( + ctx, + 20 - this.xOff, + +this.yOff * 10 * (this.outputsize / 2 - 1) + this.xOff, + xx, + yy, + this.direction + ) + lineTo( + ctx, + 20 - this.xOff, + -this.yOff * 10 * (this.outputsize / 2) - this.xOff + 20, + xx, + yy, + this.direction + ) + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = colors['hover_select'] + } + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.fillStyle = 'black' + ctx.textAlign = 'center' + // [xFill,yFill] = rotate(xx + this.output1[i].x - 7, yy + this.output1[i].y + 2); + for (let i = 0; i < this.outputsize; i++) { + if (this.direction === 'LEFT') + fillText( + ctx, + String(i), + xx + this.output1[i].x - 7, + yy + this.output1[i].y + 2, + 10 + ) + else if (this.direction === 'RIGHT') + fillText( + ctx, + String(i), + xx + this.output1[i].x + 7, + yy + this.output1[i].y + 2, + 10 + ) + else if (this.direction === 'UP') + fillText( + ctx, + String(i), + xx + this.output1[i].x, + yy + this.output1[i].y - 5, + 10 + ) + else + fillText( + ctx, + String(i), + xx + this.output1[i].x, + yy + this.output1[i].y + 10, + 10 + ) + } + ctx.fill() + } + + verilogBaseType() { + return this.verilogName() + this.output1.length + } + + //this code to generate Verilog + generateVerilog() { + Demultiplexer.selSizes.add(this.controlSignalSize) + return CircuitElement.prototype.generateVerilog.call(this) + } + + //generate the needed modules + static moduleVerilog() { + var output = '' + + for (var size of Demultiplexer.selSizes) { + var numOutput = 1 << size + output += '\n' + output += 'module Demultiplexer' + numOutput + output += '(' + for (var j = 0; j < numOutput; j++) { + output += 'out' + j + ', ' + } + output += 'in, sel);\n' + + output += ' parameter WIDTH = 1;\n' + output += ' output reg [WIDTH-1:0] ' + for (var j = 0; j < numOutput - 1; j++) { + output += 'out' + j + ', ' + } + output += 'out' + (numOutput - 1) + ';\n' + + output += ' input [WIDTH-1:0] in;\n' + output += ' input [' + (size - 1) + ':0] sel;\n' + output += ' \n' + + output += ' always @ (*) begin\n' + for (var j = 0; j < numOutput; j++) { + output += ' out' + j + ' = 0;\n' + } + output += ' case (sel)\n' + for (var j = 0; j < numOutput; j++) { + output += ' ' + j + ' : out' + j + ' = in;\n' + } + output += ' endcase\n' + output += ' end\n' + output += 'endmodule\n' + } + + return output + } + + //reset the sized before Verilog generation + static resetVerilog() { + Demultiplexer.selSizes = new Set() + } +} + +/** + * @memberof Demultiplexer + * Help Tip + * @type {string} + * @category modules + */ +Demultiplexer.prototype.tooltipText = + 'DeMultiplexer ToolTip : Multiple outputs and a single line input.' +Demultiplexer.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/5muxandplex?id=demultiplexer' +Demultiplexer.prototype.objectType = 'Demultiplexer' diff --git a/v1/src/simulator/src/modules/DigitalLed.js b/v1/src/simulator/src/modules/DigitalLed.js new file mode 100644 index 00000000..df17fbfa --- /dev/null +++ b/v1/src/simulator/src/modules/DigitalLed.js @@ -0,0 +1,188 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { + correctWidth, + lineTo, + moveTo, + arc, + colorToRGBA, + drawCircle2, + validColor, +} from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * DigitalLed + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} color - color of led + * @category modules + */ +import { colors } from '../themer/themer' + +export default class DigitalLed extends CircuitElement { + constructor(x, y, scope = globalScope, color = 'Red') { + // Calling base class constructor + + super(x, y, scope, 'UP', 1) + /* this is done in this.baseSetup() now + this.scope['DigitalLed'].push(this); + */ + this.rectangleObject = false + this.setDimensions(10, 20) + this.inp1 = new Node(-40, 0, 0, this, 1) + this.directionFixed = true + this.fixedBitWidth = true + this.color = color + const temp = colorToRGBA(this.color) + this.actualColor = `rgba(${temp[0]},${temp[1]},${temp[2]},${0.8})` + } + + /** + * @memberof DigitalLed + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.color], + nodes: { + inp1: findNode(this.inp1), + }, + } + return data + } + + /** + * @memberof DigitalLed + * function to change color of the led + */ + changeColor(value) { + if (validColor(value)) { + this.color = value + const temp = colorToRGBA(this.color) + this.actualColor = `rgba(${temp[0]},${temp[1]},${temp[2]},${0.8})` + } + } + + /** + * @memberof DigitalLed + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + + const xx = this.x + const yy = this.y + + ctx.strokeStyle = '#e3e4e5' + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + moveTo(ctx, -20, 0, xx, yy, this.direction) + lineTo(ctx, -40, 0, xx, yy, this.direction) + ctx.stroke() + + ctx.strokeStyle = '#d3d4d5' + ctx.fillStyle = ['rgba(227,228,229,0.8)', this.actualColor][ + this.inp1.value || 0 + ] + ctx.lineWidth = correctWidth(1) + + ctx.beginPath() + + moveTo(ctx, -15, -9, xx, yy, this.direction) + lineTo(ctx, 0, -9, xx, yy, this.direction) + arc(ctx, 0, 0, 9, -Math.PI / 2, Math.PI / 2, xx, yy, this.direction) + lineTo(ctx, -15, 9, xx, yy, this.direction) + lineTo(ctx, -18, 12, xx, yy, this.direction) + arc( + ctx, + 0, + 0, + Math.sqrt(468), + Math.PI / 2 + Math.acos(12 / Math.sqrt(468)), + -Math.PI / 2 - Math.asin(18 / Math.sqrt(468)), + xx, + yy, + this.direction + ) + lineTo(ctx, -15, -9, xx, yy, this.direction) + ctx.stroke() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + } + + // Draws the element in the subcircuit. Used in layout mode + subcircuitDraw(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + + var xx = this.subcircuitMetadata.x + xOffset + var yy = this.subcircuitMetadata.y + yOffset + + ctx.strokeStyle = '#090a0a' + ctx.fillStyle = ['rgba(227,228,229,0.8)', this.actualColor][ + this.inp1.value || 0 + ] + ctx.lineWidth = correctWidth(1) + + ctx.beginPath() + drawCircle2(ctx, 0, 0, 6, xx, yy, this.direction) + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected == this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = 'rgba(255, 255, 32,0.8)' + ctx.fill() + } + generateVerilog() { + var label = this.label ? this.verilogLabel : this.inp1.verilogLabel + return ` + always @ (*) + $display("DigitalLed:${label}=%d", ${this.inp1.verilogLabel});` + } +} + +/** + * @memberof DigitalLed + * Help Tip + * @type {string} + * @category modules + */ +DigitalLed.prototype.tooltipText = + 'Digital Led ToolTip: Digital LED glows high when input is High(1).' + +/** + * @memberof DigitalLed + * Help URL + * @type {string} + * @category modules + */ +DigitalLed.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/3output?id=digital-led' + +/** + * @memberof DigitalLed + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +DigitalLed.prototype.mutableProperties = { + color: { + name: 'Color: ', + type: 'text', + func: 'changeColor', + }, +} +DigitalLed.prototype.objectType = 'DigitalLed' +DigitalLed.prototype.canShowInSubcircuit = true diff --git a/v1/src/simulator/src/modules/Flag.js b/v1/src/simulator/src/modules/Flag.js new file mode 100644 index 00000000..f332622b --- /dev/null +++ b/v1/src/simulator/src/modules/Flag.js @@ -0,0 +1,234 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect2, fillText } from '../canvasApi' +import plotArea from '../plotArea' +import EventQueue from '../eventQueue' +/** + * @class + * Flag + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @param {string} identifier - id + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Flag extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 1, + identifier + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Flag'].push(this); + */ + this.setWidth(60) + this.setHeight(20) + this.rectangleObject = false + this.directionFixed = true + this.orientationFixed = false + this.identifier = identifier || `F${this.scope.Flag.length}` + this.plotValues = [] + + this.xSize = 10 + this.flagTimeUnit = 0 + + this.inp1 = new Node(40, 0, 0, this) + } + + resolve() { + this.flagTimeUnit = simulationArea.simulationQueue.time + const time = plotArea.getPlotTime(this.flagTimeUnit) + + if ( + this.plotValues.length && + this.plotValues[this.plotValues.length - 1][0] === time + ) { + this.plotValues.pop() + } + + if (this.plotValues.length === 0) { + this.plotValues.push([time, this.inp1.value]) + return + } + + if ( + this.plotValues[this.plotValues.length - 1][1] === this.inp1.value + ) { + return + } + this.plotValues.push([time, this.inp1.value]) + } + + /** + * @memberof Flag + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + inp1: findNode(this.inp1), + }, + values: { + identifier: this.identifier, + }, + } + return data + } + + /** + * @memberof Flag + * set the flag id + * @param {number} id - identifier for flag + */ + setIdentifier(id = '') { + if (id.length === 0) return + this.identifier = id + const len = this.identifier.length + if (len === 1) this.xSize = 20 + else if (len > 1 && len < 4) this.xSize = 10 + else this.xSize = 0 + } + + /** + * @memberof Flag + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(1) + const xx = this.x + const yy = this.y + + rect2( + ctx, + -50 + this.xSize, + -20, + 100 - 2 * this.xSize, + 40, + xx, + yy, + 'RIGHT' + ) + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + + ctx.font = '14px Raleway' + this.xOff = ctx.measureText(this.identifier).width + + ctx.beginPath() + rect2(ctx, -40 + this.xSize, -12, this.xOff + 10, 25, xx, yy, 'RIGHT') + ctx.fillStyle = '#eee' + ctx.strokeStyle = '#ccc' + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = 'black' + fillText( + ctx, + this.identifier, + xx - 35 + this.xOff / 2 + this.xSize, + yy + 5, + 14 + ) + ctx.fill() + + ctx.beginPath() + ctx.font = '30px Raleway' + ctx.textAlign = 'center' + ctx.fillStyle = ['blue', 'red'][+(this.inp1.value === undefined)] + if (this.inp1.value !== undefined) { + fillText( + ctx, + this.inp1.value.toString(16), + xx + 35 - this.xSize, + yy + 8, + 25 + ) + } else { + fillText(ctx, 'x', xx + 35 - this.xSize, yy + 8, 25) + } + ctx.fill() + } + + /** + * @memberof Flag + * function to change direction of Flag + * @param {string} dir - new direction + */ + newDirection(dir) { + if (dir === this.direction) return + this.direction = dir + this.inp1.refresh() + if (dir === 'RIGHT' || dir === 'LEFT') { + this.inp1.leftx = 50 - this.xSize + } else if (dir === 'UP') { + this.inp1.leftx = 20 + } else { + this.inp1.leftx = 20 + } + // if(this.direction=="LEFT" || this.direction=="RIGHT") this.inp1.leftx=50-this.xSize; + // this.inp1.refresh(); + + this.inp1.refresh() + } +} + +/** + * @memberof Flag + * Help Tip + * @type {string} + * @category modules + */ +Flag.prototype.tooltipText = + 'FLag ToolTip: Use this for debugging and plotting.' +Flag.prototype.helplink = + 'https://docs.circuitverse.org/#/timing_diagrams?id=using-flags' + +/** + * @memberof Flag + * Help URL + * @type {string} + * @category modules + */ +Flag.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/8misc?id=tunnel' + +/** + * @memberof Flag + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +Flag.prototype.mutableProperties = { + identifier: { + name: 'Debug Flag identifier', + type: 'text', + maxlength: '5', + func: 'setIdentifier', + }, +} +Flag.prototype.objectType = 'Flag' +Flag.prototype.propagationDelay = 0 diff --git a/v1/src/simulator/src/modules/Ground.js b/v1/src/simulator/src/modules/Ground.js new file mode 100644 index 00000000..f1c88932 --- /dev/null +++ b/v1/src/simulator/src/modules/Ground.js @@ -0,0 +1,129 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, arc } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * Ground + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Ground extends CircuitElement { + constructor(x, y, scope = globalScope, bitWidth = 1) { + super(x, y, scope, 'RIGHT', bitWidth) + /* this is done in this.baseSetup() now + this.scope['Ground'].push(this); + */ + this.rectangleObject = false + this.setDimensions(10, 10) + this.directionFixed = true + this.output1 = new Node(0, -10, 1, this) + } + + /** + * @memberof Ground + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + output1: findNode(this.output1), + }, + values: { + state: this.state, + }, + constructorParamaters: [this.direction, this.bitWidth], + } + return data + } + + /** + * @memberof Ground + * resolve output values based on inputData + */ + resolve() { + this.output1.value = 0 + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof Ground + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + output1: findNode(this.output1), + }, + constructorParamaters: [this.bitWidth], + } + return data + } + + /** + * @memberof Ground + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + // + ctx.beginPath() + ctx.strokeStyle = [colors['stroke'], 'brown'][ + ((this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this)) + 0 + ] + ctx.lineWidth = correctWidth(3) + + const xx = this.x + const yy = this.y + + moveTo(ctx, 0, -10, xx, yy, this.direction) + lineTo(ctx, 0, 0, xx, yy, this.direction) + moveTo(ctx, -10, 0, xx, yy, this.direction) + lineTo(ctx, 10, 0, xx, yy, this.direction) + moveTo(ctx, -6, 5, xx, yy, this.direction) + lineTo(ctx, 6, 5, xx, yy, this.direction) + moveTo(ctx, -2.5, 10, xx, yy, this.direction) + lineTo(ctx, 2.5, 10, xx, yy, this.direction) + ctx.stroke() + } + + generateVerilog() { + return `assign ${this.output1.verilogLabel} = ${this.bitWidth}'b0;` + } +} + +/** + * @memberof Ground + * Help Tip + * @type {string} + * @category modules + */ +Ground.prototype.tooltipText = 'Ground: All bits are Low(0).' + +/** + * @memberof Ground + * Help URL + * @type {string} + * @category modules + */ +Ground.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/2input?id=ground' + +/** + * @memberof Ground + * @type {number} + * @category modules + */ +Ground.prototype.propagationDelay = 0 +Ground.prototype.objectType = 'Ground' diff --git a/v1/src/simulator/src/modules/HexDisplay.js b/v1/src/simulator/src/modules/HexDisplay.js new file mode 100644 index 00000000..b96cd096 --- /dev/null +++ b/v1/src/simulator/src/modules/HexDisplay.js @@ -0,0 +1,420 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { + correctWidth, + lineTo, + moveTo, + arc, + rect2, + validColor, + colorToRGBA, +} from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * HexDisplay + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @category modules + */ +import { colors } from '../themer/themer' + +export default class HexDisplay extends CircuitElement { + constructor(x, y, scope = globalScope, color = 'Red') { + super(x, y, scope, 'RIGHT', 4) + /* this is done in this.baseSetup() now + this.scope['HexDisplay'].push(this); + */ + this.directionFixed = true + this.fixedBitWidth = true + this.setDimensions(30, 50) + this.inp = new Node(0, -50, 0, this, 4) + this.direction = 'RIGHT' + this.color = color + this.actualColor = color + } + + /** + * @memberof HexDisplay + * fn to change the color of HexDisplay + * @return {JSON} + */ + changeColor(value) { + if (validColor(value)) { + if (value.trim() === '') { + this.color = 'Red' + this.actualColor = 'rgba(255, 0, 0, 1)' + } else { + this.color = value + const temp = colorToRGBA(value) + this.actualColor = `rgba(${temp[0]},${temp[1]},${temp[2]}, ${temp[3]})` + } + } + } + + /** + * @memberof HexDisplay + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.color], + nodes: { + inp: findNode(this.inp), + }, + } + return data + } + + /** + * @memberof HexDisplay + * function to draw element + */ + customDrawSegment(x1, y1, x2, y2, color) { + if (color === undefined) color = 'lightgrey' + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = color + ctx.lineWidth = correctWidth(5) + const xx = this.x + const yy = this.y + + moveTo(ctx, x1, y1, xx, yy, this.direction) + lineTo(ctx, x2, y2, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + } + + /** + * @memberof HexDisplay + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + + const xx = this.x + const yy = this.y + + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(3) + + let a = 0, + b = 0, + c = 0, + d = 0, + e = 0, + f = 0, + g = 0 + switch (this.inp.value) { + case 0: + a = b = c = d = e = f = 1 + break + case 1: + b = c = 1 + break + case 2: + a = b = g = e = d = 1 + break + case 3: + a = b = g = c = d = 1 + break + case 4: + f = g = b = c = 1 + break + case 5: + a = f = g = c = d = 1 + break + case 6: + a = f = g = e = c = d = 1 + break + case 7: + a = b = c = 1 + break + case 8: + a = b = c = d = e = g = f = 1 + break + case 9: + a = f = g = b = c = 1 + break + case 0xa: + a = f = b = c = g = e = 1 + break + case 0xb: + f = e = g = c = d = 1 + break + case 0xc: + a = f = e = d = 1 + break + case 0xd: + b = c = g = e = d = 1 + break + case 0xe: + a = f = g = e = d = 1 + break + case 0xf: + a = f = g = e = 1 + break + default: + } + this.customDrawSegment( + 18, + -3, + 18, + -38, + ['lightgrey', this.actualColor][b] + ) + this.customDrawSegment( + 18, + 3, + 18, + 38, + ['lightgrey', this.actualColor][c] + ) + this.customDrawSegment( + -18, + -3, + -18, + -38, + ['lightgrey', this.actualColor][f] + ) + this.customDrawSegment( + -18, + 3, + -18, + 38, + ['lightgrey', this.actualColor][e] + ) + this.customDrawSegment( + -17, + -38, + 17, + -38, + ['lightgrey', this.actualColor][a] + ) + this.customDrawSegment( + -17, + 0, + 17, + 0, + ['lightgrey', this.actualColor][g] + ) + this.customDrawSegment( + -15, + 38, + 17, + 38, + ['lightgrey', this.actualColor][d] + ) + } + + subcircuitDrawSegment(x1, y1, x2, y2, color, xxSegment, yySegment) { + if (color == undefined) color = 'lightgrey' + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = color + ctx.lineWidth = correctWidth(3) + var xx = xxSegment + var yy = yySegment + + moveTo(ctx, x1, y1, xx, yy, this.direction) + lineTo(ctx, x2, y2, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + } + // Draws the element in the subcircuit. Used in layout mode + subcircuitDraw(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + + var xx = this.subcircuitMetadata.x + xOffset + var yy = this.subcircuitMetadata.y + yOffset + + ctx.strokeStyle = 'black' + ctx.lineWidth = correctWidth(3) + let a = 0, + b = 0, + c = 0, + d = 0, + e = 0, + f = 0, + g = 0 + + switch (this.inp.value) { + case 0: + a = b = c = d = e = f = 1 + break + case 1: + b = c = 1 + break + case 2: + a = b = g = e = d = 1 + break + case 3: + a = b = g = c = d = 1 + break + case 4: + f = g = b = c = 1 + break + case 5: + a = f = g = c = d = 1 + break + case 6: + a = f = g = e = c = d = 1 + break + case 7: + a = b = c = 1 + break + case 8: + a = b = c = d = e = g = f = 1 + break + case 9: + a = f = g = b = c = 1 + break + case 0xa: + a = f = b = c = g = e = 1 + break + case 0xb: + f = e = g = c = d = 1 + break + case 0xc: + a = f = e = d = 1 + break + case 0xd: + b = c = g = e = d = 1 + break + case 0xe: + a = f = g = e = d = 1 + break + case 0xf: + a = f = g = e = 1 + break + default: + } + this.subcircuitDrawSegment( + 10, + -20, + 10, + -38, + ['lightgrey', this.actualColor][b], + xx, + yy + ) + this.subcircuitDrawSegment( + 10, + -17, + 10, + 1, + ['lightgrey', this.actualColor][c], + xx, + yy + ) + this.subcircuitDrawSegment( + -10, + -20, + -10, + -38, + ['lightgrey', this.actualColor][f], + xx, + yy + ) + this.subcircuitDrawSegment( + -10, + -17, + -10, + 1, + ['lightgrey', this.actualColor][e], + xx, + yy + ) + this.subcircuitDrawSegment( + -8, + -38, + 8, + -38, + ['lightgrey', this.actualColor][a], + xx, + yy + ) + this.subcircuitDrawSegment( + -8, + -18, + 8, + -18, + ['lightgrey', this.actualColor][g], + xx, + yy + ) + this.subcircuitDrawSegment( + -8, + 1, + 8, + 1, + ['lightgrey', this.actualColor][d], + xx, + yy + ) + + ctx.beginPath() + ctx.strokeStyle = 'black' + ctx.lineWidth = correctWidth(1) + rect2(ctx, -15, -42, 33, 51, xx, yy, this.direction) + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected == this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = 'rgba(255, 255, 32,0.6)' + ctx.fill() + } + } + generateVerilog() { + return ` + always @ (*) + $display("HexDisplay:${this.verilogLabel}=%d", ${this.inp.verilogLabel});` + } +} + +/** + * @memberof HexDisplay + * Help Tip + * @type {string} + * @category modules + */ +HexDisplay.prototype.tooltipText = + 'Hex Display ToolTip: Inputs a 4 Bit Hex number and displays it.' + +/** + * @memberof HexDisplay + * Help URL + * @type {string} + * @category modules + */ +HexDisplay.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/3output?id=hexdisplay' +HexDisplay.prototype.objectType = 'HexDisplay' +HexDisplay.prototype.canShowInSubcircuit = true +HexDisplay.prototype.layoutProperties = { + rightDimensionX: 20, + leftDimensionX: 15, + upDimensionY: 42, + downDimensionY: 10, +} + +/** + * @memberof HexDisplay + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +HexDisplay.prototype.mutableProperties = { + color: { + name: 'Color: ', + type: 'text', + func: 'changeColor', + }, +} diff --git a/v1/src/simulator/src/modules/ImageAnnotation.js b/v1/src/simulator/src/modules/ImageAnnotation.js new file mode 100644 index 00000000..67ac4d8b --- /dev/null +++ b/v1/src/simulator/src/modules/ImageAnnotation.js @@ -0,0 +1,243 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect, fillText, drawImage } from '../canvasApi' +import { colors } from '../themer/themer' +import { promptFile, showMessage, getImageDimensions } from '../utils' +/** + * @class + * Image + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {number=} rows - number of rows + * @param {number=} cols - number of columns. + * @category modules + */ +export default class ImageAnnotation extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + rows = 15, + cols = 20, + imageUrl = '' + ) { + super(x, y, scope, 'RIGHT', 1) + this.directionFixed = true + this.fixedBitWidth = true + this.imageUrl = imageUrl + this.cols = cols || parseInt(prompt('Enter cols:'), 10) + this.rows = rows || parseInt(prompt('Enter rows:'), 10) + this.setSize() + this.loadImage() + } + + /** + * @memberof Image + * @param {number} size - new size of rows + */ + changeRowSize(size) { + if (size === undefined || size < 5 || size > 1000) return + if (this.rows === size) return + this.rows = parseInt(size, 10) + this.setSize() + return this + } + + /** + * @memberof Image + * @param {number} size - new size of columns + */ + changeColSize(size) { + if (size === undefined || size < 5 || size > 1000) return + if (this.cols === size) return + this.cols = parseInt(size, 10) + this.setSize() + return this + } + + /** + * @memberof Image + * listener function to change direction of Image + * @param {string} dir - new direction + */ + keyDown3(dir) { + if (dir === 'ArrowRight') { + this.changeColSize(this.cols + 2) + } + if (dir === 'ArrowLeft') { + this.changeColSize(this.cols - 2) + } + if (dir === 'ArrowDown') { + this.changeRowSize(this.rows + 2) + } + if (dir === 'ArrowUp') { + this.changeRowSize(this.rows - 2) + } + } + + /** + * @memberof Image + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.rows, this.cols, this.imageUrl], + } + return data + } + + /** + * @memberof Image + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + const xx = this.x + const yy = this.y + var w = this.elementWidth + var h = this.elementHeight + if (this.image && this.image.complete) { + drawImage(ctx, this.image, xx - w / 2, yy - h / 2, w, h) + } else { + ctx.beginPath() + ctx.strokeStyle = 'rgba(0,0,0,1)' + ctx.setLineDash([5 * globalScope.scale, 5 * globalScope.scale]) + ctx.lineWidth = correctWidth(1.5) + + rect(ctx, xx - w / 2, yy - h / 2, w, h) + ctx.stroke() + + if ( + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = 'rgba(255, 255, 32,0.1)' + ctx.fill() + } + + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = colors['text'] + fillText(ctx, 'Double Click to Insert Image', xx, yy, 10) + ctx.fill() + + ctx.setLineDash([]) + } + } + + /** + * Procedure if image is double clicked + **/ + dblclick() { + if (embed) return + this.uploadImage() + } + + async uploadImage() { + var file = await promptFile('image/*', false) + var apiUrl = 'https://api.imgur.com/3/image' + var apiKey = '9a33b3b370f1054' + var settings = { + crossDomain: true, + processData: false, + contentType: false, + type: 'POST', + url: apiUrl, + headers: { + Authorization: 'Client-ID ' + apiKey, + Accept: 'application/json', + }, + mimeType: 'multipart/form-data', + } + var formData = new FormData() + formData.append('image', file) + settings.data = formData + + // Response contains stringified JSON + // Image URL available at response.data.link + showMessage('Uploading Image') + var response = await $.ajax(settings) + showMessage('Image Uploaded') + this.imageUrl = JSON.parse(response).data.link + this.loadImage() + } + + async loadImage() { + if (!this.imageUrl) return + this.image = new Image() + this.image.crossOrigin = 'anonymous' + this.image.src = this.imageUrl + } + /** + * @memberof Image + * function to reset or (internally) set size + */ + setSize() { + this.elementWidth = this.cols * 10 + this.elementHeight = this.rows * 10 + this.upDimensionY = this.elementHeight / 2 + this.downDimensionY = this.elementHeight / 2 + this.leftDimensionX = this.elementWidth / 2 + this.rightDimensionX = this.elementWidth / 2 + } +} + +/** + * @memberof Image + * Help Tip + * @type {string} + * @category modules + */ +ImageAnnotation.prototype.tooltipText = + 'Image ToolTip: Embed an image in the circuit for annotation' +ImageAnnotation.prototype.propagationDelayFixed = true + +/** + * @memberof Image + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +ImageAnnotation.prototype.mutableProperties = { + cols: { + name: 'Columns', + type: 'number', + max: '1000', + min: '5', + func: 'changeColSize', + }, + rows: { + name: 'Rows', + type: 'number', + max: '1000', + min: '5', + func: 'changeRowSize', + }, +} +ImageAnnotation.prototype.objectType = 'ImageAnnotation' +ImageAnnotation.prototype.rectangleObject = false +ImageAnnotation.prototype.mutableProperties = { + imageUrl: { + name: 'Upload Image', + type: 'button', + func: 'uploadImage', + }, + cols: { + name: 'Columns', + type: 'number', + max: '1000', + min: '5', + func: 'changeColSize', + }, + rows: { + name: 'Rows', + type: 'number', + max: '1000', + min: '5', + func: 'changeRowSize', + }, +} diff --git a/v1/src/simulator/src/modules/Input.js b/v1/src/simulator/src/modules/Input.js new file mode 100644 index 00000000..d33c8627 --- /dev/null +++ b/v1/src/simulator/src/modules/Input.js @@ -0,0 +1,210 @@ +/* eslint-disable no-unused-expressions */ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, oppositeDirection, fillText } from '../canvasApi' +import { getNextPosition } from '../modules' +import { generateId } from '../utils' +/** + * @class + * Input + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @param {Object=} layoutProperties - x,y and id + * @category modules + */ +import { colors } from '../themer/themer' + +function bin2dec(binString) { + return parseInt(binString, 2) +} + +function dec2bin(dec, bitWidth = undefined) { + // only for positive nos + var bin = dec.toString(2) + if (bitWidth == undefined) return bin + return '0'.repeat(bitWidth - bin.length) + bin +} + +export default class Input extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 1, + layoutProperties + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Input'].push(this); + */ + if (layoutProperties) { + this.layoutProperties = layoutProperties + } else { + this.layoutProperties = {} + this.layoutProperties.x = 0 + this.layoutProperties.y = getNextPosition(0, scope) + this.layoutProperties.id = generateId() + } + + // Call base class constructor + this.state = 0 + this.orientationFixed = false + this.state = bin2dec(this.state) // in integer format + this.output1 = new Node(this.bitWidth * 10, 0, 1, this) + this.wasClicked = false + this.directionFixed = true + this.setWidth(this.bitWidth * 10) + this.rectangleObject = true // Trying to make use of base class draw + } + + /** + * @memberof Input + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + output1: findNode(this.output1), + }, + values: { + state: this.state, + }, + constructorParamaters: [ + this.direction, + this.bitWidth, + this.layoutProperties, + ], + } + return data + } + + /** + * @memberof Input + * resolve output values based on inputData + */ + resolve() { + this.output1.value = this.state + simulationArea.simulationQueue.add(this.output1) + } + + // Check if override is necessary!! + + /** + * @memberof Input + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + if (bitWidth < 1) return + const diffBitWidth = bitWidth - this.bitWidth + this.bitWidth = bitWidth // ||parseInt(prompt("Enter bitWidth"),10); + this.setWidth(this.bitWidth * 10) + this.state = 0 + this.output1.bitWidth = bitWidth + if (this.direction === 'RIGHT') { + this.x -= 10 * diffBitWidth + this.output1.x = 10 * this.bitWidth + this.output1.leftx = 10 * this.bitWidth + } else if (this.direction === 'LEFT') { + this.x += 10 * diffBitWidth + this.output1.x = -10 * this.bitWidth + this.output1.leftx = 10 * this.bitWidth + } + } + + /** + * @memberof Input + * listener function to set selected index + */ + click() { + // toggle + let pos = this.findPos() + if (pos === 0) pos = 1 // minor correction + if (pos < 1 || pos > this.bitWidth) return + this.state = ((this.state >>> 0) ^ (1 << (this.bitWidth - pos))) >>> 0 + } + + /** + * @memberof Input + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + const bin = dec2bin(this.state, this.bitWidth) + for (let k = 0; k < this.bitWidth; k++) { + fillText(ctx, bin[k], xx - 10 * this.bitWidth + 10 + k * 20, yy + 5) + } + ctx.fill() + } + + /** + * @memberof Input + * function to change direction of input + * @param {string} dir - new direction + */ + newDirection(dir) { + if (dir === this.direction) return + this.direction = dir + this.output1.refresh() + if (dir === 'RIGHT' || dir === 'LEFT') { + this.output1.leftx = 10 * this.bitWidth + this.output1.lefty = 0 + } else { + this.output1.leftx = 10 // 10*this.bitWidth; + this.output1.lefty = 0 + } + + this.output1.refresh() + this.labelDirection = oppositeDirection[this.direction] + } + + /** + * @memberof Input + * function to find position of mouse click + */ + findPos() { + return Math.round( + (simulationArea.mouseX - this.x + 10 * this.bitWidth) / 20.0 + ) + } +} + +/** + * @memberof Input + * Help Tip + * @type {string} + * @category modules + */ +Input.prototype.tooltipText = + 'Input ToolTip: Toggle the individual bits by clicking on them.' + +/** + * @memberof Input + * Help URL + * @type {string} + * @category modules + */ +Input.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/2input?id=input' + +/** + * @memberof Input + * @type {number} + * @category modules + */ +Input.prototype.propagationDelay = 0 +Input.prototype.objectType = 'Input' diff --git a/v1/src/simulator/src/modules/LSB.js b/v1/src/simulator/src/modules/LSB.js new file mode 100644 index 00000000..0f7e4e61 --- /dev/null +++ b/v1/src/simulator/src/modules/LSB.js @@ -0,0 +1,144 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode, dec2bin } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect, fillText } from '../canvasApi' +/** + * @class + * LSB + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class LSB extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['LSB'].push(this); + */ + this.leftDimensionX = 10 + this.rightDimensionX = 20 + this.setHeight(30) + this.directionFixed = true + this.bitWidth = bitWidth || parseInt(prompt('Enter bitWidth'), 10) + this.rectangleObject = false + // this.inputSize = 1 << this.bitWidth; + this.intputSize = this.bitWidth + + this.inp1 = new Node(-10, 0, 0, this, this.inputSize) + this.output1 = new Node(20, 0, 1, this, this.bitWidth) + this.enable = new Node(20, 20, 1, this, 1) + } + + /** + * @memberof LSB + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + inp1: findNode(this.inp1), + output1: findNode(this.output1), + enable: findNode(this.enable), + }, + constructorParamaters: [this.direction, this.bitWidth], + } + return data + } + + /** + * @memberof LSB + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + // this.inputSize = 1 << bitWidth + this.inputSize = bitWidth + this.inp1.bitWidth = this.inputSize + this.bitWidth = bitWidth + this.output1.bitWidth = bitWidth + } + + /** + * @memberof LSB + * resolve output values based on inputData + */ + resolve() { + const inp = dec2bin(this.inp1.value) + let out = 0 + for (let i = inp.length - 1; i >= 0; i--) { + if (inp[i] === '1') { + out = inp.length - 1 - i + break + } + } + this.output1.value = out + simulationArea.simulationQueue.add(this.output1) + if (inp != 0) { + this.enable.value = 1 + } else { + this.enable.value = 0 + } + simulationArea.simulationQueue.add(this.enable) + } + + /** + * @memberof LSB + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + rect(ctx, xx - 10, yy - 30, 30, 60) + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.fillStyle = 'black' + ctx.textAlign = 'center' + fillText(ctx, 'LSB', xx + 6, yy - 12, 10) + fillText(ctx, 'EN', xx + this.enable.x - 12, yy + this.enable.y + 3, 8) + ctx.fill() + + ctx.beginPath() + ctx.fillStyle = 'green' + ctx.textAlign = 'center' + if (this.output1.value !== undefined) { + fillText(ctx, this.output1.value, xx + 5, yy + 14, 13) + } + ctx.stroke() + ctx.fill() + } + generateVerilog() { + return `assign ${this.output1.verilogLabel} = (${this.enable.verilogLabel}!=0) ? ${this.inp1.verilogLabel}[0] : 0;` + } +} + +/** + * @memberof LSB + * Help Tip + * @type {string} + * @category modules + */ +LSB.prototype.tooltipText = + 'LSB ToolTip : The least significant bit or the low-order bit.' +LSB.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/5muxandplex?id=least-significant-bit-lsb-detector' +LSB.prototype.objectType = 'LSB' diff --git a/v1/src/simulator/src/modules/MSB.js b/v1/src/simulator/src/modules/MSB.js new file mode 100644 index 00000000..fbe14b2c --- /dev/null +++ b/v1/src/simulator/src/modules/MSB.js @@ -0,0 +1,141 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode, dec2bin } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect, fillText } from '../canvasApi' +/** + * @class + * MSB + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class MSB extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['MSB'].push(this); + */ + // this.setDimensions(20, 20); + this.leftDimensionX = 10 + this.rightDimensionX = 20 + this.setHeight(30) + this.directionFixed = true + this.bitWidth = bitWidth || parseInt(prompt('Enter bitWidth'), 10) + this.rectangleObject = false + // this.inputSize = 1 << this.bitWidth; + this.intputSize = this.bitWidth + + this.inp1 = new Node(-10, 0, 0, this, this.inputSize) + this.output1 = new Node(20, 0, 1, this, this.bitWidth) + this.enable = new Node(20, 20, 1, this, 1) + } + + /** + * @memberof MSB + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + inp1: findNode(this.inp1), + output1: findNode(this.output1), + enable: findNode(this.enable), + }, + constructorParamaters: [this.direction, this.bitWidth], + } + return data + } + + /** + * @memberof MSB + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + // this.inputSize = 1 << bitWidth + this.inputSize = bitWidth + this.inp1.bitWidth = this.inputSize + this.bitWidth = bitWidth + this.output1.bitWidth = bitWidth + } + + /** + * @memberof MSB + * resolve output values based on inputData + */ + resolve() { + const inp = this.inp1.value + this.output1.value = dec2bin(inp).length - 1 + simulationArea.simulationQueue.add(this.output1) + if (inp != 0) { + this.enable.value = 1 + } else { + this.enable.value = 0 + } + simulationArea.simulationQueue.add(this.enable) + } + + /** + * @memberof MSB + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + rect(ctx, xx - 10, yy - 30, 30, 60) + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.fillStyle = 'black' + ctx.textAlign = 'center' + fillText(ctx, 'MSB', xx + 6, yy - 12, 10) + fillText(ctx, 'EN', xx + this.enable.x - 12, yy + this.enable.y + 3, 8) + ctx.fill() + + ctx.beginPath() + ctx.fillStyle = 'green' + ctx.textAlign = 'center' + if (this.output1.value !== undefined) { + fillText(ctx, this.output1.value, xx + 5, yy + 14, 13) + } + ctx.stroke() + ctx.fill() + } + + generateVerilog() { + return `assign ${this.output1.verilogLabel} = (${ + this.enable.verilogLabel + }!=0) ? ${this.inp1.verilogLabel}[${this.inp1.bitWidth - 1}] : 0;` + } +} + +/** + * @memberof MSB + * Help Tip + * @type {string} + * @category modules + */ +MSB.prototype.tooltipText = + 'MSB ToolTip : The most significant bit or the high-order bit.' +MSB.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/5muxandplex?id=most-significant-bit-msb-detector' +MSB.prototype.objectType = 'MSB' diff --git a/v1/src/simulator/src/modules/Multiplexer.js b/v1/src/simulator/src/modules/Multiplexer.js new file mode 100644 index 00000000..638b9d01 --- /dev/null +++ b/v1/src/simulator/src/modules/Multiplexer.js @@ -0,0 +1,344 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * Multiplexer + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @param {number=} controlSignalSize - 1 by default + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Multiplexer extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 1, + controlSignalSize = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Multiplexer'].push(this); + */ + this.controlSignalSize = + controlSignalSize || + parseInt(prompt('Enter control signal bitWidth'), 10) + this.inputSize = 1 << this.controlSignalSize + this.xOff = 0 + this.yOff = 1 + if (this.controlSignalSize === 1) { + this.xOff = 10 + } + if (this.controlSignalSize <= 3) { + this.yOff = 2 + } + this.setDimensions(20 - this.xOff, this.yOff * 5 * this.inputSize) + this.rectangleObject = false + this.inp = [] + for (let i = 0; i < this.inputSize; i++) { + const a = new Node( + -20 + this.xOff, + +this.yOff * 10 * (i - this.inputSize / 2) + 10, + 0, + this + ) + this.inp.push(a) + } + this.output1 = new Node(20 - this.xOff, 0, 1, this) + this.controlSignalInput = new Node( + 0, + this.yOff * 10 * (this.inputSize / 2 - 1) + this.xOff + 10, + 0, + this, + this.controlSignalSize, + 'Control Signal' + ) + } + + /** + * @memberof Multiplexer + * function to change control signal of the element + */ + changeControlSignalSize(size) { + if (size === undefined || size < 1 || size > 32) return + if (this.controlSignalSize === size) return + const obj = new Multiplexer( + this.x, + this.y, + this.scope, + this.direction, + this.bitWidth, + size + ) + this.cleanDelete() + simulationArea.lastSelected = obj + return obj + } + + /** + * @memberof Multiplexer + * function to change bitwidth of the element + * @param {number} bitWidth - bitwidth + */ + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + for (let i = 0; i < this.inputSize; i++) { + this.inp[i].bitWidth = bitWidth + } + this.output1.bitWidth = bitWidth + } + + /** + * @memberof Multiplexer + * @type {boolean} + */ + isResolvable() { + if ( + this.controlSignalInput.value !== undefined && + this.inp[this.controlSignalInput.value].value !== undefined + ) + return true + return false + } + + /** + * @memberof Multiplexer + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.bitWidth, + this.controlSignalSize, + ], + nodes: { + inp: this.inp.map(findNode), + output1: findNode(this.output1), + controlSignalInput: findNode(this.controlSignalInput), + }, + } + return data + } + + /** + * @memberof Multiplexer + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + this.output1.value = this.inp[this.controlSignalInput.value].value + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof Multiplexer + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + + const xx = this.x + const yy = this.y + + ctx.beginPath() + moveTo( + ctx, + 0, + this.yOff * 10 * (this.inputSize / 2 - 1) + 10 + 0.5 * this.xOff, + xx, + yy, + this.direction + ) + lineTo( + ctx, + 0, + this.yOff * 5 * (this.inputSize - 1) + this.xOff, + xx, + yy, + this.direction + ) + ctx.stroke() + + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + ctx.strokeStyle = colors['stroke'] + + ctx.fillStyle = colors['fill'] + moveTo( + ctx, + -20 + this.xOff, + -this.yOff * 10 * (this.inputSize / 2), + xx, + yy, + this.direction + ) + lineTo( + ctx, + -20 + this.xOff, + 20 + this.yOff * 10 * (this.inputSize / 2 - 1), + xx, + yy, + this.direction + ) + lineTo( + ctx, + 20 - this.xOff, + +this.yOff * 10 * (this.inputSize / 2 - 1) + this.xOff, + xx, + yy, + this.direction + ) + lineTo( + ctx, + 20 - this.xOff, + -this.yOff * 10 * (this.inputSize / 2) - this.xOff + 20, + xx, + yy, + this.direction + ) + + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = colors['hover_select'] + } + ctx.fill() + ctx.stroke() + + ctx.beginPath() + // ctx.lineWidth = correctWidth(2); + ctx.fillStyle = 'black' + ctx.textAlign = 'center' + for (let i = 0; i < this.inputSize; i++) { + if (this.direction === 'RIGHT') + fillText( + ctx, + String(i), + xx + this.inp[i].x + 7, + yy + this.inp[i].y + 2, + 10 + ) + else if (this.direction === 'LEFT') + fillText( + ctx, + String(i), + xx + this.inp[i].x - 7, + yy + this.inp[i].y + 2, + 10 + ) + else if (this.direction === 'UP') + fillText( + ctx, + String(i), + xx + this.inp[i].x, + yy + this.inp[i].y - 4, + 10 + ) + else + fillText( + ctx, + String(i), + xx + this.inp[i].x, + yy + this.inp[i].y + 10, + 10 + ) + } + ctx.fill() + } + + verilogBaseType() { + return this.verilogName() + this.inp.length + } + + //this code to generate Verilog + generateVerilog() { + Multiplexer.selSizes.add(this.controlSignalSize) + return CircuitElement.prototype.generateVerilog.call(this) + } + + //generate the needed modules + static moduleVerilog() { + var output = '' + + for (var size of Multiplexer.selSizes) { + var numInput = 1 << size + var inpString = '' + for (var j = 0; j < numInput; j++) { + inpString += `in${j}, ` + } + output += `\nmodule Multiplexer${numInput}(out, ${inpString}sel);\n` + + output += ' parameter WIDTH = 1;\n' + output += ' output reg [WIDTH-1:0] out;\n' + + output += ' input [WIDTH-1:0] ' + for (var j = 0; j < numInput - 1; j++) { + output += `in${j}, ` + } + output += 'in' + (numInput - 1) + ';\n' + + output += ` input [${size - 1}:0] sel;\n` + output += ' \n' + + output += ' always @ (*)\n' + output += ' case (sel)\n' + for (var j = 0; j < numInput; j++) { + output += ` ${j} : out = in${j};\n` + } + output += ' endcase\n' + output += 'endmodule\n' + output += '\n' + } + + return output + } + //reset the sized before Verilog generation + static resetVerilog() { + Multiplexer.selSizes = new Set() + } +} + +/** + * @memberof Multiplexer + * Help Tip + * @type {string} + * @category modules + */ +Multiplexer.prototype.tooltipText = + 'Multiplexer ToolTip : Multiple inputs and a single line output.' +Multiplexer.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/5muxandplex?id=multiplexer' + +/** + * @memberof Multiplexer + * multable properties of element + * @type {JSON} + * @category modules + */ +Multiplexer.prototype.mutableProperties = { + controlSignalSize: { + name: 'Control Signal Size', + type: 'number', + max: '10', + min: '1', + func: 'changeControlSignalSize', + }, +} +Multiplexer.prototype.objectType = 'Multiplexer' diff --git a/v1/src/simulator/src/modules/NandGate.js b/v1/src/simulator/src/modules/NandGate.js new file mode 100644 index 00000000..1cf25e82 --- /dev/null +++ b/v1/src/simulator/src/modules/NandGate.js @@ -0,0 +1,169 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, drawCircle2, arc } from '../canvasApi' +import { changeInputSize } from '../modules' +import { gateGenerateVerilog } from '../utils' + +/** + * @class + * NandGate + * @extends CircuitElement + * @param {number} x - x coordinate of nand Gate. + * @param {number} y - y coordinate of nand Gate. + * @param {Scope=} scope - Cirucit on which nand gate is drawn + * @param {string=} dir - direction of nand Gate + * @param {number=} inputLength - number of input nodes + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class NandGate extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + inputLength = 2, + bitWidth = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['NandGate'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 20) + this.inp = [] + this.inputSize = inputLength + // variable inputLength , node creation + if (inputLength % 2 === 1) { + for (let i = 0; i < inputLength / 2 - 1; i++) { + const a = new Node(-10, -10 * (i + 1), 0, this) + this.inp.push(a) + } + let a = new Node(-10, 0, 0, this) + this.inp.push(a) + for (let i = inputLength / 2 + 1; i < inputLength; i++) { + a = new Node(-10, 10 * (i + 1 - inputLength / 2 - 1), 0, this) + this.inp.push(a) + } + } else { + for (let i = 0; i < inputLength / 2; i++) { + const a = new Node(-10, -10 * (i + 1), 0, this) + this.inp.push(a) + } + for (let i = inputLength / 2; i < inputLength; i++) { + const a = new Node(-10, 10 * (i + 1 - inputLength / 2), 0, this) + this.inp.push(a) + } + } + this.output1 = new Node(30, 0, 1, this) + } + + /** + * @memberof NandGate + * fn to create save Json Data of object + * @return {JSON} + */ + // fn to create save Json Data of object + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.inputSize, + this.bitWidth, + ], + nodes: { + inp: this.inp.map(findNode), + output1: findNode(this.output1), + }, + } + return data + } + + /** + * @memberof NandGate + * resolve output values based on inputData + */ + resolve() { + let result = this.inp[0].value || 0 + if (this.isResolvable() === false) { + return + } + for (let i = 1; i < this.inputSize; i++) + result &= this.inp[i].value || 0 + result = + ((~result >>> 0) << (32 - this.bitWidth)) >>> (32 - this.bitWidth) + this.output1.value = result + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof NandGate + * function to draw nand Gate + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.lineWidth = correctWidth(3) + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + const xx = this.x + const yy = this.y + moveTo(ctx, -10, -20, xx, yy, this.direction) + lineTo(ctx, 0, -20, xx, yy, this.direction) + arc(ctx, 0, 0, 20, -Math.PI / 2, Math.PI / 2, xx, yy, this.direction) + lineTo(ctx, -10, 20, xx, yy, this.direction) + lineTo(ctx, -10, -20, xx, yy, this.direction) + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + ctx.beginPath() + drawCircle2(ctx, 25, 0, 5, xx, yy, this.direction) + ctx.stroke() + } + + generateVerilog() { + return gateGenerateVerilog.call(this, '&', true) + } +} + +/** + * @memberof NandGate + * Help Tip + * @type {string} + * @category modules + */ +NandGate.prototype.tooltipText = + 'Nand Gate ToolTip : Combination of AND and NOT gates' + +/** + * @memberof NandGate + * @type {boolean} + * @category modules + */ +NandGate.prototype.alwaysResolve = true + +/** + * @memberof NandGate + * function to change input nodes of the gate + * @category modules + */ +NandGate.prototype.changeInputSize = changeInputSize + +/** + * @memberof NandGate + * @type {string} + * @category modules + */ +NandGate.prototype.verilogType = 'nand' +NandGate.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/4gates?id=nand-gate' +NandGate.prototype.objectType = 'NandGate' diff --git a/v1/src/simulator/src/modules/NorGate.js b/v1/src/simulator/src/modules/NorGate.js new file mode 100644 index 00000000..38572dd5 --- /dev/null +++ b/v1/src/simulator/src/modules/NorGate.js @@ -0,0 +1,183 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { gateGenerateVerilog } from '../utils' + +import { + correctWidth, + bezierCurveTo, + moveTo, + arc2, + drawCircle2, +} from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * NorGate + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} inputs - number of input nodes + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class NorGate extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + inputs = 2, + bitWidth = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['NorGate'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 20) + + this.inp = [] + this.inputSize = inputs + + if (inputs % 2 === 1) { + for (let i = 0; i < inputs / 2 - 1; i++) { + const a = new Node(-10, -10 * (i + 1), 0, this) + this.inp.push(a) + } + let a = new Node(-10, 0, 0, this) + this.inp.push(a) + for (let i = inputs / 2 + 1; i < inputs; i++) { + a = new Node(-10, 10 * (i + 1 - inputs / 2 - 1), 0, this) + this.inp.push(a) + } + } else { + for (let i = 0; i < inputs / 2; i++) { + const a = new Node(-10, -10 * (i + 1), 0, this) + this.inp.push(a) + } + for (let i = inputs / 2; i < inputs; i++) { + const a = new Node(-10, 10 * (i + 1 - inputs / 2), 0, this) + this.inp.push(a) + } + } + this.output1 = new Node(30, 0, 1, this) + } + + /** + * @memberof NorGate + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.inputSize, + this.bitWidth, + ], + nodes: { + inp: this.inp.map(findNode), + output1: findNode(this.output1), + }, + } + return data + } + + /** + * @memberof NorGate + * resolve output values based on inputData + */ + resolve() { + let result = this.inp[0].value || 0 + for (let i = 1; i < this.inputSize; i++) + result |= this.inp[i].value || 0 + result = + ((~result >>> 0) << (32 - this.bitWidth)) >>> (32 - this.bitWidth) + this.output1.value = result + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof NorGate + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(3) + + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.fillStyle = colors['fill'] + + moveTo(ctx, -10, -20, xx, yy, this.direction, true) + bezierCurveTo(0, -20, +15, -10, 20, 0, xx, yy, this.direction) + bezierCurveTo( + 0 + 15, + 0 + 10, + 0, + 0 + 20, + -10, + +20, + xx, + yy, + this.direction + ) + bezierCurveTo(0, 0, 0, 0, -10, -20, xx, yy, this.direction) + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + ctx.beginPath() + drawCircle2(ctx, 25, 0, 5, xx, yy, this.direction) + ctx.stroke() + // for debugging + } + + generateVerilog() { + return gateGenerateVerilog.call(this, '|', true) + } +} + +/** + * @memberof NorGate + * Help Tip + * @type {string} + * @category modules + */ +NorGate.prototype.tooltipText = + 'Nor Gate ToolTip : Combination of OR gate and NOT gate.' + +/** + * @memberof NorGate + * @type {boolean} + * @category modules + */ +NorGate.prototype.alwaysResolve = true + +/** + * @memberof SevenSegDisplay + * function to change input nodes of the element + * @category modules + */ +NorGate.prototype.changeInputSize = changeInputSize + +/** + * @memberof SevenSegDisplay + * @type {string} + * @category modules + */ +NorGate.prototype.verilogType = 'nor' +NorGate.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/4gates?id=nor-gate' +NorGate.prototype.objectType = 'NorGate' diff --git a/v1/src/simulator/src/modules/NotGate.js b/v1/src/simulator/src/modules/NotGate.js new file mode 100644 index 00000000..38ec3a05 --- /dev/null +++ b/v1/src/simulator/src/modules/NotGate.js @@ -0,0 +1,113 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, drawCircle2 } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * NotGate + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class NotGate extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['NotGate'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 15) + + this.inp1 = new Node(-10, 0, 0, this) + this.output1 = new Node(20, 0, 1, this) + } + + /** + * @memberof NotGate + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + output1: findNode(this.output1), + inp1: findNode(this.inp1), + }, + } + return data + } + + /** + * @memberof NotGate + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + this.output1.value = + ((~this.inp1.value >>> 0) << (32 - this.bitWidth)) >>> + (32 - this.bitWidth) + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof NotGate + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(3) + + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.fillStyle = colors['fill'] + moveTo(ctx, -10, -10, xx, yy, this.direction) + lineTo(ctx, 10, 0, xx, yy, this.direction) + lineTo(ctx, -10, 10, xx, yy, this.direction) + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + ctx.beginPath() + drawCircle2(ctx, 15, 0, 5, xx, yy, this.direction) + ctx.stroke() + } + + generateVerilog() { + return ( + 'assign ' + + this.output1.verilogLabel + + ' = ~' + + this.inp1.verilogLabel + + ';' + ) + } +} + +/** + * @memberof NotGate + * Help Tip + * @type {string} + * @category modules + */ +NotGate.prototype.tooltipText = + 'Not Gate Tooltip : Inverts the input digital signal.' +NotGate.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/4gates?id=not-gate' +NotGate.prototype.objectType = 'NotGate' +NotGate.prototype.verilogType = 'not' diff --git a/v1/src/simulator/src/modules/OrGate.js b/v1/src/simulator/src/modules/OrGate.js new file mode 100644 index 00000000..31b557cd --- /dev/null +++ b/v1/src/simulator/src/modules/OrGate.js @@ -0,0 +1,175 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, bezierCurveTo, moveTo, arc2 } from '../canvasApi' +import { changeInputSize } from '../modules' +import { gateGenerateVerilog } from '../utils' + +/** + * @class + * OrGate + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} inputs - number of input nodes + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class OrGate extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + inputs = 2, + bitWidth = 1 + ) { + // Calling base class constructor + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['OrGate'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 20) + // Inherit base class prototype + this.inp = [] + this.inputSize = inputs + if (inputs % 2 === 1) { + for (let i = Math.floor(inputs / 2) - 1; i >= 0; i--) { + const a = new Node(-10, -10 * (i + 1), 0, this) + this.inp.push(a) + } + let a = new Node(-10, 0, 0, this) + this.inp.push(a) + for (let i = 0; i < Math.floor(inputs / 2); i++) { + a = new Node(-10, 10 * (i + 1), 0, this) + this.inp.push(a) + } + } else { + for (let i = inputs / 2 - 1; i >= 0; i--) { + const a = new Node(-10, -10 * (i + 1), 0, this) + this.inp.push(a) + } + for (let i = 0; i < inputs / 2; i++) { + const a = new Node(-10, 10 * (i + 1), 0, this) + this.inp.push(a) + } + } + this.output1 = new Node(20, 0, 1, this) + } + + /** + * @memberof OrGate + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.inputSize, + this.bitWidth, + ], + + nodes: { + inp: this.inp.map(findNode), + output1: findNode(this.output1), + }, + } + return data + } + + /** + * @memberof OrGate + * resolve output values based on inputData + */ + resolve() { + let result = this.inp[0].value || 0 + if (this.isResolvable() === false) { + return + } + for (let i = 1; i < this.inputSize; i++) + result |= this.inp[i].value || 0 + this.output1.value = result >>> 0 + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof OrGate + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(3) + + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.fillStyle = colors['fill'] + + moveTo(ctx, -10, -20, xx, yy, this.direction, true) + bezierCurveTo(0, -20, +15, -10, 20, 0, xx, yy, this.direction) + bezierCurveTo( + 0 + 15, + 0 + 10, + 0, + 0 + 20, + -10, + +20, + xx, + yy, + this.direction + ) + bezierCurveTo(0, 0, 0, 0, -10, -20, xx, yy, this.direction) + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + } + + generateVerilog() { + return gateGenerateVerilog.call(this, '|') + } +} + +/** + * @memberof OrGate + * Help Tip + * @type {string} + * @category modules + */ +OrGate.prototype.tooltipText = + 'Or Gate Tooltip : Implements logical disjunction' + +/** + * @memberof OrGate + * function to change input nodes of the element + * @category modules + */ +OrGate.prototype.changeInputSize = changeInputSize + +/** + * @memberof SevenSegDisplay + * @type {boolean} + * @category modules + */ +OrGate.prototype.alwaysResolve = true + +/** + * @memberof SevenSegDisplay + * @type {string} + * @category modules + */ +OrGate.prototype.verilogType = 'or' +OrGate.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/4gates?id=or-gate' +OrGate.prototype.objectType = 'OrGate' diff --git a/v1/src/simulator/src/modules/Output.js b/v1/src/simulator/src/modules/Output.js new file mode 100644 index 00000000..23ef3975 --- /dev/null +++ b/v1/src/simulator/src/modules/Output.js @@ -0,0 +1,219 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, fillText, rect2, oppositeDirection } from '../canvasApi' +import { getNextPosition } from '../modules' +import { generateId } from '../utils' +import { colors } from '../themer/themer' + +function bin2dec(binString) { + return parseInt(binString, 2) +} + +function dec2bin(dec, bitWidth = undefined) { + // only for positive nos + var bin = dec.toString(2) + if (bitWidth == undefined) return bin + return '0'.repeat(bitWidth - bin.length) + bin +} + +/** + * @class + * Output + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} inputLength - number of input nodes + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +export default class Output extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'LEFT', + bitWidth = 1, + layoutProperties + ) { + // Calling base class constructor + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Output'].push(this); + */ + if (layoutProperties) { + this.layoutProperties = layoutProperties + } else { + this.layoutProperties = {} + this.layoutProperties.x = scope.layout.width + this.layoutProperties.y = getNextPosition(scope.layout.width, scope) + this.layoutProperties.id = generateId() + } + + this.rectangleObject = false + this.directionFixed = true + this.orientationFixed = false + this.setDimensions(this.bitWidth * 10, 10) + this.inp1 = new Node(this.bitWidth * 10, 0, 0, this) + } + + /** + * @memberof Output + * function to generate verilog for output + * @return {string} + */ + generateVerilog() { + return `assign ${this.label} = ${this.inp1.verilogLabel};` + } + + /** + * @memberof Output + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + inp1: findNode(this.inp1), + }, + constructorParamaters: [ + this.direction, + this.bitWidth, + this.layoutProperties, + ], + } + return data + } + + /** + * @memberof Output + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + if (bitWidth < 1) return + const diffBitWidth = bitWidth - this.bitWidth + this.state = undefined + this.inp1.bitWidth = bitWidth + this.bitWidth = bitWidth + this.setWidth(10 * this.bitWidth) + + if (this.direction === 'RIGHT') { + this.x -= 10 * diffBitWidth + this.inp1.x = 10 * this.bitWidth + this.inp1.leftx = 10 * this.bitWidth + } else if (this.direction === 'LEFT') { + this.x += 10 * diffBitWidth + this.inp1.x = -10 * this.bitWidth + this.inp1.leftx = 10 * this.bitWidth + } + } + + /** + * @memberof Output + * function to draw element + */ + customDraw() { + this.state = this.inp1.value + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = [colors['out_rect'], colors['stroke_alt']][ + +(this.inp1.value === undefined) + ] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + + rect2( + ctx, + -10 * this.bitWidth, + -10, + 20 * this.bitWidth, + 20, + xx, + yy, + 'RIGHT' + ) + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = colors['hover_select'] + } + + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.font = '20px Raleway' + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + let bin + if (this.state === undefined) { + bin = 'x'.repeat(this.bitWidth) + } else { + bin = dec2bin(this.state, this.bitWidth) + } + + for (let k = 0; k < this.bitWidth; k++) { + fillText(ctx, bin[k], xx - 10 * this.bitWidth + 10 + k * 20, yy + 5) + } + ctx.fill() + } + + /** + * @memberof Output + * function to change direction of Output + * @param {string} dir - new direction + */ + newDirection(dir) { + if (dir === this.direction) return + this.direction = dir + this.inp1.refresh() + if (dir === 'RIGHT' || dir === 'LEFT') { + this.inp1.leftx = 10 * this.bitWidth + this.inp1.lefty = 0 + } else { + this.inp1.leftx = 10 // 10*this.bitWidth; + this.inp1.lefty = 0 + } + + this.inp1.refresh() + this.labelDirection = oppositeDirection[this.direction] + } + + generateVerilog() { + return ( + 'assign ' + this.verilogLabel + ' = ' + this.inp1.verilogLabel + ';' + ) + } +} + +/** + * @memberof Output + * Help Tip + * @type {string} + * @category modules + */ +Output.prototype.tooltipText = + 'Output ToolTip: Simple output element showing output in binary.' + +/** + * @memberof Output + * Help URL + * @type {string} + * @category modules + */ +Output.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/3output?id=output' + +/** + * @memberof Output + * @type {number} + * @category modules + */ +Output.prototype.propagationDelay = 0 +Output.prototype.objectType = 'Output' diff --git a/v1/src/simulator/src/modules/Power.js b/v1/src/simulator/src/modules/Power.js new file mode 100644 index 00000000..87c419a5 --- /dev/null +++ b/v1/src/simulator/src/modules/Power.js @@ -0,0 +1,146 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, arc } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * Power + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Power extends CircuitElement { + constructor(x, y, scope = globalScope, bitWidth = 1) { + super(x, y, scope, 'RIGHT', bitWidth) + /* this is done in this.baseSetup() now + this.scope['Power'].push(this); + */ + this.directionFixed = true + this.rectangleObject = false + this.setDimensions(10, 10) + this.output1 = new Node(0, 10, 1, this) + } + + /** + * @memberof Power + * resolve output values based on inputData + */ + resolve() { + this.output1.value = ~0 >>> (32 - this.bitWidth) + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof Power + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + output1: findNode(this.output1), + }, + constructorParamaters: [this.bitWidth], + } + return data + } + + /** + * @memberof Power + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.strokeStyle = 'rgba(0,0,0,1)' + ctx.lineWidth = correctWidth(3) + ctx.fillStyle = colors['fill'] + moveTo(ctx, 0, -10, xx, yy, this.direction) + lineTo(ctx, -10, 0, xx, yy, this.direction) + lineTo(ctx, 10, 0, xx, yy, this.direction) + lineTo(ctx, 0, -10, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + moveTo(ctx, 0, 0, xx, yy, this.direction) + lineTo(ctx, 0, 10, xx, yy, this.direction) + ctx.stroke() + } + + generateVerilog() { + return `assign ${this.output1.verilogLabel} = ~${this.bitWidth}'b0;` + } +} + +/** + * @memberof Power + * Help Tip + * @type {string} + * @category modules + */ +Power.prototype.tooltipText = 'Power: All bits are High(1).' + +/** + * @memberof Power + * Help URL + * @type {string} + * @category modules + */ +Power.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/2input?id=power' + +/** + * @memberof Power + * @type {number} + * @category modules + */ +Power.prototype.propagationDelay = 0 + +function getNextPosition(x = 0, scope = globalScope) { + let possibleY = 20 + const done = {} + for (let i = 0; i < scope.Input.length; i++) { + if (scope.Input[i].layoutProperties.x === x) { + done[scope.Input[i].layoutProperties.y] = 1 + } + } + for (let i = 0; i < scope.Output.length; i++) { + if (scope.Output[i].layoutProperties.x === x) { + done[scope.Output[i].layoutProperties.y] = 1 + } + } + while (done[possibleY] || done[possibleY + 10] || done[possibleY - 10]) { + possibleY += 10 + } + const height = possibleY + 20 + if (height > scope.layout.height) { + const oldHeight = scope.layout.height + scope.layout.height = height + for (let i = 0; i < scope.Input.length; i++) { + if (scope.Input[i].layoutProperties.y === oldHeight) { + scope.Input[i].layoutProperties.y = scope.layout.height + } + } + for (let i = 0; i < scope.Output.length; i++) { + if (scope.Output[i].layoutProperties.y === oldHeight) { + scope.Output[i].layoutProperties.y = scope.layout.height + } + } + } + return possibleY +} +Power.prototype.objectType = 'Power' diff --git a/v1/src/simulator/src/modules/PriorityEncoder.js b/v1/src/simulator/src/modules/PriorityEncoder.js new file mode 100644 index 00000000..b74d7f90 --- /dev/null +++ b/v1/src/simulator/src/modules/PriorityEncoder.js @@ -0,0 +1,276 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode, dec2bin } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect, fillText } from '../canvasApi' +/** + * @class + * PriorityEncoder + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class PriorityEncoder extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['PriorityEncoder'].push(this); + */ + this.bitWidth = bitWidth || parseInt(prompt('Enter bitWidth'), 10) + this.inputSize = 1 << this.bitWidth + + this.yOff = 1 + if (this.bitWidth <= 3) { + this.yOff = 2 + } + + this.setDimensions(20, this.yOff * 5 * this.inputSize) + this.directionFixed = true + this.rectangleObject = false + + this.inp1 = [] + for (let i = 0; i < this.inputSize; i++) { + const a = new Node( + -10, + +this.yOff * 10 * (i - this.inputSize / 2) + 10, + 0, + this, + 1 + ) + this.inp1.push(a) + } + + this.output1 = [] + for (let i = 0; i < this.bitWidth; i++) { + const a = new Node( + 30, + +2 * 10 * (i - this.bitWidth / 2) + 10, + 1, + this, + 1 + ) + this.output1.push(a) + } + + this.enable = new Node( + 10, + 20 + this.inp1[this.inputSize - 1].y, + 1, + this, + 1 + ) + } + + /** + * @memberof PriorityEncoder + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + inp1: this.inp1.map(findNode), + output1: this.output1.map(findNode), + enable: findNode(this.enable), + }, + constructorParamaters: [this.direction, this.bitWidth], + } + return data + } + + /** + * @memberof PriorityEncoder + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + if (bitWidth === undefined || bitWidth < 1 || bitWidth > 32) return + if (this.bitWidth === bitWidth) return + + this.bitWidth = bitWidth + const obj = new PriorityEncoder( + this.x, + this.y, + this.scope, + this.direction, + this.bitWidth + ) + this.inputSize = 1 << bitWidth + + this.cleanDelete() + simulationArea.lastSelected = obj + return obj + } + + /** + * @memberof PriorityEncoder + * resolve output values based on inputData + */ + resolve() { + let out = 0 + let temp = 0 + for (let i = this.inputSize - 1; i >= 0; i--) { + if (this.inp1[i].value === 1) { + out = dec2bin(i) + break + } + } + temp = out + + if (out.length !== undefined) { + this.enable.value = 1 + } else { + this.enable.value = 0 + } + simulationArea.simulationQueue.add(this.enable) + + if (temp.length === undefined) { + temp = '0' + for (let i = 0; i < this.bitWidth - 1; i++) { + temp = `0${temp}` + } + } + + if (temp.length !== this.bitWidth) { + for (let i = temp.length; i < this.bitWidth; i++) { + temp = `0${temp}` + } + } + + for (let i = this.bitWidth - 1; i >= 0; i--) { + this.output1[this.bitWidth - 1 - i].value = Number(temp[i]) + simulationArea.simulationQueue.add( + this.output1[this.bitWidth - 1 - i] + ) + } + } + + /** + * @memberof PriorityEncoder + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + if (this.bitWidth <= 3) { + rect( + ctx, + xx - 10, + yy - 10 - this.yOff * 5 * this.inputSize, + 40, + 20 * (this.inputSize + 1) + ) + } else { + rect( + ctx, + xx - 10, + yy - 10 - this.yOff * 5 * this.inputSize, + 40, + 10 * (this.inputSize + 3) + ) + } + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.fillStyle = 'black' + ctx.textAlign = 'center' + for (let i = 0; i < this.inputSize; i++) { + fillText(ctx, String(i), xx, yy + this.inp1[i].y + 2, 10) + } + for (let i = 0; i < this.bitWidth; i++) { + fillText( + ctx, + String(i), + xx + this.output1[0].x - 10, + yy + this.output1[i].y + 2, + 10 + ) + } + fillText(ctx, 'EN', xx + this.enable.x, yy + this.enable.y - 5, 10) + ctx.fill() + } + + verilogBaseType() { + return this.verilogName() + this.inp1.length + } + + generateVerilog() { + PriorityEncoder.selSizes.add(this.bitWidth) + return CircuitElement.prototype.generateVerilog.call(this) + } + + static moduleVerilog() { + var output = '' + + for (var size of PriorityEncoder.selSizes) { + var numInput = 1 << size + output += '\n' + output += 'module PriorityEncoder' + numInput + output += '(sel, ze, ' + for (var j = 0; j < numInput - 1; j++) { + output += 'in' + j + ', ' + } + output += 'in' + (numInput - 1) + ');\n' + + output += ' output reg [' + (size - 1) + ':0] sel;\n' + output += ' output reg ze;\n' + + output += ' input ' + for (var j = 0; j < numInput - 1; j++) { + output += 'in' + j + ', ' + } + output += 'in' + (numInput - 1) + ';\n' + output += '\n' + + output += ' always @ (*) begin\n' + output += ' sel = 0;\n' + output += ' ze = 0;\n' + output += ' if (in' + (numInput - 1) + ')\n' + output += ' sel = ' + (numInput - 1) + ';\n' + for (var j = numInput - 2; j <= 0; j++) { + output += ' else if (in' + j + ')\n' + output += ' sel = ' + j + ';\n' + } + output += ' else\n' + output += ' ze = 1;\n' + output += ' end\n' + output += 'endmodule\n' + } + + return output + } + + //reset the sized before Verilog generation + static resetVerilog() { + PriorityEncoder.selSizes = new Set() + } +} + +/** + * @memberof PriorityEncoder + * Help Tip + * @type {string} + * @category modules + */ +PriorityEncoder.prototype.tooltipText = + 'Priority Encoder ToolTip : Compresses binary inputs into a smaller number of outputs.' +PriorityEncoder.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/5muxandplex?id=priority-encoder' +PriorityEncoder.prototype.objectType = 'PriorityEncoder' diff --git a/v1/src/simulator/src/modules/RGBLed.js b/v1/src/simulator/src/modules/RGBLed.js new file mode 100644 index 00000000..a1bcc659 --- /dev/null +++ b/v1/src/simulator/src/modules/RGBLed.js @@ -0,0 +1,177 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, arc, drawCircle2 } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * RGBLed + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @category modules + */ +import { colors } from '../themer/themer' + +export default class RGBLed extends CircuitElement { + constructor(x, y, scope = globalScope) { + // Calling base class constructor + super(x, y, scope, 'UP', 8) + /* this is done in this.baseSetup() now + this.scope['RGBLed'].push(this); + */ + this.rectangleObject = false + this.inp = [] + this.setDimensions(10, 10) + this.inp1 = new Node(-40, -10, 0, this, 8) + this.inp2 = new Node(-40, 0, 0, this, 8) + this.inp3 = new Node(-40, 10, 0, this, 8) + this.inp.push(this.inp1) + this.inp.push(this.inp2) + this.inp.push(this.inp3) + this.directionFixed = true + this.fixedBitWidth = true + } + + /** + * @memberof RGBLed + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + nodes: { + inp1: findNode(this.inp1), + inp2: findNode(this.inp2), + inp3: findNode(this.inp3), + }, + } + return data + } + + /** + * @memberof RGBLed + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + + const xx = this.x + const yy = this.y + + ctx.strokeStyle = 'green' + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + moveTo(ctx, -20, 0, xx, yy, this.direction) + lineTo(ctx, -40, 0, xx, yy, this.direction) + ctx.stroke() + + ctx.strokeStyle = 'red' + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + moveTo(ctx, -20, -10, xx, yy, this.direction) + lineTo(ctx, -40, -10, xx, yy, this.direction) + ctx.stroke() + + ctx.strokeStyle = 'blue' + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + moveTo(ctx, -20, 10, xx, yy, this.direction) + lineTo(ctx, -40, 10, xx, yy, this.direction) + ctx.stroke() + + const a = this.inp1.value + const b = this.inp2.value + const c = this.inp3.value + ctx.strokeStyle = '#d3d4d5' + ctx.fillStyle = [ + `rgba(${a}, ${b}, ${c}, 0.8)`, + 'rgba(227, 228, 229, 0.8)', + ][(a === undefined || b === undefined || c === undefined) + 0] + // ctx.fillStyle = ["rgba(200, 200, 200, 0.3)","rgba(227, 228, 229, 0.8)"][((a === undefined || b === undefined || c === undefined) || (a === 0 && b === 0 && c === 0)) + 0]; + ctx.lineWidth = correctWidth(1) + + ctx.beginPath() + + moveTo(ctx, -18, -11, xx, yy, this.direction) + lineTo(ctx, 0, -11, xx, yy, this.direction) + arc(ctx, 0, 0, 11, -Math.PI / 2, Math.PI / 2, xx, yy, this.direction) + lineTo(ctx, -18, 11, xx, yy, this.direction) + lineTo(ctx, -21, 15, xx, yy, this.direction) + arc( + ctx, + 0, + 0, + Math.sqrt(666), + Math.PI / 2 + Math.acos(15 / Math.sqrt(666)), + -Math.PI / 2 - Math.asin(21 / Math.sqrt(666)), + xx, + yy, + this.direction + ) + lineTo(ctx, -18, -11, xx, yy, this.direction) + ctx.stroke() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + } + + // Draws the element in the subcuircuit. Used in layout mode + subcircuitDraw(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + + var xx = this.subcircuitMetadata.x + xOffset + var yy = this.subcircuitMetadata.y + yOffset + var dimensionSize = 6 + + var a = this.inp1.value + var b = this.inp2.value + var c = this.inp3.value + ctx.strokeStyle = '#090a0a' + ctx.fillStyle = [ + 'rgba(' + a + ', ' + b + ', ' + c + ', 0.8)', + 'rgba(227, 228, 229, 0.8)', + ][(a === undefined || b === undefined || c === undefined) + 0] + ctx.lineWidth = correctWidth(1) + + ctx.beginPath() + drawCircle2(ctx, 0, 0, dimensionSize, xx, yy, this.direction) + ctx.stroke() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected == this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = 'rgba(255, 255, 32,0.8)' + ctx.fill() + } + generateVerilog() { + return ` + always @ (*) + $display("RGBLed:{${this.inp1.verilogLabel},${this.inp2.verilogLabel},${this.inp3.verilogLabel}} = {%d,%d,%d}", ${this.inp1.verilogLabel}, ${this.inp2.verilogLabel}, ${this.inp3.verilogLabel});` + } +} + +/** + * @memberof RGBLed + * Help Tip + * @type {string} + * @category modules + */ +RGBLed.prototype.tooltipText = + 'RGB Led ToolTip: RGB Led inputs 8 bit values for the colors RED, GREEN and BLUE.' + +/** + * @memberof RGBLed + * Help URL + * @type {string} + * @category modules + */ +RGBLed.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/3output?id=rgbled' +RGBLed.prototype.objectType = 'RGBLed' +RGBLed.prototype.canShowInSubcircuit = true diff --git a/v1/src/simulator/src/modules/RGBLedMatrix.js b/v1/src/simulator/src/modules/RGBLedMatrix.js new file mode 100644 index 00000000..00fe1757 --- /dev/null +++ b/v1/src/simulator/src/modules/RGBLedMatrix.js @@ -0,0 +1,383 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect2, rotate, lineTo, moveTo } from '../canvasApi' + +/** + * @class + * RGBLedMatrix + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {number=} rows - number of rows + * @param {number=} cols - number of columns. + * @category modules + */ +export default class RGBLedMatrix extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + { + rows = 8, + columns = 8, + ledSize = 2, + showGrid = true, + colors = [], + } = {} + ) { + super(x, y, scope, 'RIGHT', 8) + /* this is done in this.baseSetup() now + this.scope['RGBLedMatrix'].push(this); + */ + this.fixedBitWidth = true + this.directionFixed = true + this.rectangleObject = true + this.alwaysResolve = true + this.labelDirection = 'UP' + this.leftDimensionX = 0 + this.upDimensionY = 0 + + // These pins provide bulk-editing of the colors + this.rowEnableNodes = [] // 1-bit pin for each row, on the left side. + this.columnEnableNodes = [] // 1-bit pin for each column, on the bottom. + this.columnColorNodes = [] // 24-bit pin for each column, on the top. + + // These pins provide single-pixel editing; these are on the right side. + this.colorNode = new Node(0, -10, NODE_INPUT, this, 24, 'COLOR') + this.rowNode = new Node(0, 0, NODE_INPUT, this, 1, 'ROW') + this.columnNode = new Node(0, 10, NODE_INPUT, this, 1, 'COLUMN') + + this.colors = colors + this.showGrid = showGrid + this.changeSize(rows, columns, ledSize, false) + } + + toggleGrid() { + this.showGrid = !this.showGrid + } + + changeRows(rows) { + this.changeSize(rows, this.columns, this.ledSize, true) + } + + changeColumns(columns) { + this.changeSize(this.rows, columns, this.ledSize, true) + } + + changeLedSize(ledSize) { + this.changeSize(this.rows, this.columns, ledSize, true) + } + + changeSize(rows, columns, ledSize, move) { + rows = parseInt(rows, 10) + if (isNaN(rows) || rows < 0 || rows > this.maxRows) return + + columns = parseInt(columns, 10) + if (isNaN(columns) || columns < 0 || columns > this.maxColumns) return + + ledSize = parseInt(ledSize, 10) + if (isNaN(ledSize) || ledSize < 0 || ledSize > this.maxLedSize) return + + // The size of an individual LED, in canvas units. + var ledWidth = 10 * ledSize + var ledHeight = 10 * ledSize + + // The size of the LED matrix, in canvas units. + var gridWidth = ledWidth * columns + var gridHeight = ledHeight * rows + + // We need to position the element in the 10x10 grid. + // Depending on the size of the leds we need to add different paddings so position correctly. + var padding = ledSize % 2 ? 5 : 10 + + // The dimensions of the element, in canvas units. + var halfWidth = gridWidth / 2 + padding + var halfHeight = gridHeight / 2 + padding + + // Move the element in order to keep the position of the nodes stable so wires don't break. + if (move) { + this.x -= this.leftDimensionX - halfWidth + this.y -= this.upDimensionY - halfHeight + } + + // Update the dimensions of the element. + this.setDimensions(halfWidth, halfHeight) + + // Offset of the nodes in relation to the element's center. + var nodePadding = [10, 20, 20][ledSize - 1] + var nodeOffsetX = nodePadding - halfWidth + var nodeOffsetY = nodePadding - halfHeight + + // When the led size changes it is better to delete all nodes to break connected the wires. + // Otherwise, wires can end up connected in unexpected ways. + var resetAllNodes = ledSize != this.ledSize + + // Delete unused row-enable nodes, reposition remaining nodes and add new nodes. + this.rowEnableNodes + .splice(resetAllNodes ? 0 : rows) + .forEach((node) => node.delete()) + this.rowEnableNodes.forEach((node, i) => { + node.x = node.leftx = -halfWidth + node.y = node.lefty = i * ledHeight + nodeOffsetY + }) + while (this.rowEnableNodes.length < rows) { + this.rowEnableNodes.push( + new Node( + -halfWidth, + this.rowEnableNodes.length * ledHeight + nodeOffsetY, + NODE_INPUT, + this, + 1, + 'R' + this.rowEnableNodes.length + ) + ) + } + + // Delete unused column-enable nodes, reposition remaining nodes and add new nodes. + this.columnEnableNodes + .splice(resetAllNodes ? 0 : columns) + .forEach((node) => node.delete()) + this.columnEnableNodes.forEach((node, i) => { + node.x = node.leftx = i * ledWidth + nodeOffsetX + node.y = node.lefty = halfHeight + }) + while (this.columnEnableNodes.length < columns) { + this.columnEnableNodes.push( + new Node( + this.columnEnableNodes.length * ledWidth + nodeOffsetX, + halfHeight, + NODE_INPUT, + this, + 1, + 'C' + this.columnEnableNodes.length + ) + ) + } + + // Delete unused column color nodes, reposition remaining nodes and add new nodes. + this.columnColorNodes + .splice(resetAllNodes ? 0 : columns) + .forEach((node) => node.delete()) + this.columnColorNodes.forEach((node, i) => { + node.x = node.leftx = i * ledWidth + nodeOffsetX + node.y = node.lefty = -halfHeight + }) + while (this.columnColorNodes.length < columns) { + this.columnColorNodes.push( + new Node( + this.columnColorNodes.length * ledWidth + nodeOffsetX, + -halfHeight, + NODE_INPUT, + this, + 24, + 'CLR' + this.columnColorNodes.length + ) + ) + } + + // Delete unused color storage and add storage for new rows. + this.colors.splice(rows) + this.colors.forEach((c) => c.splice(columns)) + while (this.colors.length < rows) { + this.colors.push([]) + } + + // Reposition the single-pixel nodes + this.rowNode.bitWidth = Math.ceil(Math.log2(rows)) + this.rowNode.label = 'ROW (' + this.rowNode.bitWidth + ' bits)' + this.columnNode.bitWidth = Math.ceil(Math.log2(columns)) + this.columnNode.label = 'COLUMN (' + this.columnNode.bitWidth + ' bits)' + var singlePixelNodePadding = rows > 1 ? nodeOffsetY : nodeOffsetY - 10 + var singlePixelNodeDistance = rows <= 2 ? 10 : ledHeight + ;[this.colorNode, this.rowNode, this.columnNode].forEach((node, i) => { + node.x = node.leftx = halfWidth + node.y = node.lefty = + i * singlePixelNodeDistance + singlePixelNodePadding + }) + + // Store the new values + this.rows = rows + this.columns = columns + this.ledSize = ledSize + + return this + } + + customSave() { + // Save the size of the LED matrix. + // Unlike a read LED matrix, we also persist the color of each pixel. + // This allows circuit preview to show the colors at the time the simulation was saved. + return { + constructorParamaters: [ + { + rows: this.rows, + columns: this.columns, + ledSize: this.ledSize, + showGrid: this.showGrid, + colors: this.colors, + }, + ], + nodes: { + rowEnableNodes: this.rowEnableNodes.map(findNode), + columnEnableNodes: this.columnEnableNodes.map(findNode), + columnColorNodes: this.columnColorNodes.map(findNode), + colorNode: findNode(this.colorNode), + rowNode: findNode(this.rowNode), + columnNode: findNode(this.columnNode), + }, + } + } + + resolve() { + var colorValue = this.colorNode.value + var hasColorValue = colorValue != undefined + + var rows = this.rows + var columns = this.columns + var rowEnableNodes = this.rowEnableNodes + var columnEnableNodes = this.columnEnableNodes + var columnColorNodes = this.columnColorNodes + var colors = this.colors + + for (var row = 0; row < rows; row++) { + if (rowEnableNodes[row].value === 1) { + for (var column = 0; column < columns; column++) { + // Method 1: set pixel by rowEnable + columnColor pins + var columnColor = columnColorNodes[column].value + if (columnColor !== undefined) { + colors[row][column] = columnColor + } + + // Method 2: set pixel by rowEnable + columnEnable + color pins + if ( + hasColorValue && + columnEnableNodes[column].value === 1 + ) { + colors[row][column] = colorValue + } + } + } + } + + // Method 3: set pixel by write + pixel index + color pins. + var hasRowNodeValue = this.rowNode.value != undefined || rows == 1 + var hasColumnNodeValue = + this.columnNode.value != undefined || columns == 1 + if (hasColorValue && hasRowNodeValue && hasColumnNodeValue) { + var rowNodeValue = this.rowNode.value || 0 + var columnNodeValue = this.columnNode.value || 0 + if (rowNodeValue < rows && columnNodeValue < columns) { + colors[rowNodeValue][columnNodeValue] = colorValue + } + } + } + + customDraw() { + var ctx = simulationArea.context + var rows = this.rows + var columns = this.columns + var colors = this.colors + var xx = this.x + var yy = this.y + var dir = this.direction + var ledWidth = 10 * this.ledSize + var ledHeight = 10 * this.ledSize + var top = this.rowEnableNodes[0].y - ledHeight / 2 + var left = this.columnColorNodes[0].x - ledWidth / 2 + var width = this.columns * ledWidth + var height = this.rows * ledHeight + var bottom = top + height + var right = left + width + + var [w, h] = rotate( + ledWidth * globalScope.scale, + ledHeight * globalScope.scale, + dir + ) + var xoffset = Math.round(globalScope.ox + xx * globalScope.scale) + var yoffset = Math.round(globalScope.oy + yy * globalScope.scale) + for (var row = 0; row < rows; row++) { + for (var column = 0; column < columns; column++) { + var color = colors[row][column] || 0 + ctx.beginPath() + ctx.fillStyle = + 'rgb(' + + ((color & 0xff0000) >> 16) + + ',' + + ((color & 0xff00) >> 8) + + ',' + + (color & 0xff) + + ')' + let x1, y1 + ;[x1, y1] = rotate( + left + column * ledWidth, + top + row * ledHeight, + dir + ) + x1 = x1 * globalScope.scale + y1 = y1 * globalScope.scale + ctx.rect(xoffset + x1, yoffset + y1, w, h) + ctx.fill() + } + } + + if (this.showGrid) { + ctx.beginPath() + ctx.strokeStyle = '#323232' + ctx.lineWidth = correctWidth(1) + rect2(ctx, left, top, width, height, xx, yy, dir) + for (var x = left + ledWidth; x < right; x += ledWidth) { + moveTo(ctx, x, top, xx, yy, dir) + lineTo(ctx, x, bottom, xx, yy, dir) + } + for (var y = top + ledHeight; y < bottom; y += ledHeight) { + moveTo(ctx, left, y, xx, yy, dir) + lineTo(ctx, right, y, xx, yy, dir) + } + ctx.stroke() + } + } +} + +RGBLedMatrix.prototype.tooltipText = 'RGB Led Matrix' + +// Limit the size of the matrix otherwise the simulation starts to lag. +RGBLedMatrix.prototype.maxRows = 128 +RGBLedMatrix.prototype.maxColumns = 128 + +// Let the user choose between 3 sizes of LEDs: small, medium and large. +RGBLedMatrix.prototype.maxLedSize = 3 + +RGBLedMatrix.prototype.mutableProperties = { + rows: { + name: 'Rows', + type: 'number', + max: RGBLedMatrix.prototype.maxRows, + min: 1, + func: 'changeRows', + }, + columns: { + name: 'Columns', + type: 'number', + max: RGBLedMatrix.prototype.maxColumns, + min: 1, + func: 'changeColumns', + }, + ledSize: { + name: 'LED Size', + type: 'number', + max: RGBLedMatrix.prototype.maxLedSize, + min: 1, + func: 'changeLedSize', + }, + showGrid: { + name: 'Toggle Grid', + type: 'button', + max: RGBLedMatrix.prototype.maxLedSize, + min: 1, + func: 'toggleGrid', + }, +} +RGBLedMatrix.prototype.objectType = 'RGBLedMatrix' diff --git a/v1/src/simulator/src/modules/Random.js b/v1/src/simulator/src/modules/Random.js new file mode 100644 index 00000000..01c9427b --- /dev/null +++ b/v1/src/simulator/src/modules/Random.js @@ -0,0 +1,172 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { fillText, lineTo, moveTo, correctWidth, rect2 } from '../canvasApi' +/** + * @class + * Random + * Random is used to generate random value. + * It has 2 input node: + * clock and max random output value + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Random extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Random'].push(this); + */ + this.directionFixed = true + this.setDimensions(20, 20) + this.rectangleObject = true + this.currentRandomNo = 0 + this.clockInp = new Node(-20, +10, 0, this, 1, 'Clock') + this.maxValue = new Node(-20, -10, 0, this, this.bitWidth, 'MaxValue') + this.output = new Node(20, -10, 1, this, this.bitWidth, 'RandomValue') + this.prevClockState = 0 + this.wasClicked = false + } + + /** + * @memberof Random + * return true if clock is connected and if maxValue is set or unconnected. + */ + isResolvable() { + if ( + this.clockInp.value != undefined && + (this.maxValue.value != undefined || + this.maxValue.connections.length == 0) + ) { + return true + } + return false + } + + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.maxValue.bitWidth = bitWidth + this.output.bitWidth = bitWidth + } + + /** + * @memberof Random + * Edge triggered when the clock state changes a + * Random number is generated less then the maxValue. + */ + resolve() { + var maxValue = this.maxValue.connections.length + ? this.maxValue.value + 1 + : 2 << (this.bitWidth - 1) + if (this.clockInp.value != undefined) { + if (this.clockInp.value != this.prevClockState) { + if (this.clockInp.value == 1) { + this.currentRandomNo = Math.floor(Math.random() * maxValue) + } + this.prevClockState = this.clockInp.value + } + } + if (this.output.value != this.currentRandomNo) { + this.output.value = this.currentRandomNo + simulationArea.simulationQueue.add(this.output) + } + } + + customSave() { + var data = { + nodes: { + clockInp: findNode(this.clockInp), + maxValue: findNode(this.maxValue), + output: findNode(this.output), + }, + constructorParamaters: [this.direction, this.bitWidth], + } + return data + } + + customDraw() { + var ctx = simulationArea.context + // + ctx.fillStyle = colors['fill'] + ctx.strokeStyle = colors['stroke'] + ctx.beginPath() + var xx = this.x + var yy = this.y + ctx.font = '20px Raleway' + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + fillText(ctx, this.currentRandomNo.toString(10), this.x, this.y + 5) + ctx.fill() + ctx.beginPath() + moveTo(ctx, -20, 5, xx, yy, this.direction) + lineTo(ctx, -15, 10, xx, yy, this.direction) + lineTo(ctx, -20, 15, xx, yy, this.direction) + ctx.stroke() + } + + // Draws the element in the subcircuit. Used in layout mode + subcircuitDraw(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + var xx = this.subcircuitMetadata.x + xOffset + var yy = this.subcircuitMetadata.y + yOffset + + ctx.beginPath() + ctx.font = '20px Raleway' + ctx.fillStyle = 'green' + ctx.textAlign = 'center' + fillText(ctx, this.currentRandomNo.toString(16), xx + 10, yy + 17) + ctx.fill() + + ctx.beginPath() + ctx.lineWidth = correctWidth(1) + rect2(ctx, 0, 0, 20, 20, xx, yy, this.direction) + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected == this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = 'rgba(255, 255, 32,0.6)' + ctx.fill() + } + } + + static moduleVerilog() { + return ` + module Random(val, clk, max); + parameter WIDTH = 1; + output reg [WIDTH-1:0] val; + input clk; + input [WIDTH-1:0] max; + + always @ (posedge clk) + if (^max === 1'bX) + val = $urandom_range(0, {WIDTH{1'b1}}); + else + val = $urandom_range(0, max); + endmodule + ` + } +} + +Random.prototype.tooltipText = 'Random ToolTip : Random Selected.' + +Random.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/2input?id=random' + +Random.prototype.objectType = 'Random' + +Random.prototype.canShowInSubcircuit = true +Random.prototype.layoutProperties = { + rightDimensionX: 20, + leftDimensionX: 0, + upDimensionY: 0, + downDimensionY: 20, +} diff --git a/v1/src/simulator/src/modules/Rectangle.js b/v1/src/simulator/src/modules/Rectangle.js new file mode 100644 index 00000000..09bf240f --- /dev/null +++ b/v1/src/simulator/src/modules/Rectangle.js @@ -0,0 +1,159 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect } from '../canvasApi' +/** + * @class + * Rectangle + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {number=} rows - number of rows + * @param {number=} cols - number of columns. + * @category modules + */ +export default class Rectangle extends CircuitElement { + constructor(x, y, scope = globalScope, rows = 15, cols = 20) { + super(x, y, scope, 'RIGHT', 1) + /* this is done in this.baseSetup() now + this.scope['Rectangle'].push(this); + */ + this.directionFixed = true + this.fixedBitWidth = true + this.rectangleObject = false + this.cols = cols || parseInt(prompt('Enter cols:'), 10) + this.rows = rows || parseInt(prompt('Enter rows:'), 10) + this.setSize() + } + + /** + * @memberof Rectangle + * @param {number} size - new size of rows + */ + changeRowSize(size) { + if (size === undefined || size < 5 || size > 1000) return + if (this.rows === size) return + this.rows = parseInt(size, 10) + this.setSize() + return this + } + + /** + * @memberof Rectangle + * @param {number} size - new size of columns + */ + changeColSize(size) { + if (size === undefined || size < 5 || size > 1000) return + if (this.cols === size) return + this.cols = parseInt(size, 10) + this.setSize() + return this + } + + /** + * @memberof Rectangle + * listener function to change direction of rectangle + * @param {string} dir - new direction + */ + keyDown3(dir) { + if (dir === 'ArrowRight') { + this.changeColSize(this.cols + 2) + } + if (dir === 'ArrowLeft') { + this.changeColSize(this.cols - 2) + } + if (dir === 'ArrowDown') { + this.changeRowSize(this.rows + 2) + } + if (dir === 'ArrowUp') { + this.changeRowSize(this.rows - 2) + } + } + + /** + * @memberof Rectangle + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.rows, this.cols], + } + return data + } + + /** + * @memberof Rectangle + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = 'rgba(0,0,0,1)' + ctx.setLineDash([5 * globalScope.scale, 5 * globalScope.scale]) + ctx.lineWidth = correctWidth(1.5) + const xx = this.x + const yy = this.y + rect(ctx, xx, yy, this.elementWidth, this.elementHeight) + ctx.stroke() + + if ( + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = 'rgba(255, 255, 32,0.1)' + ctx.fill() + } + ctx.setLineDash([]) + } + + /** + * @memberof Rectangle + * function to reset or (internally) set size + */ + setSize() { + this.elementWidth = this.cols * 10 + this.elementHeight = this.rows * 10 + this.upDimensionY = 0 + this.leftDimensionX = 0 + this.rightDimensionX = this.elementWidth + this.downDimensionY = this.elementHeight + } +} + +/** + * @memberof Rectangle + * Help Tip + * @type {string} + * @category modules + */ +Rectangle.prototype.tooltipText = + 'Rectangle ToolTip : Used to Box the Circuit or area you want to highlight.' +Rectangle.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/7annotation?id=rectangle' +Rectangle.prototype.propagationDelayFixed = true + +/** + * @memberof Rectangle + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +Rectangle.prototype.mutableProperties = { + cols: { + name: 'Columns', + type: 'number', + max: '1000', + min: '5', + func: 'changeColSize', + }, + rows: { + name: 'Rows', + type: 'number', + max: '1000', + min: '5', + func: 'changeRowSize', + }, +} +Rectangle.prototype.objectType = 'Rectangle' diff --git a/v1/src/simulator/src/modules/SevenSegDisplay.js b/v1/src/simulator/src/modules/SevenSegDisplay.js new file mode 100644 index 00000000..eedd26f0 --- /dev/null +++ b/v1/src/simulator/src/modules/SevenSegDisplay.js @@ -0,0 +1,321 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { + colorToRGBA, + correctWidth, + lineTo, + moveTo, + rect, + rect2, + validColor, +} from '../canvasApi' + +/** + * @class + * SevenSegDisplay + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @category modules + */ +export default class SevenSegDisplay extends CircuitElement { + constructor(x, y, scope = globalScope, color = 'Red') { + super(x, y, scope, 'RIGHT', 1) + /* this is done in this.baseSetup() now + this.scope['SevenSegDisplay'].push(this); + */ + this.fixedBitWidth = true + this.directionFixed = true + this.setDimensions(30, 50) + + this.g = new Node(-20, -50, 0, this) + this.f = new Node(-10, -50, 0, this) + this.a = new Node(+10, -50, 0, this) + this.b = new Node(+20, -50, 0, this) + this.e = new Node(-20, +50, 0, this) + this.d = new Node(-10, +50, 0, this) + this.c = new Node(+10, +50, 0, this) + this.dot = new Node(+20, +50, 0, this) + this.direction = 'RIGHT' + this.color = color + this.actualColor = color + } + + /** + * @memberof SevenSegDisplay + * fn to change the color of SevenSegmentDisplay + * @return {JSON} + */ + changeColor(value) { + if (validColor(value)) { + if (value.trim() === '') { + this.color = 'Red' + this.actualColor = 'rgba(255, 0, 0, 1)' + } else { + this.color = value + const temp = colorToRGBA(value) + this.actualColor = `rgba(${temp[0]},${temp[1]},${temp[2]}, ${temp[3]})` + } + } + } + /** + * @memberof SevenSegDisplay + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.color], + nodes: { + g: findNode(this.g), + f: findNode(this.f), + a: findNode(this.a), + b: findNode(this.b), + d: findNode(this.d), + e: findNode(this.e), + c: findNode(this.c), + dot: findNode(this.dot), + }, + } + return data + } + + /** + * @memberof SevenSegDisplay + * helper function to create save Json Data of object + */ + customDrawSegment(x1, y1, x2, y2, color) { + if (color === undefined) color = 'lightgrey' + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = color + ctx.lineWidth = correctWidth(5) + const xx = this.x + const yy = this.y + moveTo(ctx, x1, y1, xx, yy, this.direction) + lineTo(ctx, x2, y2, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + } + + /** + * @memberof SevenSegDisplay + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + const xx = this.x + const yy = this.y + this.customDrawSegment( + 18, + -3, + 18, + -38, + ['lightgrey', this.actualColor][this.b.value] + ) + this.customDrawSegment( + 18, + 3, + 18, + 38, + ['lightgrey', this.actualColor][this.c.value] + ) + this.customDrawSegment( + -18, + -3, + -18, + -38, + ['lightgrey', this.actualColor][this.f.value] + ) + this.customDrawSegment( + -18, + 3, + -18, + 38, + ['lightgrey', this.actualColor][this.e.value] + ) + this.customDrawSegment( + -17, + -38, + 17, + -38, + ['lightgrey', this.actualColor][this.a.value] + ) + this.customDrawSegment( + -17, + 0, + 17, + 0, + ['lightgrey', this.actualColor][this.g.value] + ) + this.customDrawSegment( + -15, + 38, + 17, + 38, + ['lightgrey', this.actualColor][this.d.value] + ) + ctx.beginPath() + const dotColor = + ['lightgrey', this.actualColor][this.dot.value] || 'lightgrey' + ctx.strokeStyle = dotColor + rect(ctx, xx + 22, yy + 42, 2, 2) + ctx.stroke() + } + + subcircuitDrawSegment(x1, y1, x2, y2, color, xxSegment, yySegment) { + if (color == undefined) color = 'lightgrey' + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = color + ctx.lineWidth = correctWidth(3) + var xx = xxSegment + var yy = yySegment + moveTo(ctx, x1, y1, xx, yy, this.direction) + lineTo(ctx, x2, y2, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + } + + // Draws the element in the subcuircuit. Used in layout mode + subcircuitDraw(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + + var xx = this.subcircuitMetadata.x + xOffset + var yy = this.subcircuitMetadata.y + yOffset + + this.subcircuitDrawSegment( + 10, + -20, + 10, + -38, + ['lightgrey', this.actualColor][this.b.value], + xx, + yy + ) + this.subcircuitDrawSegment( + 10, + -17, + 10, + 1, + ['lightgrey', this.actualColor][this.c.value], + xx, + yy + ) + this.subcircuitDrawSegment( + -10, + -20, + -10, + -38, + ['lightgrey', this.actualColor][this.f.value], + xx, + yy + ) + this.subcircuitDrawSegment( + -10, + -17, + -10, + 1, + ['lightgrey', this.actualColor][this.e.value], + xx, + yy + ) + this.subcircuitDrawSegment( + -8, + -38, + 8, + -38, + ['lightgrey', this.actualColor][this.a.value], + xx, + yy + ) + this.subcircuitDrawSegment( + -8, + -18, + 8, + -18, + ['lightgrey', this.actualColor][this.g.value], + xx, + yy + ) + this.subcircuitDrawSegment( + -8, + 1, + 8, + 1, + ['lightgrey', this.actualColor][this.d.value], + xx, + yy + ) + + ctx.beginPath() + var dotColor = + ['lightgrey', this.actualColor][this.dot.value] || 'lightgrey' + ctx.strokeStyle = dotColor + rect(ctx, xx + 13, yy + 5, 1, 1) + ctx.stroke() + + ctx.beginPath() + ctx.strokeStyle = 'black' + ctx.lineWidth = correctWidth(1) + rect2(ctx, -15, -42, 33, 51, xx, yy, this.direction) + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected == this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = 'rgba(255, 255, 32,0.6)' + ctx.fill() + } + } + generateVerilog() { + return ` + always @ (*) + $display("SevenSegDisplay:${this.verilogLabel}.abcdefg. = %b%b%b%b%b%b%b%b}", + ${this.a.verilogLabel}, ${this.b.verilogLabel}, ${this.c.verilogLabel}, ${this.d.verilogLabel}, ${this.e.verilogLabel}, ${this.f.verilogLabel}, ${this.g.verilogLabel}, ${this.dot.verilogLabel});` + } +} + +/** + * @memberof SevenSegDisplay + * Help Tip + * @type {string} + * @category modules + */ +SevenSegDisplay.prototype.tooltipText = + 'Seven Display ToolTip: Consists of 7+1 single bit inputs.' + +/** + * @memberof SevenSegDisplay + * Help URL + * @type {string} + * @category modules + */ +SevenSegDisplay.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/3output?id=sevensegdisplay' +SevenSegDisplay.prototype.objectType = 'SevenSegDisplay' +SevenSegDisplay.prototype.canShowInSubcircuit = true +SevenSegDisplay.prototype.layoutProperties = { + rightDimensionX: 20, + leftDimensionX: 15, + upDimensionY: 42, + downDimensionY: 10, +} + +/** + * @memberof SevenSegDisplay + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +SevenSegDisplay.prototype.mutableProperties = { + color: { + name: 'Color: ', + type: 'text', + func: 'changeColor', + }, +} diff --git a/v1/src/simulator/src/modules/SixteenSegDisplay.js b/v1/src/simulator/src/modules/SixteenSegDisplay.js new file mode 100644 index 00000000..944ba443 --- /dev/null +++ b/v1/src/simulator/src/modules/SixteenSegDisplay.js @@ -0,0 +1,489 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { + colorToRGBA, + correctWidth, + lineTo, + moveTo, + rect, + rect2, + validColor, +} from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * SixteenSegDisplay + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @category modules + */ +export default class SixteenSegDisplay extends CircuitElement { + constructor(x, y, scope = globalScope, color = 'Red') { + super(x, y, scope, 'RIGHT', 16) + /* this is done in this.baseSetup() now + this.scope['SixteenSegDisplay'].push(this); + */ + this.fixedBitWidth = true + this.directionFixed = true + this.setDimensions(30, 50) + this.input1 = new Node(0, -50, 0, this, 16) + this.dot = new Node(0, 50, 0, this, 1) + this.direction = 'RIGHT' + this.color = color + this.actualColor = color + } + + /** + * @memberof SixteenSegDisplay + * fn to change the color of SixteenSegmentDisplay + * @return {JSON} + */ + changeColor(value) { + if (validColor(value)) { + if (value.trim() === '') { + this.color = 'Red' + this.actualColor = 'rgba(255, 0, 0, 1)' + } else { + this.color = value + const temp = colorToRGBA(value) + this.actualColor = `rgba(${temp[0]},${temp[1]},${temp[2]}, ${temp[3]})` + } + } + } + + /** + * @memberof SixteenSegDisplay + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.color], + nodes: { + input1: findNode(this.input1), + dot: findNode(this.dot), + }, + } + return data + } + + /** + * @memberof SixteenSegDisplay + * function to draw element + */ + customDrawSegment(x1, y1, x2, y2, color) { + if (color === undefined) color = 'lightgrey' + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = color + ctx.lineWidth = correctWidth(4) + const xx = this.x + const yy = this.y + moveTo(ctx, x1, y1, xx, yy, this.direction) + lineTo(ctx, x2, y2, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + } + + /** + * @memberof SixteenSegDisplay + * function to draw element + */ + customDrawSegmentSlant(x1, y1, x2, y2, color) { + if (color === undefined) color = 'lightgrey' + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = color + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + moveTo(ctx, x1, y1, xx, yy, this.direction) + lineTo(ctx, x2, y2, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + } + + /** + * @memberof SixteenSegDisplay + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + const xx = this.x + const yy = this.y + const color = ['lightgrey', this.actualColor] + const { value } = this.input1 + this.customDrawSegment( + -20, + -38, + 0, + -38, + ['lightgrey', this.actualColor][(value >> 15) & 1] + ) // a1 + this.customDrawSegment( + 20, + -38, + 0, + -38, + ['lightgrey', this.actualColor][(value >> 14) & 1] + ) // a2 + this.customDrawSegment( + 21.5, + -2, + 21.5, + -36, + ['lightgrey', this.actualColor][(value >> 13) & 1] + ) // b + this.customDrawSegment( + 21.5, + 2, + 21.5, + 36, + ['lightgrey', this.actualColor][(value >> 12) & 1] + ) // c + this.customDrawSegment( + -20, + 38, + 0, + 38, + ['lightgrey', this.actualColor][(value >> 11) & 1] + ) // d1 + this.customDrawSegment( + 20, + 38, + 0, + 38, + ['lightgrey', this.actualColor][(value >> 10) & 1] + ) // d2 + this.customDrawSegment( + -21.5, + 2, + -21.5, + 36, + ['lightgrey', this.actualColor][(value >> 9) & 1] + ) // e + this.customDrawSegment( + -21.5, + -36, + -21.5, + -2, + ['lightgrey', this.actualColor][(value >> 8) & 1] + ) // f + this.customDrawSegment( + -20, + 0, + 0, + 0, + ['lightgrey', this.actualColor][(value >> 7) & 1] + ) // g1 + this.customDrawSegment( + 20, + 0, + 0, + 0, + ['lightgrey', this.actualColor][(value >> 6) & 1] + ) // g2 + this.customDrawSegmentSlant( + 0, + 0, + -21, + -37, + ['lightgrey', this.actualColor][(value >> 5) & 1] + ) // h + this.customDrawSegment( + 0, + -2, + 0, + -36, + ['lightgrey', this.actualColor][(value >> 4) & 1] + ) // i + this.customDrawSegmentSlant( + 0, + 0, + 21, + -37, + ['lightgrey', this.actualColor][(value >> 3) & 1] + ) // j + this.customDrawSegmentSlant( + 0, + 0, + 21, + 37, + ['lightgrey', this.actualColor][(value >> 2) & 1] + ) // k + this.customDrawSegment( + 0, + 2, + 0, + 36, + ['lightgrey', this.actualColor][(value >> 1) & 1] + ) // l + this.customDrawSegmentSlant( + 0, + 0, + -21, + 37, + ['lightgrey', this.actualColor][(value >> 0) & 1] + ) // m + ctx.beginPath() + const dotColor = + ['lightgrey', this.actualColor][this.dot.value] || 'lightgrey' + ctx.strokeStyle = dotColor + rect(ctx, xx + 22, yy + 42, 2, 2) + ctx.stroke() + } + + subcircuitDrawSegment(x1, y1, x2, y2, color, xxSegment, yySegment) { + if (color == undefined) color = 'lightgrey' + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = color + ctx.lineWidth = correctWidth(3) + var xx = xxSegment + var yy = yySegment + moveTo(ctx, x1, y1, xx, yy, this.direction) + lineTo(ctx, x2, y2, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + } + + subcircuitDrawSegmentSlant(x1, y1, x2, y2, color, xxSegment, yySegment) { + if (color == undefined) color = 'lightgrey' + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = color + ctx.lineWidth = correctWidth(2) + var xx = xxSegment + var yy = yySegment + moveTo(ctx, x1, y1, xx, yy, this.direction) + lineTo(ctx, x2, y2, xx, yy, this.direction) + ctx.closePath() + ctx.stroke() + } + + // Draws the element in the subcircuit. Used in layout mode + subcircuitDraw(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + + var xx = this.subcircuitMetadata.x + xOffset + var yy = this.subcircuitMetadata.y + yOffset + + var color = ['lightgrey', this.actualColor] + var value = this.input1.value + + this.subcircuitDrawSegment( + -10, + -38, + 0, + -38, + ['lightgrey', this.actualColor][(value >> 15) & 1], + xx, + yy + ) //a1 + this.subcircuitDrawSegment( + 10, + -38, + 0, + -38, + ['lightgrey', this.actualColor][(value >> 14) & 1], + xx, + yy + ) //a2 + this.subcircuitDrawSegment( + 11.5, + -19, + 11.5, + -36, + ['lightgrey', this.actualColor][(value >> 13) & 1], + xx, + yy + ) //b + this.subcircuitDrawSegment( + 11.5, + 2, + 11.5, + -15, + ['lightgrey', this.actualColor][(value >> 12) & 1], + xx, + yy + ) //c + this.subcircuitDrawSegment( + -10, + 4, + 0, + 4, + ['lightgrey', this.actualColor][(value >> 11) & 1], + xx, + yy + ) //d1 + this.subcircuitDrawSegment( + 10, + 4, + 0, + 4, + ['lightgrey', this.actualColor][(value >> 10) & 1], + xx, + yy + ) //d2 + this.subcircuitDrawSegment( + -11.5, + 2, + -11.5, + -15, + ['lightgrey', this.actualColor][(value >> 9) & 1], + xx, + yy + ) //e + this.subcircuitDrawSegment( + -11.5, + -36, + -11.5, + -19, + ['lightgrey', this.actualColor][(value >> 8) & 1], + xx, + yy + ) //f + this.subcircuitDrawSegment( + -10, + -17, + 0, + -17, + ['lightgrey', this.actualColor][(value >> 7) & 1], + xx, + yy + ) //g1 + this.subcircuitDrawSegment( + 10, + -17, + 0, + -17, + ['lightgrey', this.actualColor][(value >> 6) & 1], + xx, + yy + ) //g2 + this.subcircuitDrawSegmentSlant( + 0, + -17, + -9, + -36, + ['lightgrey', this.actualColor][(value >> 5) & 1], + xx, + yy + ) //h + this.subcircuitDrawSegment( + 0, + -36, + 0, + -19, + ['lightgrey', this.actualColor][(value >> 4) & 1], + xx, + yy + ) //i + this.subcircuitDrawSegmentSlant( + 0, + -17, + 9, + -36, + ['lightgrey', this.actualColor][(value >> 3) & 1], + xx, + yy + ) //j + this.subcircuitDrawSegmentSlant( + 0, + -17, + 9, + 0, + ['lightgrey', this.actualColor][(value >> 2) & 1], + xx, + yy + ) //k + this.subcircuitDrawSegment( + 0, + -17, + 0, + 2, + ['lightgrey', this.actualColor][(value >> 1) & 1], + xx, + yy + ) //l + this.subcircuitDrawSegmentSlant( + 0, + -17, + -9, + 0, + ['lightgrey', this.actualColor][(value >> 0) & 1], + xx, + yy + ) //m + + ctx.beginPath() + var dotColor = + ['lightgrey', this.actualColor][this.dot.value] || 'lightgrey' + ctx.strokeStyle = dotColor + rect(ctx, xx + 13, yy + 5, 1, 1) + ctx.stroke() + + ctx.beginPath() + ctx.strokeStyle = 'black' + ctx.lineWidth = correctWidth(1) + rect2(ctx, -15, -42, 33, 51, xx, yy, this.direction) + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected == this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = 'rgba(255, 255, 32,0.6)' + ctx.fill() + } + } + generateVerilog() { + return ` + always @ (*) + $display("SixteenSegDisplay:{${this.input1.verilogLabel},${this.dot.verilogLabel}} = {%16b,%1b}", ${this.input1.verilogLabel}, ${this.dot.verilogLabel});` + } +} + +/** + * @memberof SixteenSegDisplay + * Help Tip + * @type {string} + * @category modules + */ +SixteenSegDisplay.prototype.tooltipText = + 'Sixteen Display ToolTip: Consists of 16+1 bit inputs.' + +/** + * @memberof SixteenSegDisplay + * Help URL + * @type {string} + * @category modules + */ +SixteenSegDisplay.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/3output?id=sixteensegdisplay' +SixteenSegDisplay.prototype.objectType = 'SixteenSegDisplay' +SixteenSegDisplay.prototype.canShowInSubcircuit = true +SixteenSegDisplay.prototype.layoutProperties = { + rightDimensionX: 20, + leftDimensionX: 15, + upDimensionY: 42, + downDimensionY: 10, +} + +/** + * @memberof SixteenSegDisplay + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +SixteenSegDisplay.prototype.mutableProperties = { + color: { + name: 'Color: ', + type: 'text', + func: 'changeColor', + }, +} diff --git a/v1/src/simulator/src/modules/Splitter.js b/v1/src/simulator/src/modules/Splitter.js new file mode 100644 index 00000000..ffcb296c --- /dev/null +++ b/v1/src/simulator/src/modules/Splitter.js @@ -0,0 +1,359 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText2 } from '../canvasApi' +import { colors } from '../themer/themer' + +function extractBits(num, start, end) { + return (num << (32 - end)) >>> (32 - (end - start + 1)) +} + +/** + * @class + * Splitter + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @param {number=} bitWidthSplit - number of input nodes + * @category modules + */ +export default class Splitter extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = undefined, + bitWidthSplit = undefined + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Splitter'].push(this); + */ + this.rectangleObject = false + + this.bitWidthSplit = + bitWidthSplit || + ( + prompt('Enter bitWidth Split') || + `${'1 '.repeat((this.bitWidth || 1) - 1)}1` + ) + .split(' ') + .filter((lambda) => lambda !== '') + .map((lambda) => parseInt(lambda, 10) || 1) + this.splitCount = this.bitWidthSplit.length + + this.setDimensions(10, (this.splitCount - 1) * 10 + 10) + this.yOffset = (this.splitCount / 2 - 1) * 20 + + this.inp1 = new Node(-10, 10 + this.yOffset, 0, this, this.bitWidth) + + this.outputs = [] + // this.prevOutValues=new Array(this.splitCount) + for (let i = 0; i < this.splitCount; i++) { + this.outputs.push( + new Node( + 20, + i * 20 - this.yOffset - 20, + 0, + this, + this.bitWidthSplit[i] + ) + ) + } + + this.prevInpValue = undefined + } + + /** + * @memberof Splitter + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.bitWidth, + this.bitWidthSplit, + ], + nodes: { + outputs: this.outputs.map(findNode), + inp1: findNode(this.inp1), + }, + } + return data + } + + /** + * @memberof Splitter + * fn to remove proporgation delay. + * @return {JSON} + */ + removePropagation() { + if (this.inp1.value === undefined) { + let i = 0 + for (i = 0; i < this.outputs.length; i++) { + // False Hit + if (this.outputs[i].value === undefined) return + } + for (i = 0; i < this.outputs.length; i++) { + if (this.outputs[i].value !== undefined) { + this.outputs[i].value = undefined + simulationArea.simulationQueue.add(this.outputs[i]) + } + } + } else if (this.inp1.value !== undefined) { + this.inp1.value = undefined + simulationArea.simulationQueue.add(this.inp1) + } + this.prevInpValue = undefined + } + + /** + * @memberof Splitter + * Checks if the element is resolvable + * @return {boolean} + */ + isResolvable() { + let resolvable = false + if (this.inp1.value !== this.prevInpValue) { + if (this.inp1.value !== undefined) return true + return false + } + let i + for (i = 0; i < this.splitCount; i++) { + if (this.outputs[i].value === undefined) break + } + if (i === this.splitCount) resolvable = true + return resolvable + } + + /** + * @memberof Splitter + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + if ( + this.inp1.value !== undefined && + this.inp1.value !== this.prevInpValue + ) { + let bitCount = 1 + for (let i = 0; i < this.splitCount; i++) { + const bitSplitValue = extractBits( + this.inp1.value, + bitCount, + bitCount + this.bitWidthSplit[i] - 1 + ) + if (this.outputs[i].value !== bitSplitValue) { + if (this.outputs[i].value !== bitSplitValue) { + this.outputs[i].value = bitSplitValue + simulationArea.simulationQueue.add(this.outputs[i]) + } + } + bitCount += this.bitWidthSplit[i] + } + } else { + let n = 0 + for (let i = this.splitCount - 1; i >= 0; i--) { + n <<= this.bitWidthSplit[i] + n += this.outputs[i].value + } + if (this.inp1.value !== n >>> 0) { + this.inp1.value = n >>> 0 + simulationArea.simulationQueue.add(this.inp1) + } + // else if (this.inp1.value !== n) { + // } + } + this.prevInpValue = this.inp1.value + } + + /** + * @memberof Splitter + * fn to reset values of splitter + */ + reset() { + this.prevInpValue = undefined + } + + /** + * @memberof Splitter + * fn to process verilog of the element + * @return {JSON} + */ + processVerilog() { + if ( + this.inp1.verilogLabel !== '' && + this.outputs[0].verilogLabel === '' + ) { + let bitCount = 0 + for (let i = 0; i < this.splitCount; i++) { + // let bitSplitValue = extractBits(this.inp1.value, bitCount, bitCount + this.bitWidthSplit[i] - 1); + if (this.bitWidthSplit[i] > 1) { + const label = `${this.inp1.verilogLabel}[ ${ + bitCount + this.bitWidthSplit[i] - 1 + }:${bitCount}]` + } else { + const label = `${this.inp1.verilogLabel}[${bitCount}]` + } + if (this.outputs[i].verilogLabel !== label) { + this.outputs[i].verilogLabel = label + this.scope.stack.push(this.outputs[i]) + } + bitCount += this.bitWidthSplit[i] + } + } else if ( + this.inp1.verilogLabel === '' && + this.outputs[0].verilogLabel !== '' + ) { + const label = `{${this.outputs + .map((x) => x.verilogLabel) + .join(',')}}` + if (this.inp1.verilogLabel !== label) { + this.inp1.verilogLabel = label + this.scope.stack.push(this.inp1) + } + } + } + + /** + * @memberof Splitter + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + // + ctx.strokeStyle = [colors['splitter'], 'brown'][ + ((this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this)) + 0 + ] + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + ctx.beginPath() + moveTo(ctx, -10, 10 + this.yOffset, xx, yy, this.direction) + lineTo(ctx, 0, 0 + this.yOffset, xx, yy, this.direction) + lineTo( + ctx, + 0, + -20 * (this.splitCount - 1) + this.yOffset, + xx, + yy, + this.direction + ) + let bitCount = 0 + for (let i = this.splitCount - 1; i >= 0; i--) { + moveTo(ctx, 0, -20 * i + this.yOffset, xx, yy, this.direction) + lineTo(ctx, 20, -20 * i + this.yOffset, xx, yy, this.direction) + } + ctx.stroke() + ctx.beginPath() + ctx.fillStyle = colors['text'] + for (let i = this.splitCount - 1; i >= 0; i--) { + var splitLabel + if (this.bitWidthSplit[this.splitCount - i - 1] == 1) + splitLabel = `${bitCount}` + else + splitLabel = `${bitCount}:${ + bitCount + this.bitWidthSplit[this.splitCount - i - 1] - 1 + }` + + fillText2( + ctx, + splitLabel, + 16, + -20 * i + this.yOffset + 10, + xx, + yy, + this.direction + ) + bitCount += this.bitWidthSplit[this.splitCount - i - 1] + } + ctx.fill() + } + + processVerilog() { + // Combiner + if (this.inp1.verilogLabel == '') { + this.isSplitter = false + this.inp1.verilogLabel = this.verilogLabel + '_cmb' + if ( + !this.scope.verilogWireList[this.bitWidth].contains( + this.inp1.verilogLabel + ) + ) + this.scope.verilogWireList[this.bitWidth].push( + this.inp1.verilogLabel + ) + this.scope.stack.push(this.inp1) + return + } + + // Splitter + this.isSplitter = true + for (var j = 0; j < this.outputs.length; j++) { + var bitCount = 0 + var inpLabel = this.inp1.verilogLabel + // Already Split Regex + var re = /^(.*)\[(\d*):(\d*)\]$/ + if (re.test(inpLabel)) { + var matches = inpLabel.match(re) + inpLabel = matches[1] + bitCount = parseInt(matches[3]) + } + for (var i = 0; i < this.splitCount; i++) { + if (this.bitWidthSplit[i] > 1) + var label = + inpLabel + + '[' + + (bitCount + this.bitWidthSplit[i] - 1) + + ':' + + bitCount + + ']' + else var label = inpLabel + '[' + bitCount + ']' + if (this.outputs[i].verilogLabel != label) { + this.outputs[i].verilogLabel = label + this.scope.stack.push(this.outputs[i]) + } + bitCount += this.bitWidthSplit[i] + } + } + } + //added to generate Splitter INPUTS + generateVerilog() { + var res = '' + if (!this.isSplitter) { + res += 'assign ' + this.inp1.verilogLabel + ' = {' + for (var i = this.outputs.length - 1; i > 0; i--) + res += this.outputs[i].verilogLabel + ',' + res += this.outputs[0].verilogLabel + '};' + } + return res + } +} + +/** + * @memberof Splitter + * Help Tip + * @type {string} + * @category modules + */ +Splitter.prototype.tooltipText = + 'Splitter ToolTip: Split multiBit Input into smaller bitwidths or vice versa.' + +/** + * @memberof Splitter + * Help URL + * @type {string} + * @category modules + */ +Splitter.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/8misc?id=splitter' +Splitter.prototype.objectType = 'Splitter' diff --git a/v1/src/simulator/src/modules/SquareRGBLed.js b/v1/src/simulator/src/modules/SquareRGBLed.js new file mode 100644 index 00000000..b93e0bb6 --- /dev/null +++ b/v1/src/simulator/src/modules/SquareRGBLed.js @@ -0,0 +1,215 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, rect2 } from '../canvasApi' + +/** + * @class + * SquareRGBLed + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} pinLength - pins per node. + * @category modules + */ +export default class SquareRGBLed extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'UP', pinLength = 1) { + super(x, y, scope, dir, 8) + /* this is done in this.baseSetup() now + this.scope['SquareRGBLed'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 15) + this.pinLength = pinLength === undefined ? 1 : pinLength + const nodeX = -10 - 10 * pinLength + this.inp1 = new Node(nodeX, -10, 0, this, 8, 'R') + this.inp2 = new Node(nodeX, 0, 0, this, 8, 'G') + this.inp3 = new Node(nodeX, 10, 0, this, 8, 'B') + this.inp = [this.inp1, this.inp2, this.inp3] + this.labelDirection = 'UP' + this.fixedBitWidth = true + + // eslint-disable-next-line no-shadow + this.changePinLength = function (pinLength) { + if (pinLength === undefined) return + pinLength = parseInt(pinLength, 10) + if (pinLength < 0 || pinLength > 1000) return + + // Calculate the new position of the LED, so the nodes will stay in the same place. + const diff = 10 * (pinLength - this.pinLength) + // eslint-disable-next-line no-nested-ternary + const diffX = + this.direction === 'LEFT' + ? -diff + : this.direction === 'RIGHT' + ? diff + : 0 + // eslint-disable-next-line no-nested-ternary + const diffY = + this.direction === 'UP' + ? -diff + : this.direction === 'DOWN' + ? diff + : 0 + + // Build a new LED with the new values; preserve label properties too. + const obj = new SquareRGBLed( + this.x + diffX, + this.y + diffY, + this.scope, + this.direction, + pinLength + ) + obj.label = this.label + obj.labelDirection = this.labelDirection + + this.cleanDelete() + simulationArea.lastSelected = obj + return obj + } + + this.mutableProperties = { + pinLength: { + name: 'Pin Length', + type: 'number', + max: '1000', + min: '0', + func: 'changePinLength', + }, + } + } + + /** + * @memberof SquareRGBLed + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.pinLength], + nodes: { + inp1: findNode(this.inp1), + inp2: findNode(this.inp2), + inp3: findNode(this.inp3), + }, + } + return data + } + + /** + * @memberof SquareRGBLed + * function to draw element + */ + customDraw() { + const ctx = simulationArea.context + const xx = this.x + const yy = this.y + const r = this.inp1.value + const g = this.inp2.value + const b = this.inp3.value + + const colors = ['rgb(174,20,20)', 'rgb(40,174,40)', 'rgb(0,100,255)'] + for (let i = 0; i < 3; i++) { + const x = -10 - 10 * this.pinLength + const y = i * 10 - 10 + ctx.lineWidth = correctWidth(3) + + // A gray line, which makes it easy on the eyes when the pin length is large + ctx.beginPath() + ctx.lineCap = 'butt' + ctx.strokeStyle = 'rgb(227, 228, 229)' + moveTo(ctx, -15, y, xx, yy, this.direction) + lineTo(ctx, x + 10, y, xx, yy, this.direction) + ctx.stroke() + + // A colored line, so people know which pin does what. + ctx.lineCap = 'round' + ctx.beginPath() + ctx.strokeStyle = colors[i] + moveTo(ctx, x + 10, y, xx, yy, this.direction) + lineTo(ctx, x, y, xx, yy, this.direction) + ctx.stroke() + } + + ctx.strokeStyle = '#d3d4d5' + ctx.fillStyle = + r === undefined && g === undefined && b === undefined + ? 'rgb(227, 228, 229)' + : `rgb(${r || 0}, ${g || 0}, ${b || 0})` + ctx.lineWidth = correctWidth(1) + ctx.beginPath() + rect2(ctx, -15, -15, 30, 30, xx, yy, this.direction) + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = 'rgba(255, 255, 32)' + } + + ctx.fill() + } + // Draws the element in the subcuircuit. Used in layout mode + subcircuitDraw(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + var xx = this.subcircuitMetadata.x + xOffset + var yy = this.subcircuitMetadata.y + yOffset + var r = this.inp1.value + var g = this.inp2.value + var b = this.inp3.value + + ctx.strokeStyle = '#d3d4d5' + ctx.fillStyle = + r === undefined && g === undefined && b === undefined + ? 'rgb(227, 228, 229)' + : 'rgb(' + (r || 0) + ', ' + (g || 0) + ', ' + (b || 0) + ')' + ctx.lineWidth = correctWidth(1) + ctx.beginPath() + rect2(ctx, 0, 0, 15, 15, xx, yy, this.direction) + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected == this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = 'rgba(255, 255, 32)' + } + + ctx.fill() + } + + generateVerilog() { + return this.generateVerilog.call(this) + } +} + +/** + * @memberof SquareRGBLed + * Help Tip + * @type {string} + * @category modules + */ +SquareRGBLed.prototype.tooltipText = + 'Square RGB Led ToolTip: RGB Led inputs 8 bit values for the colors RED, GREEN and BLUE.' + +/** + * @memberof SquareRGBLed + * Help URL + * @type {string} + * @category modules + */ +SquareRGBLed.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/3output?id=squarergbled' +SquareRGBLed.prototype.objectType = 'SquareRGBLed' +SquareRGBLed.prototype.canShowInSubcircuit = true +SquareRGBLed.prototype.layoutProperties = { + rightDimensionX: 15, + leftDimensionX: 0, + upDimensionY: 15, + downDimensionY: 0, +} diff --git a/v1/src/simulator/src/modules/Stepper.js b/v1/src/simulator/src/modules/Stepper.js new file mode 100644 index 00000000..c6cfbd3f --- /dev/null +++ b/v1/src/simulator/src/modules/Stepper.js @@ -0,0 +1,102 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { fillText } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * Stepper + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bitwidth of element + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Stepper extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 8) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Stepper'].push(this); + */ + this.setDimensions(20, 20) + + this.output1 = new Node(20, 0, 1, this, bitWidth) + this.state = 0 + } + + /** + * @memberof Stepper + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + var data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + output1: findNode(this.output1), + }, + values: { + state: this.state, + }, + } + return data + } + + /** + * @memberof Stepper + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.font = '20px Raleway' + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + fillText(ctx, this.state.toString(16), this.x, this.y + 5) + ctx.fill() + } + + /** + * @memberof Stepper + * resolve output values based on inputData + */ + resolve() { + this.state = Math.min(this.state, (1 << this.bitWidth) - 1) + this.output1.value = this.state + simulationArea.simulationQueue.add(this.output1) + } + + /** + * Listener function for increasing value of state + * @memberof Stepper + * @param {string} key - the key pressed + */ + keyDown2(key) { + if (this.state < 1 << this.bitWidth && (key === '+' || key === '=')) + this.state++ + if (this.state > 0 && (key === '_' || key === '-')) this.state-- + } +} + +/** + * @memberof Stepper + * Help Tip + * @type {string} + * @category modules + */ +Stepper.prototype.tooltipText = + 'Stepper ToolTip: Increase/Decrease value by selecting the stepper and using +/- keys.' + +/** + * @memberof Stepper + * Help URL + * @type {string} + * @category modules + */ +Stepper.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/2input?id=stepper' +Stepper.prototype.objectType = 'Stepper' diff --git a/v1/src/simulator/src/modules/Text.js b/v1/src/simulator/src/modules/Text.js new file mode 100644 index 00000000..7248c575 --- /dev/null +++ b/v1/src/simulator/src/modules/Text.js @@ -0,0 +1,208 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { rect2, fillText } from '../canvasApi' +/** + * @class + * Text + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} label - label of element + * @param {number=} fontSize - font size + * @category modules + */ +import { colors } from '../themer/themer' +import { copy, paste } from '../events' + +export default class Text extends CircuitElement { + constructor(x, y, scope = globalScope, label = '', fontSize = 14) { + super(x, y, scope, 'RIGHT', 1) + /* this is done in this.baseSetup() now + this.scope['Text'].push(this); + */ + // this.setDimensions(15, 15); + this.fixedBitWidth = true + this.directionFixed = true + this.labelDirectionFixed = true + this.setLabel(label) + this.setFontSize(fontSize) + } + + /** + * @memberof Text + * function for setting text inside the element + * @param {string=} str - the label + */ + setLabel(str = '') { + this.label = str + var ctx = simulationArea.context + ctx.font = `${this.fontSize}px Raleway` + this.leftDimensionX = 10 + this.rightDimensionX = ctx.measureText(this.label).width + 10 + this.setTextboxSize() + } + + /** + * @memberof Text + * function for setting font size inside the element + * @param {number=} str - the font size + */ + setFontSize(fontSize = 14) { + this.fontSize = fontSize + var ctx = simulationArea.context + ctx.font = `${this.fontSize}px Raleway` + this.setTextboxSize() + } + + setTextboxSize() { + this.leftDimensionX = 10 + var maxWidth = 0 + var labels = this.label.split('\n') + var ctx = simulationArea.context + labels.forEach( + (l) => (maxWidth = Math.max(maxWidth, ctx.measureText(l).width)) + ) + this.rightDimensionX = maxWidth + 10 + this.downDimensionY = labels.length * this.fontSize + } + + /** + * @memberof Text + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.label, this.fontSize], + } + return data + } + + /** + * @memberof Text + * Listener function for Text Box + * @param {string} key - the label + */ + keyDown(key) { + if (simulationArea.controlDown && (key === 'c' || key === 'C')) { + const textToPutOnClipboard = copy([this]) + navigator.clipboard.writeText(textToPutOnClipboard) + localStorage.setItem('clipboardData', textToPutOnClipboard) + } else if (simulationArea.controlDown && (key === 'v' || key === 'V')) { + paste(localStorage.getItem('clipboardData')) + } else if (key.length === 1) { + if (this.label === 'Enter Text Here') { + this.setLabel(key) + } else { + this.setLabel(this.label + key) + } + } else if (key === 'Backspace') { + if (this.label === 'Enter Text Here') { + this.setLabel('') + } else { + this.setLabel(this.label.slice(0, -1)) + } + } else if (key === 'Enter') { + if (this.label === 'Enter Text Here') { + this.setLabel('') + } else { + this.setLabel(this.label + '\n') + } + } + $('[name=setLabel]').val(this.label) + } + + /** + * @memberof Text + * Function for drawing text box + */ + draw() { + // + if (this.label.length === 0 && simulationArea.lastSelected !== this) + this.delete() + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = 1 + const xx = this.x + const yy = this.y + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.beginPath() + ctx.fillStyle = colors['fill'] + const magicDimension = this.fontSize - 14 + rect2( + ctx, + -this.leftDimensionX, + -this.upDimensionY - magicDimension, + this.leftDimensionX + this.rightDimensionX, + this.upDimensionY + this.downDimensionY + magicDimension, + this.x, + this.y, + 'RIGHT' + ) + ctx.fillStyle = 'rgba(255, 255, 32,0.1)' + ctx.fill() + ctx.stroke() + } + ctx.beginPath() + ctx.textAlign = 'left' + ctx.fillStyle = colors['text'] + var labels = this.label.split('\n') + for (var i = 0; i < labels.length; i++) { + fillText( + ctx, + labels[i], + xx, + yy + 5 + i * this.fontSize, + this.fontSize + ) + } + ctx.fill() + } +} + +/** + * @memberof Text + * Help Tip + * @type {string} + * @category modules + */ +Text.prototype.tooltipText = 'Text ToolTip: Use this to document your circuit.' + +/** + * @memberof Text + * Help URL + * @type {string} + * @category modules + */ +Text.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/7annotation?id=text' + +/** + * @memberof Text + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +Text.prototype.mutableProperties = { + fontSize: { + name: 'Font size: ', + type: 'number', + max: '84', + min: '14', + func: 'setFontSize', + }, + label: { + name: 'Text: ', + type: 'textarea', + func: 'setLabel', + }, +} +Text.prototype.disableLabel = true +Text.prototype.objectType = 'Text' +Text.prototype.propagationDelayFixed = true diff --git a/v1/src/simulator/src/modules/TriState.js b/v1/src/simulator/src/modules/TriState.js new file mode 100644 index 00000000..e4048fc9 --- /dev/null +++ b/v1/src/simulator/src/modules/TriState.js @@ -0,0 +1,129 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, arc } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * TriState + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class TriState extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['TriState'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 15) + + this.inp1 = new Node(-10, 0, 0, this) + this.output1 = new Node(20, 0, 1, this) + this.state = new Node(0, 0, 0, this, 1, 'Enable') + } + + // TriState.prototype.propagationDelay=10000; + + /** + * @memberof TriState + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + output1: findNode(this.output1), + inp1: findNode(this.inp1), + state: findNode(this.state), + }, + } + return data + } + + /** + * @memberof TriState + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.inp1.bitWidth = bitWidth + this.output1.bitWidth = bitWidth + this.bitWidth = bitWidth + } + + /** + * @memberof TriState + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + + if (this.state.value === 1) { + if (this.output1.value !== this.inp1.value) { + this.output1.value = this.inp1.value // >>>0)<<(32-this.bitWidth))>>>(32-this.bitWidth); + simulationArea.simulationQueue.add(this.output1) + } + simulationArea.contentionPending.clean(this) + } else if ( + this.output1.value !== undefined && + !simulationArea.contentionPending.contains(this) + ) { + this.output1.value = undefined + simulationArea.simulationQueue.add(this.output1) + } + simulationArea.contentionPending.clean(this) + } + + /** + * @memberof TriState + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.fillStyle = colors['fill'] + moveTo(ctx, -10, -15, xx, yy, this.direction) + lineTo(ctx, 20, 0, xx, yy, this.direction) + lineTo(ctx, -10, 15, xx, yy, this.direction) + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + } + + generateVerilog() { + return `assign ${this.output1.verilogLabel} = (${this.state.verilogLabel}!=0) ? ${this.inp1.verilogLabel} : ${this.inp1.bitWidth}'b?;` + } +} + +/** + * @memberof TriState + * Help Tip + * @type {string} + * @category modules + */ +TriState.prototype.tooltipText = + 'TriState ToolTip : Effectively removes the output from the circuit.' +TriState.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/8misc?id=tristate-buffer' +TriState.prototype.objectType = 'TriState' diff --git a/v1/src/simulator/src/modules/Tunnel.js b/v1/src/simulator/src/modules/Tunnel.js new file mode 100644 index 00000000..7e3f96c5 --- /dev/null +++ b/v1/src/simulator/src/modules/Tunnel.js @@ -0,0 +1,351 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect2, fillText } from '../canvasApi' +import plotArea from '../plotArea' +import { showError } from '../utils' +/** + * @class + * Tunnel + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @param {string=} identifier - number of input nodes + * @category modules + */ +import { colors } from '../themer/themer' + +export default class Tunnel extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'LEFT', + bitWidth = 1, + identifier + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['Tunnel'].push(this); + */ + this.rectangleObject = false + this.centerElement = true + this.xSize = 10 + this.plotValues = [] + this.inp1 = new Node(0, 0, 0, this) + this.checked = false // has this tunnel been checked by another paired tunnel + this.setIdentifier(identifier || 'T') + this.setBounds() + // if tunnels with this's identifier exist, then set the bitwidth to that of those tunnels + if (this.scope.tunnelList[this.identifier].length > 0) { + this.newBitWidth(this.scope.tunnelList[this.identifier][0].bitWidth) + } + } + + /** + * @memberof Tunnel + * function to change direction of Tunnel + * @param {string} dir - new direction + */ + newDirection(dir) { + if (this.direction === dir) return + this.direction = dir + this.setBounds() + } + + setBounds() { + let xRotate = 0 + let yRotate = 0 + if (this.direction === 'LEFT') { + xRotate = 0 + yRotate = 0 + } else if (this.direction === 'RIGHT') { + xRotate = 120 - this.xSize + yRotate = 0 + } else if (this.direction === 'UP') { + xRotate = 60 - this.xSize / 2 + yRotate = -20 + } else { + xRotate = 60 - this.xSize / 2 + yRotate = 20 + } + + this.leftDimensionX = Math.abs(-120 + xRotate + this.xSize) + this.upDimensionY = Math.abs(-20 + yRotate) + this.rightDimensionX = Math.abs(xRotate) + this.downDimensionY = Math.abs(20 + yRotate) + + // rect2(ctx, -120 + xRotate + this.xSize, -20 + yRotate, 120 - this.xSize, 40, xx, yy, "RIGHT"); + } + + /** + * @memberof Tunnel + * resolve output values based on inputData + */ + resolve() { + // Don't check for paired tunnels' value if already checked by another paired tunnel (O(n)) + if (this.checked) { + this.checked = false + return + } + // Check for bitwidth error since it bypasses node's resolve() function which usually checks bitwidths + for (const tunnel of this.scope.tunnelList[this.identifier]) { + if (tunnel.inp1.bitWidth !== this.inp1.bitWidth) { + this.inp1.highlighted = true + tunnel.inp1.highlighted = true + showError( + `BitWidth Error: ${this.inp1.bitWidth} and ${tunnel.inp1.bitWidth}` + ) + } + if (tunnel.inp1.value !== this.inp1.value) { + tunnel.inp1.value = this.inp1.value + simulationArea.simulationQueue.add(tunnel.inp1) + } + if (tunnel !== this) tunnel.checked = true + } + } + + /** + * @memberof Tunnel + * function to set tunnel value + * @param {Scope} scope - tunnel value + */ + updateScope(scope) { + this.scope = scope + this.inp1.updateScope(scope) + this.setIdentifier(this.identifier) + } + + /** + * @memberof Tunnel + * function to set plot value + */ + setPlotValue() { + return + const time = plotArea.stopWatch.ElapsedMilliseconds + if ( + this.plotValues.length && + this.plotValues[this.plotValues.length - 1][0] === time + ) { + this.plotValues.pop() + } + + if (this.plotValues.length === 0) { + this.plotValues.push([time, this.inp1.value]) + return + } + + if ( + this.plotValues[this.plotValues.length - 1][1] === this.inp1.value + ) { + return + } + this.plotValues.push([time, this.inp1.value]) + } + + /** + * @memberof Tunnel + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.bitWidth, + this.identifier, + ], + nodes: { + inp1: findNode(this.inp1), + }, + values: { + identifier: this.identifier, + }, + } + return data + } + + /** + * @memberof Tunnel + * function to set tunnel identifier value + * @param {string=} id - id so that every link is unique + */ + setIdentifier(id = '') { + if (id.length === 0) return + if (this.scope.tunnelList[this.identifier]) + this.scope.tunnelList[this.identifier].clean(this) + this.identifier = id + if (this.scope.tunnelList[this.identifier]) + this.scope.tunnelList[this.identifier].push(this) + else this.scope.tunnelList[this.identifier] = [this] + + // Change the bitwidth to be same as the other elements with this.identifier + if ( + this.scope.tunnelList[this.identifier] && + this.scope.tunnelList[this.identifier].length > 1 + ) { + this.bitWidth = this.inp1.bitWidth = + this.scope.tunnelList[this.identifier][0].bitWidth + } + + const len = this.identifier.length + if (len === 1) this.xSize = 40 + else if (len > 1 && len < 4) this.xSize = 20 + else this.xSize = 0 + this.setBounds() + } + + /** + * @memberof Tunnel + * delete the tunnel element + */ + delete() { + this.scope.Tunnel.clean(this) + this.scope.tunnelList[this.identifier].clean(this) + super.delete() + } + + /** + * @memberof Tunnel + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(1) + const xx = this.x + const yy = this.y + + let xRotate = 0 + let yRotate = 0 + if (this.direction === 'LEFT') { + xRotate = 0 + yRotate = 0 + } else if (this.direction === 'RIGHT') { + xRotate = 120 - this.xSize + yRotate = 0 + } else if (this.direction === 'UP') { + xRotate = 60 - this.xSize / 2 + yRotate = -20 + } else { + xRotate = 60 - this.xSize / 2 + yRotate = 20 + } + + rect2( + ctx, + -120 + xRotate + this.xSize, + -20 + yRotate, + 120 - this.xSize, + 40, + xx, + yy, + 'RIGHT' + ) + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.fillStyle = colors['hover_select'] + } + ctx.fill() + ctx.stroke() + + ctx.font = '14px Raleway' + this.xOff = ctx.measureText(this.identifier).width + ctx.beginPath() + rect2( + ctx, + -105 + xRotate + this.xSize, + -11 + yRotate, + this.xOff + 10, + 23, + xx, + yy, + 'RIGHT' + ) + ctx.fillStyle = '#eee' + ctx.strokeStyle = '#ccc' + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = 'black' + fillText( + ctx, + this.identifier, + xx - 100 + this.xOff / 2 + xRotate + this.xSize, + yy + 6 + yRotate, + 14 + ) + ctx.fill() + + ctx.beginPath() + ctx.font = '30px Raleway' + ctx.textAlign = 'center' + ctx.fillStyle = ['blue', 'red'][+(this.inp1.value === undefined)] + if (this.inp1.value !== undefined) { + fillText( + ctx, + this.inp1.value.toString(16), + xx - 23 + xRotate, + yy + 8 + yRotate, + 25 + ) + } else { + fillText(ctx, 'x', xx - 23 + xRotate, yy + 8 + yRotate, 25) + } + ctx.fill() + } + + /** + * Overridden from CircuitElement. Sets all paired tunnels' bitwidths for syncronization + * @param {number} bitWidth - bitwidth to set to + */ + newBitWidth(bitWidth) { + for (let tunnel of this.scope.tunnelList[this.identifier]) { + if (tunnel.fixedBitWidth) continue + if (tunnel.bitWidth === undefined) continue + if (tunnel.bitWidth < 1) continue + tunnel.bitWidth = bitWidth + for (let i = 0; i < tunnel.nodeList.length; i++) { + tunnel.nodeList[i].bitWidth = bitWidth + } + } + } +} + +/** + * @memberof Tunnel + * Help Tip + * @type {string} + * @category modules + */ +Tunnel.prototype.tooltipText = 'Tunnel ToolTip : Tunnel Selected.' +Tunnel.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/8misc?id=tunnel' + +Tunnel.prototype.overrideDirectionRotation = true + +/** + * @memberof Tunnel + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +Tunnel.prototype.mutableProperties = { + identifier: { + name: 'Debug Flag identifier', + type: 'text', + maxlength: '5', + func: 'setIdentifier', + }, +} +Tunnel.prototype.objectType = 'Tunnel' diff --git a/v1/src/simulator/src/modules/TwoComplement.js b/v1/src/simulator/src/modules/TwoComplement.js new file mode 100644 index 00000000..ace62ec7 --- /dev/null +++ b/v1/src/simulator/src/modules/TwoComplement.js @@ -0,0 +1,102 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, fillText, drawCircle2 } from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * TwoComplement + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class TwoComplement extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['TwoComplement'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 15) + this.inp1 = new Node(-10, 0, 0, this, this.bitWidth, 'input stream') + this.output1 = new Node(20, 0, 1, this, this.bitWidth, "2's complement") + } + + /** + * @memberof TwoComplement + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + output1: findNode(this.output1), + inp1: findNode(this.inp1), + }, + } + return data + } + + /** + * @memberof TwoComplement + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + let output = + ((~this.inp1.value >>> 0) << (32 - this.bitWidth)) >>> + (32 - this.bitWidth) + output += 1 + this.output1.value = + (output << (32 - this.bitWidth)) >>> (32 - this.bitWidth) + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof TwoComplement + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(3) + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.fillStyle = 'black' + fillText(ctx, "2'", xx, yy, 10) + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.beginPath() + drawCircle2(ctx, 5, 0, 15, xx, yy, this.direction) + ctx.stroke() + } + + generateVerilog() { + return `assign ${this.output1.verilogLabel} = ~${this.inp1.verilogLabel} + 1;` + } +} + +/** + * @memberof TwoComplement + * Help Tip + * @type {string} + * @category modules + */ +TwoComplement.prototype.tooltipText = + "Two's Complement Tooltip : Calculates the two's complement" +TwoComplement.prototype.objectType = 'TwoComplement' diff --git a/v1/src/simulator/src/modules/VariableLed.js b/v1/src/simulator/src/modules/VariableLed.js new file mode 100644 index 00000000..a32cb5aa --- /dev/null +++ b/v1/src/simulator/src/modules/VariableLed.js @@ -0,0 +1,205 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { + correctWidth, + lineTo, + moveTo, + arc, + drawCircle2, + colorToRGBA, + validColor, +} from '../canvasApi' +import { changeInputSize } from '../modules' +/** + * @class + * VariableLed + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @category modules + */ +import { colors } from '../themer/themer' + +export default class VariableLed extends CircuitElement { + constructor(x, y, scope = globalScope, color = 'Red') { + // Calling base class constructor + + super(x, y, scope, 'UP', 8) + /* this is done in this.baseSetup() now + this.scope['VariableLed'].push(this); + */ + this.rectangleObject = false + this.setDimensions(10, 20) + this.inp1 = new Node(-40, 0, 0, this, 8) + this.directionFixed = true + this.fixedBitWidth = true + this.color = color + const temp = colorToRGBA(this.color) + this.actualColor = `rgba(${temp[0]},${temp[1]},${temp[2]},${0.8})` + } + + /** + * @memberof VariableLed + * fn to change the color of VariableLed + * @return {JSON} + */ + changeColor(value) { + if (validColor(value)) { + if (value.trim() === '') { + this.color = 'Red' + this.actualColor = 'rgba(255, 0, 0, 1)' + } else { + this.color = value + const temp = colorToRGBA(value) + this.actualColor = `rgba(${temp[0]},${temp[1]},${temp[2]}, ${temp[3]})` + } + } + } + + /** + * @memberof VariableLed + * fn to set the rgba value of the color + * @return {JSON} + */ + createRGBA(alpha = 1) { + const len = this.actualColor.length + const temp = this.actualColor + .split('') + .slice(5, len - 1) + .join('') + .split(',') + if (alpha.toString() === 'NaN') + return `rgba(${temp[0]}, ${temp[1]}, ${temp[2]}, 1)` + return `rgba(${temp[0]},${temp[1]},${temp[2]},${alpha})` + } + + /** + * @memberof VariableLed + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.color], + nodes: { + inp1: findNode(this.inp1), + }, + } + return data + } + + /** + * @memberof VariableLed + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + + const xx = this.x + const yy = this.y + + ctx.strokeStyle = '#353535' + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + moveTo(ctx, -20, 0, xx, yy, this.direction) + lineTo(ctx, -40, 0, xx, yy, this.direction) + ctx.stroke() + const c = this.inp1.value + const alpha = c / 255 + ctx.strokeStyle = '#090a0a' + ctx.fillStyle = [this.createRGBA(alpha), 'rgba(227, 228, 229, 0.8)'][ + (c === undefined || c === 0) + 0 + ] + ctx.lineWidth = correctWidth(1) + + ctx.beginPath() + + moveTo(ctx, -20, -9, xx, yy, this.direction) + lineTo(ctx, 0, -9, xx, yy, this.direction) + arc(ctx, 0, 0, 9, -Math.PI / 2, Math.PI / 2, xx, yy, this.direction) + lineTo(ctx, -20, 9, xx, yy, this.direction) + /* lineTo(ctx,-18,12,xx,yy,this.direction); + arc(ctx,0,0,Math.sqrt(468),((Math.PI/2) + Math.acos(12/Math.sqrt(468))),((-Math.PI/2) - Math.asin(18/Math.sqrt(468))),xx,yy,this.direction); + + */ + lineTo(ctx, -20, -9, xx, yy, this.direction) + ctx.stroke() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + } + + // Draws the element in the subcuircuit. Used in layout mode + subcircuitDraw(xOffset = 0, yOffset = 0) { + var ctx = simulationArea.context + + var xx = this.subcircuitMetadata.x + xOffset + var yy = this.subcircuitMetadata.y + yOffset + + var c = this.inp1.value + var alpha = c / 255 + ctx.strokeStyle = '#090a0a' + ctx.fillStyle = [this.createRGBA(alpha), 'rgba(227, 228, 229, 0.8)'][ + (c === undefined || c == 0) + 0 + ] + ctx.lineWidth = correctWidth(1) + + ctx.beginPath() + drawCircle2(ctx, 0, 0, 6, xx, yy, this.direction) + ctx.stroke() + + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected == this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = 'rgba(255, 255, 32,0.8)' + ctx.fill() + } + + generateVerilog() { + return ` + always @ (*) + $display("VeriableLed:${this.inp1.verilogLabel}=%d", ${this.inp1.verilogLabel});` + } +} + +/** + * @memberof VariableLed + * Help Tip + * @type {string} + * @category modules + */ +VariableLed.prototype.tooltipText = + 'Variable Led ToolTip: Variable LED inputs an 8 bit value and glows with a proportional intensity.' + +/** + * @memberof VariableLed + * Mutable properties of the element + * @type {JSON} + * @category modules + */ +VariableLed.prototype.mutableProperties = { + color: { + name: 'Color: ', + type: 'text', + func: 'changeColor', + }, +} + +/** + * @memberof VariableLed + * Help URL + * @type {string} + * @category modules + */ +VariableLed.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/3output?id=variableled' +VariableLed.prototype.objectType = 'VariableLed' +VariableLed.prototype.canShowInSubcircuit = true diff --git a/v1/src/simulator/src/modules/XnorGate.js b/v1/src/simulator/src/modules/XnorGate.js new file mode 100644 index 00000000..dd93e734 --- /dev/null +++ b/v1/src/simulator/src/modules/XnorGate.js @@ -0,0 +1,199 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { + correctWidth, + bezierCurveTo, + moveTo, + arc2, + drawCircle2, +} from '../canvasApi' +import { gateGenerateVerilog } from '../utils' + +import { changeInputSize } from '../modules' +/** + * @class + * XnorGate + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} inputLength - number of input nodes + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class XnorGate extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + inputs = 2, + bitWidth = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['XnorGate'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 20) + + this.inp = [] + this.inputSize = inputs + + if (inputs % 2 === 1) { + for (let i = 0; i < inputs / 2 - 1; i++) { + const a = new Node(-20, -10 * (i + 1), 0, this) + this.inp.push(a) + } + let a = new Node(-20, 0, 0, this) + this.inp.push(a) + for (let i = inputs / 2 + 1; i < inputs; i++) { + a = new Node(-20, 10 * (i + 1 - inputs / 2 - 1), 0, this) + this.inp.push(a) + } + } else { + for (let i = 0; i < inputs / 2; i++) { + const a = new Node(-20, -10 * (i + 1), 0, this) + this.inp.push(a) + } + for (let i = inputs / 2; i < inputs; i++) { + const a = new Node(-20, 10 * (i + 1 - inputs / 2), 0, this) + this.inp.push(a) + } + } + this.output1 = new Node(30, 0, 1, this) + } + + /** + * @memberof XnorGate + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.inputSize, + this.bitWidth, + ], + nodes: { + inp: this.inp.map(findNode), + output1: findNode(this.output1), + }, + } + return data + } + + /** + * @memberof XnorGate + * resolve output values based on inputData + */ + resolve() { + let result = this.inp[0].value || 0 + if (this.isResolvable() === false) { + return + } + for (let i = 1; i < this.inputSize; i++) + result ^= this.inp[i].value || 0 + result = + ((~result >>> 0) << (32 - this.bitWidth)) >>> (32 - this.bitWidth) + this.output1.value = result + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof XnorGate + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(3) + + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.fillStyle = colors['fill'] + moveTo(ctx, -10, -20, xx, yy, this.direction, true) + bezierCurveTo(0, -20, +15, -10, 20, 0, xx, yy, this.direction) + bezierCurveTo( + 0 + 15, + 0 + 10, + 0, + 0 + 20, + -10, + +20, + xx, + yy, + this.direction + ) + bezierCurveTo(0, 0, 0, 0, -10, -20, xx, yy, this.direction) + // arc(ctx, 0, 0, -20, (-Math.PI / 2), (Math.PI / 2), xx, yy, this.direction); + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + ctx.beginPath() + arc2( + ctx, + -35, + 0, + 25, + 1.7 * Math.PI, + 0.3 * Math.PI, + xx, + yy, + this.direction + ) + ctx.stroke() + ctx.beginPath() + drawCircle2(ctx, 25, 0, 5, xx, yy, this.direction) + ctx.stroke() + } + + generateVerilog() { + return gateGenerateVerilog.call(this, '^', true) + } +} + +/** + * @memberof XnorGate + * @type {boolean} + * @category modules + */ +XnorGate.prototype.alwaysResolve = true + +/** + * @memberof XnorGate + * Help Tip + * @type {string} + * @category modules + */ +XnorGate.prototype.tooltipText = + 'Xnor Gate ToolTip : Logical complement of the XOR gate' + +/** + * @memberof XnorGate + * function to change input nodes of the element + * @category modules + */ +XnorGate.prototype.changeInputSize = changeInputSize + +/** + * @memberof XnorGate + * @type {string} + * @category modules + */ +XnorGate.prototype.verilogType = 'xnor' +XnorGate.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/4gates?id=xnor-gate' +XnorGate.prototype.objectType = 'XnorGate' diff --git a/v1/src/simulator/src/modules/XorGate.js b/v1/src/simulator/src/modules/XorGate.js new file mode 100644 index 00000000..74c5b0d8 --- /dev/null +++ b/v1/src/simulator/src/modules/XorGate.js @@ -0,0 +1,187 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, bezierCurveTo, moveTo, arc2 } from '../canvasApi' +import { changeInputSize } from '../modules' +import { gateGenerateVerilog } from '../utils' + +/** + * @class + * XorGate + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} inputs - number of input nodes + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +import { colors } from '../themer/themer' + +export default class XorGate extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + inputs = 2, + bitWidth = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['XorGate'].push(this); + */ + this.rectangleObject = false + this.setDimensions(15, 20) + + this.inp = [] + this.inputSize = inputs + + if (inputs % 2 === 1) { + for (let i = 0; i < inputs / 2 - 1; i++) { + const a = new Node(-20, -10 * (i + 1), 0, this) + this.inp.push(a) + } + let a = new Node(-20, 0, 0, this) + this.inp.push(a) + for (let i = inputs / 2 + 1; i < inputs; i++) { + a = new Node(-20, 10 * (i + 1 - inputs / 2 - 1), 0, this) + this.inp.push(a) + } + } else { + for (let i = 0; i < inputs / 2; i++) { + const a = new Node(-20, -10 * (i + 1), 0, this) + this.inp.push(a) + } + for (let i = inputs / 2; i < inputs; i++) { + const a = new Node(-20, 10 * (i + 1 - inputs / 2), 0, this) + this.inp.push(a) + } + } + this.output1 = new Node(20, 0, 1, this) + } + + /** + * @memberof XorGate + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.inputSize, + this.bitWidth, + ], + nodes: { + inp: this.inp.map(findNode), + output1: findNode(this.output1), + }, + } + return data + } + + /** + * @memberof XorGate + * resolve output values based on inputData + */ + resolve() { + let result = this.inp[0].value || 0 + if (this.isResolvable() === false) { + return + } + for (let i = 1; i < this.inputSize; i++) + result ^= this.inp[i].value || 0 + + this.output1.value = result + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof XorGate + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.lineWidth = correctWidth(3) + + const xx = this.x + const yy = this.y + ctx.beginPath() + ctx.fillStyle = colors['fill'] + moveTo(ctx, -10, -20, xx, yy, this.direction, true) + bezierCurveTo(0, -20, +15, -10, 20, 0, xx, yy, this.direction) + bezierCurveTo( + 0 + 15, + 0 + 10, + 0, + 0 + 20, + -10, + +20, + xx, + yy, + this.direction + ) + bezierCurveTo(0, 0, 0, 0, -10, -20, xx, yy, this.direction) + // arc(ctx, 0, 0, -20, (-Math.PI / 2), (Math.PI / 2), xx, yy, this.direction); + ctx.closePath() + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + ctx.beginPath() + arc2( + ctx, + -35, + 0, + 25, + 1.7 * Math.PI, + 0.3 * Math.PI, + xx, + yy, + this.direction + ) + ctx.stroke() + } + + generateVerilog() { + return gateGenerateVerilog.call(this, '^') + } +} + +/** + * @memberof XorGate + * Help Tip + * @type {string} + * @category modules + */ +XorGate.prototype.tooltipText = 'Xor Gate Tooltip : Implements an exclusive OR.' + +/** + * @memberof XorGate + * @type {boolean} + * @category modules + */ +XorGate.prototype.alwaysResolve = true + +/** + * @memberof XorGate + * function to change input nodes of the element + * @category modules + */ +XorGate.prototype.changeInputSize = changeInputSize + +/** + * @memberof XorGate + * @type {string} + * @category modules + */ +XorGate.prototype.verilogType = 'xor' +XorGate.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/4gates?id=xor-gate' +XorGate.prototype.objectType = 'XorGate' diff --git a/v1/src/simulator/src/modules/verilogDivider.js b/v1/src/simulator/src/modules/verilogDivider.js new file mode 100644 index 00000000..cd6acaf5 --- /dev/null +++ b/v1/src/simulator/src/modules/verilogDivider.js @@ -0,0 +1,127 @@ +/* eslint-disable no-bitwise */ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' + +/** + * @class + * verilogDivider + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. modules + * @category modules + */ +export default class verilogDivider extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 1, + outputBitWidth = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['verilogDivider'].push(this); + */ + this.setDimensions(20, 20) + this.outputBitWidth = outputBitWidth + this.inpA = new Node(-20, -10, 0, this, this.bitWidth, 'A') + this.inpB = new Node(-20, 0, 0, this, this.bitWidth, 'B') + this.quotient = new Node( + 20, + 0, + 1, + this, + this.outputBitWidth, + 'Quotient' + ) + this.remainder = new Node( + 20, + 0, + 1, + this, + this.outputBitWidth, + 'Remainder' + ) + } + + /** + * @memberof verilogDivider + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.bitWidth, + this.outputBitWidth, + ], + nodes: { + inpA: findNode(this.inpA), + inpB: findNode(this.inpB), + quotient: findNode(this.quotient), + remainder: findNode(this.remainder), + }, + } + return data + } + + /** + * @memberof verilogDivider + * Checks if the element is resolvable + * @return {boolean} + */ + isResolvable() { + return this.inpA.value !== undefined && this.inpB.value !== undefined + } + + /** + * @memberof verilogDivider + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.inpA.bitWidth = bitWidth + this.inpB.bitWidth = bitWidth + this.quotient.bitWidth = bitWidth + this.remainder.bitWidth = bitWidth + } + + /** + * @memberof verilogDivider + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + const quotient = this.inpA.value / this.inpB.value + const remainder = this.inpA.value % this.inpB.value + this.remainder.value = + (remainder << (32 - this.outputBitWidth)) >>> + (32 - this.outputBitWidth) + this.quotient.value = + (quotient << (32 - this.outputBitWidth)) >>> + (32 - this.outputBitWidth) + simulationArea.simulationQueue.add(this.quotient) + simulationArea.simulationQueue.add(this.remainder) + } +} + +/** + * @memberof verilogDivider + * Help Tip + * @type {string} + * @category modules + */ +verilogDivider.prototype.tooltipText = + 'verilogDivider ToolTip : Performs addition of numbers.' +verilogDivider.prototype.helplink = + 'https://docs.circuitverse.org/#/miscellaneous?id=verilogDivider' +verilogDivider.prototype.objectType = 'verilogDivider' diff --git a/v1/src/simulator/src/modules/verilogMultiplier.js b/v1/src/simulator/src/modules/verilogMultiplier.js new file mode 100644 index 00000000..d428c036 --- /dev/null +++ b/v1/src/simulator/src/modules/verilogMultiplier.js @@ -0,0 +1,106 @@ +/* eslint-disable no-bitwise */ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' + +/** + * @class + * verilogMultiplier + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. modules + * @category modules + */ +export default class verilogMultiplier extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 1, + outputBitWidth = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['verilogMultiplier'].push(this); + */ + this.setDimensions(20, 20) + this.outputBitWidth = outputBitWidth + this.inpA = new Node(-20, -10, 0, this, this.bitWidth, 'A') + this.inpB = new Node(-20, 0, 0, this, this.bitWidth, 'B') + this.product = new Node(20, 0, 1, this, this.outputBitWidth, 'Product') + } + + /** + * @memberof verilogMultiplier + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.bitWidth, + this.outputBitWidth, + ], + nodes: { + inpA: findNode(this.inpA), + inpB: findNode(this.inpB), + product: findNode(this.product), + }, + } + return data + } + + /** + * @memberof verilogMultiplier + * Checks if the element is resolvable + * @return {boolean} + */ + isResolvable() { + return this.inpA.value !== undefined && this.inpB.value !== undefined + } + + /** + * @memberof verilogMultiplier + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.inpA.bitWidth = bitWidth + this.inpB.bitWidth = bitWidth + this.product.bitWidth = bitWidth + } + + /** + * @memberof verilogMultiplier + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + const product = this.inpA.value * this.inpB.value + + this.product.value = + (product << (32 - this.outputBitWidth)) >>> + (32 - this.outputBitWidth) + simulationArea.simulationQueue.add(this.product) + } +} + +/** + * @memberof verilogMultiplier + * Help Tip + * @type {string} + * @category modules + */ +verilogMultiplier.prototype.tooltipText = + 'verilogMultiplier ToolTip : Performs addition of numbers.' +verilogMultiplier.prototype.helplink = + 'https://docs.circuitverse.org/#/miscellaneous?id=verilogMultiplier' +verilogMultiplier.prototype.objectType = 'verilogMultiplier' diff --git a/v1/src/simulator/src/modules/verilogPower.js b/v1/src/simulator/src/modules/verilogPower.js new file mode 100644 index 00000000..ded6fdc1 --- /dev/null +++ b/v1/src/simulator/src/modules/verilogPower.js @@ -0,0 +1,106 @@ +/* eslint-disable no-bitwise */ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' + +/** + * @class + * verilogPower + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. modules + * @category modules + */ +export default class verilogPower extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 1, + outputBitWidth = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['verilogPower'].push(this); + */ + this.setDimensions(20, 20) + this.outputBitWidth = outputBitWidth + this.inpA = new Node(-20, -10, 0, this, this.bitWidth, 'A') + this.inpB = new Node(-20, 0, 0, this, this.bitWidth, 'B') + this.answer = new Node(20, 0, 1, this, this.outputBitWidth, 'Answer') + } + + /** + * @memberof verilogPower + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.bitWidth, + this.outputBitWidth, + ], + nodes: { + inpA: findNode(this.inpA), + inpB: findNode(this.inpB), + answer: findNode(this.answer), + }, + } + return data + } + + /** + * @memberof verilogPower + * Checks if the element is resolvable + * @return {boolean} + */ + isResolvable() { + return this.inpA.value !== undefined && this.inpB.value !== undefined + } + + /** + * @memberof verilogPower + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.inpA.bitWidth = bitWidth + this.inpB.bitWidth = bitWidth + this.answer.bitWidth = bitWidth + } + + /** + * @memberof verilogPower + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + const answer = Math.pow(this.inpA.value, this.inpB.value) + + this.answer.value = + (answer << (32 - this.outputBitWidth)) >>> + (32 - this.outputBitWidth) + simulationArea.simulationQueue.add(this.answer) + } +} + +/** + * @memberof verilogPower + * Help Tip + * @type {string} + * @category modules + */ +verilogPower.prototype.tooltipText = + 'verilogPower ToolTip : Performs addition of numbers.' +verilogPower.prototype.helplink = + 'https://docs.circuitverse.org/#/miscellaneous?id=verilogPower' +verilogPower.prototype.objectType = 'verilogPower' diff --git a/v1/src/simulator/src/modules/verilogShiftLeft.js b/v1/src/simulator/src/modules/verilogShiftLeft.js new file mode 100644 index 00000000..65a61a4c --- /dev/null +++ b/v1/src/simulator/src/modules/verilogShiftLeft.js @@ -0,0 +1,108 @@ +/* eslint-disable no-bitwise */ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' + +/** + * @class + * verilogShiftLeft + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. modules + * @category modules + */ +export default class verilogShiftLeft extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 1, + outputBitWidth = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['verilogShiftLeft'].push(this); + */ + this.setDimensions(20, 20) + this.outputBitWidth = outputBitWidth + this.inp1 = new Node(-20, -10, 0, this, this.bitWidth, 'Input') + this.shiftInp = new Node(-20, 0, 0, this, this.bitWidth, 'ShiftInput') + this.output1 = new Node(20, 0, 1, this, this.outputBitWidth, 'Output') + } + + /** + * @memberof verilogShiftLeft + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.bitWidth, + this.outputBitWidth, + ], + nodes: { + inp1: findNode(this.inp1), + shiftInp: findNode(this.shiftInp), + output1: findNode(this.output1), + }, + } + return data + } + + /** + * @memberof verilogShiftLeft + * Checks if the element is resolvable + * @return {boolean} + */ + isResolvable() { + return ( + this.inp1.value !== undefined && this.shiftInp.value !== undefined + ) + } + + /** + * @memberof verilogShiftLeft + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.inp1.bitWidth = bitWidth + this.shiftInp.bitWidth = bitWidth + this.output1.bitWidth = bitWidth + } + + /** + * @memberof verilogShiftLeft + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + const output1 = this.inp1.value << this.shiftInp.value + + this.output1.value = + (output1 << (32 - this.outputBitWidth)) >>> + (32 - this.outputBitWidth) + simulationArea.simulationQueue.add(this.output1) + } +} + +/** + * @memberof verilogShiftLeft + * Help Tip + * @type {string} + * @category modules + */ +verilogShiftLeft.prototype.tooltipText = + 'verilogShiftLeft ToolTip : Performs addition of numbers.' +verilogShiftLeft.prototype.helplink = + 'https://docs.circuitverse.org/#/miscellaneous?id=verilogShiftLeft' +verilogShiftLeft.prototype.objectType = 'verilogShiftLeft' diff --git a/v1/src/simulator/src/modules/verilogShiftRight.js b/v1/src/simulator/src/modules/verilogShiftRight.js new file mode 100644 index 00000000..a37332fb --- /dev/null +++ b/v1/src/simulator/src/modules/verilogShiftRight.js @@ -0,0 +1,108 @@ +/* eslint-disable no-bitwise */ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' + +/** + * @class + * verilogShiftRight + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. modules + * @category modules + */ +export default class verilogShiftRight extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 1, + outputBitWidth = 1 + ) { + super(x, y, scope, dir, bitWidth) + /* this is done in this.baseSetup() now + this.scope['verilogShiftRight'].push(this); + */ + this.setDimensions(20, 20) + this.outputBitWidth = outputBitWidth + this.inp1 = new Node(-20, -10, 0, this, this.bitWidth, 'Input') + this.shiftInp = new Node(-20, 0, 0, this, this.bitWidth, 'ShiftInput') + this.output1 = new Node(20, 0, 1, this, this.outputBitWidth, 'Output') + } + + /** + * @memberof verilogShiftRight + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [ + this.direction, + this.bitWidth, + this.outputBitWidth, + ], + nodes: { + inp1: findNode(this.inp1), + shiftInp: findNode(this.shiftInp), + output1: findNode(this.output1), + }, + } + return data + } + + /** + * @memberof verilogShiftRight + * Checks if the element is resolvable + * @return {boolean} + */ + isResolvable() { + return ( + this.inp1.value !== undefined && this.shiftInp.value !== undefined + ) + } + + /** + * @memberof verilogShiftRight + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.inp1.bitWidth = bitWidth + this.shiftInp.bitWidth = bitWidth + this.output1.bitWidth = bitWidth + } + + /** + * @memberof verilogShiftRight + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + const output1 = this.inp1.value >> this.shiftInp.value + + this.output1.value = + (output1 << (32 - this.outputBitWidth)) >>> + (32 - this.outputBitWidth) + simulationArea.simulationQueue.add(this.output1) + } +} + +/** + * @memberof verilogShiftRight + * Help Tip + * @type {string} + * @category modules + */ +verilogShiftRight.prototype.tooltipText = + 'verilogShiftRight ToolTip : Performs addition of numbers.' +verilogShiftRight.prototype.helplink = + 'https://docs.circuitverse.org/#/miscellaneous?id=verilogShiftRight' +verilogShiftRight.prototype.objectType = 'verilogShiftRight' diff --git a/v1/src/simulator/src/node.js b/v1/src/simulator/src/node.js new file mode 100644 index 00000000..696a664b --- /dev/null +++ b/v1/src/simulator/src/node.js @@ -0,0 +1,1021 @@ +/* eslint-disable import/no-cycle */ +import { drawCircle, drawLine, arc } from './canvasApi' +import simulationArea from './simulationArea' +import { distance, showError } from './utils' +import { + renderCanvas, + scheduleUpdate, + wireToBeCheckedSet, + updateSimulationSet, + updateCanvasSet, + forceResetNodesSet, + canvasMessageData, +} from './engine' +import Wire from './wire' +// import { colors } from './themer/themer'; +import { colors } from './themer/themer' + +/** + * Constructs all the connections of Node node + * @param {Node} node - node to be constructed + * @param {JSON} data - the saved data which is used to load + * @category node + */ +export function constructNodeConnections(node, data) { + for (var i = 0; i < data.connections.length; i++) { + if ( + !node.connections.contains(node.scope.allNodes[data.connections[i]]) + ) + node.connect(node.scope.allNodes[data.connections[i]]) + } +} + +/** + * Fn to replace node by node @ index in global Node List - used when loading + * @param {Node} node - node to be replaced + * @param {number} index - index of node to be replaced + * @category node + */ +export function replace(node, index) { + if (index == -1) { + return node + } + var { scope } = node + var { parent } = node + parent.nodeList.clean(node) + node.delete() + node = scope.allNodes[index] + node.parent = parent + parent.nodeList.push(node) + node.updateRotation() + return node +} +function rotate(x1, y1, dir) { + if (dir == 'LEFT') { + return [-x1, y1] + } + if (dir == 'DOWN') { + return [y1, x1] + } + if (dir == 'UP') { + return [y1, -x1] + } + return [x1, y1] +} + +export function extractBits(num, start, end) { + return (num << (32 - end)) >>> (32 - (end - start + 1)) +} + +export function bin2dec(binString) { + return parseInt(binString, 2) +} + +export function dec2bin(dec, bitWidth = undefined) { + // only for positive nos + var bin = dec.toString(2) + if (bitWidth == undefined) return bin + return '0'.repeat(bitWidth - bin.length) + bin +} + +/** + * find Index of a node + * @param {Node} x - Node to be dound + * @category node + */ +export function findNode(x) { + return x.scope.allNodes.indexOf(x) +} + +/** + * function makes a node according to data providede + * @param {JSON} data - the data used to load a Project + * @param {Scope} scope - scope to which node has to be loaded + * @category node + */ +export function loadNode(data, scope) { + var n = new Node( + data.x, + data.y, + data.type, + scope.root, + data.bitWidth, + data.label + ) +} + +/** + * get Node in index x in scope and set parent + * @param {Node} x - the desired node + * @param {Scope} scope - the scope + * @param {CircuitElement} parent - The parent of node + * @category node + */ +function extractNode(x, scope, parent) { + var n = scope.allNodes[x] + n.parent = parent + return n +} + +// output node=1 +// input node=0 +// intermediate node =2 + +window.NODE_INPUT = 0 +window.NODE_OUTPUT = 1 +window.NODE_INTERMEDIATE = 2 +/** + * used to give id to a node. + * @type {number} + * @category node + */ +var uniqueIdCounter = 10 + +/** + * This class is responsible for all the Nodes.Nodes are connected using Wires + * Nodes are of 3 types; + * NODE_INPUT = 0; + * NODE_OUTPUT = 1; + * NODE_INTERMEDIATE = 2; + * Input and output nodes belong to some CircuitElement(it's parent) + * @param {number} x - x coord of Node + * @param {number} y - y coord of Node + * @param {number} type - type of node + * @param {CircuitElement} parent - parent element + * @param {?number} bitWidth - the bits of node in input and output nodes + * @param {string=} label - label for a node + * @category node + */ +export default class Node { + constructor(x, y, type, parent, bitWidth = undefined, label = '') { + // Should never raise, but just in case + if (isNaN(x) || isNaN(y)) { + this.delete() + showError('Fatal error occurred') + return + } + + forceResetNodesSet(true) + + this.objectType = 'Node' + this.subcircuitOverride = false + this.id = `node${uniqueIdCounter}` + uniqueIdCounter++ + this.parent = parent + if (type != 2 && this.parent.nodeList !== undefined) { + this.parent.nodeList.push(this) + } + + if (bitWidth == undefined) { + this.bitWidth = parent.bitWidth + } else { + this.bitWidth = bitWidth + } + this.label = label + this.prevx = undefined + this.prevy = undefined + this.leftx = x + this.lefty = y + this.x = x + this.y = y + + this.type = type + this.connections = new Array() + this.value = undefined + this.radius = 5 + this.clicked = false + this.hover = false + this.wasClicked = false + this.scope = this.parent.scope + /** + * @type {string} + * value of this.prev is + * 'a' : whenever a node is not being dragged this.prev is 'a' + * 'x' : when node is being dragged horizontally + * 'y' : when node is being dragged vertically + */ + this.prev = 'a' + this.count = 0 + this.highlighted = false + + // This fn is called during rotations and setup + this.refresh() + + if (this.type == 2) { + this.parent.scope.nodes.push(this) + } + + this.parent.scope.allNodes.push(this) + + this.queueProperties = { + inQueue: false, + time: undefined, + index: undefined, + } + } + + /** + * @param {string} - new label + * Function to set label + */ + setLabel(label) { + this.label = label // || ""; + } + + /** + * function to convert a node to intermediate node + */ + converToIntermediate() { + this.type = 2 + this.x = this.absX() + this.y = this.absY() + this.parent = this.scope.root + this.scope.nodes.push(this) + } + + /** + * Helper fuction to move a node. Sets up some variable which help in changing node. + */ + startDragging() { + this.oldx = this.x + this.oldy = this.y + } + + /** + * Helper fuction to move a node. + */ + drag() { + this.x = this.oldx + simulationArea.mouseX - simulationArea.mouseDownX + this.y = this.oldy + simulationArea.mouseY - simulationArea.mouseDownY + } + + /** + * Funciton for saving a node + */ + saveObject() { + if (this.type == 2) { + this.leftx = this.x + this.lefty = this.y + } + var data = { + x: this.leftx, + y: this.lefty, + type: this.type, + bitWidth: this.bitWidth, + label: this.label, + connections: [], + } + for (var i = 0; i < this.connections.length; i++) { + data.connections.push(findNode(this.connections[i])) + } + return data + } + + /** + * helper function to help rotating parent + */ + updateRotation() { + var x + var y + ;[x, y] = rotate(this.leftx, this.lefty, this.parent.direction) + this.x = x + this.y = y + } + + /** + * Refreshes a node after roation of parent + */ + refresh() { + this.updateRotation() + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].connections.clean(this) + } + this.connections = [] + } + + /** + * gives absolute x position of the node + */ + absX() { + return this.x + this.parent.x + } + + /** + * gives absolute y position of the node + */ + absY() { + return this.y + this.parent.y + } + + /** + * update the scope of a node + */ + updateScope(scope) { + this.scope = scope + if (this.type == 2) this.parent = scope.root + } + + /** + * return true if node is connected or not connected but false if undefined. + */ + isResolvable() { + return this.value != undefined + } + + /** + * function used to reset the nodes + */ + reset() { + this.value = undefined + this.highlighted = false + } + + /** + * function to connect two nodes. + */ + connect(n) { + if (n == this) return + if (n.connections.contains(this)) return + var w = new Wire(this, n, this.parent.scope) + this.connections.push(n) + n.connections.push(this) + + updateCanvasSet(true) + updateSimulationSet(true) + scheduleUpdate() + } + + /** + * connects but doesnt draw the wire between nodes + */ + connectWireLess(n) { + if (n == this) return + if (n.connections.contains(this)) return + this.connections.push(n) + n.connections.push(this) + + updateCanvasSet(true) + updateSimulationSet(true) + scheduleUpdate() + } + + /** + * disconnecting two nodes connected wirelessly + */ + disconnectWireLess(n) { + this.connections.clean(n) + n.connections.clean(this) + } + + /** + * function to resolve a node + */ + resolve() { + // Remove Propogation of values (TriState) + if (this.value == undefined) { + for (var i = 0; i < this.connections.length; i++) { + if (this.connections[i].value !== undefined) { + this.connections[i].value = undefined + simulationArea.simulationQueue.add(this.connections[i]) + } + } + + if (this.type == NODE_INPUT) { + if (this.parent.objectType == 'Splitter') { + this.parent.removePropagation() + } else if (this.parent.isResolvable()) { + simulationArea.simulationQueue.add(this.parent) + } else { + this.parent.removePropagation() + } + } + + if (this.type == NODE_OUTPUT && !this.subcircuitOverride) { + if ( + this.parent.isResolvable() && + !this.parent.queueProperties.inQueue + ) { + if (this.parent.objectType == 'TriState') { + if (this.parent.state.value) { + simulationArea.simulationQueue.add(this.parent) + } + } else { + simulationArea.simulationQueue.add(this.parent) + } + } + } + + return + } + + if (this.type == 0) { + if (this.parent.isResolvable()) { + simulationArea.simulationQueue.add(this.parent) + } + } + + for (var i = 0; i < this.connections.length; i++) { + const node = this.connections[i] + + if (node.value != this.value || node.bitWidth != this.bitWidth) { + if ( + node.type == 1 && + node.value != undefined && + node.parent.objectType != 'TriState' && + !(node.subcircuitOverride && node.scope != this.scope) && // Subcircuit Input Node Output Override + node.parent.objectType != 'SubCircuit' + ) { + // Subcircuit Output Node Override + this.highlighted = true + node.highlighted = true + var circuitName = node.scope.name + var circuitElementName = node.parent.objectType + showError( + `Contention Error: ${this.value} and ${node.value} at ${circuitElementName} in ${circuitName}` + ) + } else if (node.bitWidth == this.bitWidth || node.type == 2) { + if ( + node.parent.objectType == 'TriState' && + node.value != undefined && + node.type == 1 + ) { + if (node.parent.state.value) { + simulationArea.contentionPending.push(node.parent) + } + } + + node.bitWidth = this.bitWidth + node.value = this.value + simulationArea.simulationQueue.add(node) + } else { + this.highlighted = true + node.highlighted = true + showError( + `BitWidth Error: ${this.bitWidth} and ${node.bitWidth}` + ) + } + } + } + } + + /** + * this function checks if hover over the node + */ + checkHover() { + if (!simulationArea.mouseDown) { + if (simulationArea.hover == this) { + this.hover = this.isHover() + if (!this.hover) { + simulationArea.hover = undefined + this.showHover = false + } + } else if (!simulationArea.hover) { + this.hover = this.isHover() + if (this.hover) { + simulationArea.hover = this + } else { + this.showHover = false + } + } else { + this.hover = false + this.showHover = false + } + } + } + + /** + * this function draw a node + */ + draw() { + const ctx = simulationArea.context + // + const color = colors['color_wire_draw'] + if (this.clicked) { + if (this.prev == 'x') { + drawLine( + ctx, + this.absX(), + this.absY(), + simulationArea.mouseX, + this.absY(), + color, + 3 + ) + drawLine( + ctx, + simulationArea.mouseX, + this.absY(), + simulationArea.mouseX, + simulationArea.mouseY, + color, + 3 + ) + } else if (this.prev == 'y') { + drawLine( + ctx, + this.absX(), + this.absY(), + this.absX(), + simulationArea.mouseY, + color, + 3 + ) + drawLine( + ctx, + this.absX(), + simulationArea.mouseY, + simulationArea.mouseX, + simulationArea.mouseY, + color, + 3 + ) + } else if ( + Math.abs(this.x + this.parent.x - simulationArea.mouseX) > + Math.abs(this.y + this.parent.y - simulationArea.mouseY) + ) { + drawLine( + ctx, + this.absX(), + this.absY(), + simulationArea.mouseX, + this.absY(), + color, + 3 + ) + } else { + drawLine( + ctx, + this.absX(), + this.absY(), + this.absX(), + simulationArea.mouseY, + color, + 3 + ) + } + } + var colorNode = colors['stroke'] + const colorNodeConnect = colors['color_wire_con'] + const colorNodePow = colors['color_wire_pow'] + const colorNodeLose = colors['color_wire_lose'] + const colorNodeSelected = colors['node'] + + if (this.bitWidth == 1) + colorNode = [colorNodeConnect, colorNodePow][this.value] + if (this.value == undefined) colorNode = colorNodeLose + if (this.type == 2) this.checkHover() + if (this.type == 2) { + drawCircle(ctx, this.absX(), this.absY(), 3, colorNode) + } else { + drawCircle(ctx, this.absX(), this.absY(), 3, colorNodeSelected) + } + + if ( + this.highlighted || + simulationArea.lastSelected == this || + (this.isHover() && + !simulationArea.selected && + !simulationArea.shiftDown) || + simulationArea.multipleObjectSelections.contains(this) + ) { + ctx.strokeStyle = colorNodeSelected + ctx.beginPath() + ctx.lineWidth = 3 + arc( + ctx, + this.x, + this.y, + 8, + 0, + Math.PI * 2, + this.parent.x, + this.parent.y, + 'RIGHT' + ) + ctx.closePath() + ctx.stroke() + } + + if (this.hover || simulationArea.lastSelected == this) { + if (this.showHover || simulationArea.lastSelected == this) { + canvasMessageData.x = this.absX() + canvasMessageData.y = this.absY() - 15 + if (this.type == 2) { + var v = 'X' + if (this.value !== undefined) { + v = this.value.toString(16) + } + if (this.label.length) { + canvasMessageData.string = `${this.label} : ${v}` + } else { + canvasMessageData.string = v + } + } else if (this.label.length) { + canvasMessageData.string = this.label + } + } else { + setTimeout(() => { + if (simulationArea.hover) + simulationArea.hover.showHover = true + updateCanvasSet(true) + renderCanvas(globalScope) + }, 400) + } + } + } + + /** + * checks if a node has been deleted + */ + checkDeleted() { + if (this.deleted) this.delete() + if (this.connections.length == 0 && this.type == 2) this.delete() + } + + /** + * used to update nodes if there is a event like click or hover on the node. + * many booleans are used to check if certain properties are to be updated. + */ + update() { + if (embed) return + + if (this == simulationArea.hover) simulationArea.hover = undefined + this.hover = this.isHover() + + if (!simulationArea.mouseDown) { + if (this.absX() != this.prevx || this.absY() != this.prevy) { + // Connect to any node + this.prevx = this.absX() + this.prevy = this.absY() + this.nodeConnect() + } + } + + if (this.hover) { + simulationArea.hover = this + } + + if ( + simulationArea.mouseDown && + ((this.hover && !simulationArea.selected) || + simulationArea.lastSelected == this) + ) { + simulationArea.selected = true + simulationArea.lastSelected = this + this.clicked = true + } else { + this.clicked = false + } + + if (!this.wasClicked && this.clicked) { + this.wasClicked = true + this.prev = 'a' + if (this.type == 2) { + if ( + !simulationArea.shiftDown && + simulationArea.multipleObjectSelections.contains(this) + ) { + for ( + var i = 0; + i < simulationArea.multipleObjectSelections.length; + i++ + ) { + simulationArea.multipleObjectSelections[ + i + ].startDragging() + } + } + + if (simulationArea.shiftDown) { + simulationArea.lastSelected = undefined + if ( + simulationArea.multipleObjectSelections.contains(this) + ) { + simulationArea.multipleObjectSelections.clean(this) + } else { + simulationArea.multipleObjectSelections.push(this) + } + } else { + simulationArea.lastSelected = this + } + } + } else if (this.wasClicked && this.clicked) { + if ( + !simulationArea.shiftDown && + simulationArea.multipleObjectSelections.contains(this) + ) { + for ( + var i = 0; + i < simulationArea.multipleObjectSelections.length; + i++ + ) { + simulationArea.multipleObjectSelections[i].drag() + } + } + if (this.type == 2) { + if ( + this.connections.length == 1 && + this.connections[0].absX() == simulationArea.mouseX && + this.absX() == simulationArea.mouseX + ) { + this.y = simulationArea.mouseY - this.parent.y + this.prev = 'a' + return + } + if ( + this.connections.length == 1 && + this.connections[0].absY() == simulationArea.mouseY && + this.absY() == simulationArea.mouseY + ) { + this.x = simulationArea.mouseX - this.parent.x + this.prev = 'a' + return + } + if ( + this.connections.length == 1 && + this.connections[0].absX() == this.absX() && + this.connections[0].absY() == this.absY() + ) { + this.connections[0].clicked = true + this.connections[0].wasClicked = true + simulationArea.lastSelected = this.connections[0] + this.delete() + return + } + } + + if ( + this.prev == 'a' && + distance( + simulationArea.mouseX, + simulationArea.mouseY, + this.absX(), + this.absY() + ) >= 10 + ) { + if ( + Math.abs(this.x + this.parent.x - simulationArea.mouseX) > + Math.abs(this.y + this.parent.y - simulationArea.mouseY) + ) { + this.prev = 'x' + } else { + this.prev = 'y' + } + } else if ( + this.prev == 'x' && + this.absY() == simulationArea.mouseY + ) { + this.prev = 'a' + } else if ( + this.prev == 'y' && + this.absX() == simulationArea.mouseX + ) { + this.prev = 'a' + } + } else if (this.wasClicked && !this.clicked) { + this.wasClicked = false + + if ( + simulationArea.mouseX == this.absX() && + simulationArea.mouseY == this.absY() + ) { + return // no new node situation + } + + var x1 + var y1 + var x2 + var y2 + var flag = 0 + var n1 + var n2 + + // (x,y) present node, (x1,y1) node 1 , (x2,y2) node 2 + // n1 - node 1, n2 - node 2 + // node 1 may or may not be there + // flag = 0 - node 2 only + // flag = 1 - node 1 and node 2 + x2 = simulationArea.mouseX + y2 = simulationArea.mouseY + const x = this.absX() + const y = this.absY() + + if (x != x2 && y != y2) { + // Rare Exception Cases + if ( + this.prev == 'a' && + distance( + simulationArea.mouseX, + simulationArea.mouseY, + this.absX(), + this.absY() + ) >= 10 + ) { + if ( + Math.abs( + this.x + this.parent.x - simulationArea.mouseX + ) > + Math.abs(this.y + this.parent.y - simulationArea.mouseY) + ) { + this.prev = 'x' + } else { + this.prev = 'y' + } + } + + flag = 1 + if (this.prev == 'x') { + x1 = x2 + y1 = y + } else if (this.prev == 'y') { + y1 = y2 + x1 = x + } + } + + if (flag == 1) { + for (var i = 0; i < this.parent.scope.allNodes.length; i++) { + if ( + x1 == this.parent.scope.allNodes[i].absX() && + y1 == this.parent.scope.allNodes[i].absY() + ) { + n1 = this.parent.scope.allNodes[i] + break + } + } + + if (n1 == undefined) { + n1 = new Node(x1, y1, 2, this.scope.root) + for (var i = 0; i < this.parent.scope.wires.length; i++) { + if (this.parent.scope.wires[i].checkConvergence(n1)) { + this.parent.scope.wires[i].converge(n1) + break + } + } + } + this.connect(n1) + } + + for (var i = 0; i < this.parent.scope.allNodes.length; i++) { + if ( + x2 == this.parent.scope.allNodes[i].absX() && + y2 == this.parent.scope.allNodes[i].absY() + ) { + n2 = this.parent.scope.allNodes[i] + break + } + } + + if (n2 == undefined) { + n2 = new Node(x2, y2, 2, this.scope.root) + for (var i = 0; i < this.parent.scope.wires.length; i++) { + if (this.parent.scope.wires[i].checkConvergence(n2)) { + this.parent.scope.wires[i].converge(n2) + break + } + } + } + if (flag == 0) this.connect(n2) + else n1.connect(n2) + if (simulationArea.lastSelected == this) + simulationArea.lastSelected = n2 + } + + if (this.type == 2 && simulationArea.mouseDown == false) { + if (this.connections.length == 2) { + if ( + this.connections[0].absX() == this.connections[1].absX() || + this.connections[0].absY() == this.connections[1].absY() + ) { + this.connections[0].connect(this.connections[1]) + this.delete() + } + } else if (this.connections.length == 0) this.delete() + } + } + + /** + * function delete a node + */ + delete() { + updateSimulationSet(true) + this.deleted = true + this.parent.scope.allNodes.clean(this) + this.parent.scope.nodes.clean(this) + + this.parent.scope.root.nodeList.clean(this) // Hope this works! - Can cause bugs + + if (simulationArea.lastSelected == this) + simulationArea.lastSelected = undefined + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].connections.clean(this) + this.connections[i].checkDeleted() + } + wireToBeCheckedSet(1) + forceResetNodesSet(true) + scheduleUpdate() + } + + isClicked() { + return ( + this.absX() == simulationArea.mouseX && + this.absY() == simulationArea.mouseY + ) + } + + isHover() { + return ( + this.absX() == simulationArea.mouseX && + this.absY() == simulationArea.mouseY + ) + } + + /** + * if input nodde: it resolves the parent + * else: it adds all the nodes onto the stack + * and they are processed to generate verilog + */ + nodeConnect() { + var x = this.absX() + var y = this.absY() + var n + + for (var i = 0; i < this.parent.scope.allNodes.length; i++) { + if ( + this != this.parent.scope.allNodes[i] && + x == this.parent.scope.allNodes[i].absX() && + y == this.parent.scope.allNodes[i].absY() + ) { + n = this.parent.scope.allNodes[i] + if (this.type == 2) { + for (var j = 0; j < this.connections.length; j++) { + n.connect(this.connections[j]) + } + this.delete() + } else { + this.connect(n) + } + + break + } + } + + if (n == undefined) { + for (var i = 0; i < this.parent.scope.wires.length; i++) { + if (this.parent.scope.wires[i].checkConvergence(this)) { + var n = this + if (this.type != 2) { + n = new Node( + this.absX(), + this.absY(), + 2, + this.scope.root + ) + this.connect(n) + } + this.parent.scope.wires[i].converge(n) + break + } + } + } + } + + processVerilog() { + if (this.type == NODE_INPUT) { + if (this.parent.isVerilogResolvable()) { + this.scope.stack.push(this.parent) + } + } + + for (var i = 0; i < this.connections.length; i++) { + if (this.connections[i].verilogLabel != this.verilogLabel) { + this.connections[i].verilogLabel = this.verilogLabel + this.scope.stack.push(this.connections[i]) + } + } + } +} + +/** + * delay in simulation of the node. + * @category node + */ +Node.prototype.propagationDelay = 0 + +/** + * backward comaptibilty? + * @category node + */ +Node.prototype.cleanDelete = Node.prototype.delete + +Node.prototype.processVerilog = function () { + if (this.type == NODE_INPUT) { + this.scope.stack.push(this.parent) + } + for (var i = 0; i < this.connections.length; i++) { + if (this.connections[i].verilogLabel != this.verilogLabel) { + this.connections[i].verilogLabel = this.verilogLabel + this.scope.stack.push(this.connections[i]) + } + } +} diff --git a/v1/src/simulator/src/plotArea.js b/v1/src/simulator/src/plotArea.js new file mode 100644 index 00000000..79bf2582 --- /dev/null +++ b/v1/src/simulator/src/plotArea.js @@ -0,0 +1,521 @@ +import simulationArea from './simulationArea' +import { convertors } from './utils' + +var DPR = window.devicePixelRatio || 1 + +// Helper function to scale to display +function sh(x) { + return x * DPR +} + +/** + * Spec Constants + * Size Spec Diagram - https://app.diagrams.net/#G1HFoesRvNyDap95sNJswTy3nH09emDriC + * NOTE: Since DPR is set on page load, changing of screen in runtime will not work well + * @TODO + * - Support for color themes + * - Replace constants with functions? - Can support Zoom in and Zoom out of canvas then + */ +var frameInterval = 100 // Refresh rate +var timeLineHeight = sh(20) +var padding = sh(2) +var plotHeight = sh(20) +var waveFormPadding = sh(5) +var waveFormHeight = plotHeight - 2 * waveFormPadding +var flagLabelWidth = sh(75) +var cycleWidth = sh(30) +var backgroundColor = 'black' +var foregroundColor = '#eee' +var textColor = 'black' +var waveFormColor = 'cyan' +var timeLineStartX = flagLabelWidth + padding + +// Helper functions for canvas + +function getFullHeight(flagCount) { + return timeLineHeight + (plotHeight + padding) * flagCount +} + +function getFlagStartY(flagIndex) { + return getFullHeight(flagIndex) + padding +} + +function getCycleStartX(cycleNumber) { + return timeLineStartX + (cycleNumber - plotArea.cycleOffset) * cycleWidth +} + +/** + * @type {Object} plotArea + * @category plotArea + */ +const plotArea = { + cycleOffset: 0, // Determines timeline offset + DPR: window.devicePixelRatio || 1, + canvas: document.getElementById('plotArea'), + cycleCount: 0, // Number of clock cycles passed + cycleTime: 0, // Time of last clock tick (in ms) + executionStartTime: 0, // Last time play() function ran in engine.js (in ms) + autoScroll: true, // if true, timeline will scroll to keep current time in display + width: 0, // canvas width + height: 0, // canvas height + unitUsed: 0, // Number of simulation units used by the engine + cycleUnit: 1000, // Number of simulation units per cycle + mouseDown: false, + mouseX: 0, // Current mouse position + mouseDownX: 0, // position of mouse when clicked + mouseDownTime: 0, // time when mouse clicked (in ms) + // Reset timeline to 0 and resume autoscroll + reset() { + this.cycleCount = 0 + this.cycleTime = new Date().getTime() + for (var i = 0; i < globalScope.Flag.length; i++) { + globalScope.Flag[i].plotValues = [ + [0, globalScope.Flag[i].inp1.value], + ] + globalScope.Flag[i].cachedIndex = 0 + } + this.unitUsed = 0 + this.resume() + this.resize() + }, + // Resume autoscroll + resume() { + this.autoScroll = true + }, + // pause autoscroll + pause() { + this.autoScroll = false + plotArea.scrollAcc = 0 + }, + // Called every time clock is ticked + nextCycle() { + this.cycleCount++ + this.cycleTime = new Date().getTime() + }, + // Called everytime play() function is execute in engine.js + setExecutionTime() { + this.executionStartTime = new Date().getTime() + }, + // Scale timeline up + zoomIn() { + cycleWidth += sh(2) + }, + // Scale timeline down + zoomOut() { + cycleWidth -= sh(2) + }, + // download as image + download() { + var img = this.canvas.toDataURL(`image/png`) + const anchor = document.createElement('a') + anchor.href = img + anchor.download = `waveform.png` + anchor.click() + }, + // update canvas size to use full screen + resize() { + var oldHeight = this.height + var oldWidth = this.width + this.width = document.getElementById('plot').clientWidth * this.DPR + this.height = getFullHeight(globalScope.Flag.length) + if (oldHeight == this.height && oldWidth == this.width) return + this.canvas.width = this.width + this.canvas.height = this.height + this.plot() + }, + // Setup function, called on page load + setup() { + this.canvas = document.getElementById('plotArea') + if (!embed) { + this.ctx = this.canvas.getContext('2d') + } + this.timeOutPlot = setInterval(() => { + plotArea.plot() + }, frameInterval) + this.reset() + }, + // Used to resolve analytical time in clock cycles + getPlotTime(timeUnit) { + var time = this.cycleCount // Current cycle count + time += timeUnit / this.cycleUnit // Add propagation delay + // For user interactions like buttons - calculate time since clock tick + var timePeriod = simulationArea.timePeriod + var executionDelay = this.executionStartTime - this.cycleTime + var delayFraction = executionDelay / timePeriod + // Add time since clock tick + time += delayFraction + return time + }, + // Auto calibrate clock simulation units based on usage + calibrate() { + var recommendedUnit = Math.max(20, Math.round(this.unitUsed * 3)) + this.cycleUnit = recommendedUnit + $('#timing-diagram-units').val(recommendedUnit) + this.reset() + }, + // Get current time in clock cycles + getCurrentTime() { + var time = this.cycleCount + var timePeriod = simulationArea.timePeriod + var delay = new Date().getTime() - this.cycleTime + var delayFraction = delay / timePeriod + time += delayFraction + return time + }, + update() { + this.resize() + var dangerColor = '#dc5656' + var normalColor = '#42b983' + this.unitUsed = Math.max( + this.unitUsed, + simulationArea.simulationQueue.time + ) + var unitUsed = this.unitUsed + var units = this.cycleUnit + var utilization = Math.round((unitUsed * 10000) / units) / 100 + $('#timing-diagram-log').html( + `Utilization: ${Math.round(unitUsed)} Units (${utilization}%)` + ) + if (utilization >= 90 || utilization <= 10) { + var recommendedUnit = Math.max(20, Math.round(unitUsed * 3)) + $('#timing-diagram-log').append( + ` Recommended Units: ${recommendedUnit}` + ) + $('#timing-diagram-log').css('background-color', dangerColor) + if (utilization >= 100) { + this.clear() + return + } + } else { + $('#timing-diagram-log').css('background-color', normalColor) + } + + var width = this.width + var endTime = this.getCurrentTime() + + if (this.autoScroll) { + // Formula used: + // (endTime - x) * cycleWidth = width - timeLineStartX; + // x = endTime - (width - timeLineStartX) / cycleWidth + this.cycleOffset = Math.max( + 0, + endTime - (width - timeLineStartX) / cycleWidth + ) + } else if (!plotArea.mouseDown) { + // Scroll + this.cycleOffset -= plotArea.scrollAcc + // Friction + plotArea.scrollAcc *= 0.95 + // No negative numbers allowed, so negative scroll to 0 + if (this.cycleOffset < 0) plotArea.scrollAcc = this.cycleOffset / 5 + // Set position to 0, to avoid infinite scrolling + if (Math.abs(this.cycleOffset) < 0.01) this.cycleOffset = 0 + } + }, + render() { + var { width, height } = this + this.canvas.height = height + this.canvas.width = width + var endTime = this.getCurrentTime() + // Reset canvas + this.clear() + var ctx = this.ctx + + // Background Color + ctx.fillStyle = backgroundColor + ctx.fillRect(0, 0, width, height) + + ctx.lineWidth = sh(1) + ctx.font = `${sh(15)}px Raleway` + ctx.textAlign = 'left' + + // Timeline + ctx.fillStyle = foregroundColor + ctx.fillRect(timeLineStartX, 0, this.canvas.width, timeLineHeight) + ctx.fillRect(0, 0, flagLabelWidth, timeLineHeight) + ctx.fillStyle = textColor + ctx.fillText('Time', sh(5), timeLineHeight * 0.7) + + // Timeline numbers + ctx.font = `${sh(9)}px Times New Roman` + ctx.strokeStyle = textColor + ctx.textAlign = 'center' + for ( + var i = Math.floor(plotArea.cycleOffset); + getCycleStartX(i) <= width; + i++ + ) { + var x = getCycleStartX(i) + // Large ticks + number + // @TODO - collapse number if it doesn't fit + if (x >= timeLineStartX) { + ctx.fillText(`${i}`, x, timeLineHeight - sh(15) / 2) + ctx.beginPath() + ctx.moveTo(x, timeLineHeight - sh(5)) + ctx.lineTo(x, timeLineHeight) + ctx.stroke() + } + // Small ticks + for (var j = 1; j < 5; j++) { + var x1 = x + Math.round((j * cycleWidth) / 5) + if (x1 >= timeLineStartX) { + ctx.beginPath() + ctx.moveTo(x1, timeLineHeight - sh(2)) + ctx.lineTo(x1, timeLineHeight) + ctx.stroke() + } + } + } + + // Flag Labels + ctx.textAlign = 'left' + for (var i = 0; i < globalScope.Flag.length; i++) { + var startHeight = getFlagStartY(i) + ctx.fillStyle = foregroundColor + ctx.fillRect(0, startHeight, flagLabelWidth, plotHeight) + ctx.fillStyle = textColor + ctx.fillText( + globalScope.Flag[i].identifier, + sh(5), + startHeight + plotHeight * 0.7 + ) + } + + // Waveform Status Flags + const WAVEFORM_NOT_STARTED = 0 + const WAVEFORM_STARTED = 1 + const WAVEFORM_OVER = 3 + + // Waveform + ctx.strokeStyle = waveFormColor + ctx.textAlign = 'center' + var endX = Math.min(getCycleStartX(endTime), width) + + for (var i = 0; i < globalScope.Flag.length; i++) { + var plotValues = globalScope.Flag[i].plotValues + var startHeight = getFlagStartY(i) + waveFormPadding + var yTop = startHeight + var yMid = startHeight + waveFormHeight / 2 + var yBottom = startHeight + waveFormHeight + var state = WAVEFORM_NOT_STARTED + var prevY + + // Find correct index to start plotting from + var j = 0 + // Using caching for optimal performance + if (globalScope.Flag[i].cachedIndex) { + j = globalScope.Flag[i].cachedIndex + } + // Move to beyond timeLineStartX + while ( + j + 1 < plotValues.length && + getCycleStartX(plotValues[j][0]) < timeLineStartX + ) { + j++ + } + // Move to just before timeLineStartX + while (j > 0 && getCycleStartX(plotValues[j][0]) > timeLineStartX) { + j-- + } + // Cache index + globalScope.Flag[i].cachedIndex = j + + // Plot + for (; j < plotValues.length; j++) { + var x = getCycleStartX(plotValues[j][0]) + + // Handle out of bound + if (x < timeLineStartX) { + if (j + 1 != plotValues.length) { + // Next one also is out of bound, so skip this one completely + var x1 = getCycleStartX(plotValues[j + 1][0]) + if (x1 < timeLineStartX) continue + } + x = timeLineStartX + } + + var value = plotValues[j][1] + if (value === undefined) { + if (state == WAVEFORM_STARTED) { + ctx.stroke() + } + state = WAVEFORM_NOT_STARTED + continue + } + if (globalScope.Flag[i].bitWidth == 1) { + if (x > endX) break + var y = value == 1 ? yTop : yBottom + if (state == WAVEFORM_NOT_STARTED) { + // Start new plot + state = WAVEFORM_STARTED + ctx.beginPath() + ctx.moveTo(x, y) + } else { + ctx.lineTo(x, prevY) + ctx.lineTo(x, y) + } + prevY = y + } else { + var endX + if (j + 1 == plotValues.length) { + endX = getCycleStartX(endTime) + } else { + endX = getCycleStartX(plotValues[j + 1][0]) + } + var smallOffset = waveFormHeight / 2 + ctx.beginPath() + ctx.moveTo(endX, yMid) + ctx.lineTo(endX - smallOffset, yTop) + ctx.lineTo(x + smallOffset, yTop) + ctx.lineTo(x, yMid) + ctx.lineTo(x + smallOffset, yBottom) + ctx.lineTo(endX - smallOffset, yBottom) + ctx.closePath() + ctx.stroke() + + // Text position + // Clamp start and end are within the screen + var x1 = Math.max(x, timeLineStartX) + var x2 = Math.min(endX, width) + var textPositionX = (x1 + x2) / 2 + + ctx.font = `${sh(9)}px Times New Roman` + ctx.fillStyle = 'white' + ctx.fillText( + convertors.dec2hex(value), + textPositionX, + yMid + sh(3) + ) + } + if (x > width) { + state = WAVEFORM_OVER + ctx.stroke() + break + } + } + if (state == WAVEFORM_STARTED) { + if (globalScope.Flag[i].bitWidth == 1) { + ctx.lineTo(endX, prevY) + } + ctx.stroke() + } + } + }, + // Driver function to render and update + plot() { + if (embed) return + if (globalScope.Flag.length === 0) { + this.canvas.width = 0 + this.canvas.height = 0 + return + } + + this.update() + this.render() + }, + clear() { + this.ctx.clearRect(0, 0, plotArea.canvas.width, plotArea.canvas.height) + }, +} +export default plotArea + +/** + * type {Object} timingDiagramButtonActions + * @category plotArea + * @description Actions for buttons in timing diagram + * @property {function} smallHeight - Decrease waveform height + * @property {function} largeHeight - Increase waveform height + */ + +const timingDiagramButtonActions = { + smallHeight() { + if (plotHeight >= sh(20)) { + plotHeight -= sh(5) + waveFormHeight = plotHeight - 2 * waveFormPadding + } + }, + largeHeight() { + if (plotHeight < sh(50)) { + plotHeight += sh(5) + waveFormHeight = plotHeight - 2 * waveFormPadding + } + }, +} + +export { timingDiagramButtonActions } + +export function setupTimingListeners() { + // $('.timing-diagram-smaller').on('click', () => { + // $('#plot').width(Math.max($('#plot').width() - 20, 560)) + // plotArea.resize() + // }) + // $('.timing-diagram-larger').on('click', () => { + // $('#plot').width($('#plot').width() + 20) + // plotArea.resize() + // }) + // $('.timing-diagram-small-height').on('click', () => { + // if (plotHeight >= sh(20)) { + // plotHeight -= sh(5) + // waveFormHeight = plotHeight - 2 * waveFormPadding + // } + // }) + // $('.timing-diagram-large-height').on('click', () => { + // if (plotHeight < sh(50)) { + // plotHeight += sh(5) + // waveFormHeight = plotHeight - 2 * waveFormPadding + // } + // }) + // $('.timing-diagram-reset').on('click', () => { + // plotArea.reset() + // }) + // $('.timing-diagram-calibrate').on('click', () => { + // plotArea.calibrate() + // }) + // $('.timing-diagram-resume').on('click', () => { + // plotArea.resume() + // }) + // $('.timing-diagram-pause').on('click', () => { + // plotArea.pause() + // }) + // $('.timing-diagram-download').on('click', () => { + // plotArea.download() + // }) + // $('.timing-diagram-zoom-in').on('click', () => { + // plotArea.zoomIn() + // }) + // $('.timing-diagram-zoom-out').on('click', () => { + // plotArea.zoomOut() + // }) + // $('#timing-diagram-units').on('change paste keyup', function () { + // var timeUnits = parseInt($(this).val(), 10) + // if (isNaN(timeUnits) || timeUnits < 1) return + // plotArea.cycleUnit = timeUnits + // }) + document.getElementById('plotArea').addEventListener('mousedown', (e) => { + var rect = plotArea.canvas.getBoundingClientRect() + var x = sh(e.clientX - rect.left) + plotArea.scrollAcc = 0 + plotArea.autoScroll = false + plotArea.mouseDown = true + plotArea.mouseX = x + plotArea.mouseDownX = x + plotArea.mouseDownTime = new Date().getTime() + }) + document.getElementById('plotArea').addEventListener('mouseup', (e) => { + plotArea.mouseDown = false + var time = new Date().getTime() - plotArea.mouseDownTime + var offset = (plotArea.mouseX - plotArea.mouseDownX) / cycleWidth + plotArea.scrollAcc = (offset * frameInterval) / time + }) + + document.getElementById('plotArea').addEventListener('mousemove', (e) => { + var rect = plotArea.canvas.getBoundingClientRect() + var x = sh(e.clientX - rect.left) + if (plotArea.mouseDown) { + plotArea.cycleOffset -= (x - plotArea.mouseX) / cycleWidth + plotArea.mouseX = x + } else { + plotArea.mouseDown = false + } + }) +} diff --git a/v1/src/simulator/src/quinMcCluskey.js b/v1/src/simulator/src/quinMcCluskey.js new file mode 100644 index 00000000..f15041db --- /dev/null +++ b/v1/src/simulator/src/quinMcCluskey.js @@ -0,0 +1,227 @@ +// Algorithm used for Combinational Analysis + +export default function BooleanMinimize( + numVarsArg, + minTermsArg, + dontCaresArg = [] +) { + var __result + + Object.defineProperties(this, { + minTerms: { + value: minTermsArg, + enumerable: false, + writable: false, + configurable: true, + }, + + dontCares: { + value: dontCaresArg, + enumerable: false, + writable: false, + configurable: true, + }, + + numVars: { + value: numVarsArg, + enumerable: false, + writable: false, + configurable: true, + }, + + result: { + enumerable: true, + configurable: true, + get: function () { + if (__result === undefined) { + __result = BooleanMinimize.prototype.solve.call(this) + } + + return __result + }, + set: function () { + throw new Error('result cannot be assigned a value') + }, + }, + }) +} + +BooleanMinimize.prototype.solve = function () { + function dec_to_binary_string(n) { + var str = n.toString(2) + + while (str.length != this.numVars) { + str = '0' + str + } + + return str + } + + function num_set_bits(s) { + var ans = 0 + for (let i = 0; i < s.length; ++i) if (s[i] === '1') ans++ + return ans + } + + function get_prime_implicants(allTerms) { + var table = [] + var primeImplicants = new Set() + var reduced + + while (1) { + for (let i = 0; i <= this.numVars; ++i) table[i] = new Set() + for (let i = 0; i < allTerms.length; ++i) + table[num_set_bits(allTerms[i])].add(allTerms[i]) + + allTerms = [] + reduced = new Set() + + for (let i = 0; i < table.length - 1; ++i) { + for (let str1 of table[i]) { + for (let str2 of table[i + 1]) { + let diff = -1 + + for (let j = 0; j < this.numVars; ++j) { + if (str1[j] != str2[j]) { + if (diff === -1) { + diff = j + } else { + diff = -1 + break + } + } + } + + if (diff !== -1) { + allTerms.push( + str1.slice(0, diff) + '-' + str1.slice(diff + 1) + ) + reduced.add(str1) + reduced.add(str2) + } + } + } + } + + for (let t of table) { + for (let str of t) { + if (!reduced.has(str)) primeImplicants.add(str) + } + } + + if (!reduced.size) break + } + + return primeImplicants + } + + function get_essential_prime_implicants(primeImplicants, minTerms) { + var table = [], + column + + function check_if_similar(minTerm, primeImplicant) { + for (let i = 0; i < primeImplicant.length; ++i) { + if ( + primeImplicant[i] !== '-' && + minTerm[i] !== primeImplicant[i] + ) + return false + } + + return true + } + + function get_complexity(terms) { + var complexity = terms.length + + for (let t of terms) { + for (let i = 0; i < t.length; ++i) { + if (t[i] !== '-') { + complexity++ + if (t[i] === '0') complexity++ + } + } + } + + return complexity + } + + function isSubset(sub, sup) { + for (let i of sub) { + if (!sup.has(i)) return false + } + + return true + } + + for (let m of minTerms) { + column = [] + + for (let i = 0; i < primeImplicants.length; ++i) { + if (check_if_similar(m, primeImplicants[i])) { + column.push(i) + } + } + + table.push(column) + } + + var possibleSets = [], + tempSets + + for (let i of table[0]) { + possibleSets.push(new Set([i])) + } + + for (let i = 1; i < table.length; ++i) { + tempSets = [] + for (let s of possibleSets) { + for (let p of table[i]) { + let x = new Set(s) + x.add(p) + let append = true + + for (let j = tempSets.length - 1; j >= 0; --j) { + if (isSubset(x, tempSets[j])) { + tempSets.splice(j, 1) + } else { + append = false + } + } + + if (append) { + tempSets.push(x) + } + } + + possibleSets = tempSets + } + } + + var essentialImplicants, + minComplexity = 1e9 + + for (let s of possibleSets) { + let p = [] + for (let i of s) { + p.push(primeImplicants[i]) + } + let comp = get_complexity(p) + if (comp < minComplexity) { + essentialImplicants = p + minComplexity = comp + } + } + + return essentialImplicants + } + + var minTerms = this.minTerms.map(dec_to_binary_string.bind(this)) + var dontCares = this.dontCares.map(dec_to_binary_string.bind(this)) + + return get_essential_prime_implicants.call( + this, + Array.from(get_prime_implicants.call(this, minTerms.concat(dontCares))), + minTerms + ) +} diff --git a/v1/src/simulator/src/restrictedElementDiv.js b/v1/src/simulator/src/restrictedElementDiv.js new file mode 100644 index 00000000..74e1aad5 --- /dev/null +++ b/v1/src/simulator/src/restrictedElementDiv.js @@ -0,0 +1,44 @@ +export function updateRestrictedElementsList() { + if (restrictedElements.length === 0) return + + const { restrictedCircuitElementsUsed } = globalScope + let restrictedStr = '' + + restrictedCircuitElementsUsed.forEach((element) => { + restrictedStr += `${element}, ` + }) + + if (restrictedStr === '') { + restrictedStr = 'None' + } else { + restrictedStr = restrictedStr.slice(0, -2) + } + + document.getElementById('restrictedElementsDiv--list').innerHTML = restrictedStr +} + +export function updateRestrictedElementsInScope(scope = globalScope) { + // Do nothing if no restricted elements + if (restrictedElements.length === 0) return + + const restrictedElementsUsed = [] + restrictedElements.forEach((element) => { + if (scope[element].length > 0) { + restrictedElementsUsed.push(element) + } + }) + + scope.restrictedCircuitElementsUsed = restrictedElementsUsed + updateRestrictedElementsList() +} + +export function showRestricted() { + document.getElementById('restrictedDiv').classList.remove('display--none') + // Show no help text for restricted elements + document.getElementById('Help').classList.remove('show') + document.getElementById('restrictedDiv').innerHTML = 'The element has been restricted by mentor. Usage might lead to deduction in marks' +} + +export function hideRestricted() { + document.getElementById('restrictedDiv').classList.add('display--none') +} diff --git a/v1/src/simulator/src/sequential.js b/v1/src/simulator/src/sequential.js new file mode 100644 index 00000000..bd1740de --- /dev/null +++ b/v1/src/simulator/src/sequential.js @@ -0,0 +1,25 @@ +import { scheduleUpdate, play, updateCanvasSet } from './engine' +import simulationArea from './simulationArea' + +/** + * a global function as a helper for simulationArea.changeClockEnable + * @category sequential + */ +export function changeClockEnable(val) { + simulationArea.clockEnabled = val +} + +/** + * WIP function defined and used + * @param {number} n + * @category sequential + */ +export function runTest(n = 10) { + var t = new Date().getTime() + for (var i = 0; i < n; i++) { + clockTick() + } + updateCanvasSet(true) + play() + scheduleUpdate() +} diff --git a/v1/src/simulator/src/sequential/Clock.js b/v1/src/simulator/src/sequential/Clock.js new file mode 100644 index 00000000..86e24955 --- /dev/null +++ b/v1/src/simulator/src/sequential/Clock.js @@ -0,0 +1,95 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo } from '../canvasApi' +import { colors } from '../themer/themer' +/** + * @class + * Clock + * Clock + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * @category sequential + */ +export default class Clock extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT') { + super(x, y, scope, dir, 1) + /* + this.scope['Clock'].push(this); + */ + this.fixedBitWidth = true + this.output1 = new Node(10, 0, 1, this, 1) + this.state = 0 + this.output1.value = this.state + this.wasClicked = false + this.interval = null + } + + customSave() { + var data = { + nodes: { + output1: findNode(this.output1), + }, + constructorParamaters: [this.direction], + } + return data + } + + resolve() { + this.output1.value = this.state + simulationArea.simulationQueue.add(this.output1) + } + + toggleState() { + // toggleState + this.state = (this.state + 1) % 2 + this.output1.value = this.state + } + + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(3) + var xx = this.x + var yy = this.y + + ctx.beginPath() + ctx.strokeStyle = [colors['color_wire_con'], colors['color_wire_pow']][ + this.state + ] + ctx.lineWidth = correctWidth(2) + if (this.state == 0) { + moveTo(ctx, -6, 0, xx, yy, 'RIGHT') + lineTo(ctx, -6, 5, xx, yy, 'RIGHT') + lineTo(ctx, 0, 5, xx, yy, 'RIGHT') + lineTo(ctx, 0, -5, xx, yy, 'RIGHT') + lineTo(ctx, 6, -5, xx, yy, 'RIGHT') + lineTo(ctx, 6, 0, xx, yy, 'RIGHT') + } else { + moveTo(ctx, -6, 0, xx, yy, 'RIGHT') + lineTo(ctx, -6, -5, xx, yy, 'RIGHT') + lineTo(ctx, 0, -5, xx, yy, 'RIGHT') + lineTo(ctx, 0, 5, xx, yy, 'RIGHT') + lineTo(ctx, 6, 5, xx, yy, 'RIGHT') + lineTo(ctx, 6, 0, xx, yy, 'RIGHT') + } + ctx.stroke() + } + + static verilogInstructions() { + return 'Clock - Use a single global clock\n' + } +} + +Clock.prototype.tooltipText = 'Clock' + +Clock.prototype.click = Clock.prototype.toggleState +Clock.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/6sequentialelements?id=clock' +Clock.prototype.objectType = 'Clock' +Clock.prototype.propagationDelay = 0 +Clock.prototype.propagationDelayFixed = true diff --git a/v1/src/simulator/src/sequential/DflipFlop.js b/v1/src/simulator/src/sequential/DflipFlop.js new file mode 100644 index 00000000..4543ba61 --- /dev/null +++ b/v1/src/simulator/src/sequential/DflipFlop.js @@ -0,0 +1,168 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText } from '../canvasApi' +import { colors } from '../themer/themer' +/** + * @class + * DflipFlop + * D flip flop has 5 input nodes: + * clock, data input, preset, reset ,enable. + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * @category sequential + */ +export default class DflipFlop extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* + this.scope['DflipFlop'].push(this); + */ + this.directionFixed = true + this.setDimensions(20, 20) + this.rectangleObject = true + this.clockInp = new Node(-20, +10, 0, this, 1, 'Clock') + this.dInp = new Node(-20, -10, 0, this, this.bitWidth, 'D') + this.qOutput = new Node(20, -10, 1, this, this.bitWidth, 'Q') + this.qInvOutput = new Node(20, 10, 1, this, this.bitWidth, 'Q Inverse') + this.reset = new Node(10, 20, 0, this, 1, 'Asynchronous Reset') + this.preset = new Node(0, 20, 0, this, this.bitWidth, 'Preset') + this.en = new Node(-10, 20, 0, this, 1, 'Enable') + this.masterState = 0 + this.slaveState = 0 + this.prevClockState = 0 + + this.wasClicked = false + } + + /** + * WIP always resolvable? + */ + isResolvable() { + return true + // if (this.reset.value == 1) return true; + // if (this.clockInp.value != undefined && this.dInp.value != undefined) return true; + // return false; + } + + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.dInp.bitWidth = bitWidth + this.qOutput.bitWidth = bitWidth + this.qInvOutput.bitWidth = bitWidth + this.preset.bitWidth = bitWidth + } + + /** + * @memberof DflipFlop + * On the leading edge of the clock signal (LOW-to-HIGH) the first stage, + * the “master” latches the input condition at D, while the output stage is deactivated. + * On the trailing edge of the clock signal (HIGH-to-LOW) the second “slave” stage is + * now activated, latching on to the output from the first master circuit. + * Then the output stage appears to be triggered on the negative edge of the clock pulse. + * This fuction sets the value for the node qOutput based on the previous state + * and input of the clock. We flip the bits to find qInvOutput + */ + resolve() { + if (this.reset.value == 1) { + this.masterState = this.slaveState = this.preset.value || 0 + } else if (this.en.value == 0) { + this.prevClockState = this.clockInp.value + } else if (this.en.value == 1 || this.en.connections.length == 0) { + // if(this.en.value==1) // Creating Infinite Loop, WHY ?? + if (this.clockInp.value == this.prevClockState) { + if (this.clockInp.value == 0 && this.dInp.value != undefined) { + this.masterState = this.dInp.value + } + } else if (this.clockInp.value != undefined) { + if (this.clockInp.value == 1) { + this.slaveState = this.masterState + } else if ( + this.clockInp.value == 0 && + this.dInp.value != undefined + ) { + this.masterState = this.dInp.value + } + this.prevClockState = this.clockInp.value + } + } + + if (this.qOutput.value != this.slaveState) { + this.qOutput.value = this.slaveState + this.qInvOutput.value = this.flipBits(this.slaveState) + simulationArea.simulationQueue.add(this.qOutput) + simulationArea.simulationQueue.add(this.qInvOutput) + } + } + + customSave() { + var data = { + nodes: { + clockInp: findNode(this.clockInp), + dInp: findNode(this.dInp), + qOutput: findNode(this.qOutput), + qInvOutput: findNode(this.qInvOutput), + reset: findNode(this.reset), + preset: findNode(this.preset), + en: findNode(this.en), + }, + constructorParamaters: [this.direction, this.bitWidth], + } + return data + } + + customDraw() { + var ctx = simulationArea.context + // + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.beginPath() + ctx.lineWidth = correctWidth(3) + var xx = this.x + var yy = this.y + // rect(ctx, xx - 20, yy - 20, 40, 40); + moveTo(ctx, -20, 5, xx, yy, this.direction) + lineTo(ctx, -15, 10, xx, yy, this.direction) + lineTo(ctx, -20, 15, xx, yy, this.direction) + // if ((this.b.hover&&!simulationArea.shiftDown)|| simulationArea.lastSelected == this || simulationArea.multipleObjectSelections.contains(this)) ctx.fillStyle = "rgba(255, 255, 32,0.8)";ctx.fill(); + ctx.stroke() + + ctx.beginPath() + ctx.font = '20px Raleway' + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + fillText(ctx, this.slaveState.toString(16), xx, yy + 5) + ctx.fill() + } + + static moduleVerilog() { + return ` +module DflipFlop(q, q_inv, clk, d, a_rst, pre, en); + parameter WIDTH = 1; + output reg [WIDTH-1:0] q, q_inv; + input clk, a_rst, pre, en; + input [WIDTH-1:0] d; + + always @ (posedge clk or posedge a_rst) + if (a_rst) begin + q <= 'b0; + q_inv <= 'b1; + end else if (en == 0) ; + else begin + q <= d; + q_inv <= ~d; + end +endmodule + ` + } +} + +DflipFlop.prototype.tooltipText = + 'D FlipFlop ToolTip : Introduces delay in timing circuit.' +DflipFlop.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/6sequentialelements?id=d-flip-flop' + +DflipFlop.prototype.objectType = 'DflipFlop' diff --git a/v1/src/simulator/src/sequential/Dlatch.js b/v1/src/simulator/src/sequential/Dlatch.js new file mode 100644 index 00000000..7532d3db --- /dev/null +++ b/v1/src/simulator/src/sequential/Dlatch.js @@ -0,0 +1,119 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText } from '../canvasApi' +/** + * @class + * Dlatch + * D latch has 2 input nodes: + * clock, data input. + * Difference between this and D - FlipFlop is + * that Flip flop must have a clock. + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * @category sequential + */ +import { colors } from '../themer/themer' +export default class Dlatch extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + /* + this.scope['Dlatch'].push(this); + */ + this.directionFixed = true + this.setDimensions(20, 20) + this.rectangleObject = true + this.clockInp = new Node(-20, +10, 0, this, 1, 'Clock') + this.dInp = new Node(-20, -10, 0, this, this.bitWidth, 'D') + this.qOutput = new Node(20, -10, 1, this, this.bitWidth, 'Q') + this.qInvOutput = new Node(20, 10, 1, this, this.bitWidth, 'Q Inverse') + // this.reset = new Node(10, 20, 0, this, 1, "Asynchronous Reset"); + // this.preset = new Node(0, 20, 0, this, this.bitWidth, "Preset"); + // this.en = new Node(-10, 20, 0, this, 1, "Enable"); + this.state = 0 + this.prevClockState = 0 + this.wasClicked = false + } + + /** + * Idea: shoould be D FF? + */ + isResolvable() { + if (this.clockInp.value != undefined && this.dInp.value != undefined) + return true + return false + } + + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.dInp.bitWidth = bitWidth + this.qOutput.bitWidth = bitWidth + this.qInvOutput.bitWidth = bitWidth + // this.preset.bitWidth = bitWidth; + } + + /** + * @memberof Dlatch + * when the clock input is high we update the state + * qOutput is set to the state + */ + resolve() { + if (this.clockInp.value == 1 && this.dInp.value != undefined) { + this.state = this.dInp.value + } + + if (this.qOutput.value != this.state) { + this.qOutput.value = this.state + this.qInvOutput.value = this.flipBits(this.state) + simulationArea.simulationQueue.add(this.qOutput) + simulationArea.simulationQueue.add(this.qInvOutput) + } + } + + customSave() { + var data = { + nodes: { + clockInp: findNode(this.clockInp), + dInp: findNode(this.dInp), + qOutput: findNode(this.qOutput), + qInvOutput: findNode(this.qInvOutput), + // reset: findNode(this.reset), + // preset: findNode(this.preset), + // en: findNode(this.en), + }, + constructorParamaters: [this.direction, this.bitWidth], + } + return data + } + + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.beginPath() + ctx.lineWidth = correctWidth(3) + var xx = this.x + var yy = this.y + // rect(ctx, xx - 20, yy - 20, 40, 40); + moveTo(ctx, -20, 5, xx, yy, this.direction) + lineTo(ctx, -15, 10, xx, yy, this.direction) + lineTo(ctx, -20, 15, xx, yy, this.direction) + // if ((this.b.hover&&!simulationArea.shiftDown)|| simulationArea.lastSelected == this || simulationArea.multipleObjectSelections.contains(this)) ctx.fillStyle = "rgba(255, 255, 32,0.8)";ctx.fill(); + ctx.stroke() + ctx.beginPath() + ctx.font = '20px Raleway' + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + fillText(ctx, this.state.toString(16), xx, yy + 5) + ctx.fill() + } +} + +Dlatch.prototype.tooltipText = 'D Latch : Single input Flip flop or D FlipFlop' +Dlatch.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/6sequentialelements?id=d-latch' + +Dlatch.prototype.objectType = 'Dlatch' diff --git a/v1/src/simulator/src/sequential/EEPROM.js b/v1/src/simulator/src/sequential/EEPROM.js new file mode 100644 index 00000000..3a3427b8 --- /dev/null +++ b/v1/src/simulator/src/sequential/EEPROM.js @@ -0,0 +1,104 @@ +import RAM from './RAM' +/** + * @class + * EEPROM Component. + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + + * + * This is basically a RAM component that persists its contents. + * + * We consider EEPROMs more 'expensive' than RAMs, so we arbitrarily limit + * the addressWith to a maximum of 10 bits (1024 addresses) with a default of 8-bit (256). + * + * In the EEPROM all addresses are initialized to zero. + * This way we serialize unused values as "0" instead of "null". + * + * These two techniques help keep reduce the size of saved projects. + * @category sequential + */ +export default class EEPROM extends RAM { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 8, + addressWidth = 8, + data = null + ) { + super(x, y, scope, dir, bitWidth, addressWidth) + /* + this.scope['EEPROM'].push(this); + */ + this.data = data || this.data + } + + clearData() { + super.clearData() + for (var i = 0; i < this.data.length; i++) + this.data[i] = this.data[i] || 0 + } + + customSave() { + var saveInfo = super.customSave(this) + + // Normalize this.data to use zeroes instead of null when serialized. + var { data } = this + + saveInfo.constructorParamaters.push(data) + return saveInfo + } + + //This is a EERAM without a clock - not normal + //reset is supported + static moduleVerilog() { + return ` + module EEPROM(dout, addr, din, we, dmp, rst); + parameter WIDTH = 8; + parameter ADDR = 10; + output [WIDTH-1:0] dout; + input [ADDR-1:0] addr; + input [WIDTH-1:0] din; + input we; + input dmp; + input rst; + reg [WIDTH-1:0] mem[2**ADDR-1:0]; + integer j; + + assign dout = mem[addr]; + + always @ (*) begin + if (!rst) + for (j=0; j < 2**ADDR-1; j=j+1) begin + mem[j] = 0; + end + if (!we) + mem[addr] = din; + dout = mem[addr]; + end + endmodule + ` + } +} + +EEPROM.prototype.tooltipText = + 'Electrically Erasable Programmable Read-Only Memory' +EEPROM.prototype.shortName = 'EEPROM' +EEPROM.prototype.maxAddressWidth = 10 +EEPROM.prototype.mutableProperties = { + addressWidth: { + name: 'Address Width', + type: 'number', + max: '10', + min: '1', + func: 'changeAddressWidth', + }, + dump: RAM.prototype.mutableProperties.dump, + load: RAM.prototype.mutableProperties.load, + reset: RAM.prototype.mutableProperties.reset, +} +EEPROM.prototype.objectType = 'EEPROM' diff --git a/v1/src/simulator/src/sequential/JKflipFlop.js b/v1/src/simulator/src/sequential/JKflipFlop.js new file mode 100644 index 00000000..c02eae3f --- /dev/null +++ b/v1/src/simulator/src/sequential/JKflipFlop.js @@ -0,0 +1,166 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText } from '../canvasApi' +/** + * @class + * JKflipFlop + * JK flip flop has 6 input nodes: + * clock, J input, K input, preset, reset ,enable. + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * @category sequential + */ +import { colors } from '../themer/themer' +export default class JKflipFlop extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT') { + super(x, y, scope, dir, 1) + /* + this.scope['JKflipFlop'].push(this); + */ + this.directionFixed = true + this.fixedBitWidth = true + this.setDimensions(20, 20) + this.rectangleObject = true + this.J = new Node(-20, -10, 0, this, 1, 'J') + this.K = new Node(-20, 0, 0, this, 1, 'K') + this.clockInp = new Node(-20, 10, 0, this, 1, 'Clock') + this.qOutput = new Node(20, -10, 1, this, 1, 'Q') + this.qInvOutput = new Node(20, 10, 1, this, 1, 'Q Inverse') + this.reset = new Node(10, 20, 0, this, 1, 'Asynchronous Reset') + this.preset = new Node(0, 20, 0, this, 1, 'Preset') + this.en = new Node(-10, 20, 0, this, 1, 'Enable') + this.state = 0 + this.slaveState = 0 + this.masterState = 0 + this.prevClockState = 0 + + // this.wasClicked = false; + } + + /** + * @memberof JKflipFlop + * if none of the predefined nodes have been deleted it isresolvable + */ + isResolvable() { + if (this.reset.value == 1) return true + if ( + this.clockInp.value != undefined && + this.J.value != undefined && + this.K.value != undefined + ) + return true + return false + } + + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.dInp.bitWidth = bitWidth + this.qOutput.bitWidth = bitWidth + this.qInvOutput.bitWidth = bitWidth + this.preset.bitWidth = bitWidth + } + + /** + * @memberof JKflipFlop + * Edge triggered master slave JK flip flop is resolved by + * setting the slaveState = masterState when there is an edge + * in the clock. masterState = this.J when no change in clock. + */ + resolve() { + if (this.reset.value == 1) { + this.masterState = this.slaveState = this.preset.value || 0 + } else if (this.en.value == 0) { + this.prevClockState = this.clockInp.value + } else if (this.en.value == 1 || this.en.connections.length == 0) { + if (this.clockInp.value == this.prevClockState) { + if ( + this.clockInp.value == 0 && + this.J.value != undefined && + this.K.value != undefined + ) { + if (this.J.value && this.K.value) { + this.masterState = 1 ^ this.slaveState + } else if (this.J.value ^ this.K.value) { + this.masterState = this.J.value + } + } + } else if (this.clockInp.value != undefined) { + if (this.clockInp.value == 1) { + this.slaveState = this.masterState + } else if ( + this.clockInp.value == 0 && + this.J.value != undefined && + this.K.value != undefined + ) { + if (this.J.value && this.K.value) { + this.masterState = 1 ^ this.slaveState + } else if (this.J.value ^ this.K.value) { + this.masterState = this.J.value + } + } + this.prevClockState = this.clockInp.value + } + } + + if (this.qOutput.value != this.slaveState) { + this.qOutput.value = this.slaveState + this.qInvOutput.value = this.flipBits(this.slaveState) + simulationArea.simulationQueue.add(this.qOutput) + simulationArea.simulationQueue.add(this.qInvOutput) + } + } + + customSave() { + var data = { + nodes: { + J: findNode(this.J), + K: findNode(this.K), + clockInp: findNode(this.clockInp), + qOutput: findNode(this.qOutput), + qInvOutput: findNode(this.qInvOutput), + reset: findNode(this.reset), + preset: findNode(this.preset), + en: findNode(this.en), + }, + constructorParamaters: [this.direction], + } + return data + } + + customDraw() { + var ctx = simulationArea.context + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.beginPath() + ctx.lineWidth = correctWidth(3) + var xx = this.x + var yy = this.y + + // rect(ctx, xx - 20, yy - 20, 40, 40); + moveTo(ctx, -20, 5, xx, yy, this.direction) + lineTo(ctx, -15, 10, xx, yy, this.direction) + lineTo(ctx, -20, 15, xx, yy, this.direction) + + // if ((this.b.hover&&!simulationArea.shiftDown)|| simulationArea.lastSelected == this || simulationArea.multipleObjectSelections.contains(this)) ctx.fillStyle = "rgba(255, 255, 32,0.8)";ctx.fill(); + ctx.stroke() + + ctx.beginPath() + ctx.font = '20px Raleway' + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + fillText(ctx, this.slaveState.toString(16), xx, yy + 5) + ctx.fill() + } +} + +JKflipFlop.prototype.tooltipText = + 'JK FlipFlop ToolTip : gated SR flip-flop with the addition of a clock input.' + +JKflipFlop.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/6sequentialelements?id=jk-flip-flop' + +JKflipFlop.prototype.objectType = 'JKflipFlop' diff --git a/v1/src/simulator/src/sequential/Keyboard.js b/v1/src/simulator/src/sequential/Keyboard.js new file mode 100644 index 00000000..ffeb7a9c --- /dev/null +++ b/v1/src/simulator/src/sequential/Keyboard.js @@ -0,0 +1,232 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText3 } from '../canvasApi' +/** + * @class + * Keyboard + * KeyBoard - We can give 3 inputs: clock, enable and available. + * An output of 7 bits is given out when clockInp = 1. + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * @category sequential + */ +import { colors } from '../themer/themer' +export default class Keyboard extends CircuitElement { + constructor(x, y, scope = globalScope, bufferSize = 32) { + super(x, y, scope, 'RIGHT', 1) + /* + this.scope['Keyboard'].push(this); + */ + this.directionFixed = true + this.fixedBitWidth = true + + this.bufferSize = bufferSize || parseInt(prompt('Enter buffer size:')) + this.elementWidth = Math.max(80, Math.ceil(this.bufferSize / 2) * 20) + this.elementHeight = 40 // Math.max(40,Math.ceil(this.rows*15/20)*20); + this.setWidth(this.elementWidth / 2) + this.setHeight(this.elementHeight / 2) + + this.clockInp = new Node( + -this.elementWidth / 2, + this.elementHeight / 2 - 10, + 0, + this, + 1, + 'Clock' + ) + this.asciiOutput = new Node( + 30, + this.elementHeight / 2, + 1, + this, + 7, + 'Ascii Output' + ) + this.available = new Node( + 10, + this.elementHeight / 2, + 1, + this, + 1, + 'Available' + ) + this.reset = new Node(-10, this.elementHeight / 2, 0, this, 1, 'Reset') + this.en = new Node(-30, this.elementHeight / 2, 0, this, 1, 'Enable') + this.prevClockState = 0 + this.buffer = '' + this.bufferOutValue = undefined + } + + /** + * @memberof Keyboard + * this funcion sets the size of maximum input that can + * be given to the keyboard at once before it starts sending data. + */ + changeBufferSize(size) { + if (size == undefined || size < 20 || size > 100) return + if (this.bufferSize == size) return + var obj = new Keyboard(this.x, this.y, this.scope, size) + this.delete() + simulationArea.lastSelected = obj + return obj + } + + /** + * @memberof Keyboard + * Adds the keyy pressed to the buffer + */ + keyDown(key) { + if (key.length != 1) return + this.buffer += key + if (this.buffer.length > this.bufferSize) { + this.buffer = this.buffer.slice(1) + } + } + + /** + * @memberof Keyboard + * not resolvable if enable = 0 or clock is undefined + */ + isResolvable() { + if (this.reset.value == 1) return true + if ( + this.en.value == 0 || + (this.en.connections.length && this.en.value == undefined) + ) + return false + else if (this.clockInp.value == undefined) return false + return true + } + + /** + * @memberof Keyboard + * Whenever clock is enabled (1) then one charecter + * from the buffer is converted to ascii and transmitted + * through the output nodes. + */ + resolve() { + if (this.reset.value == 1) { + this.buffer = '' + return + } + if (this.en.value == 0) { + return + } + + if (this.available.value != 0) { + this.available.value = 0 // this.bufferOutValue; + simulationArea.simulationQueue.add(this.available) + } + + if (this.clockInp.value == this.prevClockState) { + if (this.clockInp.value == 0) { + if (this.buffer.length) { + this.bufferOutValue = this.buffer[0].charCodeAt(0) + } else { + this.bufferOutValue = undefined + } + } + } else if (this.clockInp.value != undefined) { + if (this.clockInp.value == 1 && this.buffer.length) { + if (this.bufferOutValue == this.buffer[0].charCodeAt(0)) { + // WHY IS THIS REQUIRED ?? + this.buffer = this.buffer.slice(1) + } + } else if (this.buffer.length) { + this.bufferOutValue = this.buffer[0].charCodeAt(0) + } else { + this.bufferOutValue = undefined + } + this.prevClockState = this.clockInp.value + } + + if (this.asciiOutput.value != this.bufferOutValue) { + this.asciiOutput.value = this.bufferOutValue + simulationArea.simulationQueue.add(this.asciiOutput) + } + + if (this.bufferOutValue !== undefined && this.available.value != 1) { + this.available.value = 1 // this.bufferOutValue; + simulationArea.simulationQueue.add(this.available) + } + } + + customSave() { + var data = { + nodes: { + clockInp: findNode(this.clockInp), + asciiOutput: findNode(this.asciiOutput), + available: findNode(this.available), + reset: findNode(this.reset), + en: findNode(this.en), + }, + constructorParamaters: [this.bufferSize], + } + return data + } + + customDraw() { + var ctx = simulationArea.context + // + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.beginPath() + ctx.lineWidth = correctWidth(3) + var xx = this.x + var yy = this.y + moveTo( + ctx, + -this.elementWidth / 2, + this.elementHeight / 2 - 15, + xx, + yy, + this.direction + ) + lineTo( + ctx, + 5 - this.elementWidth / 2, + this.elementHeight / 2 - 10, + xx, + yy, + this.direction + ) + lineTo( + ctx, + -this.elementWidth / 2, + this.elementHeight / 2 - 5, + xx, + yy, + this.direction + ) + + ctx.stroke() + + ctx.beginPath() + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + var lineData = + this.buffer + ' '.repeat(this.bufferSize - this.buffer.length) + fillText3(ctx, lineData, 0, +5, xx, yy, 15, 'Courier New', 'center') + ctx.fill() + } +} + +Keyboard.prototype.tooltipText = 'Keyboard' +Keyboard.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/6sequentialelements?id=keyboard' + +Keyboard.prototype.mutableProperties = { + bufferSize: { + name: 'Buffer Size', + type: 'number', + max: '100', + min: '20', + func: 'changeBufferSize', + }, +} + +Keyboard.prototype.objectType = 'Keyboard' diff --git a/v1/src/simulator/src/sequential/RAM.js b/v1/src/simulator/src/sequential/RAM.js new file mode 100644 index 00000000..b406f921 --- /dev/null +++ b/v1/src/simulator/src/sequential/RAM.js @@ -0,0 +1,374 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, fillText2, fillText4, drawCircle2 } from '../canvasApi' +import { parseNumber, showMessage } from '../utils' +/** + * @class + * RAM Component. + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * + * Two settings are available: + * - addressWidth: 1 to 20, default=10. Controls the width of the address input. + * - bitWidth: 1 to 32, default=8. Controls the width of data pins. + * + * Amount of memory in the element is 2^addressWidth x bitWidth bits. + * Minimum RAM size is: 2^1 x 1 = 2 bits. + * Maximum RAM size is: 2^20 x 32 = 1M x 32 bits => 32 Mbits => 4MB. + * Maximum 8-bits size: 2^20 x 8 = 1M x 8 bits => 1MB. + * Default RAM size is: 2^10 x 8 = 1024 bytes => 1KB. + * + * RAMs are volatile therefore this component does not persist the memory contents. + * + * Changes to addressWidth and bitWidth also cause data to be lost. + * Think of these operations as being equivalent to taking a piece of RAM out of a + * circuit board and replacing it with another RAM of different size. + * + * The contents of the RAM can be reset to zero by setting the RESET pin 1 or + * or by selecting the component and pressing the "Reset" button in the properties window. + * + * The contents of the RAM can be dumped to the console by transitioning CORE DUMP pin to 1 + * or by selecting the component and pressing the "Core Dump" button in the properties window. + * Address spaces that have not been written will show up as `undefined` in the core dump. + * + * NOTE: The maximum address width of 20 is arbitrary. + * Larger values are possible, but in practice circuits won't need this much + * memory and keeping the value small helps avoid allocating too much memory on the browser. + * Internally we use a sparse array, so only the addresses that are written are actually + * allocated. Nevertheless, it is better to prevent large allocations from happening + * by keeping the max addressWidth small. If needed, we can increase the max. + * @category sequential + */ +import { colors } from '../themer/themer' +import { showError } from '../utils' +export default class RAM extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 8, + addressWidth = 10 + ) { + super(x, y, scope, dir, Math.min(Math.max(1, bitWidth), 32)) + /* + this.scope['RAM'].push(this); + */ + this.setDimensions(60, 40) + + this.directionFixed = true + this.labelDirection = 'UP' + + this.addressWidth = Math.min( + Math.max(1, addressWidth), + this.maxAddressWidth + ) + this.address = new Node( + -this.leftDimensionX, + -20, + 0, + this, + this.addressWidth, + 'ADDRESS' + ) + this.dataIn = new Node( + -this.leftDimensionX, + 0, + 0, + this, + this.bitWidth, + 'DATA IN' + ) + this.write = new Node(-this.leftDimensionX, 20, 0, this, 1, 'WRITE') + this.reset = new Node(0, this.downDimensionY, 0, this, 1, 'RESET') + this.coreDump = new Node( + -20, + this.downDimensionY, + 0, + this, + 1, + 'CORE DUMP' + ) + this.dataOut = new Node( + this.rightDimensionX, + 0, + 1, + this, + this.bitWidth, + 'DATA OUT' + ) + this.prevCoreDumpValue = undefined + + this.clearData() + } + + customSave() { + return { + // NOTE: data is not persisted since RAMs are volatile. + constructorParamaters: [ + this.direction, + this.bitWidth, + this.addressWidth, + ], + nodes: { + address: findNode(this.address), + dataIn: findNode(this.dataIn), + write: findNode(this.write), + reset: findNode(this.reset), + coreDump: findNode(this.coreDump), + dataOut: findNode(this.dataOut), + }, + } + } + + newBitWidth(value) { + value = parseInt(value) + if ( + !isNaN(value) && + this.bitWidth != value && + value >= 1 && + value <= 32 + ) { + this.bitWidth = value + this.dataIn.bitWidth = value + this.dataOut.bitWidth = value + this.clearData() + } + } + + changeAddressWidth(value) { + value = parseInt(value) + if ( + !isNaN(value) && + this.addressWidth != value && + value >= 1 && + value <= this.maxAddressWidth + ) { + this.addressWidth = value + this.address.bitWidth = value + this.clearData() + } + } + + clearData() { + this.data = new Array(Math.pow(2, this.addressWidth)) + this.tooltipText = `${this.memSizeString()} ${this.shortName}` + } + + isResolvable() { + return ( + this.address.value !== undefined || + this.reset.value !== undefined || + this.coreDump.value !== undefined + ) + } + + resolve() { + if (this.write.value == 1) { + this.data[this.address.value] = this.dataIn.value + } + + if (this.reset.value == 1) { + this.clearData() + } + + if ( + this.coreDump.value && + this.prevCoreDumpValue != this.coreDump.value + ) { + this.dump() + } + this.prevCoreDumpValue = this.coreDump.value + + this.dataOut.value = this.data[this.address.value] || 0 + simulationArea.simulationQueue.add(this.dataOut) + } + + customDraw() { + var ctx = simulationArea.context + // + var xx = this.x + var yy = this.y + + ctx.beginPath() + ctx.strokeStyle = 'gray' + ctx.fillStyle = this.write.value ? 'red' : 'lightgreen' + ctx.lineWidth = correctWidth(1) + drawCircle2(ctx, 50, -30, 3, xx, yy, this.direction) + ctx.fill() + ctx.stroke() + + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = 'black' + fillText4(ctx, this.memSizeString(), 0, -10, xx, yy, this.direction, 12) + fillText4(ctx, this.shortName, 0, 10, xx, yy, this.direction, 12) + fillText2( + ctx, + 'A', + this.address.x + 12, + this.address.y, + xx, + yy, + this.direction + ) + fillText2( + ctx, + 'DI', + this.dataIn.x + 12, + this.dataIn.y, + xx, + yy, + this.direction + ) + fillText2( + ctx, + 'W', + this.write.x + 12, + this.write.y, + xx, + yy, + this.direction + ) + fillText2( + ctx, + 'DO', + this.dataOut.x - 15, + this.dataOut.y, + xx, + yy, + this.direction + ) + ctx.fill() + } + + memSizeString() { + var mag = ['', 'K', 'M'] + var unit = + this.bitWidth == 8 + ? 'B' + : this.bitWidth == 1 + ? 'b' + : ` x ${this.bitWidth}b` + var v = Math.pow(2, this.addressWidth) + var m = 0 + while (v >= 1024 && m < mag.length - 1) { + v /= 1024 + m++ + } + return v + mag[m] + unit + } + + dump() { + var logLabel = console.group && this.label + if (logLabel) { + console.group(this.label) + } + + showMessage('Data dumped to developer Console') + + console.log(JSON.stringify(this.data)) + + if (logLabel) { + console.groupEnd() + } + } + + dblclick() { + this.promptData() + } + + promptData() { + var data = prompt( + 'Enter Data (separated by space, comma, tab or newline) (data can be in hex, binary, octal or decimal)' + ) + if (!data) { + showError('No data entered.') + return + } + var oldData = this.data + try { + var ramSize = 1 << this.addressWidth + var maxNumber = 1 << this.bitWidth + this.clearData() + + data = data.split(/[, \n\t]/) + data = data.filter((x) => x.length) + if (data.length > ramSize) { + throw `Capacity: ${ramSize}. But ${data.length} data cells found` + } + + for (var i = 0; i < data.length; i++) { + var dataCell = parseNumber(data[i]) + if (isNaN(dataCell)) + throw `Address ${i}: ${data[i]} is not a number` + if (dataCell < 0) throw `Address ${i}: ${data[i]} is negative` + if (dataCell >= maxNumber) + throw `Address ${i}: ${data[i]} is too large` + this.data[i] = dataCell + } + showMessage(`${data.length} data cells loaded`) + } catch (e) { + this.data = oldData + showError(e) + } + } + + //This is a RAM without a clock - not normal + //reset is not supported + static moduleVerilog() { + return ` + module RAM(dout, addr, din, we, dmp, rst); + parameter WIDTH = 8; + parameter ADDR = 10; + output [WIDTH-1:0] dout; + input [ADDR-1:0] addr; + input [WIDTH-1:0] din; + input we; + input dmp; + input rst; + reg [WIDTH-1:0] mem [2**ADDR-1:0]; + + assign dout = mem[addr]; + + always @ (*) begin + if (!we) + mem[addr] = din; + end + endmodule + ` + } +} + +RAM.prototype.tooltipText = 'Random Access Memory' +RAM.prototype.shortName = 'RAM' +RAM.prototype.maxAddressWidth = 20 +RAM.prototype.mutableProperties = { + addressWidth: { + name: 'Address Width', + type: 'number', + max: '20', + min: '1', + func: 'changeAddressWidth', + }, + dump: { + name: 'Core Dump', + type: 'button', + func: 'dump', + }, + load: { + name: 'Load Data', + type: 'button', + func: 'promptData', + }, + reset: { + name: 'Reset', + type: 'button', + func: 'clearData', + }, +} +RAM.prototype.objectType = 'RAM' diff --git a/v1/src/simulator/src/sequential/Rom.js b/v1/src/simulator/src/sequential/Rom.js new file mode 100644 index 00000000..69bb544b --- /dev/null +++ b/v1/src/simulator/src/sequential/Rom.js @@ -0,0 +1,314 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, rect2, fillText3 } from '../canvasApi' +/** + * @class + * Rom + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {Array=} data - bit width per node. + * @category sequential + */ +import { colors } from '../themer/themer' +export default class Rom extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + data = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + ) { + super(x, y, scope, 'RIGHT', 1) + /* + this.scope['Rom'].push(this); + */ + this.fixedBitWidth = true + this.directionFixed = true + this.rectangleObject = false + this.setDimensions(80, 50) + this.memAddr = new Node(-80, 0, 0, this, 4, 'Address') + this.en = new Node(0, 50, 0, this, 1, 'Enable') + this.dataOut = new Node(80, 0, 1, this, 8, 'DataOut') + this.data = + data || + prompt('Enter data') + .split(' ') + .map((lambda) => parseInt(lambda, 16)) + } + + /** + * @memberof Rom + * Checks if the element is resolvable + * @return {boolean} + */ + isResolvable() { + if ( + (this.en.value === 1 || this.en.connections.length === 0) && + this.memAddr.value !== undefined + ) + return true + return false + } + + /** + * @memberof Rom + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.data], + nodes: { + memAddr: findNode(this.memAddr), + dataOut: findNode(this.dataOut), + en: findNode(this.en), + }, + } + return data + } + + /** + * @memberof Rom + * function to find position of the index of part of rom selected. + * @return {number} + */ + findPos() { + const i = Math.floor((simulationArea.mouseX - this.x + 35) / 20) + const j = Math.floor((simulationArea.mouseY - this.y + 35) / 16) + if (i < 0 || j < 0 || i > 3 || j > 3) return undefined + return j * 4 + i + } + + /** + * @memberof Rom + * listener function to set selected index + * @return {number} + */ + click() { + // toggle + this.selectedIndex = this.findPos() + } + + /** + * @memberof Rom + * to take input in rom + * @return {number} + */ + keyDown(key) { + if (key === 'Backspace') this.delete() + if (this.selectedIndex === undefined) return + key = key.toLowerCase() + if (!~'1234567890abcdef'.indexOf(key)) return + + this.data[this.selectedIndex] = + (this.data[this.selectedIndex] * 16 + parseInt(key, 16)) % 256 + } + + /** + * @memberof Rom + * function to draw element + */ + customDraw() { + const ctx = simulationArea.context + const xx = this.x + const yy = this.y + const hoverIndex = this.findPos() + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + rect2( + ctx, + -this.leftDimensionX, + -this.upDimensionY, + this.leftDimensionX + this.rightDimensionX, + this.upDimensionY + this.downDimensionY, + this.x, + this.y, + [this.direction, 'RIGHT'][+this.directionFixed] + ) + if ( + hoverIndex === undefined && + ((!simulationArea.shiftDown && this.hover) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this)) + ) + ctx.fillStyle = colors['hover_select'] + ctx.fill() + ctx.stroke() + ctx.strokeStyle = 'black' + ctx.fillStyle = '#fafafa' + ctx.lineWidth = correctWidth(1) + ctx.beginPath() + for (let i = 0; i < 16; i += 4) { + for (let j = i; j < i + 4; j++) { + rect2(ctx, (j % 4) * 20, i * 4, 20, 16, xx - 35, yy - 35) + } + } + ctx.fill() + ctx.stroke() + if (hoverIndex !== undefined) { + ctx.beginPath() + ctx.fillStyle = 'yellow' + rect2( + ctx, + (hoverIndex % 4) * 20, + Math.floor(hoverIndex / 4) * 16, + 20, + 16, + xx - 35, + yy - 35 + ) + ctx.fill() + ctx.stroke() + } + if (this.selectedIndex !== undefined) { + ctx.beginPath() + ctx.fillStyle = 'lightgreen' + rect2( + ctx, + (this.selectedIndex % 4) * 20, + Math.floor(this.selectedIndex / 4) * 16, + 20, + 16, + xx - 35, + yy - 35 + ) + ctx.fill() + ctx.stroke() + } + if (this.memAddr.value !== undefined) { + ctx.beginPath() + ctx.fillStyle = colors['input_text'] + rect2( + ctx, + (this.memAddr.value % 4) * 20, + Math.floor(this.memAddr.value / 4) * 16, + 20, + 16, + xx - 35, + yy - 35 + ) + ctx.fill() + ctx.stroke() + } + + ctx.beginPath() + ctx.fillStyle = 'Black' + fillText3(ctx, 'A', -65, 5, xx, yy, 16, 'Raleway', 'right') + fillText3(ctx, 'D', 75, 5, xx, yy, 16, 'Raleway', 'right') + fillText3(ctx, 'En', 5, 47, xx, yy, 16, 'Raleway', 'right') + ctx.fill() + + ctx.beginPath() + ctx.fillStyle = 'Black' + for (let i = 0; i < 16; i += 4) { + for (let j = i; j < i + 4; j++) { + let s = this.data[j].toString(16) + if (s.length < 2) s = `0${s}` + fillText3( + ctx, + s, + (j % 4) * 20, + i * 4, + xx - 35 + 10, + yy - 35 + 12, + 14, + 'Raleway', + 'center' + ) + } + } + ctx.fill() + + ctx.beginPath() + ctx.fillStyle = 'Black' + for (let i = 0; i < 16; i += 4) { + let s = i.toString(16) + if (s.length < 2) s = `0${s}` + fillText3( + ctx, + s, + 0, + i * 4, + xx - 40, + yy - 35 + 12, + 14, + 'Raleway', + 'right' + ) + } + ctx.fill() + } + + /** + * @memberof Rom + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return + } + this.dataOut.value = this.data[this.memAddr.value] + simulationArea.simulationQueue.add(this.dataOut) + } + + verilogBaseType() { + return this.verilogName() + (Rom.selSizes.length - 1) + } + //this code to generate Verilog + generateVerilog() { + Rom.selSizes.push(this.data) + return CircuitElement.prototype.generateVerilog.call(this) + } + + //This code to determine what sizes are used to generate the needed modules + //generate the needed modules + static moduleVerilog() { + var output = '' + + for (var i = 0; i < Rom.selSizes.length; i++) { + output += ` + module Rom${i}(dout, addr, en); + parameter WIDTH = 8; + parameter ADDR = 4; + output reg [WIDTH-1:0] dout; + input [ADDR-1:0] addr; + input en; + + always @ (*) begin + if (en == 0) + dout = {WIDTH{1'bz}}; + else + case (addr) + ` + for (var j = 0; j < 1 << 4; j++) { + output += + ' ' + j + ' : dout = ' + Rom.selSizes[i][j] + ';\n' + } + + output += ` endcase + end + endmodule + ` + } + + return output + } + //reset the sized before Verilog generation + static resetVerilog() { + Rom.selSizes = [] + } +} + +/** + * @memberof Rom + * Help Tip + * @type {string} + * @category sequential + */ +Rom.prototype.tooltipText = 'Read-only memory' +Rom.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/6sequentialelements?id=rom' +Rom.prototype.objectType = 'Rom' diff --git a/v1/src/simulator/src/sequential/SRflipFlop.js b/v1/src/simulator/src/sequential/SRflipFlop.js new file mode 100644 index 00000000..af1a16ce --- /dev/null +++ b/v1/src/simulator/src/sequential/SRflipFlop.js @@ -0,0 +1,131 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, fillText } from '../canvasApi' +/** + * @class + * SRflipFlop + * SR flip flop has 6 input nodes: + * clock, S input, R input, preset, reset ,enable. + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * @category sequential + */ +import { colors } from '../themer/themer' +export default class SRflipFlop extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT') { + super(x, y, scope, dir, 1) + /* + this.scope['SRflipFlop'].push(this); + */ + this.directionFixed = true + this.fixedBitWidth = true + this.setDimensions(20, 20) + this.rectangleObject = true + this.R = new Node(-20, +10, 0, this, 1, 'R') + this.S = new Node(-20, -10, 0, this, 1, 'S') + this.qOutput = new Node(20, -10, 1, this, 1, 'Q') + this.qInvOutput = new Node(20, 10, 1, this, 1, 'Q Inverse') + this.reset = new Node(10, 20, 0, this, 1, 'Asynchronous Reset') + this.preset = new Node(0, 20, 0, this, 1, 'Preset') + this.en = new Node(-10, 20, 0, this, 1, 'Enable') + this.state = 0 + // this.slaveState = 0; + // this.prevClockState = 0; + // this.wasClicked = false; + } + + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.dInp.bitWidth = bitWidth + this.qOutput.bitWidth = bitWidth + this.qInvOutput.bitWidth = bitWidth + this.preset.bitWidth = bitWidth + } + + /** + * @memberof SRflipFlop + * always resolvable + */ + isResolvable() { + return true + if (this.reset.value == 1) return true + if (this.S.value != undefined && this.R.value != undefined) return true + return false + } + + /** + * @memberof SRflipFlop + * function to resolve SR flip flop if S != R we can + * set this.state to value S. + */ + resolve() { + if (this.reset.value == 1) { + this.state = this.preset.value || 0 + } else if ( + (this.en.value == 1 || this.en.connections == 0) && + this.S.value ^ this.R.value + ) { + this.state = this.S.value + } + + if (this.qOutput.value != this.state) { + this.qOutput.value = this.state + this.qInvOutput.value = this.flipBits(this.state) + simulationArea.simulationQueue.add(this.qOutput) + simulationArea.simulationQueue.add(this.qInvOutput) + } + } + + customSave() { + var data = { + nodes: { + S: findNode(this.S), + R: findNode(this.R), + qOutput: findNode(this.qOutput), + qInvOutput: findNode(this.qInvOutput), + reset: findNode(this.reset), + preset: findNode(this.preset), + en: findNode(this.en), + }, + constructorParamaters: [this.direction], + } + return data + } + + customDraw() { + var ctx = simulationArea.context + // + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.beginPath() + ctx.lineWidth = correctWidth(3) + var xx = this.x + var yy = this.y + + // rect(ctx, xx - 20, yy - 20, 40, 40); + // moveTo(ctx, -20, 5, xx, yy, this.direction); + // lineTo(ctx, -15, 10, xx, yy, this.direction); + // lineTo(ctx, -20, 15, xx, yy, this.direction); + + // if ((this.b.hover&&!simulationArea.shiftDown)|| simulationArea.lastSelected == this || simulationArea.multipleObjectSelections.contains(this)) ctx.fillStyle = "rgba(255, 255, 32,0.8)";ctx.fill(); + ctx.stroke() + + ctx.beginPath() + ctx.font = '20px Raleway' + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + fillText(ctx, this.state.toString(16), xx, yy + 5) + ctx.fill() + } +} + +SRflipFlop.prototype.tooltipText = 'SR FlipFlop ToolTip : SR FlipFlop Selected.' + +SRflipFlop.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/6sequentialelements?id=sr-flip-flop' + +SRflipFlop.prototype.objectType = 'SRflipFlop' diff --git a/v1/src/simulator/src/sequential/TTY.js b/v1/src/simulator/src/sequential/TTY.js new file mode 100644 index 00000000..d0c89461 --- /dev/null +++ b/v1/src/simulator/src/sequential/TTY.js @@ -0,0 +1,250 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText3 } from '../canvasApi' +import { colors } from '../themer/themer' + +/** + * @class + * TTY + * TypeWriter - We can give 4 inputs: + * clock and input of 7 bits are main input required + * on the edge change the data is added onto the display + * screen of the typewriter + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * @category sequential + */ +export default class TTY extends CircuitElement { + constructor(x, y, scope = globalScope, rows = 3, cols = 32) { + super(x, y, scope, 'RIGHT', 1) + /* + this.scope['TTY'].push(this); + */ + this.directionFixed = true + this.fixedBitWidth = true + this.cols = cols || parseInt(prompt('Enter cols:')) + this.rows = rows || parseInt(prompt('Enter rows:')) + + this.elementWidth = Math.max(40, Math.ceil(this.cols / 2) * 20) + this.elementHeight = Math.max(40, Math.ceil((this.rows * 15) / 20) * 20) + this.setWidth(this.elementWidth / 2) + this.setHeight(this.elementHeight / 2) + // this.element = new Element(x, y, "TTY",this.elementWidth/2, this,this.elementHeight/2); + + this.clockInp = new Node( + -this.elementWidth / 2, + this.elementHeight / 2 - 10, + 0, + this, + 1, + 'Clock' + ) + this.asciiInp = new Node( + -this.elementWidth / 2, + this.elementHeight / 2 - 30, + 0, + this, + 7, + 'Ascii Input' + ) + // this.qOutput = new Node(20, -10, 1, this); + this.reset = new Node( + 30 - this.elementWidth / 2, + this.elementHeight / 2, + 0, + this, + 1, + 'Reset' + ) + this.en = new Node( + 10 - this.elementWidth / 2, + this.elementHeight / 2, + 0, + this, + 1, + 'Enable' + ) + // this.masterState = 0; + // this.slaveState = 0; + this.prevClockState = 0 + + this.data = '' + this.buffer = '' + } + + /** + * @memberof TTY + * this funciton is used to change the size of the screen + */ + changeRowSize(size) { + if (size == undefined || size < 1 || size > 10) return + if (this.rows == size) return + var obj = new TTY(this.x, this.y, this.scope, size, this.cols) + this.delete() + simulationArea.lastSelected = obj + return obj + } + + /** + * @memberof TTY + * this funciton is used to change the size of the screen + */ + changeColSize(size) { + if (size == undefined || size < 20 || size > 100) return + if (this.cols == size) return + var obj = new TTY(this.x, this.y, this.scope, this.rows, size) + this.delete() + simulationArea.lastSelected = obj + return obj + } + + /** + * @memberof TTY + * if no input or enable key is set to 0 returns false + */ + isResolvable() { + if (this.reset.value == 1) return true + if ( + this.en.value == 0 || + (this.en.connections.length && this.en.value == undefined) + ) + return false + else if (this.clockInp.value == undefined) return false + else if (this.asciiInp.value == undefined) return false + return true + } + + /** + * @memberof TTY + * To resolve the Typewriter clock and input of 7 bits are + * used to get the ascii and then on the edge change the + * data is added onto the display screen of the typewriter. + */ + resolve() { + if (this.reset.value == 1) { + this.data = '' + return + } + if (this.en.value == 0) { + this.buffer = '' + return + } + + if (this.clockInp.value == this.prevClockState) { + if (this.clockInp.value == 0) { + this.buffer = String.fromCharCode(this.asciiInp.value) + } + } else if (this.clockInp.value != undefined) { + if (this.clockInp.value == 1) { + this.data += this.buffer + if (this.data.length > this.cols * this.rows) { + this.data = this.data.slice(1) + } + } else if (this.clockInp.value == 0) { + this.buffer = String.fromCharCode(this.asciiInp.value) + } + this.prevClockState = this.clockInp.value + } + } + + customSave() { + var data = { + nodes: { + clockInp: findNode(this.clockInp), + asciiInp: findNode(this.asciiInp), + reset: findNode(this.reset), + en: findNode(this.en), + }, + constructorParamaters: [this.rows, this.cols], + } + return data + } + + customDraw() { + var ctx = simulationArea.context + // + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.beginPath() + ctx.lineWidth = correctWidth(3) + var xx = this.x + var yy = this.y + // rect(ctx, xx - this.elementWidth/2, yy - this.elementHeight/2, this.elementWidth, this.elementHeight); + + moveTo( + ctx, + -this.elementWidth / 2, + this.elementHeight / 2 - 15, + xx, + yy, + this.direction + ) + lineTo( + ctx, + 5 - this.elementWidth / 2, + this.elementHeight / 2 - 10, + xx, + yy, + this.direction + ) + lineTo( + ctx, + -this.elementWidth / 2, + this.elementHeight / 2 - 5, + xx, + yy, + this.direction + ) + + // if ((this.b.hover&&!simulationArea.shiftDown)|| simulationArea.lastSelected == this || simulationArea.multipleObjectSelections.contains(this)) + // ctx.fillStyle = "rgba(255, 255, 32,0.8)"; + ctx.stroke() + + ctx.beginPath() + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + var startY = -7.5 * this.rows + 3 + for (var i = 0; i < this.data.length; i += this.cols) { + var lineData = this.data.slice(i, i + this.cols) + lineData += ' '.repeat(this.cols - lineData.length) + fillText3( + ctx, + lineData, + 0, + startY + (i / this.cols) * 15 + 9, + xx, + yy, + 15, + 'Courier New', + 'center' + ) + } + ctx.fill() + } +} + +TTY.prototype.tooltipText = 'TTY ToolTip : Tele typewriter selected.' +TTY.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/6sequentialelements?id=tty' + +TTY.prototype.mutableProperties = { + cols: { + name: 'Columns', + type: 'number', + max: '100', + min: '20', + func: 'changeColSize', + }, + rows: { + name: 'Rows', + type: 'number', + max: '10', + min: '1', + func: 'changeRowSize', + }, +} + +TTY.prototype.objectType = 'TTY' diff --git a/v1/src/simulator/src/sequential/TflipFlop.js b/v1/src/simulator/src/sequential/TflipFlop.js new file mode 100644 index 00000000..cedb9f6b --- /dev/null +++ b/v1/src/simulator/src/sequential/TflipFlop.js @@ -0,0 +1,179 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText } from '../canvasApi' +import { colors } from '../themer/themer' + +/** + * @class + * TflipFlop + * T flip flop has 5 input nodes: + * clock, data input, preset, reset ,enable. + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * @category sequential + */ +export default class TflipFlop extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT') { + super(x, y, scope, dir, 1) + /* + this.scope['TflipFlop'].push(this); + */ + this.directionFixed = true + this.fixedBitWidth = true + this.setDimensions(20, 20) + this.rectangleObject = true + this.clockInp = new Node(-20, +10, 0, this, 1, 'Clock') + this.dInp = new Node(-20, -10, 0, this, this.bitWidth, 'T') + this.qOutput = new Node(20, -10, 1, this, this.bitWidth, 'Q') + this.qInvOutput = new Node(20, 10, 1, this, this.bitWidth, 'Q Inverse') + this.reset = new Node(10, 20, 0, this, 1, 'Asynchronous Reset') + this.preset = new Node(0, 20, 0, this, this.bitWidth, 'Preset') + this.en = new Node(-10, 20, 0, this, 1, 'Enable') + this.masterState = 0 + this.slaveState = 0 + this.prevClockState = 0 + + // this.wasClicked = false; + } + + /** + * @memberof TflipFlop + * returns true if clock is defined + */ + isResolvable() { + if (this.reset.value == 1) return true + if (this.clockInp.value != undefined && this.dInp.value != undefined) + return true + return false + } + + /** + * @memberof TflipFlop + * @param {number} bitWidth - the new bitwidth + */ + newBitWidth(bitWidth) { + this.bitWidth = bitWidth + this.dInp.bitWidth = bitWidth + this.qOutput.bitWidth = bitWidth + this.qInvOutput.bitWidth = bitWidth + this.preset.bitWidth = bitWidth + } + + /** + * @memberof TflipFlop + * On the leading edge of the clock signal (LOW-to-HIGH) the first stage, + * the “master” latches the input condition at D, while the output stage is deactivated. + * On the trailing edge of the clock signal (HIGH-to-LOW) the second “slave” stage is + * now activated, latching on to the output from the first master circuit. + * This fuction sets the value for the node qOutput based on + * the previous state and input of the clock by taking xor. + * We flip the bits to find qInvOutput + */ + resolve() { + if (this.reset.value == 1) { + // if reset bit is set + this.masterState = this.slaveState = this.preset.value || 0 + } else if (this.en.value == 0) { + // if enabled bit is 0 + this.prevClockState = this.clockInp.value + } else if (this.en.value == 1 || this.en.connections.length == 0) { + // if enabled bit is 1 or not connected to anything. + if (this.clockInp.value == this.prevClockState) { + if (this.clockInp.value == 0 && this.dInp.value != undefined) { + // value is xor of + this.masterState = this.dInp.value ^ this.slaveState + } + } else if (this.clockInp.value != undefined) { + if (this.clockInp.value == 1) { + this.slaveState = this.masterState + } else if ( + this.clockInp.value == 0 && + this.dInp.value != undefined + ) { + this.masterState = this.dInp.value ^ this.slaveState + } + this.prevClockState = this.clockInp.value + } + } + + if (this.qOutput.value != this.slaveState) { + this.qOutput.value = this.slaveState + this.qInvOutput.value = this.flipBits(this.slaveState) + simulationArea.simulationQueue.add(this.qOutput) + simulationArea.simulationQueue.add(this.qInvOutput) + } + } + + customSave() { + var data = { + nodes: { + clockInp: findNode(this.clockInp), + dInp: findNode(this.dInp), + qOutput: findNode(this.qOutput), + qInvOutput: findNode(this.qInvOutput), + reset: findNode(this.reset), + preset: findNode(this.preset), + en: findNode(this.en), + }, + constructorParamaters: [this.direction, this.bitWidth], + } + return data + } + + customDraw() { + var ctx = simulationArea.context + // + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.beginPath() + ctx.lineWidth = correctWidth(3) + var xx = this.x + var yy = this.y + // rect(ctx, xx - 20, yy - 20, 40, 40); + moveTo(ctx, -20, 5, xx, yy, this.direction) + lineTo(ctx, -15, 10, xx, yy, this.direction) + lineTo(ctx, -20, 15, xx, yy, this.direction) + + // if ((this.b.hover&&!simulationArea.shiftDown)|| simulationArea.lastSelected == this || simulationArea.multipleObjectSelections.contains(this)) ctx.fillStyle = "rgba(255, 255, 32,0.8)";ctx.fill(); + ctx.stroke() + ctx.beginPath() + ctx.font = '20px Raleway' + ctx.fillStyle = colors['input_text'] + ctx.textAlign = 'center' + fillText(ctx, this.slaveState.toString(16), xx, yy + 5) + ctx.fill() + } + + static moduleVerilog() { + return ` + module TflipFlop(q, q_inv, clk, t, a_rst, pre, en); + parameter WIDTH = 1; + output reg [WIDTH-1:0] q, q_inv; + input clk, a_rst, pre, en; + input [WIDTH-1:0] t; + + always @ (posedge clk or posedge a_rst) + if (a_rst) begin + q <= 'b0; + q_inv <= 'b1; + end else if (en == 0) ; + else if (t) begin + q <= q ^ t; + q_inv <= ~q ^ t; + end + endmodule + ` + } +} + +TflipFlop.prototype.tooltipText = + 'T FlipFlop ToolTip : Changes state / Toggles whenever the clock input is strobed.' + +TflipFlop.prototype.helplink = + 'https://docs.circuitverse.org/#/chapter4/6sequentialelements?id=t-flip-flop' + +TflipFlop.prototype.objectType = 'TflipFlop' diff --git a/v1/src/simulator/src/sequential/verilogRAM.js b/v1/src/simulator/src/sequential/verilogRAM.js new file mode 100644 index 00000000..d1e9c71d --- /dev/null +++ b/v1/src/simulator/src/sequential/verilogRAM.js @@ -0,0 +1,577 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { correctWidth, fillText2, fillText4, drawCircle2 } from '../canvasApi' +/** + * @class + * verilogRAM Component. + * @extends CircuitElement + * @param {number} x - x coord of element + * @param {number} y - y coord of element + * @param {Scope=} scope - the ciruit in which we want the Element + * @param {string=} dir - direcion in which element has to drawn + * + * Two settings are available: + * - addressWidth: 1 to 20, default=10. Controls the width of the address input. + * - bitWidth: 1 to 32, default=8. Controls the width of data pins. + * + * Amount of memory in the element is 2^addressWidth x bitWidth bits. + * Minimum verilogRAM size is: 2^1 x 1 = 2 bits. + * Maximum verilogRAM size is: 2^20 x 32 = 1M x 32 bits => 32 Mbits => 4MB. + * Maximum 8-bits size: 2^20 x 8 = 1M x 8 bits => 1MB. + * Default verilogRAM size is: 2^10 x 8 = 1024 bytes => 1KB. + * + * verilogRAMs are volatile therefore this component does not persist the memory contents. + * + * Changes to addressWidth and bitWidth also cause data to be lost. + * Think of these operations as being equivalent to taking a piece of verilogRAM out of a + * circuit board and replacing it with another verilogRAM of different size. + * + * The contents of the verilogRAM can be reset to zero by setting the RESET pin 1 or + * or by selecting the component and pressing the "Reset" button in the properties window. + * + * The contents of the verilogRAM can be dumped to the console by transitioning CORE DUMP pin to 1 + * or by selecting the component and pressing the "Core Dump" button in the properties window. + * Address spaces that have not been written will show up as `undefined` in the core dump. + * + * NOTE: The maximum address width of 20 is arbitrary. + * Larger values are possible, but in practice circuits won't need this much + * memory and keeping the value small helps avoid allocating too much memory on the browser. + * Internally we use a sparse array, so only the addresses that are written are actually + * allocated. Nevertheless, it is better to prevent large allocations from happening + * by keeping the max addressWidth small. If needed, we can increase the max. + * @category sequential + */ +import { colors } from '../themer/themer' + +function customResolve( + clockInp, + dInp, + qOutput, + en, + masterState, + slaveState, + prevClockState, + clock_polarity, + enable_polarity, + numIterations +) { + for (var i = 0; i < numIterations; i++) { + if (clock_polarity[i] != undefined) { + clock_polarity[i] == true ? 1 : 0 + } + + if (enable_polarity[i] != undefined) { + enable_polarity[i] == true ? 1 : 0 + } + + if (clock_polarity[i] == undefined && enable_polarity[i] == undefined) { + if (dInp[i].value != undefined) { + qOutput[i].value = dInp[i].value + simulationArea.simulationQueue.add(qOutput[i]) + } + } else if ( + clock_polarity[i] == undefined && + enable_polarity[i] != undefined + ) { + if ( + (en_value[i] == undefined || + en[i].value == enable_polarity[i]) && + dInp[i].value != undefined + ) { + qOutput[i].value = dInp[i].value + simulationArea.simulationQueue.add(qOutput[i]) + } + } else if ( + clock_polarity[i] != undefined && + enable_polarity[i] == undefined + ) { + if (clockInp[i].value == prevClockState[i]) { + if (clockInp[i].value == 0 && dInp[i].value != undefined) { + masterState[i] = dInp[i].value + } + } else if (clockInp[i].value != undefined) { + if (clockInp[i].value == 1) { + slaveState[i] = masterState[i] + } else if ( + clockInp[i].value == 0 && + dInp[i].value != undefined + ) { + masterState[i] = dInp[i].value + } + prevClockState[i] = clockInp[i].value + } + + if (qOutput[i].value != slaveState[i]) { + qOutput[i].value = slaveState[i] + simulationArea.simulationQueue.add(qOutput[i]) + } + } else { + if (en[i].value == 0) { + prevClockState[i] = clockInp[i].value + } else if (en[i].value == 1 || en[i].connections.length == 0) { + // if(en.value==1) // Creating Infinite Loop, WHY ?? + if (clockInp[i].value == prevClockState[i]) { + if (clockInp[i].value == 0 && dInp[i].value != undefined) { + masterState[i] = dInp[i].value + } + } else if (clockInp[i].value != undefined) { + if (clockInp[i].value == 1) { + slaveState[i] = masterState[i] + } else if ( + clockInp[i].value == 0 && + dInp[i].value != undefined + ) { + masterState[i] = dInp[i].value + } + prevClockState[i] = clockInp[i].value + } + } + + if (qOutput[i].value != slaveState[i]) { + qOutput[i].value = slaveState[i] + simulationArea.simulationQueue.add(qOutput[i]) + } + } + } +} + +export default class verilogRAM extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + bitWidth = 8, + addressWidth = 10, + memData, + words, + numRead, + numWrite, + rdports, + wrports + ) { + super(x, y, scope, dir, Math.min(Math.max(1, bitWidth), 32)) + /* + this.scope['verilogRAM'].push(this); + */ + this.setDimensions(60, 40) + + this.directionFixed = true + this.labelDirection = 'UP' + + this.addressWidth = Math.min( + Math.max(1, addressWidth), + this.maxAddressWidth + ) + + this.readAddress = [] + for (var i = 0; i < numRead; i++) { + this.readAddress.push( + new Node( + -this.leftDimensionX, + -20, + 0, + this, + this.addressWidth, + 'READ_ADDRESS' + i.toString() + ) + ) + } + + this.writeAddress = [] + for (var i = 0; i < numWrite; i++) { + this.writeAddress.push( + new Node( + -this.leftDimensionX, + -20, + 0, + this, + this.addressWidth, + 'WRITE_ADDRESS' + i.toString() + ) + ) + } + + this.writeDataIn = [] + this.writeEnable = [] + + this.writeDffClock = [] + this.writeDffDInp = [] + this.writeDffQOutput = [] + this.writeDffEn = [] + this.writeDffMasterState = [] + this.writeDffSlaveState = [] + this.writeDffprevClockState = [] + this.writeDffClockPolarity = [] + this.writeDffEnPolarity = [] + + for (var i = 0; i < numWrite; i++) { + var currWriteData = new Node( + -this.leftDimensionX, + 0, + 0, + this, + this.bitWidth, + 'DATA IN' + i.toString() + ) + + var clockInp = new Node(-20, +10, 0, this, 1, 'Clock') + var dInp = new Node(-20, -10, 0, this, this.bitWidth, 'D') + var qOutput = new Node(20, -10, 1, this, this.bitWidth, 'Q') + var en = new Node(-10, 20, 0, this, 1, 'Enable') + var masterState = 0 + var slaveState = 0 + var prevClockState = 0 + var clockPolarity = wrports[i]['clock_polarity'] + var enPolarity = wrports[i]['enable_polarity'] + + if (enPolarity == undefined) { + enPolarity = true + } + + currWriteData.connect(dInp) + + this.writeDffClock.push(clockInp) + this.writeDffDInp.push(dInp) + this.writeDffQOutput.push(qOutput) + this.writeDffEn.push(en) + this.writeDffMasterState.push(masterState) + this.writeDffSlaveState.push(slaveState) + this.writeDffprevClockState.push(prevClockState) + this.writeDffClockPolarity.push(clockPolarity) + this.writeDffEnPolarity.push(enPolarity) + + this.writeDataIn.push(currWriteData) + this.writeEnable.push( + new Node( + -this.leftDimensionX, + 20, + 0, + this, + 1, + 'WRITE_ENABLE' + i.toString() + ) + ) + } + + this.reset = new Node(0, this.downDimensionY, 0, this, 1, 'RESET') + this.coreDump = new Node( + -20, + this.downDimensionY, + 0, + this, + 1, + 'CORE DUMP' + ) + this.dataOut = [] + + this.readDffClock = [] + this.readDffDInp = [] + this.readDffQOutput = [] + this.readDffEn = [] + this.readDffMasterState = [] + this.readDffSlaveState = [] + this.readDffprevClockState = [] + this.readDffClockPolarity = [] + this.readDffEnPolarity = [] + + for (var i = 0; i < numRead; i++) { + var currReadOut = new Node( + this.rightDimensionX, + 0, + 1, + this, + this.bitWidth, + 'DATA OUT' + i.toString() + ) + + var clockInp = new Node(-20, +10, 0, this, 1, 'Clock') + var dInp = new Node(-20, -10, 0, this, this.bitWidth, 'D') + var qOutput = new Node(20, -10, 1, this, this.bitWidth, 'Q') + var en = new Node(-10, 20, 0, this, 1, 'Enable') + var masterState = 0 + var slaveState = 0 + var prevClockState = 0 + var clockPolarity = rdports[i]['clock_polarity'] + var enPolarity = rdports[i]['enable_polarity'] + + this.readDffClock.push(clockInp) + this.readDffDInp.push(dInp) + this.readDffQOutput.push(qOutput) + this.readDffEn.push(en) + this.readDffMasterState.push(masterState) + this.readDffSlaveState.push(slaveState) + this.readDffprevClockState.push(prevClockState) + this.readDffClockPolarity.push(clockPolarity) + this.readDffEnPolarity.push(enPolarity) + + currReadOut.connect(dInp) + + this.dataOut.push(currReadOut) + } + + this.prevCoreDumpValue = undefined + this.words = words + this.numRead = numRead + this.numWrite = numWrite + this.memData = memData + this.rdports = rdports + this.wrports = wrports + this.clearData() + this.fillData(memData) + } + + fillData(memData) { + for (var i = 0; i < this.words; i++) { + this.data[i] = 0 + } + var len = memData.length + var dataIndex = 0 + for (var i = 0; i < len; i++) { + if (Number.isInteger(memData[i])) { + var data = memData[i + 1] + + if (data.startsWith('x')) { + dataIndex += memData[i] + continue + } + + var dataValue = 0 + var power2 = 1 + + for (var j = this.bitWidth - 1; j >= 0; j--) { + if (data[j] == '1') { + dataValue += power2 + } + power2 *= 2 + } + + for (var j = 0; j < memData[i]; j++) { + this.data[dataIndex++] = dataValue + } + i++ + } else { + var data = memData[i] + + if (data.startsWith('x')) { + dataIndex++ + continue + } + + var dataValue = 0 + var power2 = 1 + + for (var j = this.bitWidth - 1; j >= 0; j--) { + if (data[j] == '1') { + dataValue += power2 + } + power2 *= 2 + } + + this.data[dataIndex++] = dataValue + } + } + } + + customSave() { + this.dataOut.map(findNode) + const data = { + // NOTE: data is not persisted since verilogRAMs are volatile. + constructorParamaters: [ + this.direction, + this.bitWidth, + this.addressWidth, + this.memData, + this.words, + this.numRead, + this.numWrite, + this.rdports, + this.wrports, + ], + + nodes: { + readAddress: this.readAddress.map(findNode), + writeAddress: this.writeAddress.map(findNode), + writeDataIn: this.writeDataIn.map(findNode), + writeEnable: this.writeEnable.map(findNode), + dataOut: this.dataOut.map(findNode), + reset: findNode(this.reset), + coreDump: findNode(this.coreDump), + readDffClock: this.readDffClock.map(findNode), + readDffDInp: this.readDffDInp.map(findNode), + readDffQOutput: this.readDffQOutput.map(findNode), + readDffEn: this.readDffEn.map(findNode), + writeDffClock: this.writeDffClock.map(findNode), + writeDffDInp: this.writeDffDInp.map(findNode), + writeDffQOutput: this.writeDffQOutput.map(findNode), + writeDffEn: this.writeDffEn.map(findNode), + }, + } + + return data + } + + newBitWidth(value) { + // value = parseInt(value); + // if (!isNaN(value) && this.bitWidth != value && value >= 1 && value <= 32) { + // this.bitWidth = value; + // this.dataIn.bitWidth = value; + // this.dataOut.bitWidth = value; + // this.clearData(); + // } + } + + changeAddressWidth(value) { + // value = parseInt(value); + // if (!isNaN(value) && this.addressWidth != value && value >= 1 && value <= this.maxAddressWidth) { + // this.addressWidth = value; + // this.address.bitWidth = value; + // this.clearData(); + // } + } + + clearData() { + this.data = new Array(this.words) + this.tooltipText = `${this.memSizeString()} ${this.shortName}` + } + + isResolvable() { + for (var i = 0; i < this.numRead; i++) { + if (this.readAddress[i] != undefined) return true + } + return this.reset.value != undefined || this.coreDump.value != undefined + } + + resolve() { + // resolve write + + customResolve( + this.writeDffClock, + this.writeDffDInp, + this.writeDffQOutput, + this.writeDffEn, + this.writeDffMasterState, + this.writeDffSlaveState, + this.writeDffprevClockState, + this.writeDffClockPolarity, + this.writeDffEnPolarity, + this.numWrite + ) + + for (var i = 0; i < this.numWrite; i++) { + if (this.writeEnable[i].value == 1) { + this.data[this.writeAddress[i].value] = + this.writeDffQOutput[i].value + } + } + + if (this.reset.value == 1) { + this.clearData() + } + + if ( + this.coreDump.value && + this.prevCoreDumpValue != this.coreDump.value + ) { + this.dump() + } + this.prevCoreDumpValue = this.coreDump.value + + for (var i = 0; i < this.numRead; i++) { + this.dataOut[i].value = this.data[this.readAddress[i].value] || 0 + simulationArea.simulationQueue.add(this.dataOut[i]) + } + + customResolve( + this.readDffClock, + this.readDffDInp, + this.readDffQOutput, + this.readDffEn, + this.readDffMasterState, + this.readDffSlaveState, + this.readDffprevClockState, + this.readDffClockPolarity, + this.readDffEnPolarity, + this.numRead + ) + } + + customDraw() { + // var ctx = simulationArea.context; + // // + // var xx = this.x; + // var yy = this.y; + // ctx.beginPath(); + // ctx.strokeStyle = 'gray'; + // ctx.fillStyle = this.write.value ? 'red' : 'lightgreen'; + // ctx.lineWidth = correctWidth(1); + // drawCircle2(ctx, 50, -30, 3, xx, yy, this.direction); + // ctx.fill(); + // ctx.stroke(); + // ctx.beginPath(); + // ctx.textAlign = 'center'; + // ctx.fillStyle = 'black'; + // fillText4(ctx, this.memSizeString(), 0, -10, xx, yy, this.direction, 12); + // fillText4(ctx, this.shortName, 0, 10, xx, yy, this.direction, 12); + // fillText2(ctx, 'A', this.address.x + 12, this.address.y, xx, yy, this.direction); + // fillText2(ctx, 'DI', this.dataIn.x + 12, this.dataIn.y, xx, yy, this.direction); + // fillText2(ctx, 'W', this.write.x + 12, this.write.y, xx, yy, this.direction); + // fillText2(ctx, 'DO', this.dataOut.x - 15, this.dataOut.y, xx, yy, this.direction); + // ctx.fill(); + } + + memSizeString() { + var mag = ['', 'K', 'M'] + var unit = + this.bitWidth == 8 + ? 'B' + : this.bitWidth == 1 + ? 'b' + : ` x ${this.bitWidth}b` + var v = Math.pow(2, this.addressWidth) + var m = 0 + while (v >= 1024 && m < mag.length - 1) { + v /= 1024 + m++ + } + return v + mag[m] + unit + } + + dump() { + var logLabel = console.group && this.label + if (logLabel) { + console.group(this.label) + } + + console.log(this.data) + + if (logLabel) { + console.groupEnd() + } + } +} + +verilogRAM.prototype.tooltipText = 'Random Access Memory' +verilogRAM.prototype.shortName = 'verilogRAM' +verilogRAM.prototype.maxAddressWidth = 20 +verilogRAM.prototype.mutableProperties = { + addressWidth: { + name: 'Address Width', + type: 'number', + max: '20', + min: '1', + func: 'changeAddressWidth', + }, + dump: { + name: 'Core Dump', + type: 'button', + func: 'dump', + }, + reset: { + name: 'Reset', + type: 'button', + func: 'clearData', + }, +} +verilogRAM.prototype.objectType = 'verilogRAM' diff --git a/v1/src/simulator/src/setup.js b/v1/src/simulator/src/setup.js new file mode 100644 index 00000000..6992115c --- /dev/null +++ b/v1/src/simulator/src/setup.js @@ -0,0 +1,211 @@ +/* eslint-disable import/no-cycle */ +/* eslint-disable no-restricted-syntax */ +/* eslint-disable guard-for-in */ + +import { Tooltip } from 'bootstrap' +import metadata from './metadata.json' +import { generateId, showMessage } from './utils' +import backgroundArea from './backgroundArea' +import plotArea from './plotArea' +import simulationArea from './simulationArea' +import { dots } from './canvasApi' +import { update, updateSimulationSet, updateCanvasSet } from './engine' +import { setupUI } from './ux' +import startMainListeners from './listeners' +// import startEmbedListeners from './embedListeners' +import './embed' +import { newCircuit, scopeList } from './circuit' +import load from './data/load' +import save from './data/save' +import { showTourGuide } from './tutorials' +import setupModules from './moduleSetup' +import 'codemirror/lib/codemirror.css' +import 'codemirror/addon/hint/show-hint.css' +import 'codemirror/mode/javascript/javascript' // verilog.js from codemirror is not working because array prototype is changed. +import 'codemirror/addon/edit/closebrackets' +import 'codemirror/addon/hint/anyword-hint' +import 'codemirror/addon/hint/show-hint' +import { setupCodeMirrorEnvironment } from './Verilog2CV' +// import { keyBinder } from '#/components/DialogBox/CustomShortcut.vue' +import '../vendor/jquery-ui.min.css' +import '../vendor/jquery-ui.min' +import { confirmSingleOption } from '#/components/helpers/confirmComponent/ConfirmComponent.vue' +import { getToken } from '#/pages/simulatorHandler.vue' + +/** + * to resize window and setup things it + * sets up new width for the canvas variables. + * Also redraws the grid. + * @category setup + */ +export function resetup() { + DPR = window.devicePixelRatio || 1 + if (lightMode) { + DPR = 1 + } + width = document.getElementById('simulationArea').clientWidth * DPR + if (!embed) { + height = + (document.body.clientHeight - + document.getElementById('toolbar').clientHeight) * + DPR + } else { + height = document.getElementById('simulation').clientHeight * DPR + } + // setup simulationArea and backgroundArea variables used to make changes to canvas. + backgroundArea.setup() + simulationArea.setup() + // redraw grid + dots() + document.getElementById('backgroundArea').style.height = + height / DPR + 100 + 'px' + document.getElementById('backgroundArea').style.width = + width / DPR + 100 + 'px' + document.getElementById('canvasArea').style.height = height / DPR + 'px' + simulationArea.canvas.width = width + simulationArea.canvas.height = height + backgroundArea.canvas.width = width + 100 * DPR + backgroundArea.canvas.height = height + 100 * DPR + if (!embed) { + plotArea.setup() + } + updateCanvasSet(true) + update() // INEFFICIENT, needs to be deprecated + simulationArea.prevScale = 0 + dots() +} + +window.onresize = resetup // listener +window.onorientationchange = resetup // listener + +// for mobiles +window.addEventListener('orientationchange', resetup) // listener + +/** + * function to setup environment variables like projectId and DPR + * @category setup + */ +function setupEnvironment() { + setupModules() + const projectId = generateId() + window.projectId = projectId + updateSimulationSet(true) + // const DPR = window.devicePixelRatio || 1 // unused variable + newCircuit('Main') + window.data = {} + resetup() + setupCodeMirrorEnvironment() +} + +/** + * It initializes some useful array which are helpful + * while simulating, saving and loading project. + * It also draws icons in the sidebar + * @category setup + */ +function setupElementLists() { + // $('#menu').empty() + + window.circuitElementList = metadata.circuitElementList + window.annotationList = metadata.annotationList + window.inputList = metadata.inputList + window.subCircuitInputList = metadata.subCircuitInputList + window.moduleList = [...circuitElementList, ...annotationList] + window.updateOrder = [ + 'wires', + ...circuitElementList, + 'nodes', + ...annotationList, + ] // Order of update + window.renderOrder = [...moduleList.slice().reverse(), 'wires', 'allNodes'] // Order of render +} + +/** + * Fetches project data from API and loads it into the simulator. + * @param {number} projectId The ID of the project to fetch data for + * @category setup + */ +async function fetchProjectData(projectId) { + try { + const response = await fetch( + `/api/v1/projects/${projectId}/circuit_data`, + { + method: 'GET', + headers: { + Accept: 'application/json', + Authorization: `Token ${getToken('cvt')}`, + }, + } + ) + if (response.ok) { + const data = await response.json() + await load(data) + await simulationArea.changeClockTime(data.timePeriod || 500) + $('.loadingIcon').fadeOut() + } else { + throw new Error('API call failed') + } + } catch (error) { + console.error(error) + confirmSingleOption('Error: Could not load.') + $('.loadingIcon').fadeOut() + } +} + +/** + * Load project data immediately when available. + * Improvement to eliminate delay caused by setTimeout in previous implementation revert if issues arise. + * @category setup + */ +async function loadProjectData() { + window.logixProjectId = window.logixProjectId ?? 0 + if (window.logixProjectId !== 0) { + $('.loadingIcon').fadeIn() + await fetchProjectData(window.logixProjectId) + } else if (localStorage.getItem('recover_login') && window.isUserLoggedIn) { + // Restore unsaved data and save + const data = JSON.parse(localStorage.getItem('recover_login')) + await load(data) + localStorage.removeItem('recover') + localStorage.removeItem('recover_login') + await save() + } else if (localStorage.getItem('recover')) { + // Restore unsaved data which didn't get saved due to error + showMessage( + "We have detected that you did not save your last work. Don't worry we have recovered them. Access them using Project->Recover" + ) + } +} + +/** + * Show tour guide if it hasn't been completed yet. + * The tour is shown after a delay of 2 seconds. + * @category setup + */ +function showTour() { + if (!localStorage.tutorials_tour_done && !embed) { + setTimeout(() => { + showTourGuide() + }, 2000) + } +} + +/** + * The first function to be called to setup the whole simulator. + * This function sets up the simulator environment, the UI, the listeners, + * loads the project data, and shows the tour guide. + * @category setup + */ +export function setup() { + // let embed = false + // const startListeners = embed ? startEmbedListeners : startMainListeners + setupElementLists() + setupEnvironment() + if (!embed) { + setupUI() + startMainListeners() + } + // startListeners() + loadProjectData() + showTour() +} diff --git a/v1/src/simulator/src/simulationArea.js b/v1/src/simulator/src/simulationArea.js new file mode 100644 index 00000000..3784988a --- /dev/null +++ b/v1/src/simulator/src/simulationArea.js @@ -0,0 +1,99 @@ +/* eslint-disable import/no-cycle */ +import EventQueue from './eventQueue' +import { clockTick } from './utils' + +/** + * simulation environment object - holds simulation canvas + * @type {Object} simulationArea + * @property {HTMLCanvasElement} canvas + * @property {boolean} selected + * @property {boolean} hover + * @property {number} clockState + * @property {boolean} clockEnabled + * @property {undefined} lastSelected + * @property {Array} stack + * @property {number} prevScale + * @property {number} oldx + * @property {number} oldy + * @property {Array} objectList + * @property {number} maxHeight + * @property {number} maxWidth + * @property {number} minHeight + * @property {number} minWidth + * @property {Array} multipleObjectSelections + * @property {Array} copyList - List of selected elements + * @property {boolean} shiftDown - shift down or not + * @property {boolean} controlDown - contol down or not + * @property {number} timePeriod - time period + * @property {number} mouseX - mouse x + * @property {number} mouseY - mouse y + * @property {number} mouseDownX - mouse click x + * @property {number} mouseDownY - mouse click y + * @property {Array} simulationQueue - simulation queue + * @property {number} clickCount - number of clicks + * @property {string} lock - locked or unlocked + * @property {function} timer - timer + * @property {function} setup - to setup the simulaton area + * @property {function} changeClockTime - change clock time + * @property {function} clear - clear the simulation area + * @category simulationArea + */ +const simulationArea = { + canvas: document.getElementById('simulationArea'), + selected: false, + hover: false, + clockState: 0, + clockEnabled: true, + lastSelected: undefined, + stack: [], + prevScale: 0, + oldx: 0, + oldy: 0, + objectList: [], + maxHeight: 0, + maxWidth: 0, + minHeight: 0, + minWidth: 0, + multipleObjectSelections: [], + copyList: [], + shiftDown: false, + controlDown: false, + timePeriod: 500, + mouseX: 0, + mouseY: 0, + mouseDownX: 0, + mouseDownY: 0, + simulationQueue: undefined, + multiAddElement: false, + + clickCount: 0, // double click + lock: 'unlocked', + timer() { + ckickTimer = setTimeout(() => { + simulationArea.clickCount = 0 + }, 600) + }, + + setup() { + this.canvas = document.getElementById('simulationArea') + this.canvas.width = width + this.canvas.height = height + this.simulationQueue = new EventQueue(10000) + this.context = this.canvas.getContext('2d') + simulationArea.changeClockTime(simulationArea.timePeriod) + this.mouseDown = false + }, + changeClockTime(t) { + if (t < 50) return + clearInterval(simulationArea.ClockInterval) + t = t || prompt('Enter Time Period:') + simulationArea.timePeriod = t + simulationArea.ClockInterval = setInterval(clockTick, t) + }, + clear() { + if (!this.context) return + this.context.clearRect(0, 0, this.canvas.width, this.canvas.height) + }, +} +export const { changeClockTime } = simulationArea +export default simulationArea diff --git a/v1/src/simulator/src/subcircuit.js b/v1/src/simulator/src/subcircuit.js new file mode 100644 index 00000000..85fdc53e --- /dev/null +++ b/v1/src/simulator/src/subcircuit.js @@ -0,0 +1,747 @@ +/* eslint-disable import/no-cycle */ +import Scope, { scopeList, switchCircuit } from './circuit' +import CircuitElement from './circuitElement' +import simulationArea from './simulationArea' +import { scheduleBackup, checkIfBackup } from './data/backupCircuit' +import { + scheduleUpdate, + updateSimulationSet, + updateCanvasSet, + updateSubcircuitSet, + forceResetNodesSet, +} from './engine' +import { loadScope } from './data/load' +import { showError } from './utils' + +import Node, { findNode } from './node' +import { fillText, correctWidth, rect2 } from './canvasApi' +import { colors } from './themer/themer' +import { layoutModeGet } from './layoutMode' +import { verilogModeGet } from './Verilog2CV' +import { sanitizeLabel } from './verilogHelpers' +import { SimulatorStore } from '#/store/SimulatorStore/SimulatorStore' +/** + * Function to load a subcicuit + * @category subcircuit + */ +export function loadSubCircuit(savedData, scope) { + new SubCircuit(savedData.x, savedData.y, scope, savedData.id, savedData) +} + +/** + * Prompt to create subcircuit, shows list of circuits which dont depend on the current circuit + * @param {Scope=} scope + * @category subcircuit + */ +export function createSubCircuitPrompt(scope = globalScope) { + if (verilogModeGet() || layoutModeGet()) { + showError('Subcircuit cannot be inserted in this mode') + return + } + const simulatorStore = SimulatorStore() + simulatorStore.dialogBox.insertsubcircuit_dialog = true + /* + $('#insertSubcircuitDialog').empty() + let flag = true + for (id in scopeList) { + if ( + !scopeList[id].checkDependency(scope.id) && + scopeList[id].isVisible() + ) { + flag = false + $('#insertSubcircuitDialog').append( + `` + ) + } + } + if (flag) + $('#insertSubcircuitDialog').append( + "

Looks like there are no other circuits which doesn't have this circuit as a dependency. Create a new one!

" + ) + $('#insertSubcircuitDialog').dialog({ + resizable: false, + maxHeight: 800, + width: 450, + maxWidth: 800, + minWidth: 250, + buttons: !flag + ? [ + { + text: 'Insert SubCircuit', + click() { + if (!$('input[name=subCircuitId]:checked').val()) + return + simulationArea.lastSelected = new SubCircuit( + undefined, + undefined, + globalScope, + $('input[name=subCircuitId]:checked').val() + ) + $(this).dialog('close') + }, + }, + ] + : [], + }) + */ +} + +/** + * @class + * @extends CircuitElement + * @param {number} x - x coord of subcircuit + * @param {number} y - y coord of subcircuit + * @param {Scope=} scope - the circuit in which subcircuit has been added + * @param {string} id - the id of the subcircuit scope + * @param {JSON} savedData - the saved data + * @category subcircuit + */ +export default class SubCircuit extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + id = undefined, + savedData = undefined + ) { + super(x, y, scope, 'RIGHT', 1) // super call + this.objectType = 'SubCircuit' + this.scope.SubCircuit.push(this) + this.id = id || prompt('Enter Id: ') + this.directionFixed = true + this.fixedBitWidth = true + this.savedData = savedData + this.inputNodes = [] + this.outputNodes = [] + this.localScope = new Scope() + this.preventCircuitSwitch = false // prevents from switching circuit if double clicking element + this.rectangleObject = false + + var subcircuitScope = scopeList[this.id] // Scope of the subcircuit + // Error handing + if (subcircuitScope == undefined) { + // if no such scope for subcircuit exists + showError( + `SubCircuit : ${ + (savedData && savedData.title) || this.id + } Not found` + ) + } else if (!checkIfBackup(subcircuitScope)) { + // if there is no input/output nodes there will be no backup + showError( + `SubCircuit : ${ + (savedData && savedData.title) || subcircuitScope.name + } is an empty circuit` + ) + } else if (subcircuitScope.checkDependency(scope.id)) { + // check for cyclic dependency + showError('Cyclic Circuit Error') + } + // Error handling, cleanup + if ( + subcircuitScope == undefined || + subcircuitScope.checkDependency(scope.id) + ) { + if (savedData) { + for (var i = 0; i < savedData.inputNodes.length; i++) { + scope.allNodes[savedData.inputNodes[i]].deleted = true + } + for (var i = 0; i < savedData.outputNodes.length; i++) { + scope.allNodes[savedData.outputNodes[i]].deleted = true + } + } + return + } + + if (this.savedData != undefined) { + updateSubcircuitSet(true) + scheduleUpdate() + this.version = this.savedData.version || '1.0' + + this.id = this.savedData.id + this.label = this.savedData.label || '' + this.labelDirection = this.savedData.labelDirection || 'RIGHT' + for (var i = 0; i < this.savedData.inputNodes.length; i++) { + this.inputNodes.push( + this.scope.allNodes[this.savedData.inputNodes[i]] + ) + this.inputNodes[i].parent = this + this.inputNodes[i].layout_id = + subcircuitScope.Input[i]?.layoutProperties.id + } + for (var i = 0; i < this.savedData.outputNodes.length; i++) { + this.outputNodes.push( + this.scope.allNodes[this.savedData.outputNodes[i]] + ) + this.outputNodes[i].parent = this + this.outputNodes[i].layout_id = + subcircuitScope.Output[i]?.layoutProperties.id + } + if (this.version == '1.0') { + // For backward compatibility + this.version = '2.0' + this.x -= subcircuitScope.layout.width / 2 + this.y -= subcircuitScope.layout.height / 2 + for (var i = 0; i < this.inputNodes.length; i++) { + this.inputNodes[i].x = + subcircuitScope.Input[i].layoutProperties.x + this.inputNodes[i].y = + subcircuitScope.Input[i].layoutProperties.y + this.inputNodes[i].leftx = this.inputNodes[i].x + this.inputNodes[i].lefty = this.inputNodes[i].y + } + for (var i = 0; i < this.outputNodes.length; i++) { + this.outputNodes[i].x = + subcircuitScope.Output[i].layoutProperties.x + this.outputNodes[i].y = + subcircuitScope.Output[i].layoutProperties.y + this.outputNodes[i].leftx = this.outputNodes[i].x + this.outputNodes[i].lefty = this.outputNodes[i].y + } + } + + if (this.version == '2.0') { + this.leftDimensionX = 0 + this.upDimensionY = 0 + this.rightDimensionX = subcircuitScope.layout.width + this.downDimensionY = subcircuitScope.layout.height + } + + this.nodeList.extend(this.inputNodes) + this.nodeList.extend(this.outputNodes) + } else { + this.version = '2.0' + } + + this.data = JSON.parse(scheduleBackup(subcircuitScope)) + this.buildCircuit() // load the localScope for the subcircuit + this.makeConnections() // which will be wireless + } + + /** + * actually make all connection but are invisible so + * it seems like the simulation is happening in other + * Scope but it actually is not. + */ + makeConnections() { + for (let i = 0; i < this.inputNodes.length; i++) { + this.localScope.Input[i]?.output1.connectWireLess( + this.inputNodes[i] + ) + this.localScope.Input[i].output1.subcircuitOverride = true + } + + for (let i = 0; i < this.outputNodes.length; i++) { + this.localScope.Output[i]?.inp1.connectWireLess(this.outputNodes[i]) + this.outputNodes[i].subcircuitOverride = true + } + } + + /** + * Function to remove wireless connections + */ + removeConnections() { + for (let i = 0; i < this.inputNodes.length; i++) { + this.localScope.Input[i]?.output1.disconnectWireLess( + this.inputNodes[i] + ) + } + + for (let i = 0; i < this.outputNodes.length; i++) { + this.localScope.Output[i]?.inp1.disconnectWireLess( + this.outputNodes[i] + ) + } + } + + /** + * loads the subcircuit and draws all the nodes + */ + buildCircuit() { + var subcircuitScope = scopeList[this.id] + loadScope(this.localScope, this.data) + this.localScope.name = this.data.name + this.lastUpdated = this.localScope.timeStamp + updateSimulationSet(true) + updateCanvasSet(true) + + if (this.savedData == undefined) { + this.leftDimensionX = 0 + this.upDimensionY = 0 + this.rightDimensionX = subcircuitScope.layout.width + this.downDimensionY = subcircuitScope.layout.height + for (var i = 0; i < subcircuitScope.Output.length; i++) { + var a = new Node( + subcircuitScope.Output[i].layoutProperties.x, + subcircuitScope.Output[i].layoutProperties.y, + 1, + this, + subcircuitScope.Output[i].bitWidth + ) + a.layout_id = subcircuitScope.Output[i].layoutProperties.id + this.outputNodes.push(a) + } + for (var i = 0; i < subcircuitScope.Input.length; i++) { + var a = new Node( + subcircuitScope.Input[i].layoutProperties.x, + subcircuitScope.Input[i].layoutProperties.y, + 0, + this, + subcircuitScope.Input[i].bitWidth + ) + a.layout_id = subcircuitScope.Input[i].layoutProperties.id + this.inputNodes.push(a) + } + } + } + + // Needs to be deprecated, removed + reBuild() { + // new SubCircuit(x = this.x, y = this.y, scope = this.scope, this.id); + // this.scope.backups = []; // Because all previous states are invalid now + // this.delete(); + // showMessage('Subcircuit: ' + subcircuitScope.name + ' has been reloaded.'); + } + + /** + * rebuilds the subcircuit if any change to localscope is made + */ + reBuildCircuit() { + this.data = JSON.parse(scheduleBackup(scopeList[this.id])) + this.localScope = new Scope(data.name) + loadScope(this.localScope, this.data) + this.lastUpdated = this.localScope.timeStamp + this.scope.timeStamp = this.localScope.timeStamp + } + + reset() { + this.removeConnections() + + var subcircuitScope = scopeList[this.id] + + for (var i = 0; i < subcircuitScope.SubCircuit.length; i++) { + subcircuitScope.SubCircuit[i].reset() + } + + // No Inputs or Outputs + let emptyCircuit = + subcircuitScope.Input.length == 0 && + subcircuitScope.Output.length == 0 + // No LayoutElements + for (let element of circuitElementList) { + if ( + subcircuitScope[element].length > 0 && + subcircuitScope[element][0].canShowInSubcircuit + ) { + emptyCircuit = false + break + } + } + + if (emptyCircuit) { + showError( + `SubCircuit : ${subcircuitScope.name} is an empty circuit` + ) + } + + subcircuitScope.layout.height = subcircuitScope.layout.height + subcircuitScope.layout.width = subcircuitScope.layout.width + this.leftDimensionX = 0 + this.upDimensionY = 0 + this.rightDimensionX = subcircuitScope.layout.width + this.downDimensionY = subcircuitScope.layout.height + + var temp_map_inp = {} + for (var i = 0; i < subcircuitScope.Input.length; i++) { + temp_map_inp[subcircuitScope.Input[i].layoutProperties.id] = [ + subcircuitScope.Input[i], + undefined, + ] + } + for (var i = 0; i < this.inputNodes.length; i++) { + if (temp_map_inp.hasOwnProperty(this.inputNodes[i].layout_id)) { + temp_map_inp[this.inputNodes[i].layout_id][1] = + this.inputNodes[i] + } else { + this.scope.backups = [] + this.inputNodes[i].delete() + this.nodeList.clean(this.inputNodes[i]) + } + } + + for (id in temp_map_inp) { + if (temp_map_inp[id][1]) { + if ( + temp_map_inp[id][0].layoutProperties.x == + temp_map_inp[id][1].x && + temp_map_inp[id][0].layoutProperties.y == + temp_map_inp[id][1].y + ) { + temp_map_inp[id][1].bitWidth = temp_map_inp[id][0].bitWidth + } else { + this.scope.backups = [] + temp_map_inp[id][1].delete() + this.nodeList.clean(temp_map_inp[id][1]) + temp_map_inp[id][1] = new Node( + temp_map_inp[id][0].layoutProperties.x, + temp_map_inp[id][0].layoutProperties.y, + 0, + this, + temp_map_inp[id][0].bitWidth + ) + temp_map_inp[id][1].layout_id = id + } + } + } + + this.inputNodes = [] + for (var i = 0; i < subcircuitScope.Input.length; i++) { + var input = + temp_map_inp[subcircuitScope.Input[i].layoutProperties.id][0] + if (temp_map_inp[input.layoutProperties.id][1]) { + this.inputNodes.push(temp_map_inp[input.layoutProperties.id][1]) + } else { + var a = new Node( + input.layoutProperties.x, + input.layoutProperties.y, + 0, + this, + input.bitWidth + ) + a.layout_id = input.layoutProperties.id + this.inputNodes.push(a) + } + } + + var temp_map_out = {} + for (var i = 0; i < subcircuitScope.Output.length; i++) { + temp_map_out[subcircuitScope.Output[i].layoutProperties.id] = [ + subcircuitScope.Output[i], + undefined, + ] + } + for (var i = 0; i < this.outputNodes.length; i++) { + if (temp_map_out.hasOwnProperty(this.outputNodes[i].layout_id)) { + temp_map_out[this.outputNodes[i].layout_id][1] = + this.outputNodes[i] + } else { + this.outputNodes[i].delete() + this.nodeList.clean(this.outputNodes[i]) + } + } + + for (id in temp_map_out) { + if (temp_map_out[id][1]) { + if ( + temp_map_out[id][0].layoutProperties.x == + temp_map_out[id][1].x && + temp_map_out[id][0].layoutProperties.y == + temp_map_out[id][1].y + ) { + temp_map_out[id][1].bitWidth = temp_map_out[id][0].bitWidth + } else { + temp_map_out[id][1].delete() + this.nodeList.clean(temp_map_out[id][1]) + temp_map_out[id][1] = new Node( + temp_map_out[id][0].layoutProperties.x, + temp_map_out[id][0].layoutProperties.y, + 1, + this, + temp_map_out[id][0].bitWidth + ) + temp_map_out[id][1].layout_id = id + } + } + } + + this.outputNodes = [] + for (var i = 0; i < subcircuitScope.Output.length; i++) { + var output = + temp_map_out[subcircuitScope.Output[i].layoutProperties.id][0] + if (temp_map_out[output.layoutProperties.id][1]) { + this.outputNodes.push( + temp_map_out[output.layoutProperties.id][1] + ) + } else { + var a = new Node( + output.layoutProperties.x, + output.layoutProperties.y, + 1, + this, + output.bitWidth + ) + a.layout_id = output.layoutProperties.id + this.outputNodes.push(a) + } + } + + if (subcircuitScope.timeStamp > this.lastUpdated) { + this.reBuildCircuit() + } + + // Should this be done here or only when this.reBuildCircuit() is called? + { + this.localScope.reset() + updateSimulationSet(true) + forceResetNodesSet(true) + } + + this.makeConnections() + } + + /** + * Procedure after a element is clicked inside a subcircuit + **/ + click() { + var elementClicked = this.getElementHover() + if (elementClicked) { + this.lastClickedElement = elementClicked + elementClicked.wasClicked = true + } + } + + getElementHover() { + var rX = this.layoutProperties.rightDimensionX + var lX = this.layoutProperties.leftDimensionX + var uY = this.layoutProperties.upDimensionY + var dY = this.layoutProperties.downDimensionY + + for (let el of circuitElementList) { + if (this.localScope[el].length === 0) continue + if (!this.localScope[el][0].canShowInSubcircuit) continue + for (let i = 0; i < this.localScope[el].length; i++) { + var obj = this.localScope[el][i] + if ( + obj.subcircuitMetadata.showInSubcircuit && + obj.isSubcircuitHover(this.x, this.y) + ) { + return obj + } + } + } + } + + /** + * Sets the elements' wasClicked property in the subcircuit to false + **/ + releaseClick() { + if (this.lastClickedElement !== undefined) { + this.lastClickedElement.wasClicked = false + this.lastClickedElement = undefined + } + } + + /** + * adds all local scope inputs to the global scope simulation queue + */ + addInputs() { + for (let i = 0; i < subCircuitInputList.length; i++) { + for ( + let j = 0; + j < this.localScope[subCircuitInputList[i]].length; + j++ + ) { + simulationArea.simulationQueue.add( + this.localScope[subCircuitInputList[i]][j], + 0 + ) + } + } + for (let j = 0; j < this.localScope.SubCircuit.length; j++) { + this.localScope.SubCircuit[j].addInputs() + } + } + + /** + * Procedure if any element is double clicked inside a subcircuit + **/ + dblclick() { + if (this.elementHover) return + switchCircuit(this.id) + } + + /** + * Returns a javascript object of subcircuit data. + * Does not include data of subcircuit elements apart from Input and Output (that is a part of element.subcircuitMetadata) + **/ + saveObject() { + var data = { + x: this.x, + y: this.y, + id: this.id, + label: this.label, + labelDirection: this.labelDirection, + inputNodes: this.inputNodes.map(findNode), + outputNodes: this.outputNodes.map(findNode), + version: this.version, + } + return data + } + + /** + * By design, subcircuit element's input and output nodes are wirelessly + * connected to the localscope (clone of the scope of the subcircuit's + * circuit). So it is almost like the actual circuit is copied in the + * location of the subcircuit element. Therefore no resolve needed. + */ + isResolvable() { + return false + } + + /** + * If element not resolvable (always in subcircuits), removePropagation + * is called on it. + */ + removePropagation() { + // Leave this to the scope of the subcircuit. Do nothing. + } + + verilogName() { + return sanitizeLabel(scopeList[this.id].name) + } + /** + * determines where to show label + */ + determine_label(x, y) { + if (x == 0) return ['left', 5, 5] + if (x == scopeList[this.id].layout.width) return ['right', -5, 5] + if (y == 0) return ['center', 0, 13] + return ['center', 0, -6] + } + + checkHover() { + super.checkHover() + if (this.elementHover) { + this.elementHover.hover = false + this.elementHover = undefined + simulationArea.hover = undefined + } + var elementHover = this.getElementHover() + if (elementHover) { + elementHover.hover = true + this.elementHover = elementHover + this.hover = false + simulationArea.hover = elementHover + } + } + + /** + * Draws the subcircuit (and contained elements) on the screen when the subcircuit is included + in another circuit + **/ + customDraw() { + var subcircuitScope = scopeList[this.id] + + var ctx = simulationArea.context + + ctx.lineWidth = globalScope.scale * 3 + ctx.strokeStyle = colors['stroke'] // ("rgba(0,0,0,1)"); + ctx.fillStyle = colors['fill'] + var xx = this.x + var yy = this.y + + ctx.strokeStyle = colors['stroke'] + ctx.fillStyle = colors['fill'] + ctx.lineWidth = correctWidth(3) + ctx.beginPath() + rect2( + ctx, + -this.leftDimensionX, + -this.upDimensionY, + this.leftDimensionX + this.rightDimensionX, + this.upDimensionY + this.downDimensionY, + this.x, + this.y, + [this.direction, 'RIGHT'][+this.directionFixed] + ) + if (!this.elementHover) { + if ( + (this.hover && !simulationArea.shiftDown) || + simulationArea.lastSelected === this || + simulationArea.multipleObjectSelections.contains(this) + ) + ctx.fillStyle = colors['hover_select'] + } + ctx.fill() + ctx.stroke() + + ctx.beginPath() + + ctx.textAlign = 'center' + ctx.fillStyle = 'black' + if (this.version == '1.0') { + fillText( + ctx, + subcircuitScope.name, + xx, + yy - subcircuitScope.layout.height / 2 + 13, + 11 + ) + } else if (this.version == '2.0') { + if (subcircuitScope.layout.titleEnabled) { + fillText( + ctx, + subcircuitScope.name, + subcircuitScope.layout.title_x + xx, + yy + subcircuitScope.layout.title_y, + 11 + ) + } + } else { + } + + for (var i = 0; i < subcircuitScope.Input.length; i++) { + if (!subcircuitScope.Input[i].label) continue + var info = this.determine_label( + this.inputNodes[i].x, + this.inputNodes[i].y + ) + ctx.textAlign = info[0] + fillText( + ctx, + subcircuitScope.Input[i].label, + this.inputNodes[i].x + info[1] + xx, + yy + this.inputNodes[i].y + info[2], + 12 + ) + } + + for (var i = 0; i < subcircuitScope.Output.length; i++) { + if (!subcircuitScope.Output[i].label) continue + var info = this.determine_label( + this.outputNodes[i].x, + this.outputNodes[i].y + ) + ctx.textAlign = info[0] + fillText( + ctx, + subcircuitScope.Output[i].label, + this.outputNodes[i].x + info[1] + xx, + yy + this.outputNodes[i].y + info[2], + 12 + ) + } + ctx.fill() + for (let i = 0; i < this.outputNodes.length; i++) { + this.outputNodes[i].draw() + } + for (let i = 0; i < this.inputNodes.length; i++) { + this.inputNodes[i].draw() + } + + // draw subcircuitElements + for (let el of circuitElementList) { + if (this.localScope[el].length === 0) continue + if (!this.localScope[el][0].canShowInSubcircuit) continue + for (let i = 0; i < this.localScope[el].length; i++) { + if ( + this.localScope[el][i].subcircuitMetadata.showInSubcircuit + ) { + this.localScope[el][i].drawLayoutMode(this.x, this.y) + } + } + } + } +} +SubCircuit.prototype.centerElement = true // To center subcircuit when new +SubCircuit.prototype.propagationDelayFixed = true diff --git a/v1/src/simulator/src/testCreator.js b/v1/src/simulator/src/testCreator.js new file mode 100644 index 00000000..4a1708c2 --- /dev/null +++ b/v1/src/simulator/src/testCreator.js @@ -0,0 +1,780 @@ +/* + This file contains all javascript related to the test creator UI + at /testbench +*/ + +import _ from '../vendor/table2csv' + +const CREATORMODE = { + NORMAL: 0, + SIMULATOR_POPUP: 1, +} + +var testMode = 'comb' +var groupIndex = 0 +var inputCount = 0 +var nextInputIndex = 0 +var outputCount = 0 +var nextOutputIndex = 0 +var cases = [0] +var creatorMode = CREATORMODE.NORMAL +var circuitScopeID + +function dataReset() { + groupIndex = -1 + cases = [0] +} + +/** + * Onload, check if it is opened in a popup. + * Check if test is being edited, or created + */ +window.onload = () => { + const query = new URLSearchParams(window.location.search) + if (query.has('popUp')) { + if (query.get('popUp') == 'true') { + creatorMode = CREATORMODE.SIMULATOR_POPUP + $('.right-button-group').append( + '' + ) + } + } + if (query.has('data')) { + $('#tb-creator-head').html('Edit Test') + circuitScopeID = query.get('scopeID') + loadData(query.get('data')) + return + } + + if (query.has('result')) { + $('#tb-creator-head').html('Test Result') + loadResult(query.get('result')) + readOnlyUI() + return + } + + circuitScopeID = query.get('scopeID') + addInput() + addOutput() + makeSortable() +} + +/* Change UI testMode between Combinational(comb) and Sequential(seq) */ +function changeTestMode(m) { + if (testMode === m) return false + dataReset() + testMode = m + $('#combSelect').removeClass('tab-selected') + $('#seqSelect').removeClass('tab-selected') + $('#tb-new-group').css('visibility', m === 'seq' ? 'visible' : 'hidden') + $(`#${m}Select`).addClass('tab-selected') + $('#dataGroup').empty() + + return true +} + +/* Adds case to a group */ +function addCase(grp) { + const currentGroupTable = $(`#data-table-${grp + 1}`) + + let s = + '
\n' + for (let i = 0; i < inputCount + outputCount; i++) + s += '0' + s += '' + + // Sortable hack + currentGroupTable.find('tbody').remove() + currentGroupTable.append(s) +} + +/* Deletes case from a group */ +function deleteCase(element) { + const row = element.parent().parent() + const grp = Number(row.parent().attr('id').split('-').pop()) + + row.remove() +} + +/* Adds group with default name 'Group N' or name supplied in @param groupName */ +/* Used without params by UI, used with params by loadData() */ +function addGroup( + groupName = `${testMode === 'comb' ? 'Group' : 'Set'} ${groupIndex + 2}` +) { + $('.plus-button').removeClass('latest-button') + groupIndex++ + + const s = ` +
+

${escapeHtml(groupName)}

+
Click + to add tests to the ${ + testMode === 'comb' ? 'group' : 'set' + }
+ + +
+ +
+ ` + cases[groupIndex] = 0 + $('#dataGroup').append(s) + + makeSortable() +} + +/* Deletes a group */ +function deleteGroup(element) { + const groupDiv = element.parent() + const grp = Number(groupDiv.attr('id').split('-').pop()) + groupDiv.remove() +} + +/* Adds input with default value 0 or values supplied in @param inputData */ +/* Used without params for UI, used with params by loadData() */ +function addInput( + label = `inp${nextInputIndex + 1}`, + bitwidth = 1, + inputData = [] +) { + nextInputIndex++ + inputCount++ + // Change head table contents + const sHead = `${escapeHtml( + label + )}
` + const sData = `${escapeHtml( + bitwidth.toString() + )}` + $('#testBenchTable') + .find('tr') + .eq(1) + .find('th') + .eq(inputCount - 1) + .after(sHead) + $('#testBenchTable') + .find('tr') + .eq(2) + .find('td') + .eq(inputCount - 1) + .after(sData) + $('#tb-inputs-head').attr('colspan', inputCount) + + // Change data tables' contents + $('#dataGroup') + .find('table') + .each(function (group_i) { + $(this) + .find('tr') + .each(function (case_i) { + const s = `${ + inputData.length + ? escapeHtml(inputData[group_i][case_i]) + : 0 + }` + $(this) + .find('td') + .eq(inputCount - 1) + .after(s) + }) + }) +} + +/* Adds output with default value 0 or values supplied in @param outputData */ +/* Used without params for UI, used with params by loadData() */ +/* Used with resultData and result=true for setting result */ +function addOutput( + label = `out${nextOutputIndex + 1}`, + bitwidth = 1, + outputData = [], + result = false, + resultData = [] +) { + nextOutputIndex++ + outputCount++ + // Change head table contents + let sHead = `${escapeHtml( + label + )} ` + let sData = `${escapeHtml( + bitwidth.toString() + )}` + + // If result then set colspan to 2 + if (result) { + sHead = `${escapeHtml( + label + )} ` + sData = `${escapeHtml( + bitwidth.toString() + )}` + } + + $('#testBenchTable') + .find('tr') + .eq(1) + .find('th') + .eq(inputCount + outputCount - 1) + .after(sHead) + $('#testBenchTable') + .find('tr') + .eq(2) + .find('td') + .eq(inputCount + outputCount - 1) + .after(sData) + // If not result then colspan is outputCount + $('#tb-outputs-head').attr('colspan', outputCount) + // else it's 2*outputCount + if (result) { + $('#tb-outputs-head').attr('colspan', 2 * outputCount) + } + + // Change data tables' contents + + // If not result just add the outputs + if (!result) { + $('#dataGroup') + .find('table') + .each(function (group_i) { + $(this) + .find('tr') + .each(function (case_i) { + const s = `${ + outputData.length + ? escapeHtml(outputData[group_i][case_i]) + : 0 + }` + $(this) + .find('td') + .eq(inputCount + outputCount - 1) + .after(s) + }) + }) + + // If result then add results besides the outputs + // Hacky + } else { + $('#dataGroup') + .find('table') + .each(function (group_i) { + $(this) + .find('tr') + .each(function (case_i) { + // Add the outputs (expected values) + const outputCellData = `${escapeHtml( + outputData[group_i][case_i] + )}` + $(this) + .find('td') + .eq(inputCount + 2 * (outputCount - 1)) + .after(outputCellData) + + // Add the actual values + const resultColor = + resultData[group_i][case_i] === + outputData[group_i][case_i] + ? 'green' + : 'red' + const resultCellData = `${escapeHtml( + resultData[group_i][case_i] + )}` + $(this) + .find('td') + .eq(inputCount + 2 * outputCount - 1) + .after(resultCellData) + }) + }) + } +} + +/* Deletes input unless there's only one input */ +function deleteInput(element) { + if (inputCount === 1) return + const columnIndex = element.parent().eq(0).index() + + $('#testBenchTable tr, .data-group tr') + .slice(1) + .each(function () { + $(this).find('td, th').eq(columnIndex).remove() + }) + + inputCount-- + $('#tb-inputs-head').attr('colspan', inputCount) +} + +/* Deletes output unless there's only one output */ +function deleteOutput(element) { + if (outputCount === 1) return + const columnIndex = element.parent().eq(0).index() + + $('#testBenchTable tr, .data-group tr') + .slice(1) + .each(function () { + $(this).find('td, th').eq(columnIndex).remove() + }) + + outputCount-- + $('#tb-outputs-head').attr('colspan', outputCount) +} + +/* Returns input/output(keys) and their bitwidths(values) */ +/* Called by getData() */ +function getBitWidths() { + const bitwidths = {} + $('#testBenchTable') + .find('tr') + .eq(1) + .find('th') + .slice(1) + .each(function (index) { + const inp = $(this).text() + const bw = $('#testBenchTable') + .find('tr') + .eq(2) + .find('td') + .slice(1) + .eq(index) + .html() + bitwidths[inp] = Number(bw) + }) + return bitwidths +} + +/* Returns data for all the groups for all inputs and outputs */ +/* Called by parse() */ +function getData() { + const bitwidths = getBitWidths() + const groups = [] + const groupCount = $('#dataGroup').children().length + for (let group_i = 0; group_i < groupCount; group_i++) { + const group = {} + group.label = getGroupTitle(group_i) + group.inputs = [] + group.outputs = [] + + const group_table = $(`#data-table-${group_i + 1}`) + group.n = group_table.find('tr').length + + // Push all the inputs in the group + for (let inp_i = 0; inp_i < inputCount; inp_i++) { + const label = Object.keys(bitwidths)[inp_i] + const input = { + label: label.slice(0, label.length - 1), + bitWidth: bitwidths[label], + values: [], + } + group_table.find('tr').each(function () { + input.values.push($(this).find('td').slice(1).eq(inp_i).html()) + }) + + group.inputs.push(input) + } + + // Push all the outputs in the group + for (let out_i = 0; out_i < outputCount; out_i++) { + const label = Object.keys(bitwidths)[inputCount + out_i] + const output = { + label: label.slice(0, label.length - 1), + bitWidth: bitwidths[label], + values: [], + } + group_table.find('tr').each(function () { + output.values.push( + $(this) + .find('td') + .slice(1) + .eq(inputCount + out_i) + .html() + ) + }) + + group.outputs.push(output) + } + + groups.push(group) + } + + return groups +} + +function getTestTitle() { + return $('#test-title-label').text() +} + +function getGroupTitle(group_i) { + return $(`#data-group-title-${group_i + 1}`).text() +} + +/* Parse UI table into Javascript Object */ +function parse() { + const data = {} + const tableData = getData() + data.type = testMode + data.title = getTestTitle() + data.groups = tableData + return data +} + +/* Export test data as a CSV file */ +function exportAsCSV() { + let csvData = '' + csvData += 'Title,Test Type,Input Count,Output Count\n' + csvData += `${getTestTitle()},${testMode},${inputCount},${outputCount}\n\n\n` + csvData += $('table').eq(0).table2CSV() + csvData += '\n\n' + $('table') + .slice(1) + .each(function (group_i) { + csvData += getGroupTitle(group_i) + csvData += '\n' + csvData += $(this).table2CSV() + csvData += '\n\n' + }) + + download(`${getTestTitle()}.csv`, csvData) + return csvData +} + +/* + Imports data from CSV and loads into the table + To achieve this, first converts to JSON then uses request param to load json to table +*/ +function importFromCSV() { + const file = $('#csvFileInput').prop('files')[0] + const reader = new FileReader() + + // If circuitScopeID exists, ie. if popup opened from testbench, then use that to redirect + const query = new URLSearchParams(window.location.search) + // Preserve popup status while redirecting + const isPopup = query.get('popUp') || false + + // When the file is read, redirect to the data location + reader.onload = () => { + const csvContent = reader.result + const jsonData = csv2json(csvContent, 1, 1) + + window.location = `/testbench?scopeID=${ + circuitScopeID || '' + }&data=${jsonData}&popUp=${isPopup}` + } + + reader.readAsText(file) +} + +// Clicks the hidden upload file button, entrypoint into importFromCSV() +// The hidden button in-turn calls importFromCSV() +function clickUpload() { + $('#csvFileInput').click() +} + +/* Converts CSV to JSON to be loaded into the table */ +function csv2json(csvFileData) { + const stripQuotes = (str) => str.replaceAll('"', '') + + /* Extracts bitwidths from the csv data */ + const getBitWidthsCSV = (csvDataBW) => { + const testMetadata = csvDataBW.split('\n\n')[0].split('\n') + const labels = testMetadata[1] + .split(',') + .slice(1) + .map((label) => stripQuotes(label)) + const bitWidths = testMetadata[2] + .split(',') + .slice(1) + .map((bw) => Number(stripQuotes(bw))) + + return { labels, bitWidths } + } + + const csvMetadata = csvFileData.split('\n\n\n')[0].split('\n')[1].split(',') + const csvData = csvFileData.split('\n\n\n')[1] + const jsonData = {} + + jsonData.title = csvMetadata[0] + jsonData.type = csvMetadata[1] + const inputCountCSV = Number(csvMetadata[2]) + const outputCountCSV = Number(csvMetadata[3]) + + jsonData.groups = [] + const { labels, bitWidths } = getBitWidthsCSV(csvData) + + const groups = csvData.split('\n\n').slice(1) + for (let group_i = 0; group_i < groups.length - 1; group_i++) { + const rows = groups[group_i].split('\n') + jsonData.groups[group_i] = { + label: rows[0], + n: rows.length - 1, + inputs: [], + outputs: [], + } + + // Parse Inputs + for (let input_i = 0; input_i < inputCountCSV; input_i++) { + const thisInput = { + label: labels[input_i], + bitWidth: bitWidths[input_i], + values: [], + } + for (let case_i = 1; case_i < rows.length; case_i++) + thisInput.values.push( + stripQuotes(rows[case_i].split(',')[input_i + 1]) + ) + + jsonData.groups[group_i].inputs.push(thisInput) + } + + // Parse Outputs + for ( + let output_i = inputCountCSV; + output_i < inputCountCSV + outputCountCSV; + output_i++ + ) { + const thisOutput = { + label: labels[output_i], + bitWidth: bitWidths[output_i], + values: [], + } + for (let case_i = 1; case_i < rows.length; case_i++) { + thisOutput.values.push( + stripQuotes(rows[case_i].split(',')[output_i + 1]) + ) + } + + jsonData.groups[group_i].outputs.push(thisOutput) + } + } + + return JSON.stringify(jsonData) +} + +/* Helper function to download generated file */ +function download(filename, text) { + var element = document.createElement('a') + element.setAttribute( + 'href', + `data:text/plain;charset=utf-8,${encodeURIComponent(text)}` + ) + element.setAttribute('download', filename) + + element.style.display = 'none' + document.body.appendChild(element) + + element.click() + + document.body.removeChild(element) +} + +/** + * Called when Save is clicked. If opened in popup, sends message to parent window + * to attach test to the testbench. + */ +function saveData() { + const testData = parse() + + if (creatorMode === CREATORMODE.SIMULATOR_POPUP) { + const postData = { scopeID: circuitScopeID, testData } + window.opener.postMessage( + { type: 'testData', data: JSON.stringify(postData) }, + '*' + ) + window.close() + } +} + +/* Loads data from JSON string into the table */ +function loadData(dataJSON) { + const data = JSON.parse(dataJSON) + if (data.title) $('#test-title-label').text(data.title) + changeTestMode() + changeTestMode(data.type) + for (let group_i = 0; group_i < data.groups.length; group_i++) { + const group = data.groups[group_i] + addGroup(group.label) + for (let case_i = 0; case_i < group.inputs[0].values.length; case_i++) { + addCase(group_i) + } + } + + // Add input values + for (let input_i = 0; input_i < data.groups[0].inputs.length; input_i++) { + const input = data.groups[0].inputs[input_i] + const values = data.groups.map((group) => group.inputs[input_i].values) + + addInput(input.label, input.bitWidth, values) + } + + // Add output values + for ( + let output_i = 0; + output_i < data.groups[0].outputs.length; + output_i++ + ) { + const output = data.groups[0].outputs[output_i] + const values = data.groups.map( + (group) => group.outputs[output_i].values + ) + + addOutput(output.label, output.bitWidth, values) + } +} + +/** + * Loads result from JSON string into the testbench creator UI + */ +function loadResult(dataJSON) { + const data = JSON.parse(dataJSON) + if (data.title) $('#test-title-label').text(data.title) + changeTestMode() + changeTestMode(data.type) + for (let group_i = 0; group_i < data.groups.length; group_i++) { + const group = data.groups[group_i] + addGroup(group.label) + for (let case_i = 0; case_i < group.inputs[0].values.length; case_i++) { + addCase(group_i) + } + } + + // Add input values + for (let input_i = 0; input_i < data.groups[0].inputs.length; input_i++) { + const input = data.groups[0].inputs[input_i] + const values = data.groups.map((group) => group.inputs[input_i].values) + + addInput(input.label, input.bitWidth, values) + } + + // Add output values + for ( + let output_i = 0; + output_i < data.groups[0].outputs.length; + output_i++ + ) { + const output = data.groups[0].outputs[output_i] + const values = data.groups.map( + (group) => group.outputs[output_i].values + ) + const results = data.groups.map( + (group) => group.outputs[output_i].results + ) + const expectedOutputs = [] + const actualOutputs = [] + + for (let group_i = 0; group_i < values.length; group_i++) { + const groupExpectedOuts = [] + const groupActualOuts = [] + for (let val_i = 0; val_i < values[group_i].length; val_i++) { + groupExpectedOuts.push(values[group_i][val_i]) + groupActualOuts.push(results[group_i][val_i]) + } + + expectedOutputs.push(groupExpectedOuts) + actualOutputs.push(groupActualOuts) + } + addOutput( + `${output.label}`, + output.bitWidth, + expectedOutputs, + true, + actualOutputs + ) + } +} + +/** + * Makes the UI read only for displaying results + */ +function readOnlyUI() { + makeContentUneditable() + makeUnsortable() + $('.lower-button, .table-button, .tb-minus').hide() + $('.tablink').attr('disabled', 'disabled') + $('.tablink').removeClass('tablink-no-override') + $('.data-group-info').text('') +} + +function makeContentUneditable() { + $('body') + .find('td, th, span, h3, div') + .each(function () { + $(this).attr('contenteditable', 'false') + }) +} + +function makeSortable() { + const helper = function (e, ui) { + const helperE = ui.clone() + helperE.children().each(function (child_i) { + $(this).width(ui.children().eq(child_i).width()) + }) + + return helperE + } + + function makePlaceholder(e, ui) { + ui.placeholder.children().each(function () { + $(this).css('border', '0px') + }) + } + + /* + Sortable hack: To allow sorting inside empty tables, the tables should have some height. + But it is not possible to give tables height without having rows, so we add a tbody. + tbody gives the table height but messes up all the other things. So we only keep tbody + if the table has no rows, and once table gets rows, we remove that tbody + */ + function removeTbody(e, ui) { + $(e.target).find('tbody').remove() + } + + function createTbody(e, ui) { + if ($(e.target).find('tr, tbody').length === 0) { + $(e.target).append('') + } + } + + $('.data-group table').sortable({ + handle: '.tb-handle', + helper, + start: makePlaceholder, + placeholder: 'clone', + connectWith: 'table', + receive: removeTbody, // For sortable hack + remove: createTbody, // For sortable hack + items: 'tr', + revert: 50, + scroll: false, + }) +} + +function makeUnsortable() { + $('.data-group table').sortable({ disabled: true }) +} + +function escapeHtml(unsafe) { + return unsafe + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, ''') +} + +// Making HTML called functions global + +window.addGroup = addGroup +window.deleteGroup = deleteGroup +window.addCase = addCase +window.deleteCase = deleteCase +window.addInput = addInput +window.deleteInput = deleteInput +window.addOutput = addOutput +window.deleteOutput = deleteOutput +window.parse = parse +window.saveData = saveData +window.changeTestMode = changeTestMode +window.exportAsCSV = exportAsCSV +window.importFromCSV = importFromCSV +window.csv2json = csv2json +window.clickUpload = clickUpload diff --git a/v1/src/simulator/src/testbench.js b/v1/src/simulator/src/testbench.js new file mode 100644 index 00000000..d6f8a070 --- /dev/null +++ b/v1/src/simulator/src/testbench.js @@ -0,0 +1,1140 @@ +/** + * This file contains all functions related the the testbench + * Contains the the testbench engine and UI modules + */ + +import { scheduleBackup } from './data/backupCircuit' +import { changeClockEnable } from './sequential' +import { play } from './engine' +import Scope from './circuit' +import { showMessage, escapeHtml } from './utils' +import { confirmOption } from '#/components/helpers/confirmComponent/ConfirmComponent.vue' + +/** + * @typedef {number} RunContext + */ +const CONTEXT = { + CONTEXT_SIMULATOR: 0, + CONTEXT_ASSIGNMENTS: 1, +} + +const VALIDATION_ERRORS = { + NOTPRESENT: 0, // Element is not present in the circuit + WRONGBITWIDTH: 1, // Element is present but has incorrect bitwidth + DUPLICATE_ID_DATA: 2, // Duplicate identifiers in test data + DUPLICATE_ID_SCOPE: 3, // Duplicate identifiers in scope + NO_RST: 4, // Sequential circuit but no reset(RST) in scope +} + +const TESTBENCH_CREATOR_PATH = '/testbench' + +// Do we have any other function to do this? +// Utility function. Converts decimal number to binary string +function dec2bin(dec, bitWidth = undefined) { + if (dec === undefined) return 'X' + const bin = (dec >>> 0).toString(2) + if (!bitWidth) return bin + + return '0'.repeat(bitWidth - bin.length) + bin +} + +/** + * Class to store all data related to the testbench and functions to use it + * @param {Object} data - Javascript object of the test data + * @param {number=} currentGroup - Current group index in the test + * @param {number=} currentCase - Current case index in the group + */ +export class TestbenchData { + constructor(data, currentGroup = 0, currentCase = 0) { + this.currentCase = currentCase + this.currentGroup = currentGroup + this.testData = data + } + + /** + * Checks whether given case-group pair exists in the test + */ + isCaseValid() { + if ( + this.currentGroup >= this.data.groups.length || + this.currentGroup < 0 + ) + return false + const caseCount = + this.testData.groups[this.currentGroup].inputs[0].values.length + if (this.currentCase >= caseCount || this.currentCase < 0) return false + + return true + } + + /** + * Validate and set case and group in the test + * @param {number} groupIndex - Group index to set + * @param {number} caseIndex - Case index to set + */ + setCase(groupIndex, caseIndex) { + const newCase = new TestbenchData(this.testData, groupIndex, caseIndex) + if (newCase.isCaseValid()) { + this.currentGroup = groupIndex + this.currentCase = caseIndex + return true + } + + return false + } + + /** + * Validate and go to the next group. + * Skips over empty groups + */ + groupNext() { + const newCase = new TestbenchData(this.testData, this.currentGroup, 0) + const groupCount = newCase.testData.groups.length + let caseCount = + newCase.testData.groups[newCase.currentGroup].inputs[0].values + .length + + while (caseCount === 0 || this.currentGroup === newCase.currentGroup) { + newCase.currentGroup++ + if (newCase.currentGroup >= groupCount) return false + caseCount = + newCase.testData.groups[newCase.currentGroup].inputs[0].values + .length + } + + this.currentGroup = newCase.currentGroup + this.currentCase = newCase.currentCase + return true + } + + /** + * Validate and go to the previous group. + * Skips over empty groups + */ + groupPrev() { + const newCase = new TestbenchData(this.testData, this.currentGroup, 0) + const groupCount = newCase.testData.groups.length + let caseCount = + newCase.testData.groups[newCase.currentGroup].inputs[0].values + .length + + while (caseCount === 0 || this.currentGroup === newCase.currentGroup) { + newCase.currentGroup-- + if (newCase.currentGroup < 0) return false + caseCount = + newCase.testData.groups[newCase.currentGroup].inputs[0].values + .length + } + + this.currentGroup = newCase.currentGroup + this.currentCase = newCase.currentCase + return true + } + + /** + * Validate and go to the next case + */ + caseNext() { + const caseCount = + this.testData.groups[this.currentGroup].inputs[0].values.length + if (this.currentCase >= caseCount - 1) return this.groupNext() + this.currentCase++ + return true + } + + /** + * Validate and go to the previous case + */ + casePrev() { + if (this.currentCase <= 0) { + if (!this.groupPrev()) return false + const caseCount = + this.testData.groups[this.currentGroup].inputs[0].values.length + this.currentCase = caseCount - 1 + return true + } + + this.currentCase-- + return true + } + + /** + * Finds and switches to the first non empty group to start the test from + */ + goToFirstValidGroup() { + const newCase = new TestbenchData(this.testData, 0, 0) + const caseCount = + newCase.testData.groups[this.currentGroup].inputs[0].values.length + + // If the first group is not empty, do nothing + if (caseCount > 0) return true + + // Otherwise go next until non empty group + const validExists = newCase.groupNext() + + // If all groups empty return false + if (!validExists) return false + + // else set case to the non empty group + this.currentGroup = newCase.currentGroup + this.currentCase = newCase.currentCase + return true + } +} + +/** + * UI Function + * Create prompt for the testbench UI when creator is opened + */ +function creatorOpenPrompt(creatorWindow) { + scheduleBackup() + const windowSVG = ` + + + + + ` + + const s = ` +
+
+ ${windowSVG} +
+

A browser pop-up is opened to create the test

+

Please save the test to open it here

+
+ ` + + $('#setTestbenchData').dialog({ + resizable: false, + width: 'auto', + buttons: [ + { + text: 'Close Pop-Up', + click() { + $(this).dialog('close') + creatorWindow.close() + }, + }, + ], + }) + + $('#setTestbenchData').empty() + $('#setTestbenchData').append(s) +} + +/** + * Interface function to run testbench. Called by testbench prompt on simulator or assignments + * @param {Object} data - Object containing Test Data + * @param {RunContext=} runContext - Whether simulator or Assignment called this function + * @param {Scope=} scope - the circuit + */ +export function runTestBench( + data, + scope = globalScope, + runContext = CONTEXT.CONTEXT_SIMULATOR +) { + const isValid = validate(data, scope) + if (!isValid.ok) { + showMessage( + 'Testbench: Some elements missing from circuit. Click Validate to know more' + ) + } + + if (runContext === CONTEXT.CONTEXT_SIMULATOR) { + const tempTestbenchData = new TestbenchData(data) + if (!tempTestbenchData.goToFirstValidGroup()) { + showMessage('Testbench: The test is empty') + return + } + + globalScope.testbenchData = tempTestbenchData + + updateTestbenchUI() + return + } + + if (runContext === CONTEXT.CONTEXT_ASSIGNMENTS) { + // Not implemented + } +} + +/** + * Updates the TestBench UI on the simulator with the current test attached + * If no test is attached then shows the 'No test attached' screen + * Called by runTestBench() when test is set, also called by UX/setupPanelListeners() + * whenever ux change requires this UI to update(such as clicking on a different circuit or + * loading a saved circuit) + */ +export function updateTestbenchUI() { + // Remove all listeners from buttons + $('.tb-dialog-button').off('click') + $('.tb-case-button').off('click') + + setupTestbenchUI() + if (globalScope.testbenchData != undefined) { + const { testbenchData } = globalScope + + // Initialize the UI + setUITableHeaders(testbenchData) + + // Add listeners to buttons + $('.tb-case-button#prev-case-btn').on( + 'click', + buttonListenerFunctions.previousCaseButton + ) + $('.tb-case-button#next-case-btn').on( + 'click', + buttonListenerFunctions.nextCaseButton + ) + $('.tb-case-button#prev-group-btn').on( + 'click', + buttonListenerFunctions.previousGroupButton + ) + $('.tb-case-button#next-group-btn').on( + 'click', + buttonListenerFunctions.nextGroupButton + ) + $('.tb-dialog-button#change-test-btn').on( + 'click', + buttonListenerFunctions.changeTestButton + ) + $('.tb-dialog-button#runall-btn').on( + 'click', + buttonListenerFunctions.runAllButton + ) + $('.tb-dialog-button#edit-test-btn').on( + 'click', + buttonListenerFunctions.editTestButton + ) + $('.tb-dialog-button#validate-btn').on( + 'click', + buttonListenerFunctions.validateButton + ) + $('.tb-dialog-button#remove-test-btn').on( + 'click', + buttonListenerFunctions.removeTestButton + ) + } + + // Add listener to attach test button + $('.tb-dialog-button#attach-test-btn').on( + 'click', + buttonListenerFunctions.attachTestButton + ) +} + +/** + * Defines all the functions called as event listeners for buttons on the UI + */ +const buttonListenerFunctions = { + previousCaseButton: () => { + const isValid = validate( + globalScope.testbenchData.testData, + globalScope + ) + if (!isValid.ok) { + showMessage( + 'Testbench: Some elements missing from circuit. Click Validate to know more' + ) + return + } + globalScope.testbenchData.casePrev() + buttonListenerFunctions.computeCase() + }, + + nextCaseButton: () => { + const isValid = validate( + globalScope.testbenchData.testData, + globalScope + ) + if (!isValid.ok) { + showMessage( + 'Testbench: Some elements missing from circuit. Click Validate to know more' + ) + return + } + globalScope.testbenchData.caseNext() + buttonListenerFunctions.computeCase() + }, + + previousGroupButton: () => { + const isValid = validate( + globalScope.testbenchData.testData, + globalScope + ) + if (!isValid.ok) { + showMessage( + 'Testbench: Some elements missing from circuit. Click Validate to know more' + ) + return + } + globalScope.testbenchData.groupPrev() + buttonListenerFunctions.computeCase() + }, + + nextGroupButton: () => { + const isValid = validate( + globalScope.testbenchData.testData, + globalScope + ) + if (!isValid.ok) { + showMessage( + 'Testbench: Some elements missing from circuit. Click Validate to know more' + ) + return + } + globalScope.testbenchData.groupNext() + buttonListenerFunctions.computeCase() + }, + + changeTestButton: () => { + openCreator('create') + }, + + runAllButton: () => { + const isValid = validate( + globalScope.testbenchData.testData, + globalScope + ) + if (!isValid.ok) { + showMessage( + 'Testbench: Some elements missing from circuit. Click Validate to know more' + ) + return + } + const results = runAll(globalScope.testbenchData.testData, globalScope) + const { passed } = results.summary + const { total } = results.summary + const resultString = JSON.stringify(results.detailed) + $('#runall-summary').text(`${passed} out of ${total}`) + $('#runall-detailed-link').on('click', () => { + openCreator('result', resultString) + }) + $('.testbench-runall-label').css('display', 'table-cell') + $('.testbench-runall-label').delay(5000).fadeOut('slow') + }, + + editTestButton: () => { + const editDataString = JSON.stringify( + globalScope.testbenchData.testData + ) + openCreator('edit', editDataString) + }, + + validateButton: () => { + const isValid = validate( + globalScope.testbenchData.testData, + globalScope + ) + showValidationUI(isValid) + }, + + removeTestButton: async () => { + if ( + await confirmOption( + 'Are you sure you want to remove the test from the circuit?' + ) + ) { + globalScope.testbenchData = undefined + setupTestbenchUI() + } + }, + + attachTestButton: () => { + openCreator('create') + }, + + rerunTestButton: () => { + buttonListenerFunctions.computeCase() + }, + + computeCase: () => { + setUICurrentCase(globalScope.testbenchData) + const result = runSingleTest(globalScope.testbenchData, globalScope) + setUIResult(globalScope.testbenchData, result) + }, +} + +/** + * UI Function + * Checks whether test is attached to the scope and switches UI accordingly + */ +export function setupTestbenchUI() { + // Don't change UI if UI is minimized (because hide() and show() are recursive) + if ($('.testbench-manual-panel .minimize').css('display') === 'none') return + + if (globalScope.testbenchData === undefined) { + $('.tb-test-not-null').hide() + $('.tb-test-null').show() + return + } + + $('.tb-test-null').hide() + $('.tb-test-not-null').show() +} + +/** + * Run all the tests automatically. Called by runTestBench() + * @param {Object} data - Object containing Test Data + * @param {Scope=} scope - the circuit + */ +export function runAll(data, scope = globalScope) { + // Stop the clocks + // TestBench will now take over clock toggling + changeClockEnable(false) + + const { inputs, outputs, reset } = bindIO(data, scope) + let totalCases = 0 + let passedCases = 0 + + data.groups.forEach((group) => { + // for (const output of group.outputs) output.results = []; + group.outputs.forEach((output) => (output.results = [])) + for (let case_i = 0; case_i < group.n; case_i++) { + totalCases++ + // Set and propagate the inputs + setInputValues(inputs, group, case_i, scope) + // If sequential, trigger clock now + if (data.type === 'seq') tickClock(scope) + // Get output values + const caseResult = getOutputValues(data, outputs) + // Put the results in the data + + let casePassed = true // Tracks if current case passed or failed + + caseResult.forEach((_, outName) => { + // TODO: find() is not the best idea because of O(n) + const output = group.outputs.find( + (dataOutput) => dataOutput.label === outName + ) + output.results.push(caseResult.get(outName)) + + if (output.values[case_i] !== caseResult.get(outName)) + casePassed = false + }) + + // If current case passed, then increment passedCases + if (casePassed) passedCases++ + } + + // If sequential, trigger reset at the end of group (set) + if (data.type === 'seq') triggerReset(reset) + }) + + // Tests done, restart the clocks + changeClockEnable(true) + + // Return results + const results = {} + results.detailed = data + results.summary = { passed: passedCases, total: totalCases } + return results +} + +/** + * Runs single test + * @param {Object} data - Object containing Test Data + * @param {number} groupIndex - Index of the group to be tested + * @param {number} caseIndex - Index of the case inside the group + * @param {Scope} scope - The circuit + */ +function runSingleTest(testbenchData, scope) { + const data = testbenchData.testData + + let result + if (data.type === 'comb') { + result = runSingleCombinational(testbenchData, scope) + } else if (data.type === 'seq') { + result = runSingleSequential(testbenchData, scope) + } + + return result +} + +/** + * Runs single combinational test + * @param {Object} data - Object containing Test Data + * @param {number} groupIndex - Index of the group to be tested + * @param {number} caseIndex - Index of the case inside the group + * @param {Scope} scope - The circuit + */ +function runSingleCombinational(testbenchData, scope) { + const data = testbenchData.testData + const groupIndex = testbenchData.currentGroup + const caseIndex = testbenchData.currentCase + + const { inputs, outputs } = bindIO(data, scope) + const group = data.groups[groupIndex] + + // Stop the clocks + changeClockEnable(false) + + // Set input values according to the test + setInputValues(inputs, group, caseIndex, scope) + // Check output values + const result = getOutputValues(data, outputs) + // Restart the clocks + changeClockEnable(true) + return result +} + +/** + * Runs single sequential test and all tests above it in the group + * Used in MANUAL mode + * @param {Object} data - Object containing Test Data + * @param {number} groupIndex - Index of the group to be tested + * @param {number} caseIndex - Index of the case inside the group + * @param {Scope} scope - The circuit + */ +function runSingleSequential(testbenchData, scope) { + const data = testbenchData.testData + const groupIndex = testbenchData.currentGroup + const caseIndex = testbenchData.currentCase + + const { inputs, outputs, reset } = bindIO(data, scope) + const group = data.groups[groupIndex] + + // Stop the clocks + changeClockEnable(false) + + // Trigger reset + triggerReset(reset, scope) + + // Run the test and tests above in the same group + for (let case_i = 0; case_i <= caseIndex; case_i++) { + setInputValues(inputs, group, case_i, scope) + tickClock(scope) + } + + const result = getOutputValues(data, outputs) + + // Restart the clocks + changeClockEnable(true) + + return result +} + +/** + * Set and propogate the input values according to the testcase. + * Called by runSingle() and runAll() + * @param {Object} inputs - Object with keys as input names and values as inputs + * @param {Object} group - Test group + * @param {number} caseIndex - Index of the case in the group + * @param {Scope} scope - the circuit + */ +function setInputValues(inputs, group, caseIndex, scope) { + group.inputs.forEach((input) => { + inputs[input.label].state = parseInt(input.values[caseIndex], 2) + }) + + // Propagate inputs + play(scope) +} + +/** + * Gets Output values as a Map with keys as output name and value as output state + * @param {Object} outputs - Object with keys as output names and values as outputs + */ +function getOutputValues(data, outputs) { + const values = new Map() + + data.groups[0].outputs.forEach((dataOutput) => { + // Using node value because output state only changes on rendering + const resultValue = outputs[dataOutput.label].nodeList[0].value + const resultBW = outputs[dataOutput.label].nodeList[0].bitWidth + values.set(dataOutput.label, dec2bin(resultValue, resultBW)) + }) + + return values +} + +/** + * UI Function + * Shows validation UI + * @param {Object} validationErrors - Object with errors returned by validate() + */ +function showValidationUI(validationErrors) { + const checkSVG = ` + + + + ` + + let s = ` +
+
+ ${checkSVG} +
+ All good. No validation errors +
+ ` + + if (!validationErrors.ok) { + s = ` +
+

Please fix these errors to run tests

+ + + + + + ` + + validationErrors.invalids.forEach((vError) => { + s += ` + + + + + ` + }) + + s += '
IdentifierError
${vError.identifier}${vError.message}
' + } + + $('#testbenchValidate').dialog({ + resizable: false, + width: 'auto', + buttons: [ + { + text: 'Ok', + click() { + $(this).dialog('close') + }, + }, + { + text: 'Auto Fix', + click() { + const fixes = validationAutoFix(validationErrors) + showMessage(`Testbench: Auto fixed ${fixes} errors`) + $(this).dialog('close') + }, + }, + ], + }) + + $('#testbenchValidate').empty() + $('#testbenchValidate').append(s) +} + +/** + * Validate if all inputs and output elements are present with correct bitwidths + * @param {Object} data - Object containing Test Data + * @param {Scope} scope - the circuit + */ +function validate(data, scope) { + let invalids = [] + + // Check for duplicate identifiers + if (!checkDistinctIdentifiersData(data)) { + invalids.push({ + type: VALIDATION_ERRORS.DUPLICATE_ID_DATA, + identifier: '-', + message: 'Duplicate identifiers in test data', + }) + } + + if (!checkDistinctIdentifiersScope(scope)) { + invalids.push({ + type: VALIDATION_ERRORS.DUPLICATE_ID_SCOPE, + identifier: '-', + message: 'Duplicate identifiers in circuit', + }) + } + + // Don't do further checks if duplicates + if (invalids.length > 0) return { ok: false, invalids } + + // Validate inputs and outputs + const inputsValid = validateInputs(data, scope) + const outputsValid = validateOutputs(data, scope) + + invalids = inputsValid.ok ? invalids : invalids.concat(inputsValid.invalids) + invalids = outputsValid.ok + ? invalids + : invalids.concat(outputsValid.invalids) + + // Validate presence of reset if test is sequential + if (data.type === 'seq') { + const resetPresent = scope.Input.some( + (simulatorReset) => + simulatorReset.label === 'RST' && + simulatorReset.bitWidth === 1 && + simulatorReset.objectType === 'Input' + ) + + if (!resetPresent) { + invalids.push({ + type: VALIDATION_ERRORS.NO_RST, + identifier: 'RST', + message: 'Reset(RST) not present in circuit', + }) + } + } + + if (invalids.length > 0) return { ok: false, invalids } + return { ok: true } +} + +/** + * Autofix whatever is possible in validation errors. + * returns number of autofixed errors + * @param {Object} validationErrors - Object with errors returned by validate() + */ +function validationAutoFix(validationErrors) { + // Currently only autofixes bitwidths + let fixedErrors = 0 + // Return if no errors + if (validationErrors.ok) return fixedErrors + + const bitwidthErrors = validationErrors.invalids.filter( + (vError) => vError.type === VALIDATION_ERRORS.WRONGBITWIDTH + ) + + bitwidthErrors.forEach((bwError) => { + const { element, expectedBitWidth } = bwError.extraInfo + element.newBitWidth(expectedBitWidth) + fixedErrors++ + }) + + return fixedErrors +} + +/** + * Checks if all the labels in the test data are unique. Called by validate() + * @param {Object} data - Object containing Test Data + */ +function checkDistinctIdentifiersData(data) { + const inputIdentifiersData = data.groups[0].inputs.map( + (input) => input.label + ) + const outputIdentifiersData = data.groups[0].outputs.map( + (output) => output.label + ) + const identifiersData = inputIdentifiersData.concat(outputIdentifiersData) + + return new Set(identifiersData).size === identifiersData.length +} + +/** + * Checks if all the input/output labels in the scope are unique. Called by validate() + * TODO: Replace with identifiers + * @param {Scope} scope - the circuit + */ +function checkDistinctIdentifiersScope(scope) { + const inputIdentifiersScope = scope.Input.map((input) => input.label) + const outputIdentifiersScope = scope.Output.map((output) => output.label) + let identifiersScope = inputIdentifiersScope.concat(outputIdentifiersScope) + + // Remove identifiers which have not been set yet (ie. empty strings) + identifiersScope = identifiersScope.filter((identifer) => identifer != '') + + return new Set(identifiersScope).size === identifiersScope.length +} + +/** + * Validates presence and bitwidths of test inputs in the circuit. + * Called by validate() + * @param {Object} data - Object containing Test Data + * @param {Scope} scope - the circuit + */ +function validateInputs(data, scope) { + const invalids = [] + + data.groups[0].inputs.forEach((dataInput) => { + const matchInput = scope.Input.find( + (simulatorInput) => simulatorInput.label === dataInput.label + ) + + if (matchInput === undefined) { + invalids.push({ + type: VALIDATION_ERRORS.NOTPRESENT, + identifier: dataInput.label, + message: 'Input is not present in the circuit', + }) + } else if (matchInput.bitWidth !== dataInput.bitWidth) { + invalids.push({ + type: VALIDATION_ERRORS.WRONGBITWIDTH, + identifier: dataInput.label, + extraInfo: { + element: matchInput, + expectedBitWidth: dataInput.bitWidth, + }, + message: `Input bitwidths don't match in circuit and test (${matchInput.bitWidth} vs ${dataInput.bitWidth})`, + }) + } + }) + + if (invalids.length > 0) return { ok: false, invalids } + return { ok: true } +} + +/** + * Validates presence and bitwidths of test outputs in the circuit. + * Called by validate() + * @param {Object} data - Object containing Test Data + * @param {Scope} scope - the circuit + */ +function validateOutputs(data, scope) { + const invalids = [] + + data.groups[0].outputs.forEach((dataOutput) => { + const matchOutput = scope.Output.find( + (simulatorOutput) => simulatorOutput.label === dataOutput.label + ) + + if (matchOutput === undefined) { + invalids.push({ + type: VALIDATION_ERRORS.NOTPRESENT, + identifier: dataOutput.label, + message: 'Output is not present in the circuit', + }) + } else if (matchOutput.bitWidth !== dataOutput.bitWidth) { + invalids.push({ + type: VALIDATION_ERRORS.WRONGBITWIDTH, + identifier: dataOutput.label, + extraInfo: { + element: matchOutput, + expectedBitWidth: dataOutput.bitWidth, + }, + message: `Output bitwidths don't match in circuit and test (${matchOutput.bitWidth} vs ${dataOutput.bitWidth})`, + }) + } + }) + + if (invalids.length > 0) return { ok: false, invalids } + return { ok: true } +} + +/** + * Returns object of scope inputs and outputs keyed by their labels + * @param {Object} data - Object containing Test Data + * @param {Scope=} scope - the circuit + */ +function bindIO(data, scope) { + const inputs = {} + const outputs = {} + let reset + + data.groups[0].inputs.forEach((dataInput) => { + inputs[dataInput.label] = scope.Input.find( + (simulatorInput) => simulatorInput.label === dataInput.label + ) + }) + + data.groups[0].outputs.forEach((dataOutput) => { + outputs[dataOutput.label] = scope.Output.find( + (simulatorOutput) => simulatorOutput.label === dataOutput.label + ) + }) + + if (data.type === 'seq') { + reset = scope.Input.find( + (simulatorOutput) => simulatorOutput.label === 'RST' + ) + } + + return { inputs, outputs, reset } +} + +/** + * Ticks clock recursively one full cycle (Only used in testbench context) + * @param {Scope} scope - the circuit whose clock to be ticked + */ +function tickClock(scope) { + scope.clockTick() + play(scope) + scope.clockTick() + play(scope) +} + +/** + * Triggers reset (Only used in testbench context) + * @param {Input} reset - reset pin to be triggered + * @param {Scope} scope - the circuit + */ +function triggerReset(reset, scope) { + reset.state = 1 + play(scope) + reset.state = 0 + play(scope) +} + +/** + * UI Function + * Sets IO labels and bitwidths on UI table + * Called by simulatorRunTestbench() + * @param {Object} data - Object containing the test data + */ +function setUITableHeaders(testbenchData) { + const data = testbenchData.testData + const inputCount = data.groups[0].inputs.length + const outputCount = data.groups[0].outputs.length + + $('#tb-manual-table-inputs-head').attr('colspan', inputCount) + $('#tb-manual-table-outputs-head').attr('colspan', outputCount) + + $('.testbench-runall-label').css('display', 'none') + + $('.tb-data#data-title') + .children() + .eq(1) + .text(data.title || 'Untitled') + $('.tb-data#data-type') + .children() + .eq(1) + .text(data.type === 'comb' ? 'Combinational' : 'Sequential') + + $('#tb-manual-table-labels').html('LABELS') + $('#tb-manual-table-bitwidths').html('Bitwidth') + + data.groups[0].inputs.concat(data.groups[0].outputs).forEach((io) => { + const label = `${escapeHtml(io.label)}` + const bw = `${escapeHtml(io.bitWidth.toString())}` + $('#tb-manual-table-labels').append(label) + $('#tb-manual-table-bitwidths').append(bw) + }) + + setUICurrentCase(testbenchData) +} + +/** + * UI Function + * Set current test case data on the UI + * @param {Object} data - Object containing the test data + * @param {number} groupIndex - Index of the group of current case + * @param {number} caseIndex - Index of the case within the group + */ +function setUICurrentCase(testbenchData) { + const data = testbenchData.testData + const groupIndex = testbenchData.currentGroup + const caseIndex = testbenchData.currentCase + + const currCaseElement = $('#tb-manual-table-current-case') + currCaseElement.empty() + currCaseElement.append('Current Case') + $('#tb-manual-table-test-result').empty() + $('#tb-manual-table-test-result').append('Result') + + data.groups[groupIndex].inputs.forEach((input) => { + currCaseElement.append( + `${escapeHtml(input.values[caseIndex])}` + ) + }) + + data.groups[groupIndex].outputs.forEach((output) => { + currCaseElement.append( + `${escapeHtml(output.values[caseIndex])}` + ) + }) + + $('.testbench-manual-panel .group-label').text( + data.groups[groupIndex].label + ) + $('.testbench-manual-panel .case-label').text(caseIndex + 1) +} + +/** + * UI Function + * Set the current test case result on the UI + * @param {Object} data - Object containing the test data + * @param {Map} result - Map containing the output values (returned by getOutputValues()) + */ +function setUIResult(testbenchData, result) { + const data = testbenchData.testData + const groupIndex = testbenchData.currentGroup + const caseIndex = testbenchData.currentCase + const resultElement = $('#tb-manual-table-test-result') + let inputCount = data.groups[0].inputs.length + resultElement.empty() + resultElement.append('Result') + while (inputCount--) { + resultElement.append(' - ') + } + + for (const output of result.keys()) { + const resultValue = result.get(output) + const expectedValue = data.groups[groupIndex].outputs.find( + (dataOutput) => dataOutput.label === output + ).values[caseIndex] + const color = resultValue === expectedValue ? '#17FC12' : '#FF1616' + resultElement.append( + `${escapeHtml(resultValue)}` + ) + } +} + +/** + * Use this function to navigate to test creator. This function starts the storage listener + * so the test is loaded directly into the simulator + * @param {string} type - 'create', 'edit' or 'result' + * @param {String} dataString - data in JSON string to load in case of 'edit' and 'result' + */ +function openCreator(type, dataString) { + const popupHeight = 800 + const popupWidth = 1200 + const popupTop = (window.height - popupHeight) / 2 + const popupLeft = (window.width - popupWidth) / 2 + const POPUP_STYLE_STRING = `height=${popupHeight},width=${popupWidth},top=${popupTop},left=${popupLeft}` + let popUp + + /* Listener to catch testData from pop up and load it onto the testbench */ + const dataListener = (message) => { + if ( + message.origin !== window.origin || + message.data.type !== 'testData' + ) + return + + // Check if the current scope requested the creator pop up + const data = JSON.parse(message.data.data) + + // Unbind event listener + window.removeEventListener('message', dataListener) + + // If scopeID does not match, do nothing and return + if (data.scopeID != globalScope.id) return + + // Load test data onto the scope + runTestBench(data.testData, globalScope, CONTEXT.CONTEXT_SIMULATOR) + + // Close the 'Pop up is open' dialog + $('#setTestbenchData').dialog('close') + } + + if (type === 'create') { + const url = `${TESTBENCH_CREATOR_PATH}?scopeID=${globalScope.id}&popUp=true` + popUp = window.open(url, 'popupWindow', POPUP_STYLE_STRING) + creatorOpenPrompt(popUp) + window.addEventListener('message', dataListener) + } + + if (type === 'edit') { + const url = `${TESTBENCH_CREATOR_PATH}?scopeID=${globalScope.id}&data=${dataString}&popUp=true` + popUp = window.open(url, 'popupWindow', POPUP_STYLE_STRING) + creatorOpenPrompt(popUp) + window.addEventListener('message', dataListener) + } + + if (type === 'result') { + const url = `${TESTBENCH_CREATOR_PATH}?scopeID=${globalScope.id}&result=${dataString}&popUp=true` + popUp = window.open(url, 'popupWindow', POPUP_STYLE_STRING) + } + + // Check if popup was closed (in case it was closed by window's X button), + // then close 'popup open' dialog + if (popUp && type !== 'result') { + const checkPopUp = setInterval(() => { + if (popUp.closed) { + // Close the dialog if it's open + if ($('#setTestbenchData').dialog('isOpen')) + $('#setTestbenchData').dialog('close') + + // Remove the event listener that listens for data from popup + window.removeEventListener('message', dataListener) + clearInterval(checkPopUp) + } + }, 1000) + } +} diff --git a/v1/src/simulator/src/testbench/ForceGate.js b/v1/src/simulator/src/testbench/ForceGate.js new file mode 100644 index 00000000..5da82c6f --- /dev/null +++ b/v1/src/simulator/src/testbench/ForceGate.js @@ -0,0 +1,92 @@ +import CircuitElement from '../circuitElement' +import Node, { findNode } from '../node' +import simulationArea from '../simulationArea' +import { fillText4 } from '../canvasApi' +/** + * @class + * ForceGate + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category testbench + */ +export default class ForceGate extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth) + this.setDimensions(20, 10) + this.objectType = 'ForceGate' + this.scope.ForceGate.push(this) + this.inp1 = new Node(-20, 0, 0, this) + this.inp2 = new Node(0, 0, 0, this) + this.output1 = new Node(20, 0, 1, this) + } + + /** + * @memberof ForceGate + * Checks if the element is resolvable + * @return {boolean} + */ + isResolvable() { + return this.inp1.value !== undefined || this.inp2.value !== undefined + } + + /** + * @memberof ForceGate + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + output1: findNode(this.output1), + inp1: findNode(this.inp1), + inp2: findNode(this.inp2), + }, + } + return data + } + + /** + * @memberof ForceGate + * resolve output values based on inputData + */ + resolve() { + if (this.inp2.value !== undefined) { + this.output1.value = this.inp2.value + } else { + this.output1.value = this.inp1.value + } + simulationArea.simulationQueue.add(this.output1) + } + + /** + * @memberof ForceGate + * function to draw element + */ + customDraw() { + var ctx = simulationArea.context + const xx = this.x + const yy = this.y + + ctx.beginPath() + ctx.fillStyle = 'Black' + ctx.textAlign = 'center' + + fillText4(ctx, 'I', -10, 0, xx, yy, this.direction, 10) + fillText4(ctx, 'O', 10, 0, xx, yy, this.direction, 10) + ctx.fill() + } +} + +/** + * @memberof ForceGate + * Help Tip + * @type {string} + * @category testbench + */ +ForceGate.prototype.tooltipText = 'Force Gate ToolTip : ForceGate Selected.' +ForceGate.prototype.objectType = 'ForceGate' diff --git a/v1/src/simulator/src/testbench/testbenchInput.js b/v1/src/simulator/src/testbench/testbenchInput.js new file mode 100644 index 00000000..bdf7452b --- /dev/null +++ b/v1/src/simulator/src/testbench/testbenchInput.js @@ -0,0 +1,351 @@ +import CircuitElement from '../circuitElement' +import simulationArea from '../simulationArea' +import { correctWidth, lineTo, moveTo, fillText } from '../canvasApi' +import Node, { findNode } from '../node' +import plotArea from '../plotArea' + +/** + * TestBench Input has a node for it's clock input. + * this.testData - the data of all test cases. + * Every testbench has a uniq identifier. + * @class + * @extends CircuitElement + * @param {number} x - the x coord of TB + * @param {number} y - the y coord of TB + * @param {Scope=} scope - the circuit on which TB is drawn + * @param {string} dir - direction + * @param {string} identifier - id to identify tests + * @param {JSON=} testData - input, output and number of tests + * @category testbench + */ +export default class TB_Input extends CircuitElement { + constructor( + x, + y, + scope = globalScope, + dir = 'RIGHT', + identifier, + testData + ) { + super(x, y, scope, dir, 1) + this.objectType = 'TB_Input' + this.scope.TB_Input.push(this) + this.setIdentifier(identifier || 'Test1') + this.testData = testData || { inputs: [], outputs: [], n: 0 } + this.clockInp = new Node(0, 20, 0, this, 1) + this.outputs = [] + this.running = false // if tests are undergo + this.iteration = 0 + this.setup() + } + + /** + * @memberof TB_Input + * Takes input when double clicked. For help on generation of input refer to TB_Input.helplink + */ + dblclick() { + this.testData = JSON.parse(prompt('Enter TestBench Json')) + this.setup() + } + + setDimensions() { + this.leftDimensionX = 0 + this.rightDimensionX = 120 + + this.upDimensionY = 0 + this.downDimensionY = 40 + this.testData.inputs.length * 20 + } + + /** + * @memberof TB_Input + * setups the Test by parsing through the testbench data. + */ + setup() { + this.iteration = 0 + this.running = false + this.nodeList.clean(this.clockInp) + this.deleteNodes() + this.nodeList = [] + this.nodeList.push(this.clockInp) + this.testData = this.testData || { inputs: [], outputs: [], n: 0 } + // this.clockInp = new Node(0,20, 0,this,1); + + this.setDimensions() + + this.prevClockState = 0 + this.outputs = [] + + for (var i = 0; i < this.testData.inputs.length; i++) { + this.outputs.push( + new Node( + this.rightDimensionX, + 30 + i * 20, + 1, + this, + this.testData.inputs[i].bitWidth, + this.testData.inputs[i].label + ) + ) + } + + for (var i = 0; i < this.scope.TB_Output.length; i++) { + if (this.scope.TB_Output[i].identifier == this.identifier) { + this.scope.TB_Output[i].setup() + } + } + } + + /** + * @memberof TB_Input + * toggles state by simply negating this.running so that test cases stop + */ + toggleState() { + this.running = !this.running + this.prevClockState = 0 + } + + /** + * @memberof TB_Input + * function to run from test case 0 again + */ + resetIterations() { + this.iteration = 0 + this.prevClockState = 0 + } + + /** + * @memberof TB_Input + * function to resolve the testbench input adds + */ + resolve() { + if (this.clockInp.value != this.prevClockState) { + this.prevClockState = this.clockInp.value + if (this.clockInp.value == 1 && this.running) { + if (this.iteration < this.testData.n) { + this.iteration++ + } else { + this.running = false + } + } + } + if (this.running && this.iteration) { + for (var i = 0; i < this.testData.inputs.length; i++) { + this.outputs[i].value = parseInt( + this.testData.inputs[i].values[this.iteration - 1], + 2 + ) + simulationArea.simulationQueue.add(this.outputs[i]) + } + } + } + + /** + * @memberof TB_Input + * was a function to plot values incase any flag used as output to this element + */ + setPlotValue() { + return + var time = plotArea.stopWatch.ElapsedMilliseconds + if ( + this.plotValues.length && + this.plotValues[this.plotValues.length - 1][0] == time + ) { + this.plotValues.pop() + } + + if (this.plotValues.length == 0) { + this.plotValues.push([time, this.inp1.value]) + return + } + + if (this.plotValues[this.plotValues.length - 1][1] == this.inp1.value) { + return + } + this.plotValues.push([time, this.inp1.value]) + } + + customSave() { + var data = { + constructorParamaters: [ + this.direction, + this.identifier, + this.testData, + ], + nodes: { + outputs: this.outputs.map(findNode), + clockInp: findNode(this.clockInp), + }, + } + return data + } + + /** + * This function is used to set a uniq identifier to every testbench + * @memberof TB_Input + */ + setIdentifier(id = '') { + if (id.length == 0 || id == this.identifier) return + + for (var i = 0; i < this.scope.TB_Output.length; i++) { + this.scope.TB_Output[i].checkPairing() + } + + for (var i = 0; i < this.scope.TB_Output.length; i++) { + if (this.scope.TB_Output[i].identifier == this.identifier) { + this.scope.TB_Output[i].identifier = id + } + } + + this.identifier = id + + this.checkPaired() + } + + /** + * Check if there is a output tester paired with input TB. + * @memberof TB_Input + */ + checkPaired() { + for (var i = 0; i < this.scope.TB_Output.length; i++) { + if (this.scope.TB_Output[i].identifier == this.identifier) { + this.scope.TB_Output[i].checkPairing() + } + } + } + + delete() { + super.delete() + this.checkPaired() + } + + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = 'grey' + ctx.fillStyle = '#fcfcfc' + ctx.lineWidth = correctWidth(1) + var xx = this.x + var yy = this.y + + var xRotate = 0 + var yRotate = 0 + if (this.direction == 'LEFT') { + xRotate = 0 + yRotate = 0 + } else if (this.direction == 'RIGHT') { + xRotate = 120 - this.xSize + yRotate = 0 + } else if (this.direction == 'UP') { + xRotate = 60 - this.xSize / 2 + yRotate = -20 + } else { + xRotate = 60 - this.xSize / 2 + yRotate = 20 + } + + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = 'black' + fillText( + ctx, + `${this.identifier} [INPUT]`, + xx + this.rightDimensionX / 2, + yy + 14, + 10 + ) + + fillText( + ctx, + ['Not Running', 'Running'][+this.running], + xx + this.rightDimensionX / 2, + yy + 14 + 10 + 20 * this.testData.inputs.length, + 10 + ) + fillText( + ctx, + `Case: ${this.iteration}`, + xx + this.rightDimensionX / 2, + yy + 14 + 20 + 20 * this.testData.inputs.length, + 10 + ) + // fillText(ctx, "Case: "+this.iteration, xx , yy + 20+14, 10); + ctx.fill() + + ctx.font = '30px Raleway' + ctx.textAlign = 'right' + ctx.fillStyle = 'blue' + ctx.beginPath() + for (var i = 0; i < this.testData.inputs.length; i++) { + // ctx.beginPath(); + fillText( + ctx, + this.testData.inputs[i].label, + this.rightDimensionX - 5 + xx, + 30 + i * 20 + yy + 4, + 10 + ) + } + + ctx.fill() + if (this.running && this.iteration) { + ctx.font = '30px Raleway' + ctx.textAlign = 'left' + ctx.fillStyle = 'blue' + ctx.beginPath() + for (var i = 0; i < this.testData.inputs.length; i++) { + fillText( + ctx, + this.testData.inputs[i].values[this.iteration - 1], + 5 + xx, + 30 + i * 20 + yy + 4, + 10 + ) + } + + ctx.fill() + } + + ctx.beginPath() + ctx.strokeStyle = 'rgba(0,0,0,1)' + ctx.lineWidth = correctWidth(3) + var xx = this.x + var yy = this.y + // rect(ctx, xx - 20, yy - 20, 40, 40); + moveTo(ctx, 0, 15, xx, yy, this.direction) + lineTo(ctx, 5, 20, xx, yy, this.direction) + lineTo(ctx, 0, 25, xx, yy, this.direction) + + ctx.stroke() + } +} + +TB_Input.prototype.tooltipText = 'Test Bench Input Selected' + +/** + * @memberof TB_Input + * different algo for drawing center elements + * @category testbench + */ +TB_Input.prototype.centerElement = true + +TB_Input.prototype.helplink = 'https://docs.circuitverse.org/#/chapter7/3testcircuits' + +TB_Input.prototype.mutableProperties = { + identifier: { + name: 'TestBench Name:', + type: 'text', + maxlength: '10', + func: 'setIdentifier', + }, + iteration: { + name: 'Reset Iterations', + type: 'button', + func: 'resetIterations', + }, + toggleState: { + name: 'Toggle State', + type: 'button', + func: 'toggleState', + }, +} +TB_Input.prototype.objectType = 'TB_Input' diff --git a/v1/src/simulator/src/testbench/testbenchOutput.js b/v1/src/simulator/src/testbench/testbenchOutput.js new file mode 100644 index 00000000..865ec258 --- /dev/null +++ b/v1/src/simulator/src/testbench/testbenchOutput.js @@ -0,0 +1,324 @@ +import CircuitElement from '../circuitElement' +import simulationArea from '../simulationArea' +import { correctWidth, fillText } from '../canvasApi' +import Node, { findNode } from '../node' + +// helper function to convert decimal to binary +function dec2bin(dec, bitWidth = undefined) { + // only for positive nos + var bin = dec.toString(2) + if (bitWidth == undefined) return bin + return '0'.repeat(bitWidth - bin.length) + bin +} + +/** + * TestBench Output has a node for it's input which is + * compared to desired output according tp testData of + * input TB Every TB_output has a uniq identifier matching + * it's TB_Input + * @class + * @extends CircuitElement + * @param {number} x - the x coord of TB + * @param {number} y - the y coord of TB + * @param {Scope=} scope - the circuit on which TB is drawn + * @param {string} dir - direction + * @param {string} identifier - id to identify tests + * @category testbench + */ + +export default class TB_Output extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', identifier) { + super(x, y, scope, dir, 1) + // this.setDimensions(60,20); + this.objectType = 'TB_Output' + this.scope.TB_Output.push(this) + + // this.xSize=10; + + // this.plotValues = []; + // this.inp1 = new Node(0, 0, 0, this); + // this.inp1 = new Node(100, 100, 0, this); + this.setIdentifier(identifier || 'Test1') + this.inputs = [] + this.testBenchInput = undefined + + this.setup() + } + + // TB_Output.prototype.dblclick=function(){ + // this.testData=JSON.parse(prompt("Enter TestBench Json")); + // this.setup(); + // } + setDimensions() { + this.leftDimensionX = 0 + this.rightDimensionX = 160 + this.upDimensionY = 0 + this.downDimensionY = 40 + if (this.testBenchInput) { + this.downDimensionY = + 40 + this.testBenchInput.testData.outputs.length * 20 + } + } + + setup() { + // this.iteration = 0; + // this.running = false; + // this.nodeList.clean(this.clockInp); + this.deleteNodes() // deletes all nodes whenever setup is called. + this.nodeList = [] + + this.inputs = [] + this.testBenchInput = undefined + // find it's pair input + for (var i = 0; i < this.scope.TB_Input.length; i++) { + if (this.scope.TB_Input[i].identifier == this.identifier) { + this.testBenchInput = this.scope.TB_Input[i] + break + } + } + + this.setDimensions() + + if (this.testBenchInput) { + for ( + var i = 0; + i < this.testBenchInput.testData.outputs.length; + i++ + ) { + this.inputs.push( + new Node( + 0, + 30 + i * 20, + NODE_INPUT, + this, + this.testBenchInput.testData.outputs[i].bitWidth, + this.testBenchInput.testData.outputs[i].label + ) + ) + } + } + } + + customSave() { + var data = { + constructorParamaters: [this.direction, this.identifier], + nodes: { + inputs: this.inputs.map(findNode), + }, + } + return data + } + + /** + * @memberof TB_output + * set identifier for this testbench + */ + setIdentifier(id = '') { + if (id.length == 0 || id == this.identifier) return + this.identifier = id + this.setup() + } + + /** + * @memberof TB_output + * Function to check if the input for this TB exist + */ + checkPairing(id = '') { + if (this.testBenchInput) { + if ( + this.testBenchInput.deleted || + this.testBenchInput.identifier != this.identifier + ) { + this.setup() + } + } else { + this.setup() + } + } + + customDraw() { + var ctx = simulationArea.context + ctx.beginPath() + ctx.strokeStyle = 'grey' + ctx.fillStyle = '#fcfcfc' + ctx.lineWidth = correctWidth(1) + var xx = this.x + var yy = this.y + + var xRotate = 0 + var yRotate = 0 + if (this.direction == 'LEFT') { + xRotate = 0 + yRotate = 0 + } else if (this.direction == 'RIGHT') { + xRotate = 120 - this.xSize + yRotate = 0 + } else if (this.direction == 'UP') { + xRotate = 60 - this.xSize / 2 + yRotate = -20 + } else { + xRotate = 60 - this.xSize / 2 + yRotate = 20 + } + + // rect2(ctx, -120+xRotate+this.xSize, -20+yRotate, 120-this.xSize, 40, xx, yy, "RIGHT"); + // if ((this.hover && !simulationArea.shiftDown) || simulationArea.lastSelected == this || simulationArea.multipleObjectSelections.contains(this)) + // ctx.fillStyle = "rgba(255, 255, 32,0.8)"; + // ctx.fill(); + // ctx.stroke(); + // + // ctx.font = "14px Raleway"; + // this.xOff = ctx.measureText(this.identifier).width; + // ctx.beginPath(); + // rect2(ctx, -105+xRotate+this.xSize, -11+yRotate,this.xOff + 10, 23, xx, yy, "RIGHT"); + // ctx.fillStyle = "#eee" + // ctx.strokeStyle = "#ccc"; + // ctx.fill(); + // ctx.stroke(); + // + + ctx.beginPath() + ctx.textAlign = 'center' + ctx.fillStyle = 'black' + fillText( + ctx, + `${this.identifier} [OUTPUT]`, + xx + this.rightDimensionX / 2, + yy + 14, + 10 + ) + + // fillText(ctx, ["Not Running","Running"][+this.running], xx + this.rightDimensionX/ 2 , yy + 14 + 10 + 20*this.testData.inputs.length, 10); + // fillText(ctx, "Case: "+(this.iteration), xx + this.rightDimensionX/ 2 , yy + 14 + 20 + 20*this.testData.inputs.length, 10); + fillText( + ctx, + ['Unpaired', 'Paired'][+(this.testBenchInput != undefined)], + xx + this.rightDimensionX / 2, + yy + this.downDimensionY - 5, + 10 + ) + ctx.fill() + + if (this.testBenchInput) { + ctx.beginPath() + ctx.font = '30px Raleway' + ctx.textAlign = 'left' + ctx.fillStyle = 'blue' + for ( + var i = 0; + i < this.testBenchInput.testData.outputs.length; + i++ + ) { + // ctx.beginPath(); + fillText( + ctx, + this.testBenchInput.testData.outputs[i].label, + 5 + xx, + 30 + i * 20 + yy + 4, + 10 + ) + } + ctx.fill() + + if (this.testBenchInput.running && this.testBenchInput.iteration) { + ctx.beginPath() + ctx.font = '30px Raleway' + ctx.textAlign = 'right' + ctx.fillStyle = 'blue' + ctx.beginPath() + for ( + var i = 0; + i < this.testBenchInput.testData.outputs.length; + i++ + ) { + fillText( + ctx, + this.testBenchInput.testData.outputs[i].values[ + this.testBenchInput.iteration - 1 + ], + xx + this.rightDimensionX - 5, + 30 + i * 20 + yy + 4, + 10 + ) + } + + ctx.fill() + } + + if (this.testBenchInput.running && this.testBenchInput.iteration) { + ctx.beginPath() + ctx.font = '30px Raleway' + ctx.textAlign = 'center' + ctx.fillStyle = 'blue' + + for ( + var i = 0; + i < this.testBenchInput.testData.outputs.length; + i++ + ) { + if (this.inputs[i].value != undefined) { + ctx.beginPath() + if ( + this.testBenchInput.testData.outputs[i].values[ + this.testBenchInput.iteration - 1 + ] == 'x' || + parseInt( + this.testBenchInput.testData.outputs[i].values[ + this.testBenchInput.iteration - 1 + ], + 2 + ) == this.inputs[i].value + ) { + ctx.fillStyle = 'green' + } else { + ctx.fillStyle = 'red' + } + fillText( + ctx, + dec2bin( + this.inputs[i].value, + this.inputs[i].bitWidth + ), + xx + this.rightDimensionX / 2, + 30 + i * 20 + yy + 4, + 10 + ) + ctx.fill() + } else { + ctx.beginPath() + if ( + this.testBenchInput.testData.outputs[i].values[ + this.testBenchInput.iteration - 1 + ] == 'x' + ) { + ctx.fillStyle = 'green' + } else { + ctx.fillStyle = 'red' + } + fillText( + ctx, + 'X', + xx + this.rightDimensionX / 2, + 30 + i * 20 + yy + 4, + 10 + ) + ctx.fill() + } + } + } + } + } +} + +TB_Output.prototype.tooltipText = 'Test Bench Output Selected' +TB_Output.prototype.helplink = 'https://docs.circuitverse.org/#/chapter7/3testcircuits' +TB_Output.prototype.centerElement = true +TB_Output.prototype.mutableProperties = { + identifier: { + name: 'TestBench Name:', + type: 'text', + maxlength: '10', + func: 'setIdentifier', + }, +} +TB_Output.prototype.objectType = 'TB_Output' diff --git a/v1/src/simulator/src/themer/customThemeAbstraction.js b/v1/src/simulator/src/themer/customThemeAbstraction.js new file mode 100644 index 00000000..399134ea --- /dev/null +++ b/v1/src/simulator/src/themer/customThemeAbstraction.js @@ -0,0 +1,44 @@ +/** + * CreateAbstraction + * @param {*} themeOptions + * @returns an Object + */ +export const CreateAbstraction = (themeOptions) => { + return { + Navbar: { + color: themeOptions['--bg-navbar'], + description: 'navbar background', + ref: ['--bg-navbar'], + }, + Primary: { + color: themeOptions['--primary'], + description: 'modals background', + ref: ['--primary'], + }, + Secondary: { + color: themeOptions['--bg-tabs'], + description: 'tabBar background', + ref: ['--bg-tabs'], + }, + Canvas: { + color: themeOptions['--canvas-fill'], + description: 'canvas background', + ref: ['--canvas-fill'], + }, + Stroke: { + color: themeOptions['--canvas-stroke'], + description: 'canvas grid color', + ref: ['--canvas-stroke'], + }, + Text: { + color: themeOptions['--text-lite'], + description: 'text color', + ref: ['--text-lite', '--text-panel', '--text-dark'], + }, + Borders: { + color: themeOptions['--br-secondary'], + description: 'borders color', + ref: ['--br-secondary'], + }, + } +} diff --git a/v1/src/simulator/src/themer/customThemer.js b/v1/src/simulator/src/themer/customThemer.js new file mode 100644 index 00000000..51a7e0b2 --- /dev/null +++ b/v1/src/simulator/src/themer/customThemer.js @@ -0,0 +1,154 @@ +// /* eslint-disable import/prefer-default-export */ +// /* eslint-disable import/no-cycle */ +// import { dots } from '../canvasApi' +// import themeOptions from './themes' +// import { updateThemeForStyle } from './themer' +// import { CreateAbstraction } from './customThemeAbstraction' + +// /** +// * +// */ +// var customTheme = CreateAbstraction(themeOptions['Custom Theme']) + +// const updateBG = () => dots(true, false, true) + +// /** +// * Generates Custom theme card HTML +// * return Html Element Theme card html (properties_container) +// */ +// // const getCustomThemeCard = () => { +// // var propertiesContainer = document.createElement('form') +// // const keys = Object.keys(customTheme) +// // keys.forEach((key) => { +// // const property = document.createElement('div') +// // const newPropertyLabel = document.createElement('label') +// // newPropertyLabel.textContent = `${key} (${customTheme[key].description})` +// // newPropertyLabel.setAttribute('for', key) +// // const newPropertyInput = document.createElement('input') +// // newPropertyInput.setAttribute('type', 'color') +// // newPropertyInput.setAttribute('name', key) +// // newPropertyInput.setAttribute('value', customTheme[key].color) +// // newPropertyInput.classList.add('customColorInput') +// // property.append(newPropertyLabel) +// // property.append(newPropertyInput) +// // propertiesContainer.append(property) +// // }) +// // const downloadAnchor = document.createElement('a') +// // downloadAnchor.setAttribute('id', 'downloadThemeFile') +// // downloadAnchor.setAttribute('style', 'display:none') +// // propertiesContainer.appendChild(downloadAnchor) +// // return propertiesContainer +// // } + +// /** +// * Create Custom Color Themes Dialog +// */ +// // export const CustomColorThemes = () => { +// // $('#CustomColorThemesDialog').empty() +// // $('#CustomColorThemesDialog').append(getCustomThemeCard()) +// // $('#CustomColorThemesDialog').dialog({ +// // resizable: false, +// // close() { +// // themeOptions['Custom Theme'] = +// // JSON.parse(localStorage.getItem('Custom Theme')) || +// // themeOptions['Default Theme'] // hack for closing dialog box without saving +// // // Rollback to previous theme +// // updateThemeForStyle(localStorage.getItem('theme')) +// // updateBG() +// // }, +// // buttons: [ +// // { +// // text: 'Apply Theme', +// // click() { +// // // update theme to Custom Theme +// // localStorage.setItem('theme', 'Custom Theme') +// // // add Custom theme to custom theme object +// // localStorage.setItem( +// // 'Custom Theme', +// // JSON.stringify(themeOptions['Custom Theme']) +// // ) +// // $('.set').removeClass('set') +// // $('.selected').addClass('set') +// // $(this).dialog('close') +// // }, +// // }, +// // { +// // text: 'Import Theme', +// // click() { +// // $('#importThemeFile').click() +// // }, +// // }, +// // { +// // text: 'Export Theme', +// // click() { +// // const dlAnchorElem = +// // document.getElementById('downloadThemeFile') +// // dlAnchorElem.setAttribute( +// // 'href', +// // `data:text/json;charset=utf-8,${encodeURIComponent( +// // JSON.stringify(themeOptions['Custom Theme']) +// // )}` +// // ) +// // dlAnchorElem.setAttribute('download', 'CV_CustomTheme.json') +// // dlAnchorElem.click() +// // }, +// // }, +// // ], +// // }) + +// // $('#CustomColorThemesDialog').focus() + +// // /** +// // * To preview the changes +// // */ +// // // function setColorEvent() { +// // // $('.customColorInput').on('input', (e) => { +// // // customTheme[e.target.name].color = e.target.value +// // // customTheme[e.target.name].ref.forEach((property) => { +// // // themeOptions['Custom Theme'][property] = e.target.value +// // // }) +// // // updateThemeForStyle('Custom Theme') +// // // updateBG() +// // // }) +// // // } +// // // setColorEvent() + +// // // hack for updating current theme to the saved custom theme +// // setTimeout(() => { +// // updateThemeForStyle('Custom Theme') +// // updateBG() +// // }, 50) + +// // /** +// // * Read JSON file and +// // * set Custom theme to the Content of the JSON file +// // * */ +// // // function receivedText(e) { +// // // const lines = JSON.parse(e.target.result) +// // // customTheme = CreateAbstraction(lines) +// // // themeOptions['Custom Theme'] = lines +// // // // preview theme +// // // updateThemeForStyle('Custom Theme') +// // // updateBG() +// // // // update colors in dialog box +// // // $('#CustomColorThemesDialog').empty() +// // // $('#CustomColorThemesDialog').append(getCustomThemeCard()) +// // // setColorEvent() +// // // } + +// // /** +// // * Add listener for file input +// // * Read imported JSON file +// // */ +// // // $('#importThemeFile').on('change', (event) => { +// // // var File = event.target.files[0] +// // // if (File !== null && File.name.split('.')[1] === 'json') { +// // // var fr = new FileReader() +// // // fr.onload = receivedText +// // // fr.readAsText(File) +// // // $('#importThemeFile').val('') +// // // } else { +// // // alert('File Not Supported !') +// // // } +// // // }) +// // } diff --git a/v1/src/simulator/src/themer/themeCardSvg.js b/v1/src/simulator/src/themer/themeCardSvg.js new file mode 100644 index 00000000..5e1776cb --- /dev/null +++ b/v1/src/simulator/src/themer/themeCardSvg.js @@ -0,0 +1,102 @@ +export default ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +` diff --git a/v1/src/simulator/src/themer/themer.js b/v1/src/simulator/src/themer/themer.js new file mode 100644 index 00000000..2c61865e --- /dev/null +++ b/v1/src/simulator/src/themer/themer.js @@ -0,0 +1,223 @@ +import { dots } from '../canvasApi' +import themeOptions from './themes' +import themeCardSvg from './themeCardSvg' +import { SimulatorStore } from '#/store/SimulatorStore/SimulatorStore' + +/** + * Extracts canvas theme colors from CSS-Variables and returns a JSON Object + * @returns {object} + */ +const getCanvasColors = () => { + let colors = {} + colors['hover_select'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--hover-and-sel') + colors['fill'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--fill') + colors['mini_fill'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--mini-map') + colors['mini_stroke'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--mini-map-stroke') + colors['stroke'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--stroke') + colors['stroke_alt'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--secondary-stroke') + colors['input_text'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--input-text') + colors['color_wire_draw'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--wire-draw') + colors['color_wire_con'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--wire-cnt') + colors['color_wire_pow'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--wire-pow') + colors['color_wire_sel'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--wire-sel') + colors['color_wire_lose'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--wire-lose') + colors['color_wire'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--wire-norm') + colors['text'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--text') + colors['node'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--node') + colors['node_norm'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--node-norm') + colors['splitter'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--splitter') + colors['out_rect'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--output-rect') + colors['canvas_stroke'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--canvas-stroke') + colors['canvas_fill'] = getComputedStyle( + document.documentElement + ).getPropertyValue('--canvas-fill') + return colors +} + +/** + * Common canvas theme color object, used for rendering canvas elements + */ +export let colors = getCanvasColors() + +/** + * Updates theme + * 1) Sets CSS Variables for UI elements + * 2) Sets color variable for Canvas elements + */ +export function updateThemeForStyle(themeName) { + const selectedTheme = themeOptions[themeName] + if (selectedTheme === undefined) return + const html = document.getElementsByTagName('html')[0] + Object.keys(selectedTheme).forEach((property, i) => { + html.style.setProperty(property, selectedTheme[property]) + }) + colors = getCanvasColors() +} + +/** + * Theme Preview Card SVG + * Sets the SVG colors according to theme + * @param {string} themeName Name of theme + * @returns {SVG} + */ +export const getThemeCardSvg = (themeName) => { + const colors = themeOptions[themeName] + let svgIcon = $(themeCardSvg) + + // Dynamically set the colors according to the theme + $('.svgText', svgIcon).attr('fill', colors['--text-panel']) + + $('.svgNav', svgIcon).attr('fill', colors['--bg-tab']) + $('.svgNav', svgIcon).attr('stroke', colors['--br-primary']) + + $('.svgGridBG', svgIcon).attr('fill', colors['--canvas-fill']) + $('.svgGrid', svgIcon).attr('fill', colors['--canvas-stroke']) + + $('.svgPanel', svgIcon).attr('fill', colors['--primary']) + $('.svgPanel', svgIcon).attr('stroke', colors['--br-primary']) + + $('.svgChev', svgIcon).attr('stroke', colors['--br-secondary']) + + $('.svgHeader', svgIcon).attr('fill', colors['--primary']) + let temp = svgIcon.prop('outerHTML') + return svgIcon.prop('outerHTML') +} + +/** + * Generates theme card HTML + * @param {string} themeName Name of theme + * @param {boolean} selected Flag variable for currently selected theme + * @return {string} Theme card html + */ +export const getThemeCard = (themeName, selected) => { + if (themeName === 'Custom Theme') return '
' + let themeId = themeName.replace(' ', '') + let selectedClass = selected ? 'selected set' : '' + // themeSel is the hit area + return ` +
+
+ ${getThemeCardSvg(themeName)} + + + + +
+ ` +} + +/** + * Create Color Themes Dialog + */ +export const colorThemes = () => { + const simulatorStore = SimulatorStore() + simulatorStore.dialogBox.theme_dialog = true + + // const selectedTheme = localStorage.getItem('theme') + // $('#colorThemesDialog').empty() + // const themes = Object.keys(themeOptions) + // themes.forEach((theme) => { + // if (theme === selectedTheme) { + // $('#colorThemesDialog').append(getThemeCard(theme, true)) + // } else { + // $('#colorThemesDialog').append(getThemeCard(theme, false)) + // } + // }) + + // $('.selected label').trigger('click') + // $('#colorThemesDialog').dialog({ + // resizable: false, + // close() { + // // Rollback to previous theme + // updateThemeForStyle(localStorage.getItem('theme')) + // updateBG() + // }, + // buttons: [ + // { + // text: 'Apply Theme', + // click() { + // // check if any theme is selected or not + // if ($('.selected label').text()) { + // localStorage.removeItem('Custom Theme') + // localStorage.setItem( + // 'theme', + // $('.selected label').text() + // ) + // } + // $('.set').removeClass('set') + // $('.selected').addClass('set') + // $(this).dialog('close') + // }, + // }, + // { + // text: 'Custom Theme', + // click() { + // CustomColorThemes() + // $(this).dialog('close') + // }, + // }, + // ], + // }) + + $('#colorThemesDialog').focus() + $('.ui-dialog[aria-describedby="colorThemesDialog"]').on('click', () => + $('#colorThemesDialog').focus() + ) //hack for losing focus + + $('.themeSel').on('mousedown', (e) => { + e.preventDefault() + $('.selected').removeClass('selected') + let themeCard = $(e.target.parentElement) + themeCard.addClass('selected') + // Extract radio button + var radioButton = themeCard.find('input[type=radio]') + radioButton.trigger('click') // Mark as selected + updateThemeForStyle(themeCard.find('label').text()) // Extract theme name and set + updateBG() + }) +} + +export const updateBG = () => dots(true, false, true) +;(() => { + if (!localStorage.getItem('theme')) + localStorage.setItem('theme', 'Default Theme') + updateThemeForStyle(localStorage.getItem('theme')) +})() diff --git a/v1/src/simulator/src/themer/themes.js b/v1/src/simulator/src/themer/themes.js new file mode 100644 index 00000000..d4f8caa1 --- /dev/null +++ b/v1/src/simulator/src/themer/themes.js @@ -0,0 +1,382 @@ +export default { + 'Default Theme': { + '--text-navbar--alt': '#000', + '--br-secondary': '#7d7d7d', + '--br-circuit-cur': '#fff', + '--br-circuit': '#fff', + '--cus-radio_label': '#656565', + '--primary': '#454545', + '--text-lite': '#fff', + '--text-dark': '#000', + '--text-panel': 'white', + '--bg-navbar': '#454545', + '--qp-br-tl': '#333333', + '--qp-br-rd': '#535353', + '--qp-box-shadow-1': '#3b3b3b', + '--qp-box-shadow-2': '#4f4f4f', + '--bg-circuit': '#ddd', + '--br-circuit': '#454545', + '--br-primary': '#fff', + '--bg-primary-moz': '#454545e6', + '--bg-primary-chr': '#454545b3', + '--bg-tabs': '#8b8b8b', + '--bg-icons': '#7d7d7d', + '--bg-text': '#cacaca', + '--bg-secondary': '#bbbbbb', + '--canvas-stroke': '#eee', + '--canvas-fill': 'white', + '--context-text': 'white', + '--bg-toggle-btn-primary': '#42b983', + '--primary-btn-hov': '#3ca877', + '--btn-danger': '#dc5656', + '--btn-danger-darken': '#b03662', + '--disable': '#6c8b93', + '--cus-btn-hov--bg': '#ddd', + '--cus-btn-hov-text': '#000', + '--node': 'green', + '--stroke': 'black', + '--fill': 'white', + '--hover-and-sel': 'rgba(255, 255, 32, 0.8)', + '--wire-draw': 'black', + '--wire-cnt': 'green', + '--wire-pow': 'lightgreen', + '--wire-sel': 'blue', + '--wire-lose': 'red', + '--mini-map': 'green', + '--mini-map-stroke': 'darkgreen', + '--input-text': 'green', + '--secondary-stroke': 'red', + '--text': 'black', + '--wire-norm': 'black', + '--node-norm': 'green', + '--splitter': 'black', + '--output-rect': 'blue', + '--table-head-dark': '#3d3d3d', + }, + 'Night Sky': { + '--text-navbar--alt': '#fff', + '--br-secondary': '#665627', + '--cus-radio_label': '#0F111A', + '--primary': '#0F111A', //header bg, panels bg + '--text-lite': '#FFF', //normal state text + '--text-dark': 'white', //text state on hover, on drop down menu , context menu + '--text-panel': 'white', + '--bg-navbar': '#0F111A', + '--br-circuit': '#0F111A', //panel border, tabbar circuit border + '--br-primary': '#665627', //panel border, tabbar circuit border + '--br-circuit-cur': '#cccccc', + '--bg-circuit': '#bdc2ca', + '--bg-primary-moz': '#0f111ae6', //dialog bg + '--bg-primary-chr': '#0f111ab3', //dialog bg + '--bg-tabs': '#727d8d', //tabs bar primary bg, + '--bg-icons': '#4d647a', //ce icon bg + '--bg-text': '#727d8d', //drop down, content menu, text bg on hover + '--bg-secondary': '#536c84', //border color input button, + '--canvas-fill': '#1B2C33', //canvas bg + '--canvas-stroke': '#6A7980', //canvas stroke + '--context-text': 'white', + '--bg-toggle-btn-primary': '#48a69d', + '--primary-btn-hov': '#3f9189', + '--btn-danger': '#c33c6c', + '--btn-danger-darken': '#b03662', + '--qp-br-tl': '#282d46', //more ligthen than qp box shadow 1 + '--qp-br-rd': '#1d2132', + '--qp-box-shadow-1': '#1d2132', //lil lighten base + '--qp-box-shadow-2': '#0a0b11', //lil darken base + '--cus-btn-hov--bg': '#48a69d', + '--cus-btn-hov-text': '#fff', + '--node': '#285963', + '--stroke': '#35aea9', + '--fill': '#DEFFFE', + '--hover-and-sel': '#E3B924', + '--wire-draw': '#77878C', + '--wire-cnt': '#3B7F58', + '--wire-pow': '#75FFB0', + '--wire-sel': '#208CC9', + '--wire-lose': '#BF0426', + '--mini-map': '#3B7F58', + '--mini-map-stroke': '#607F6E', + '--input-text': '#3B7F58', + '--output-rect': '#0487D9', + '--secondary-stroke': '#BF0426', + '--text': '#E9FBF8', + '--wire-norm': '#277F7C', + '--node-norm': '#FFC231', + '--splitter': '#0284A8', + '--disable': '#4F74B0', + '--table-head-dark': '#000000', + }, + 'Lite-born Spring': { + '--text-navbar--alt': '#000', + '--br-secondary': '#6B6B6B', + '--cus-radio_label': '#6B6B6B', + '--primary': '#EAEAEB', //header bg + '--text-dark': '#6B6B6B', //normal state text + '--text-lite': 'white', //text state on hover, on drop down menu , context menu + '--text-panel': '#6B6B6B', + '--bg-navbar': '#6b6b6b', + '--qp-br-tl': '#969696', //more ligthen than qp box shadow 1 + '--qp-br-rd': '#545454', + '--qp-box-shadow-1': '#747474', //lil lighten base .. top left shadow + '--qp-box-shadow-2': '#5f5f5f', //lil darken base //down right shadow + // "--bg-tabs": "#EAEAEB", //tabs bar primary bg, + '--bg-tabs': '#A4A4A4', //tabs bar primary bg, + '--br-circuit-cur': '#42B983', + '--bg-circuit': '#D7D7D7', + '--br-circuit': '#42B983', + '--br-primary': '#42B983', //panel border, tabbar circuit border + '--context-text-hov': '#6B6B6B', + '--context-text': 'white', + '--bg-primary-moz': 'rgba(107, 107, 107, 0.904)', //dialog bg, navbar dropwdown //.9 opacity of nav + '--bg-primary-chr': 'rgba(107, 107, 107, 0.704)', //dialog bg navbar dropwdown // .7 opacity of nav + '--bg-icons': '#DDDDDD', //ce icon bg + '--bg-text': '#ddd', //drop down, content menu, text bg on hover + '--bg-secondary': '#6B6B6B', //border color input button, + '--bg-toggle-btn-primary': '#42B983', + '--primary-btn-hov': '#66C89C', + '--btn-danger': '#BF2424', + '--btn-danger-darken': '#BF414C', + '--cus-btn-hov--bg': '#42B983', + '--cus-btn-hov-text': '#fff', + '--canvas-fill': 'white', //canvas bg + '--canvas-stroke': '#BABABA', //canvas stroke + '--node': '#42B983', + '--stroke': '#6B6B6B', + '--fill': '#EAEAEB', + '--hover-and-sel': '#FFE99B', //yellow + '--wire-draw': '#6B6B6B', //black + '--wire-cnt': '#42B983', // + '--wire-pow': '#52E539', + '--wire-sel': '#0FB2F2', + '--wire-lose': '#F10530', + '--mini-map': '#42B983', + '--mini-map-stroke': '#0FB2F2', + '--input-text': '#42B983', + '--output-rect': '#0487D9', + '--secondary-stroke': '#F10530', + '--text': '#454545', + '--wire-norm': '#006839', + '--node-norm': '#FFC231', + '--splitter': '#00B462', + '--disable': '#656565', + '--table-head-dark': '#ffffff', + }, + 'G&W': { + '--text-navbar--alt': '#000', + '--br-secondary': '#6B6B6B', + '--cus-radio_label': '#6B6B6B', + '--primary': '#EAEAEB', //header bg + '--text-dark': '#6B6B6B', //normal state text + '--text-lite': 'white', //text state on hover, on drop down menu , context menu + '--text-panel': '#656565', + '--bg-navbar': '#6b6b6b', + '--qp-br-tl': '#969696', //more ligthen than qp box shadow 1 + '--qp-br-rd': '#545454', + '--qp-box-shadow-1': '#747474', //lil lighten base .. top left shadow + '--qp-box-shadow-2': '#5f5f5f', //lil darken base //down right shadow + // "--bg-tabs": "#EAEAEB", //tabs bar primary bg, + '--bg-tabs': '#A4A4A4', //tabs bar primary bg, + '--br-circuit-cur': '#6b6b6b', + '--bg-circuit': '#D7D7D7', + '--br-circuit': '#6b6b6b', + '--br-primary': '#6B6B6B', //panel border, tabbar circuit border + '--context-text-hov': '#6B6B6B', + '--context-text': 'white', + '--bg-primary-moz': 'rgba(107, 107, 107, 0.904)', //dialog bg, navbar dropwdown //.9 opacity of nav + '--bg-primary-chr': 'rgba(107, 107, 107, 0.704)', //dialog bg navbar dropwdown // .7 opacity of nav + '--bg-icons': '#DDDDDD', //ce icon bg + '--bg-text': '#ddd', //drop down, content menu, text bg on hover + '--bg-secondary': '#6B6B6B', //border color input button, + '--bg-toggle-btn-primary': '#3ac8a4', + '--primary-btn-hov': '#71D7BD', + '--btn-danger': '#fc8771', + '--btn-danger-darken': '#FDB2A4', + '--cus-btn-hov--bg': '#3ac8a4', + '--cus-btn-hov-text': '#fff', + '--canvas-fill': 'white', //canvas bg + '--canvas-stroke': '#BABABA', //canvas stroke + '--node': '#42B983', + '--stroke': '#6B6B6B', + '--fill': '#EAEAEB', + '--hover-and-sel': '#FFE99B', //yellow + '--wire-draw': '#6B6B6B', //black + '--wire-cnt': '#42B983', // + '--wire-pow': '#52E539', + '--wire-sel': '#0FB2F2', + '--wire-lose': '#F10530', + '--mini-map': '#42B983', + '--mini-map-stroke': '#0FB2F2', + '--input-text': '#42B983', + '--output-rect': '#0487D9', + '--secondary-stroke': '#F10530', + '--text': '#454545', + '--wire-norm': '#006839', + '--node-norm': '#FFC231', + '--splitter': '#00B462', + '--disable': '#656565', + '--table-head-dark': '#ffffff', + }, + 'High Contrast': { + '--text-navbar--alt': '#000', + '--br-secondary': '#F38518', + '--cus-radio_label': 'black', + '--primary': 'black', //header bg + '--text-dark': 'black', //normal state text + '--text-lite': 'white', //text state on hover, on drop down menu , context menu + '--text-panel': 'white', + '--bg-navbar': 'black', + '--qp-br-tl': '#F38518', //more ligthen than qp box shadow 1 + '--qp-br-rd': '#F38518', + '--qp-box-shadow-1': '#0D0D0D', //lil lighten base .. top left shadow + '--qp-box-shadow-2': '#0D0D0D', //lil darken base //down right shadow + '--bg-tabs': '#616161', //tabs bar primary bg, + '--text-circuit': 'black', + '--br-circuit-cur': '#F38518', + '--bg-circuit': '#B6B6B6', + '--br-circuit': '#F38518', + '--br-primary': '#F38518', //panel border, tabbar circuit border + '--context-text-hov': 'black', + '--context-text': 'white', + '--bg-primary-moz': 'rgba(0, 0, 0, 0.904)', //dialog bg, navbar dropwdown //.9 opacity of nav + '--bg-primary-chr': 'rgba(0, 0, 0, 0.704)', //dialog bg navbar dropwdown // .7 opacity of nav + '--bg-icons': '#262626', //ce icon bg + '--bg-text': '#ddd', //drop down, content menu, text bg on hover + '--bg-secondary': '#6B6B6B', //border color input button, + '--bg-toggle-btn-primary': '#009599', + '--primary-btn-hov': '#00b1b6', + '--btn-danger': '#E45605', + '--btn-danger-darken': '#fa792f', + '--cus-btn-hov--bg': '#009599', + '--cus-btn-hov-text': '#fff', + '--canvas-fill': 'black', //canvas bg + '--canvas-stroke': '#9ad5e9', //canvas stroke + '--node': '#26a841', + '--stroke': '#626262', + '--fill': '#d4d4d4', + '--hover-and-sel': '#ffdf6c', //yellow + '--wire-draw': '#909090', //black + '--wire-cnt': '#3bb15b', // + '--wire-pow': '#3ac53c', + '--wire-sel': '#049ffb', + '--wire-lose': '#f42f0b', + '--mini-map': '#1c2427', + '--mini-map-stroke': '#000', + '--input-text': '#42B983', + '--output-rect': '#005682', + '--secondary-stroke': '#f7081e', + '--text': '#fff', + '--wire-norm': '#00b965', + '--node-norm': '#F38518', + '--splitter': '#21de5a', + '--disable': '#262626', + '--table-head-dark': '#000000', + }, + 'Color Blind': { + '--text-navbar--alt': '#000', + '--br-secondary': '#e2dad1', + '--cus-radio_label': '#2e2b21', + '--primary': '#2e2b21', //header bg + '--text-dark': 'black', //normal state text + '--text-lite': 'white', //text state on hover, on drop down menu , context menu + '--text-panel': 'white', + '--bg-navbar': '#2e2b21', + '--qp-br-tl': '#716950', //more ligthen than qp box shadow 1 + '--qp-br-rd': '#6c654d', + '--qp-box-shadow-1': '#4f4a38', //lil lighten base .. top left shadow + '--qp-box-shadow-2': '#302d23', //lil darken base //down right shadow + '--bg-tabs': '#9a9a9a', //tabs bar primary bg, + '--text-circuit': 'black', + '--br-circuit-cur': '#e2dad1', + '--bg-circuit': '#d6d6d6', + '--br-circuit': '#e2dad1', + '--br-primary': '#e2dad1', //panel border, tabbar circuit border + '--context-text-hov': 'black', + '--context-text': 'white', + '--bg-primary-moz': 'rgba(46, 43, 33, 1)', //dialog bg, navbar dropwdown //.9 opacity of nav + '--bg-primary-chr': 'rgba(46, 43, 33, 1)', //dialog bg navbar dropwdown // .7 opacity of nav + '--bg-icons': '#9c7762', //ce icon bg + '--bg-text': '#ddd', //drop down, content menu, text bg on hover + '--bg-secondary': '#6B6B6B', //border color input button, + '--bg-toggle-btn-primary': '#bfaac1', + '--primary-btn-hov': '#ccbbcd', + '--btn-danger': '#b66e43', + '--btn-danger-darken': '#ba7144', + '--cus-btn-hov--bg': '#b66e43', + '--cus-btn-hov-text': '#fff', + '--canvas-fill': '#fff', //canvas bg + '--canvas-stroke': '#8d88ad', //canvas stroke + '--node': '#c59434', + '--stroke': '#342a1f', + '--fill': '#e0dcd3', + '--hover-and-sel': '#f4d4d4', //yellow + '--wire-draw': '#4c4c4c', //black + '--wire-cnt': '#908eb9', // + '--wire-pow': '#b3b1cf', + '--wire-sel': '#a7b8f8', + '--wire-lose': '#f42f0b', + '--mini-map': '#4b4636', + '--mini-map-stroke': '#000', + '--input-text': '#756d54', + '--output-rect': '#092c48', + '--secondary-stroke': '#cdb1ad', + '--text': '#000', + '--wire-norm': '#7f7cae', + '--node-norm': '#c59434', + '--splitter': '#836222', + '--disable': '#956c6a', + '--table-head-dark': '#2e2b21', + }, + 'Custom Theme': JSON.parse(localStorage.getItem('Custom Theme')) || { + '--text-navbar--alt': '#000', + '--br-secondary': '#7d7d7d', + '--br-circuit-cur': '#ffffff', + '--br-circuit': '#ffffff', + '--cus-radio_label': '#656565', + '--primary': '#454545', + '--text-lite': '#ffffff', + '--text-dark': '#000', + '--text-panel': '#ffffff', + '--bg-navbar': '#454545', + '--qp-br-tl': '#333333', + '--qp-br-rd': '#535353', + '--qp-box-shadow-1': '#3b3b3b', + '--qp-box-shadow-2': '#4f4f4f', + '--bg-circuit': '#ddd', + '--br-circuit': '#454545', + '--br-primary': '#ffffff', + '--bg-primary-moz': '#454545e6', + '--bg-primary-chr': '#454545b3', + '--bg-tabs': '#8b8b8b', + '--bg-icons': '#7d7d7d', + '--bg-text': '#cacaca', + '--bg-secondary': '#bbbbbb', + '--canvas-stroke': '#eee', + '--canvas-fill': '#ffffff', + '--context-text': '#ffffff', + '--bg-toggle-btn-primary': '#42b983', + '--primary-btn-hov': '#3ca877', + '--btn-danger': '#dc5656', + '--btn-danger-darken': '#b03662', + '--disable': '#6c8b93', + '--cus-btn-hov--bg': '#ddd', + '--cus-btn-hov-text': '#000', + '--node': '#008000', + '--stroke': '#000', + '--fill': '#ffffff', + '--hover-and-sel': '#ffff20cc', + '--wire-draw': '#000', + '--wire-cnt': '#008000', + '--wire-pow': '#90ee90', + '--wire-sel': '#0000ff', + '--wire-lose': '#ff0000', + '--mini-map': '#008000', + '--mini-map-stroke': '#006400', + '--input-text': '#008000', + '--secondary-stroke': '#ff0000', + '--text': '#000', + '--wire-norm': '#000', + '--node-norm': '#008000', + '--splitter': '#000', + '--output-rect': '#0000ff', + }, +} diff --git a/v1/src/simulator/src/tutorials.js b/v1/src/simulator/src/tutorials.js new file mode 100644 index 00000000..a1f10d67 --- /dev/null +++ b/v1/src/simulator/src/tutorials.js @@ -0,0 +1,143 @@ +import Driver from 'driver.js' + +export const tour = [ + { + element: '#guide_1', + className: 'guide_1', + popover: { + className: '', + title: 'Circuit Elements panel', + description: + 'This is where you can find all the circuit elements that are offered to build amazing circuits.', + position: 'right', + offset: 160, + }, + }, + { + element: '.guide_2', + popover: { + title: 'Properties Panel', + description: + 'This panel lets you change element properties as they are selected. When no elements are selected, the panel displays project properties.', + position: 'left', + offset: 200, + }, + }, + { + element: '.quick-btn', + popover: { + title: 'Quick Access Panel', + description: + 'This movable panel offers to perform some actions like Save Online, Open, Download quickly. Hover over the icons and see for yourself', + position: 'bottom', + // offset: 750, + }, + }, + // { + // element: '.forum-tab', + // popover: { + // className: "", + // title: 'Forum Tab', + // description: "The forums can help you report issues & bugs, feature requests, and discussing about circuits with the community!", + // position: 'right', + // // offset: -25, + // }, + // }, + { + element: '#tabsBar', + popover: { + title: 'Circuit Tabs', + description: + 'This section displays all the circuits you have in your project. You can easily add and delete circuits.', + position: 'bottom', + offset: 250, + }, + }, + { + element: '.timing-diagram-panel', + popover: { + title: 'Timing Diagram Panel (Waveform)', + description: + 'This panel displays the waveform created by circuits and can be used for resolving race conditions and debugging circuits.', + position: 'bottom', + offset: 0, + }, + }, + + // { + // element: '#delCirGuide', + // popover: { + // title: 'Delete sub-circuit button', + // description: "You can make delete sub-circuits by pressing the cross *Note that main circuit cannot be deleted.", + // position: 'right', + // // offset: 250, + // }, + // }, + { + element: '.report-sidebar a', + popover: { + className: 'bug-guide', + title: 'Report System', + description: + 'You can report any issues/bugs you face through this issue reporting button there and then quickly.', + position: 'left', + offset: -105, + }, + }, + { + element: '.tour-help', + popover: { + className: 'tourHelpStep', + title: 'Restart tutorial anytime', + description: + 'You can restart this tutorial anytime by clicking on "Tutorial Guide" under this dropdown.', + position: 'right', + offset: 0, + }, + }, +] + +// Not used currently +export const tutorialWrapper = () => { + const panelHighlight = new Driver() + document.querySelector('.panelHeader').addEventListener('click', (e) => { + if (localStorage.tutorials === 'next') { + panelHighlight.highlight({ + element: '#guide_1', + showButtons: false, + popover: { + title: 'Here are the elements', + description: + 'Select any element by clicking on it & then click anywhere on the grid to place the element.', + position: 'right', + offset: + e.target.nextElementSibling.offsetHeight + + e.target.offsetTop - + 45, + }, + }) + localStorage.setItem('tutorials', 'done') + } + }, { + once: true, + }) + document.querySelector('.icon').addEventListener('click', () => { + panelHighlight.reset(true) + }) +} + +const animatedTourDriver = new Driver({ + animate: true, + opacity: 0.8, + padding: 5, + showButtons: true, +}) + +export function showTourGuide() { + document.querySelector('.draggable-panel .maximize').click(); + animatedTourDriver.defineSteps(tour) + animatedTourDriver.start() + localStorage.setItem('tutorials_tour_done', true) +} + +export default showTourGuide diff --git a/v1/src/simulator/src/utils.js b/v1/src/simulator/src/utils.js new file mode 100644 index 00000000..9d6a32b9 --- /dev/null +++ b/v1/src/simulator/src/utils.js @@ -0,0 +1,277 @@ +import simulationArea from './simulationArea' +import { + scheduleUpdate, + play, + updateCanvasSet, + errorDetectedSet, + errorDetectedGet, +} from './engine' +import { layoutModeGet } from './layoutMode' +import plotArea from './plotArea' +import { SimulatorStore } from '#/store/SimulatorStore/SimulatorStore' + +window.globalScope = undefined +window.lightMode = false // To be deprecated +window.projectId = undefined +window.id = undefined +window.loading = false // Flag - all assets are loaded + +var prevErrorMessage // Global variable for error messages +var prevShowMessage // Global variable for error messages +export function generateId() { + var id = '' + var possible = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' + + for (var i = 0; i < 20; i++) { + id += possible.charAt(Math.floor(Math.random() * possible.length)) + } + + return id +} + +// To strip tags from input +export function stripTags(string = '') { + return string.replace(/(<([^>]+)>)/gi, '').trim() +} + +export function clockTick() { + if (!simulationArea.clockEnabled) return + if (errorDetectedGet()) return + if (layoutModeGet()) return + updateCanvasSet(true) + globalScope.clockTick() + plotArea.nextCycle() + play() + scheduleUpdate(0, 20) +} + +/** + * Helper function to show error + * @param {string} error -The error to be shown + * @category utils + */ +export function showError(error) { + errorDetectedSet(true) + // if error ha been shown return + if (error === prevErrorMessage) return + prevErrorMessage = error + var id = Math.floor(Math.random() * 10000) + $('#MessageDiv').append( + `` + ) + setTimeout(() => { + prevErrorMessage = undefined + $(`#${id}`).fadeOut() + }, 1500) +} + +// Helper function to show message +export function showMessage(mes) { + if (mes === prevShowMessage) return + prevShowMessage = mes + var id = Math.floor(Math.random() * 10000) + $('#MessageDiv').append( + `` + ) + setTimeout(() => { + prevShowMessage = undefined + $(`#${id}`).fadeOut() + }, 2500) +} + +export function distance(x1, y1, x2, y2) { + return Math.sqrt((x2 - x1) ** 2) + (y2 - y1) ** 2 +} + +/** + * Helper function to return unique list + * @param {Array} a - any array + * @category utils + */ +export function uniq(a) { + var seen = {} + const tmp = a.filter((item) => + seen.hasOwnProperty(item) ? false : (seen[item] = true) + ) + return tmp +} + +// Generates final verilog code for each element +// Gate = &/|/^ +// Invert is true for xNor, Nor, Nand +export function gateGenerateVerilog(gate, invert = false) { + var inputs = [] + var outputs = [] + + for (var i = 0; i < this.nodeList.length; i++) { + if (this.nodeList[i].type == NODE_INPUT) { + inputs.push(this.nodeList[i]) + } else { + if (this.nodeList[i].connections.length > 0) + outputs.push(this.nodeList[i]) + else outputs.push('') // Don't create a wire + } + } + + var res = 'assign ' + if (outputs.length == 1) res += outputs[0].verilogLabel + else res += `{${outputs.map((x) => x.verilogLabel).join(', ')}}` + + res += ' = ' + + var inputParams = inputs.map((x) => x.verilogLabel).join(` ${gate} `) + if (invert) { + res += `~(${inputParams});` + } else { + res += inputParams + ';' + } + return res +} + +// Helper function to download text +export function download(filename, text) { + var pom = document.createElement('a') + pom.setAttribute( + 'href', + 'data:text/plain;charset=utf-8,' + encodeURIComponent(text) + ) + pom.setAttribute('download', filename) + + if (document.createEvent) { + var event = document.createEvent('MouseEvents') + event.initEvent('click', true, true) + pom.dispatchEvent(event) + } else { + pom.click() + } +} + +// Helper function to open a new tab +export function openInNewTab(url) { + var win = window.open(url, '_blank') + win.focus() +} + +export function copyToClipboard(text) { + const textarea = document.createElement('textarea') + + // Move it off-screen. + textarea.style.cssText = 'position: absolute; left: -99999em' + + // Set to readonly to prevent mobile devices opening a keyboard when + // text is .select()'ed. + textarea.setAttribute('readonly', true) + + document.body.appendChild(textarea) + textarea.value = text + + // Check if there is any content selected previously. + const selected = + document.getSelection().rangeCount > 0 + ? document.getSelection().getRangeAt(0) + : false + + // iOS Safari blocks programmatic execCommand copying normally, without this hack. + // https://stackoverflow.com/questions/34045777/copy-to-clipboard-using-javascript-in-ios + if (navigator.userAgent.match(/ipad|ipod|iphone/i)) { + const editable = textarea.contentEditable + textarea.contentEditable = true + const range = document.createRange() + range.selectNodeContents(textarea) + const sel = window.getSelection() + sel.removeAllRanges() + sel.addRange(range) + textarea.setSelectionRange(0, 999999) + textarea.contentEditable = editable + } else { + textarea.select() + } + + try { + const result = document.execCommand('copy') + + // Restore previous selection. + if (selected) { + document.getSelection().removeAllRanges() + document.getSelection().addRange(selected) + } + textarea.remove() + return result + } catch (err) { + console.error(err) + textarea.remove() + return false + } +} + +export function truncateString(str, num) { + // If the length of str is less than or equal to num + // just return str--don't truncate it. + if (str.length <= num) { + return str + } + // Return str truncated with '...' concatenated to the end of str. + return str.slice(0, num) + '...' +} + +export function bitConverterDialog() { + const simulatorStore = SimulatorStore(); + simulatorStore.dialogBox.hex_bin_dec_converter_dialog = true; +} + +export function getImageDimensions(file) { + return new Promise(function (resolved, rejected) { + var i = new Image() + i.onload = function () { + resolved({ w: i.width, h: i.height }) + } + i.src = file + }) +} + +// convertors +export var convertors = { + dec2bin: (x) => '0b' + x.toString(2), + dec2hex: (x) => '0x' + x.toString(16), + dec2octal: (x) => '0' + x.toString(8), + dec2bcd: (x) => parseInt(x.toString(10), 16).toString(2), +} + +export function parseNumber(num) { + if (num instanceof Number) return num + if (num.slice(0, 2).toLocaleLowerCase() == '0b') + return parseInt(num.slice(2), 2) + if (num.slice(0, 2).toLocaleLowerCase() == '0x') + return parseInt(num.slice(2), 16) + if (num.slice(0, 1).toLocaleLowerCase() == '0') return parseInt(num, 8) + return parseInt(num) +} + +export function promptFile(contentType, multiple) { + var input = document.createElement('input') + input.type = 'file' + input.multiple = multiple + input.accept = contentType + return new Promise(function (resolve) { + document.activeElement.onfocus = function () { + document.activeElement.onfocus = null + setTimeout(resolve, 500) + } + input.onchange = function () { + var files = Array.from(input.files) + if (multiple) return resolve(files) + resolve(files[0]) + } + input.click() + }) +} + +export function escapeHtml(unsafe) { + return unsafe + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, ''') +} diff --git a/v1/src/simulator/src/ux.js b/v1/src/simulator/src/ux.js new file mode 100644 index 00000000..aaad33cd --- /dev/null +++ b/v1/src/simulator/src/ux.js @@ -0,0 +1,803 @@ +/* eslint-disable import/no-cycle */ +/* eslint-disable guard-for-in */ +/* eslint-disable no-restricted-syntax */ +/* eslint-disable no-restricted-syntax */ +/* eslint-disable guard-for-in */ + +import { layoutModeGet } from './layoutMode' +import { + scheduleUpdate, + wireToBeCheckedSet, + updateCanvasSet, + update, + updateSimulationSet, +} from './engine' +import simulationArea from './simulationArea' +import logixFunction from './data' +import { newCircuit, circuitProperty } from './circuit' +import modules from './modules' +import { updateRestrictedElementsInScope } from './restrictedElementDiv' +import { paste } from './events' +import { setProjectName, getProjectName } from './data/save' +import { changeScale } from './canvasApi' +import { generateImage, generateSaveData } from './data/save' +import { setupVerilogExportCodeWindow } from './verilog' +import { updateTestbenchUI, setupTestbenchUI } from './testbench' +import { applyVerilogTheme } from './Verilog2CV' +import { dragging } from './drag' + +export const uxvar = { + smartDropXX: 50, + smartDropYY: 80, +} +/** + * @type {number} - Is used to calculate the position where an element from sidebar is dropped + * @category ux + */ +uxvar.smartDropXX = 50 + +/** + * @type {number} - Is used to calculate the position where an element from sidebar is dropped + * @category ux + */ +uxvar.smartDropYY = 80 + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ +/** + * @type {Object} - Object stores the position of context menu; + * @category ux + */ +var ctxPos = { + x: 0, + y: 0, + visible: false, +} +// FUNCITON TO SHOW AND HIDE CONTEXT MENU +function hideContextMenu() { + var el = document.getElementById('contextMenu') + el.style = 'opacity:0;' + setTimeout(() => { + el.style = 'visibility:hidden;' + ctxPos.visible = false + }, 200) // Hide after 2 sec +} +/** + * Function displays context menu + * @category ux + */ +function showContextMenu() { + if (layoutModeGet()) return false // Hide context menu when it is in Layout Mode + $('#contextMenu').css({ + visibility: 'visible', + opacity: 1, + }) + + var windowHeight = + $('#simulationArea').height() - $('#contextMenu').height() - 10 + var windowWidth = + $('#simulationArea').width() - $('#contextMenu').width() - 10 + // for top, left, right, bottom + var topPosition + var leftPosition + var rightPosition + var bottomPosition + if (ctxPos.y > windowHeight && ctxPos.x <= windowWidth) { + //When user click on bottom-left part of window + leftPosition = ctxPos.x + bottomPosition = $(window).height() - ctxPos.y + $('#contextMenu').css({ + left: `${leftPosition}px`, + bottom: `${bottomPosition}px`, + right: 'auto', + top: 'auto', + }) + } else if (ctxPos.y > windowHeight && ctxPos.x > windowWidth) { + //When user click on bottom-right part of window + bottomPosition = $(window).height() - ctxPos.y + rightPosition = $(window).width() - ctxPos.x + $('#contextMenu').css({ + left: 'auto', + bottom: `${bottomPosition}px`, + right: `${rightPosition}px`, + top: 'auto', + }) + } else if (ctxPos.y <= windowHeight && ctxPos.x <= windowWidth) { + //When user click on top-left part of window + leftPosition = ctxPos.x + topPosition = ctxPos.y + $('#contextMenu').css({ + left: `${leftPosition}px`, + bottom: 'auto', + right: 'auto', + top: `${topPosition}px`, + }) + } else { + //When user click on top-right part of window + rightPosition = $(window).width() - ctxPos.x + topPosition = ctxPos.y + $('#contextMenu').css({ + left: 'auto', + bottom: 'auto', + right: `${rightPosition}px`, + top: `${topPosition}px`, + }) + } + ctxPos.visible = true + return false +} + +/** + * adds some UI elements to side bar and + * menu also attaches listeners to sidebar + * @category ux + */ +export function setupUI() { + var ctxEl = document.getElementById('contextMenu') + document.addEventListener('mousedown', (e) => { + // Check if mouse is not inside the context menu and menu is visible + if ( + !( + e.clientX >= ctxPos.x && + e.clientX <= ctxPos.x + ctxEl.offsetWidth && + e.clientY >= ctxPos.y && + e.clientY <= ctxPos.y + ctxEl.offsetHeight + ) && + ctxPos.visible && + e.which !== 3 + ) { + hideContextMenu() + } + + // Change the position of context whenever mouse is clicked + ctxPos.x = e.clientX + ctxPos.y = e.clientY + }) + document.getElementById('canvasArea').oncontextmenu = showContextMenu + + // commenting jquery-ui (not working) + // $('#sideBar').resizable({ + // handles: 'e', + // // minWidth:270, + // }); + // $('#menu, #subcircuitMenu').accordion({ + // collapsible: true, + // active: false, + // heightStyle: 'content', + // }); + + $('.logixButton').on('click', function () { + logixFunction[this.id]() + }) + // var dummyCounter=0; + + // calling apply on select theme in dropdown + + // $('#saveAsImg').on('click',function(){ + // saveAsImg(); + // }); + // $('#Save').on('click',function(){ + // Save(); + // }); + // $('#moduleProperty').draggable(); + setupPanels() + // setupVerilogExportCodeWindow() +} + +/** + * Keeps in check which property is being displayed + * @category ux + */ +var prevPropertyObj + +export function prevPropertyObjSet(param) { + prevPropertyObj = param +} + +export function prevPropertyObjGet() { + return prevPropertyObj +} + +function checkValidBitWidth() { + const selector = $("[name='newBitWidth']") + if ( + selector === undefined || + selector.val() > 32 || + selector.val() < 1 || + !$.isNumeric(selector.val()) + ) { + // fallback to previously saves state + selector.val(selector.attr('old-val')) + } else { + selector.attr('old-val', selector.val()) + } +} + +export function objectPropertyAttributeUpdate() { + checkValidBitWidth() + scheduleUpdate() + updateCanvasSet(true) + wireToBeCheckedSet(1) + let { value } = this + if (this.type === 'number') { + value = parseFloat(value) + } + if (simulationArea.lastSelected && simulationArea.lastSelected[this.name]) { + simulationArea.lastSelected[this.name](value) + // Commented out due to property menu refresh bug + // prevPropertyObjSet(simulationArea.lastSelected[this.name](this.value)) || prevPropertyObjGet(); + } else { + circuitProperty[this.name](value) + } +} + +export function objectPropertyAttributeCheckedUpdate() { + if (this.name === 'toggleLabelInLayoutMode') return // Hack to prevent toggleLabelInLayoutMode from toggling twice + scheduleUpdate() + updateCanvasSet(true) + wireToBeCheckedSet(1) + if (simulationArea.lastSelected && simulationArea.lastSelected[this.name]) { + simulationArea.lastSelected[this.name](this.value) + // Commented out due to property menu refresh bug + // prevPropertyObjSet(simulationArea.lastSelected[this.name](this.value)) || prevPropertyObjGet(); + } else { + circuitProperty[this.name](this.checked) + } +} + +export function checkPropertiesUpdate(value = 0) { + $('.objectPropertyAttribute').off( + 'change keyup paste click', + objectPropertyAttributeUpdate + ) + $('.objectPropertyAttribute').on( + 'change keyup paste click', + objectPropertyAttributeUpdate + ) + + $('.objectPropertyAttributeChecked').off( + 'change keyup paste click', + objectPropertyAttributeCheckedUpdate + ) + $('.objectPropertyAttributeChecked').on( + 'change keyup paste click', + objectPropertyAttributeCheckedUpdate + ) +} + +/** + * show properties of an object. + * @param {CircuiElement} obj - the object whose properties we want to be shown in sidebar + * @category ux + */ +export function showProperties(obj) { + if (obj === prevPropertyObjGet()) return + + /* + hideProperties() + prevPropertyObjSet(obj) + if (layoutModeGet()) { + // if an element is selected, show its properties instead of the layout dialog + if ( + simulationArea.lastSelected === undefined || + ['Wire', 'CircuitElement', 'Node'].indexOf( + simulationArea.lastSelected.objectType + ) !== -1 + ) { + $('#moduleProperty').hide() + $('#layoutDialog').show() + return + } + + $('#moduleProperty').show() + $('#layoutDialog').hide() + $('#moduleProperty-inner').append( + "
" + obj.objectType + '
' + ) + + if (obj.subcircuitMutableProperties && obj.canShowInSubcircuit) { + for (let attr in obj.subcircuitMutableProperties) { + var prop = obj.subcircuitMutableProperties[attr] + if (obj.subcircuitMutableProperties[attr].type == 'number') { + var s = + '

' + + prop.name + + "

" + $('#moduleProperty-inner').append(s) + } + } + if (!obj.labelDirectionFixed) { + if (!obj.subcircuitMetadata.labelDirection) + obj.subcircuitMetadata.labelDirection = obj.labelDirection + var s = $( + "' + ) + s.val(obj.subcircuitMetadata.labelDirection) + $('#moduleProperty-inner').append( + '

Label Direction: ' + $(s).prop('outerHTML') + '

' + ) + } + } + } else if ( + simulationArea.lastSelected === undefined || + ['Wire', 'CircuitElement', 'Node'].indexOf( + simulationArea.lastSelected.objectType + ) !== -1 + ) { + $('#moduleProperty').show() + + $('#moduleProperty-inner').append( + `

Project:

` + ) + $('#moduleProperty-inner').append( + `

Circuit:

` + ) + $('#moduleProperty-inner').append( + `

Clock Time (ms):

` + ) + $('#moduleProperty-inner').append( + `

Clock Enabled:

` + ) + $('#moduleProperty-inner').append( + `

Lite Mode:

` + ) + $('#moduleProperty-inner').append( + "

" + ) + // $('#moduleProperty-inner').append("

"); + } else { + $('#moduleProperty').show() + + $('#moduleProperty-inner').append( + `

${obj.objectType}
` + ) + // $('#moduleProperty').append(""); + if (!obj.fixedBitWidth) { + $('#moduleProperty-inner').append( + `

BitWidth:

` + ) + } + + if (obj.changeInputSize) { + $('#moduleProperty-inner').append( + `

Input Size:

` + ) + } + + if (!obj.propagationDelayFixed) { + $('#moduleProperty-inner').append( + `

Delay:

` + ) + } + + if (!obj.disableLabel) + $('#moduleProperty-inner').append( + `

Label:

` + ) + + var s + if (!obj.labelDirectionFixed) { + s = $( + `${ + "' + ) + s.val(obj.labelDirection) + $('#moduleProperty-inner').append( + `

Label Direction: ${$(s).prop('outerHTML')}

` + ) + } + + if (!obj.directionFixed) { + s = $( + `${ + "' + ) + $('#moduleProperty-inner').append( + `

Direction: ${$(s).prop('outerHTML')}

` + ) + } else if (!obj.orientationFixed) { + s = $( + `${ + "' + ) + $('#moduleProperty-inner').append( + `

Orientation: ${$(s).prop('outerHTML')}

` + ) + } + + if (obj.mutableProperties) { + for (const attr in obj.mutableProperties) { + var prop = obj.mutableProperties[attr] + if (obj.mutableProperties[attr].type === 'number') { + s = `

${ + prop.name + }

` + $('#moduleProperty-inner').append(s) + } else if (obj.mutableProperties[attr].type === 'text') { + s = `

${ + prop.name + }

` + $('#moduleProperty-inner').append(s) + } else if (obj.mutableProperties[attr].type === 'button') { + s = `

` + $('#moduleProperty-inner').append(s) + } else if (obj.mutableProperties[attr].type === 'textarea') { + s = `

${prop.name}

` + $('#moduleProperty-inner').append(s) + } + } + } + } + + var helplink = obj && obj.helplink + if (helplink) { + $('#moduleProperty-inner').append( + '

' + ) + $('#HelpButton').on('click', () => { + window.open(helplink) + }) + } +*/ + checkPropertiesUpdate(this) + + // $(".moduleProperty input[type='number']").inputSpinner(); +} + +/** + * Hides the properties in sidebar. + * @category ux + */ +export function hideProperties() { + $('#moduleProperty-inner').empty() + $('#moduleProperty').hide() + prevPropertyObjSet(undefined) + $('.objectPropertyAttribute').unbind('change keyup paste click') +} +/** + * checkss the input is safe or not + * @param {HTML} unsafe - the html which we wants to escape + * @category ux + */ +function escapeHtml(unsafe) { + return unsafe + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, ''') +} + +export function deleteSelected() { + if ( + simulationArea.lastSelected && + !( + simulationArea.lastSelected.objectType === 'Node' && + simulationArea.lastSelected.type !== 2 + ) + ) { + simulationArea.lastSelected.delete() + } + + for (var i = 0; i < simulationArea.multipleObjectSelections.length; i++) { + if ( + !( + simulationArea.multipleObjectSelections[i].objectType === + 'Node' && + simulationArea.multipleObjectSelections[i].type !== 2 + ) + ) + simulationArea.multipleObjectSelections[i].cleanDelete() + } + + simulationArea.multipleObjectSelections = [] + simulationArea.lastSelected = undefined + showProperties(simulationArea.lastSelected) + // Updated restricted elements + updateCanvasSet(true) + scheduleUpdate() + updateRestrictedElementsInScope() +} + +export function setupPanels() { + // $('#dragQPanel') + // .on('mousedown', () => + // $('.quick-btn').draggable({ + // disabled: false, + // containment: 'window', + // }) + // ) + // .on('mouseup', () => $('.quick-btn').draggable({ disabled: true })) + + // let position = { x: 0, y: 0 } + // interact('.quick-btn').draggable({ + // allowFrom: '#dragQPanel', + // listeners: { + // move(event) { + // position.x = position.x + event.dx + // position.y = position.y + event.dy + // event.target.style.transform = `translate(${position.x}px, ${position.y}px)` + // }, + // }, + // }) + + dragging('#dragQPanel', '.quick-btn') + + setupPanelListeners('.elementPanel') + setupPanelListeners('.layoutElementPanel') + setupPanelListeners('#moduleProperty') + setupPanelListeners('#layoutDialog') + setupPanelListeners('#verilogEditorPanel') + setupPanelListeners('.timing-diagram-panel') + setupPanelListeners('.testbench-manual-panel') + + // Minimize Timing Diagram (takes too much space) + $('.timing-diagram-panel .minimize').trigger('click') + + // Update the Testbench Panel UI + updateTestbenchUI() + // Minimize Testbench UI + $('.testbench-manual-panel .minimize').trigger('click') + + // Hack because minimizing panel then maximizing sets visibility recursively + // updateTestbenchUI calls some hide()s which are undone by maximization + // TODO: Remove hack + $('.testbench-manual-panel .maximize').on('click', setupTestbenchUI) + + $('#projectName').on('click', () => { + $("input[name='setProjectName']").focus().select() + }) +} + +function setupPanelListeners(panelSelector) { + var headerSelector = `${panelSelector} .panel-header` + var minimizeSelector = `${panelSelector} .minimize` + var maximizeSelector = `${panelSelector} .maximize` + var bodySelector = `${panelSelector} > .panel-body` + + dragging(headerSelector, panelSelector) + // let position = { x: 0, y: 0 } + // Drag Start + // $(headerSelector).on('mousedown', () => + // $(panelSelector).draggable({ disabled: false, containment: 'window' }) + // interact(panelSelector).draggable({ + // allowFrom: headerSelector, + // listeners: { + // move(event) { + // position.x += event.dx + // position.y += event.dy + + // event.target.style.transform = `translate(${position.x}px, ${position.y}px)` + // }, + // }, + // }) + // ) + // // Drag End + // $(headerSelector).on('mouseup', () => + // $(panelSelector).draggable({ disabled: true }) + // ) + // Current Panel on Top + var minimized = false + $(headerSelector).on('dblclick', () => + minimized + ? $(maximizeSelector).trigger('click') + : $(minimizeSelector).trigger('click') + ) + // Minimize + $(minimizeSelector).on('click', () => { + $(bodySelector).hide() + $(minimizeSelector).hide() + $(maximizeSelector).show() + minimized = true + }) + // Maximize + $(maximizeSelector).on('click', () => { + $(bodySelector).show() + $(minimizeSelector).show() + $(maximizeSelector).hide() + minimized = false + }) +} + +export function exitFullView() { + const exitViewBtn = document.querySelector('#exitViewBtn') + if (exitViewBtn) exitViewBtn.remove() + + const elements = document.querySelectorAll( + '.navbar, .modules, .report-sidebar, #tabsBar, #moduleProperty, .timing-diagram-panel, .testbench-manual-panel, .quick-btn' + ) + elements.forEach((element) => { + if (element instanceof HTMLElement) { + element.style.display = '' + } + }) +} + +export function fullView() { + const app = document.querySelector('#app') + + const exitViewEl = document.createElement('button') + exitViewEl.id = 'exitViewBtn' + exitViewEl.textContent = 'Exit Full Preview' + + const elements = document.querySelectorAll( + '.navbar, .modules, .report-sidebar, #tabsBar, #moduleProperty, .timing-diagram-panel, .testbench-manual-panel, .quick-btn' + ) + elements.forEach((element) => { + if (element instanceof HTMLElement) { + element.style.display = 'none' + } + }) + + app.appendChild(exitViewEl) + exitViewEl.addEventListener('click', exitFullView) +} + +/** + Fills the elements that can be displayed in the subcircuit, in the subcircuit menu +**/ +export function fillSubcircuitElements() { + $('#subcircuitMenu').empty() + var subCircuitElementExists = false + for (let el of circuitElementList) { + if (globalScope[el].length === 0) continue + if (!globalScope[el][0].canShowInSubcircuit) continue + let tempHTML = '' + + // add a panel for each existing group + tempHTML += `
${el}s
` + tempHTML += `
` + + let available = false + + // add an SVG for each element + for (let i = 0; i < globalScope[el].length; i++) { + if (!globalScope[el][i].subcircuitMetadata.showInSubcircuit) { + tempHTML += `
` + tempHTML += `` + tempHTML += `

${ + globalScope[el][i].label !== '' + ? globalScope[el][i].label + : 'unlabeled' + }

` + tempHTML += '
' + available = true + } + } + tempHTML += '
' + subCircuitElementExists = subCircuitElementExists || available + if (available) $('#subcircuitMenu').append(tempHTML) + } + + if (subCircuitElementExists) { + // $('#subcircuitMenu').accordion('refresh') + } else { + $('#subcircuitMenu').append('

No layout elements available

') + } + + $('.subcircuitModule').mousedown(function () { + let elementName = this.dataset.elementName + let elementIndex = this.dataset.elementId + + let element = globalScope[elementName][elementIndex] + + element.subcircuitMetadata.showInSubcircuit = true + element.newElement = true + simulationArea.lastSelected = element + this.parentElement.removeChild(this) + }) +} diff --git a/v1/src/simulator/src/verilog.js b/v1/src/simulator/src/verilog.js new file mode 100644 index 00000000..d0811b2c --- /dev/null +++ b/v1/src/simulator/src/verilog.js @@ -0,0 +1,580 @@ +/* + # Primary Developers + 1) James H-J Yeh, Ph.D. + 2) Satvik Ramaprasad + + refer verilog_documentation.md +*/ +import { scopeList } from './circuit' +import { errorDetectedGet } from './engine' +import { download } from './utils' +import { getProjectName } from './data/save' +import modules from './modules' +import { sanitizeLabel } from './verilogHelpers' +import CodeMirror from 'codemirror/lib/codemirror.js' +import 'codemirror/lib/codemirror.css' +import 'codemirror/addon/hint/show-hint.css' +import 'codemirror/mode/verilog/verilog.js' +import 'codemirror/addon/edit/closebrackets.js' +import 'codemirror/addon/hint/anyword-hint.js' +import 'codemirror/addon/hint/show-hint.js' +import 'codemirror/addon/display/autorefresh.js' +import { openInNewTab, copyToClipboard, showMessage } from './utils' +import { SimulatorStore } from '#/store/SimulatorStore/SimulatorStore' +var editor + +export function generateVerilog() { + const simulatorStore = SimulatorStore() + simulatorStore.dialogBox.exportverilog_dialog = true + // var dialog = $('#verilog-export-code-window-div') + // var data = verilog.exportVerilog() + // editor.setValue(data) + // $('#verilog-export-code-window-div .CodeMirror').css( + // 'height', + // $(window).height() - 200 + // ) + // dialog.dialog({ + // resizable: false, + // width: '90%', + // height: 'auto', + // position: { my: 'center', at: 'center', of: window }, + // buttons: [ + // { + // text: 'Download Verilog File', + // click() { + // var fileName = getProjectName() || 'Untitled' + // download(fileName + '.v', editor.getValue()) + // }, + // }, + // { + // text: 'Copy to Clipboard', + // click() { + // copyToClipboard(editor.getValue()) + // showMessage('Code has been copied') + // }, + // }, + // { + // text: 'Try in EDA Playground', + // click() { + // copyToClipboard(editor.getValue()) + // openInNewTab('https://www.edaplayground.com/x/XZpY') + // }, + // }, + // ], + // }) +} + +export function setupVerilogExportCodeWindow() { + var myTextarea = document.getElementById('verilog-export-code-window') + editor = CodeMirror.fromTextArea(myTextarea, { + mode: 'verilog', + autoRefresh: true, + styleActiveLine: true, + lineNumbers: true, + autoCloseBrackets: true, + smartIndent: true, + indentWithTabs: true, + extraKeys: { 'Ctrl-Space': 'autocomplete' }, + }) +} + +export var verilog = { + // Entry point to verilog generation + // scope = undefined means export all circuits + exportVerilog: function (scope = undefined) { + var dependencyList = {} + // Reset Verilog Element State + for (var elem in modules) { + // Not sure if globalScope here is correct. + if (modules[elem].resetVerilog) { + modules[elem].resetVerilog() + } + } + + // List of devices under test for which testbench needs to be created + var DUTs = [] + var SubCircuitIds = new Set() + + // Generate SubCircuit Dependency Graph + for (id in scopeList) { + dependencyList[id] = scopeList[id].getDependencies() + for (var i = 0; i < scopeList[id].SubCircuit.length; i++) { + SubCircuitIds.add(scopeList[id].SubCircuit[i].id) + } + } + + for (id in scopeList) { + if (!SubCircuitIds.has(id)) DUTs.push(scopeList[id]) + } + + // DFS on SubCircuit Dependency Graph + var visited = {} + var elementTypesUsed = {} + var output = '' + if (scope) { + // generate verilog only for scope + output += this.exportVerilogScope( + scope.id, + visited, + dependencyList, + elementTypesUsed + ) + } else { + // generate verilog for everything + for (id in scopeList) { + output += this.exportVerilogScope( + id, + visited, + dependencyList, + elementTypesUsed + ) + } + } + // Add Circuit Element - Module Specific Verilog Code + for (var element in elementTypesUsed) { + // If element has custom verilog + if (modules[element] && modules[element].moduleVerilog) { + output += modules[element].moduleVerilog() + } + } + + var report = this.generateReport(elementTypesUsed) + '\n' + var testbench = this.generateTestBenchCode(DUTs) + + return report + testbench + output + }, + generateReport: function (elementTypesUsed) { + var output = '' + output += '/**\n' + output += + ' * This is an autogenerated netlist code from CircuitVerse. Verilog Code can be\n' + output += + ' * tested on https://www.edaplayground.com/ using Icarus Verilog 0.9.7. This is an\n' + output += + ' * experimental module and some manual changes make need to be done in order for\n' + output += ' * this to work.\n' + output += ' *\n' + output += + ' * If you have any ideas/suggestions or bug fixes, raise an issue\n' + output += + ' * on https://github.com/CircuitVerse/CircuitVerse/issues/new/choose\n' + output += ' */\n' + output += '\n' + output += '/*\n' + output += sp(1) + 'Element Usage Report\n' + for (var elem in elementTypesUsed) { + if (elem == 'Node') continue + output += `${sp(2)}${elem} - ${elementTypesUsed[elem]} times\n` + } + output += '*/\n' + output += '\n' + var instructions = '' + output += '/*\n' + output += sp(1) + 'Usage Instructions and Tips\n' + instructions += + sp(2) + + 'Labels - Ensure unique label names and avoid using verilog keywords\n' + instructions += + sp(2) + + 'Warnings - Connect all optional inputs to remove warnings\n' + for (var elem in elementTypesUsed) { + // If element has custom instructions + if (modules[elem] && modules[elem].verilogInstructions) { + instructions += indent(2, modules[elem].verilogInstructions()) + } + } + output += instructions + output += '*/\n' + return output + }, + generateTestBenchCode: function (DUTs) { + if (DUTs.length == 0) return '' + var output = '// Sample Testbench Code - Uncomment to use\n' + + output += '\n/*\n' + output += 'module TestBench();\n' + var registers = {} + var wires = {} + for (var i = 1; i <= 32; i++) registers[i] = new Set() + for (var i = 1; i <= 32; i++) wires[i] = new Set() + + var clocks = new Set() + var inputs = new Set() + var outputs = new Set() + var deviceInstantiations = '' + for (var i = 0; i < DUTs.length; i++) { + var DUT = DUTs[i] + for (var j = 0; j < DUT.Input.length; j++) { + var inp = DUT.Input[j] + registers[inp.bitWidth].add(inp.label) + inputs.add(inp.label) + } + for (var j = 0; j < DUT.Output.length; j++) { + var out = DUT.Output[j] + wires[out.bitWidth].add(out.label) + outputs.add(out.label) + } + for (var j = 0; j < DUT.Clock.length; j++) { + var inp = DUT.Clock[j] + registers[1].add(inp.label) + clocks.add(inp.label) + } + var circuitName = sanitizeLabel(DUT.name) + var dutHeader = this.generateHeaderHelper(DUT) + deviceInstantiations += `${sp( + 1 + )}${circuitName} DUT${i}${dutHeader}\n` + } + output += '\n' + // Generate Reg Initialization Code + for (var bitWidth = 1; bitWidth <= 32; bitWidth++) { + if (registers[bitWidth].size == 0) continue + var regArray = [...registers[bitWidth]] + if (bitWidth == 1) output += `${sp(1)}reg ${regArray.join(', ')};\n` + else + output += `${sp(1)}reg [${bitWidth - 1}:0] ${regArray.join( + ', ' + )};\n` + } + output += '\n' + // Generate Wire Initialization Code + for (var bitWidth = 1; bitWidth <= 32; bitWidth++) { + if (wires[bitWidth].size == 0) continue + var wireArray = [...wires[bitWidth]] + if (bitWidth == 1) + output += `${sp(1)}wire ${wireArray.join(', ')};\n` + else + output += `${sp(1)}wire [${bitWidth - 1}:0] ${wireArray.join( + ', ' + )};\n` + } + output += '\n' + + output += deviceInstantiations + + if (clocks.size) { + output += `${sp(1)}always begin\n` + output += `${sp(2)}#10\n` + for (var clk of clocks) output += `${sp(2)}${clk} = 0;\n` + output += `${sp(2)}#10\n` + for (var clk of clocks) output += `${sp(2)}${clk} = 1;\n` + output += `${sp(1)}end\n` + output += '\n' + } + + output += `${sp(1)}initial begin\n` + + // Reset inputs to 0 + for (var inp of inputs) { + output += `${sp(2)}${inp} = 0;\n` + } + output += '\n' + output += `${sp(2)}#15\n` + for (var out of outputs) { + output += `${sp(2)}$display("${out} = %b", ${out});\n` + } + output += '\n' + output += `${sp(2)}#10\n` + for (var out of outputs) { + output += `${sp(2)}$display("${out} = %b", ${out});\n` + } + output += '\n' + output += `${sp(2)}$finish;\n\n` + output += `${sp(1)}end\n` + + output += 'endmodule\n' + + output += '\n*/\n' + + return output + }, + // Recursive DFS function + exportVerilogScope: function ( + id, + visited, + dependencyList, + elementTypesUsed + ) { + // Already Visited + if (visited[id]) return '' + // Mark as Visited + visited[id] = true + + var output = '' + // DFS on dependencies + for (var i = 0; i < dependencyList[id].length; i++) + output += + this.exportVerilogScope( + dependencyList[id][i], + visited, + dependencyList, + elementTypesUsed + ) + '\n' + + var scope = scopeList[id] + // Initialize labels for all elements + this.resetLabels(scope) + this.setLabels(scope) + + output += this.generateHeader(scope) + output += this.generateOutputList(scope) // generate output first to be consistent + output += this.generateInputList(scope) + + // Note: processGraph function populates scope.verilogWireList + var res = this.processGraph(scope, elementTypesUsed) + + // Generate Wire Initialization Code + for (var bitWidth = 1; bitWidth <= 32; bitWidth++) { + var wireList = scope.verilogWireList[bitWidth] + // Hack for splitter + wireList = wireList.filter((x) => !x.includes('[')) + if (wireList.length == 0) continue + if (bitWidth == 1) output += ' wire ' + wireList.join(', ') + ';\n' + else + output += + ' wire [' + + (bitWidth - 1) + + ':0] ' + + wireList.join(', ') + + ';\n' + } + + // Append Wire connections and module instantiations + output += res + + // Append footer + output += 'endmodule\n' + + return output + }, + // Performs DFS on the graph and generates netlist of wires and connections + processGraph: function (scope, elementTypesUsed) { + // Initializations + var res = '' + scope.stack = [] + scope.verilogWireList = [] + for (var i = 0; i <= 32; i++) scope.verilogWireList.push(new Array()) + + var verilogResolvedSet = new Set() + + // Start DFS from inputs + for (var i = 0; i < inputList.length; i++) { + for (var j = 0; j < scope[inputList[i]].length; j++) { + scope.stack.push(scope[inputList[i]][j]) + } + } + + // Iterative DFS on circuit graph + while (scope.stack.length) { + if (errorDetectedGet()) return + var elem = scope.stack.pop() + + if (verilogResolvedSet.has(elem)) continue + + // Process verilog creates variable names and adds elements to DFS stack + elem.processVerilog() + + // Record usage of element type + if (elem.objectType != 'Node') { + if (elementTypesUsed[elem.objectType]) + elementTypesUsed[elem.objectType]++ + else elementTypesUsed[elem.objectType] = 1 + } + + if ( + elem.objectType != 'Node' && + elem.objectType != 'Input' && + elem.objectType != 'Clock' + ) { + verilogResolvedSet.add(elem) + } + } + + // Generate connection verilog code and module instantiations + for (var elem of verilogResolvedSet) { + res += ' ' + elem.generateVerilog() + '\n' + } + return res + }, + + resetLabels: function (scope) { + for (var i = 0; i < scope.allNodes.length; i++) { + scope.allNodes[i].verilogLabel = '' + } + }, + // Sets labels for all Circuit Elements elements + setLabels: function (scope = globalScope) { + /** + * Sets a name for each element. If element is already labeled, + * the element is used directly, otherwise an automated label is provided + * sanitizeLabel is a helper function to escape white spaces + */ + for (var i = 0; i < scope.Input.length; i++) { + if (scope.Input[i].label == '') scope.Input[i].label = 'inp_' + i + else scope.Input[i].label = sanitizeLabel(scope.Input[i].label) + // copy label to node + scope.Input[i].output1.verilogLabel = scope.Input[i].label + } + for (var i = 0; i < scope.ConstantVal.length; i++) { + if (scope.ConstantVal[i].label == '') + scope.ConstantVal[i].label = 'const_' + i + else + scope.ConstantVal[i].label = sanitizeLabel( + scope.ConstantVal[i].label + ) + // copy label to node + scope.ConstantVal[i].output1.verilogLabel = + scope.ConstantVal[i].label + } + + // copy label to clock + for (var i = 0; i < scope.Clock.length; i++) { + if (scope.Clock[i].label == '') scope.Clock[i].label = 'clk_' + i + else scope.Clock[i].label = sanitizeLabel(scope.Clock[i].label) + scope.Clock[i].output1.verilogLabel = scope.Clock[i].label + } + + for (var i = 0; i < scope.Output.length; i++) { + if (scope.Output[i].label == '') scope.Output[i].label = 'out_' + i + else scope.Output[i].label = sanitizeLabel(scope.Output[i].label) + } + for (var i = 0; i < scope.SubCircuit.length; i++) { + if (scope.SubCircuit[i].label == '') + scope.SubCircuit[i].label = + scope.SubCircuit[i].data.name + '_' + i + else + scope.SubCircuit[i].label = sanitizeLabel( + scope.SubCircuit[i].label + ) + } + for (var i = 0; i < moduleList.length; i++) { + var m = moduleList[i] + for (var j = 0; j < scope[m].length; j++) { + scope[m][j].verilogLabel = + sanitizeLabel(scope[m][j].label) || + scope[m][j].verilogName() + '_' + j + } + } + }, + generateHeader: function (scope = globalScope) { + // Example: module HalfAdder (a,b,s,c); + var res = '\nmodule ' + sanitizeLabel(scope.name) + res += this.generateHeaderHelper(scope) + return res + }, + generateHeaderHelper: function (scope = globalScope) { + // Example: (a,b,s,c); + var res = '(' + var pins = [] + for (var i = 0; i < scope.Output.length; i++) { + pins.push(scope.Output[i].label) + } + for (var i = 0; i < scope.Clock.length; i++) { + pins.push(scope.Clock[i].label) + } + for (var i = 0; i < scope.Input.length; i++) { + pins.push(scope.Input[i].label) + } + res += pins.join(', ') + res += ');\n' + return res + }, + generateInputList: function (scope = globalScope) { + var inputs = {} + for (var i = 1; i <= 32; i++) inputs[i] = [] + + for (var i = 0; i < scope.Input.length; i++) { + inputs[scope.Input[i].bitWidth].push(scope.Input[i].label) + } + + for (var i = 0; i < scope.Clock.length; i++) { + inputs[scope.Clock[i].bitWidth].push(scope.Clock[i].label) + } + + var res = '' + for (var bitWidth in inputs) { + if (inputs[bitWidth].length == 0) continue + if (bitWidth == 1) res += ' input ' + inputs[1].join(', ') + ';\n' + else + res += + ' input [' + + (bitWidth - 1) + + ':0] ' + + inputs[bitWidth].join(', ') + + ';\n' + } + + return res + }, + generateOutputList: function (scope = globalScope) { + // Example 1: output s,cout; + var outputs = {} + for (var i = 0; i < scope.Output.length; i++) { + if (outputs[scope.Output[i].bitWidth]) + outputs[scope.Output[i].bitWidth].push(scope.Output[i].label) + else outputs[scope.Output[i].bitWidth] = [scope.Output[i].label] + } + var res = '' + for (var bitWidth in outputs) { + if (bitWidth == 1) + res += ' output ' + outputs[1].join(', ') + ';\n' + else + res += + ' output [' + + (bitWidth - 1) + + ':0] ' + + outputs[bitWidth].join(', ') + + ';\n' + } + + return res + }, + /* + sanitizeLabel: function(name){ + // Replace spaces by "_" + name = name.replace(/ /g , "_"); + // Replace Hyphens by "_" + name = name.replace(/-/g , "_"); + // Replace Colons by "_" + name = name.replace(/:/g , "_"); + // replace ~ with inv_ + name = name.replace(/~/g , "inv_"); + // Shorten Inverse to inv + name = name.replace(/Inverse/g , "inv"); + + // If first character is a number + if(name.substring(0, 1).search(/[0-9]/g) > -1) { + name = "w_" + name; + } + + // if first character is not \ already + if (name[0] != '\\') { + //if there are non-alphanum_ character, add \ + if (name.search(/[\W]/g) > -1) + name = "\\" + name; + } + return name; + }, + */ +} + +/* + Helper function to generate spaces for indentation +*/ +function sp(indentation) { + return ' '.repeat(indentation * 2) +} + +/* + Helper function to indent paragraph +*/ +function indent(indentation, string) { + var result = string.split('\n') + if (result[result.length - 1] == '') { + result.pop() + result = result.map((x) => sp(indentation) + x).join('\n') + result += '\n' + return result + } + return result.map((x) => sp(indentation) + x).join('\n') +} diff --git a/v1/src/simulator/src/verilogHelpers.js b/v1/src/simulator/src/verilogHelpers.js new file mode 100644 index 00000000..3f9a4123 --- /dev/null +++ b/v1/src/simulator/src/verilogHelpers.js @@ -0,0 +1,41 @@ +export function sanitizeLabel(name) { + // return name.replace(/ Inverse/g, "_inv").replace(/ /g , "_"); + var temp = name + // if there is a space anywhere but the last place + // replace spaces by "_" + // last space is required for escaped id + if (temp.search(/ /g) < temp.length - 1 && temp.search(/ /g) >= 0) { + temp = temp.replace(/ Inverse/g, '_inv') + temp = temp.replace(/ /g, '_') + } + // if first character is not \ already + if (temp.substring(0, 1).search(/\\/g) < 0) { + // if there are non-alphanum_ character, or first character is num, add \ + if ( + temp.search(/[\W]/g) > -1 || + temp.substring(0, 1).search(/[0-9]/g) > -1 + ) + temp = '\\' + temp + ' ' + } + return temp +} + +export function generateNodeName(node, currentCount, totalCount) { + if (node.verilogLabel) return node.verilogLabel + var parentVerilogLabel = node.parent.verilogLabel + var nodeName + if (node.label) { + nodeName = sanitizeLabel(node.label) + } else { + nodeName = totalCount > 1 ? 'out_' + currentCount : 'out' + } + if (parentVerilogLabel.substring(0, 1).search(/\\/g) < 0) + return parentVerilogLabel + '_' + nodeName + else + return ( + parentVerilogLabel.substring(0, parentVerilogLabel.length - 1) + + '_' + + nodeName + + ' ' + ) +} diff --git a/v1/src/simulator/src/wire.js b/v1/src/simulator/src/wire.js new file mode 100644 index 00000000..7e06e7d2 --- /dev/null +++ b/v1/src/simulator/src/wire.js @@ -0,0 +1,240 @@ +/* eslint-disable no-multi-assign */ +// wire object +import { drawLine } from './canvasApi' +import simulationArea from './simulationArea' +import Node from './node' +import { updateSimulationSet, forceResetNodesSet } from './engine' +import { colors } from './themer/themer' + +/** + * Wire - To connect two nodes. + * @class + * @memberof module:wire + * @param {Node} node1 + * @param {Node} node2 + * @param {Scope} scope - The circuit in which wire has to be drawn + * @category wire + */ +export default class Wire { + constructor(node1, node2, scope) { + this.objectType = 'Wire' + this.node1 = node1 + this.scope = scope + this.node2 = node2 + this.type = 'horizontal' + + this.updateData() + this.scope.wires.push(this) + forceResetNodesSet(true) + } + + // if data changes + updateData() { + this.x1 = this.node1.absX() + this.y1 = this.node1.absY() + this.x2 = this.node2.absX() + this.y2 = this.node2.absY() + if (this.x1 === this.x2) this.type = 'vertical' + } + + updateScope(scope) { + this.scope = scope + this.checkConnections() + } + + // to check if nodes are disconnected + checkConnections() { + var check = + this.node1.deleted || + this.node2.deleted || + !this.node1.connections.contains(this.node2) || + !this.node2.connections.contains(this.node1) + if (check) this.delete() + return check + } + + dblclick() { + if ( + this.node1.parent == globalScope.root && + this.node2.parent == globalScope.root + ) { + simulationArea.multipleObjectSelections = [this.node1, this.node2] + simulationArea.lastSelected = undefined + } + } + + update() { + var updated = false + if (embed) return updated + + if (this.node1.absX() === this.node2.absX()) { + this.x1 = this.x2 = this.node1.absX() + this.type = 'vertical' + } else if (this.node1.absY() === this.node2.absY()) { + this.y1 = this.y2 = this.node1.absY() + this.type = 'horizontal' + } + + // if (wireToBeChecked && this.checkConnections()) { + // this.delete(); + // return updated; + // } // SLOW , REMOVE + if ( + simulationArea.shiftDown === false && + simulationArea.mouseDown === true && + simulationArea.selected === false && + this.checkWithin( + simulationArea.mouseDownX, + simulationArea.mouseDownY + ) + ) { + simulationArea.selected = true + simulationArea.lastSelected = this + updated = true + } else if ( + simulationArea.mouseDown && + simulationArea.lastSelected === this && + !this.checkWithin(simulationArea.mouseX, simulationArea.mouseY) + ) { + var n = new Node( + simulationArea.mouseDownX, + simulationArea.mouseDownY, + 2, + this.scope.root + ) + n.clicked = true + n.wasClicked = true + simulationArea.lastSelected = n + this.converge(n) + } + // eslint-disable-next-line no-empty + if (simulationArea.lastSelected === this) { + } + + if (this.node1.deleted || this.node2.deleted) { + this.delete() + return updated + } // if either of the nodes are deleted + + if (simulationArea.mouseDown === false) { + if (this.type === 'horizontal') { + if (this.node1.absY() !== this.y1) { + // if(this.checkConnections()){this.delete();return;} + n = new Node(this.node1.absX(), this.y1, 2, this.scope.root) + this.converge(n) + updated = true + } else if (this.node2.absY() !== this.y2) { + // if(this.checkConnections()){this.delete();return;} + n = new Node(this.node2.absX(), this.y2, 2, this.scope.root) + this.converge(n) + updated = true + } + } else if (this.type === 'vertical') { + if (this.node1.absX() !== this.x1) { + // if(this.checkConnections()){this.delete();return;} + n = new Node(this.x1, this.node1.absY(), 2, this.scope.root) + this.converge(n) + updated = true + } else if (this.node2.absX() !== this.x2) { + // if(this.checkConnections()){this.delete();return;} + n = new Node(this.x2, this.node2.absY(), 2, this.scope.root) + this.converge(n) + updated = true + } + } + } + return updated + } + + draw() { + // for calculating min-max Width,min-max Height + // + const ctx = simulationArea.context + + var color + if (simulationArea.lastSelected == this) { + color = colors['color_wire_sel'] + } else if ( + this.node1.value == undefined || + this.node2.value == undefined + ) { + color = colors['color_wire_lose'] + } else if (this.node1.bitWidth == 1) { + color = [ + colors['color_wire_lose'], + colors['color_wire_con'], + colors['color_wire_pow'], + ][this.node1.value + 1] + } else { + color = colors['color_wire'] + } + drawLine( + ctx, + this.node1.absX(), + this.node1.absY(), + this.node2.absX(), + this.node2.absY(), + color, + 3 + ) + } + + // checks if node lies on wire + checkConvergence(n) { + return this.checkWithin(n.absX(), n.absY()) + } + + // fn checks if coordinate lies on wire + checkWithin(x, y) { + if ( + this.type === 'horizontal' && + this.node1.absX() < this.node2.absX() && + x > this.node1.absX() && + x < this.node2.absX() && + y === this.node2.absY() + ) + return true + if ( + this.type === 'horizontal' && + this.node1.absX() > this.node2.absX() && + x < this.node1.absX() && + x > this.node2.absX() && + y === this.node2.absY() + ) + return true + if ( + this.type === 'vertical' && + this.node1.absY() < this.node2.absY() && + y > this.node1.absY() && + y < this.node2.absY() && + x === this.node2.absX() + ) + return true + if ( + this.type === 'vertical' && + this.node1.absY() > this.node2.absY() && + y < this.node1.absY() && + y > this.node2.absY() && + x === this.node2.absX() + ) + return true + return false + } + + // add intermediate node between these 2 nodes + converge(n) { + this.node1.connect(n) + this.node2.connect(n) + this.delete() + } + + delete() { + forceResetNodesSet(true) + updateSimulationSet(true) + this.node1.connections.clean(this.node2) + this.node2.connections.clean(this.node1) + this.scope.wires.clean(this) + this.node1.checkDeleted() + this.node2.checkDeleted() + } +} diff --git a/v1/src/simulator/vendor/canvas2svg.js b/v1/src/simulator/vendor/canvas2svg.js new file mode 100644 index 00000000..73dae81d --- /dev/null +++ b/v1/src/simulator/vendor/canvas2svg.js @@ -0,0 +1,1469 @@ +/*!! + * Canvas 2 Svg v1.0.19 + * A low level canvas to SVG converter. Uses a mock canvas context to build an SVG document. + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/mit-license.php + * + * Author: + * Kerry Liu + * + * Copyright (c) 2014 Gliffy Inc. + */ + +;(function () { + 'use strict' + + var STYLES, ctx, CanvasGradient, CanvasPattern, namedEntities + + //helper function to format a string + function format(str, args) { + var keys = Object.keys(args), + i + for (i = 0; i < keys.length; i++) { + str = str.replace( + new RegExp('\\{' + keys[i] + '\\}', 'gi'), + args[keys[i]] + ) + } + return str + } + + //helper function that generates a random string + function randomString(holder) { + var chars, randomstring, i + if (!holder) { + throw new Error( + 'cannot create a random attribute name for an undefined object' + ) + } + chars = 'ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz' + randomstring = '' + do { + randomstring = '' + for (i = 0; i < 12; i++) { + randomstring += chars[Math.floor(Math.random() * chars.length)] + } + } while (holder[randomstring]) + return randomstring + } + + //helper function to map named to numbered entities + function createNamedToNumberedLookup(items, radix) { + var i, + entity, + lookup = {}, + base10, + base16 + items = items.split(',') + radix = radix || 10 + // Map from named to numbered entities. + for (i = 0; i < items.length; i += 2) { + entity = '&' + items[i + 1] + ';' + base10 = parseInt(items[i], radix) + lookup[entity] = '&#' + base10 + ';' + } + //FF and IE need to create a regex from hex values ie   == \xa0 + lookup['\\xa0'] = ' ' + return lookup + } + + //helper function to map canvas-textAlign to svg-textAnchor + function getTextAnchor(textAlign) { + //TODO: support rtl languages + var mapping = { + left: 'start', + right: 'end', + center: 'middle', + start: 'start', + end: 'end', + } + return mapping[textAlign] || mapping.start + } + + //helper function to map canvas-textBaseline to svg-dominantBaseline + function getDominantBaseline(textBaseline) { + //INFO: not supported in all browsers + var mapping = { + alphabetic: 'alphabetic', + hanging: 'hanging', + top: 'text-before-edge', + bottom: 'text-after-edge', + middle: 'central', + } + return mapping[textBaseline] || mapping.alphabetic + } + + // Unpack entities lookup where the numbers are in radix 32 to reduce the size + // entity mapping courtesy of tinymce + namedEntities = createNamedToNumberedLookup( + '50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,' + + '5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,' + + '5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,' + + '5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,' + + '68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,' + + '6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,' + + '6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,' + + '75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,' + + '7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,' + + '7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,' + + 'sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,' + + 'st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,' + + 't9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,' + + 'tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,' + + 'u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,' + + '81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,' + + '8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,' + + '8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,' + + '8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,' + + '8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,' + + 'nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,' + + 'rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,' + + 'Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,' + + '80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,' + + '811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro', + 32 + ) + + //Some basic mappings for attributes and default values. + STYLES = { + strokeStyle: { + svgAttr: 'stroke', //corresponding svg attribute + canvas: '#000000', //canvas default + svg: 'none', //svg default + apply: 'stroke', //apply on stroke() or fill() + }, + fillStyle: { + svgAttr: 'fill', + canvas: '#000000', + svg: null, //svg default is black, but we need to special case this to handle canvas stroke without fill + apply: 'fill', + }, + lineCap: { + svgAttr: 'stroke-linecap', + canvas: 'butt', + svg: 'butt', + apply: 'stroke', + }, + lineJoin: { + svgAttr: 'stroke-linejoin', + canvas: 'miter', + svg: 'miter', + apply: 'stroke', + }, + miterLimit: { + svgAttr: 'stroke-miterlimit', + canvas: 10, + svg: 4, + apply: 'stroke', + }, + lineWidth: { + svgAttr: 'stroke-width', + canvas: 1, + svg: 1, + apply: 'stroke', + }, + globalAlpha: { + svgAttr: 'opacity', + canvas: 1, + svg: 1, + apply: 'fill stroke', + }, + font: { + //font converts to multiple svg attributes, there is custom logic for this + canvas: '10px sans-serif', + }, + shadowColor: { + canvas: '#000000', + }, + shadowOffsetX: { + canvas: 0, + }, + shadowOffsetY: { + canvas: 0, + }, + shadowBlur: { + canvas: 0, + }, + textAlign: { + canvas: 'start', + }, + textBaseline: { + canvas: 'alphabetic', + }, + lineDash: { + svgAttr: 'stroke-dasharray', + canvas: [], + svg: null, + apply: 'stroke', + }, + } + + /** + * + * @param gradientNode - reference to the gradient + * @constructor + */ + CanvasGradient = function (gradientNode, ctx) { + this.__root = gradientNode + this.__ctx = ctx + } + + /** + * Adds a color stop to the gradient root + */ + CanvasGradient.prototype.addColorStop = function (offset, color) { + var stop = this.__ctx.__createElement('stop'), + regex, + matches + stop.setAttribute('offset', offset) + if (color.indexOf('rgba') !== -1) { + //separate alpha value, since webkit can't handle it + regex = + /rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d?\.?\d*)\s*\)/gi + matches = regex.exec(color) + stop.setAttribute( + 'stop-color', + format('rgb({r},{g},{b})', { + r: matches[1], + g: matches[2], + b: matches[3], + }) + ) + stop.setAttribute('stop-opacity', matches[4]) + } else { + stop.setAttribute('stop-color', color) + } + this.__root.appendChild(stop) + } + + CanvasPattern = function (pattern, ctx) { + this.__root = pattern + this.__ctx = ctx + } + + /** + * The mock canvas context + * @param o - options include: + * ctx - existing Context2D to wrap around + * width - width of your canvas (defaults to 500) + * height - height of your canvas (defaults to 500) + * enableMirroring - enables canvas mirroring (get image data) (defaults to false) + * document - the document object (defaults to the current document) + */ + ctx = function (o) { + var defaultOptions = { + width: 500, + height: 500, + enableMirroring: false, + }, + options + + //keep support for this way of calling C2S: new C2S(width,height) + if (arguments.length > 1) { + options = defaultOptions + options.width = arguments[0] + options.height = arguments[1] + } else if (!o) { + options = defaultOptions + } else { + options = o + } + + if (!(this instanceof ctx)) { + //did someone call this without new? + return new ctx(options) + } + + //setup options + this.width = options.width || defaultOptions.width + this.height = options.height || defaultOptions.height + this.enableMirroring = + options.enableMirroring !== undefined + ? options.enableMirroring + : defaultOptions.enableMirroring + + this.canvas = this ///point back to this instance! + this.__document = options.document || document + + // allow passing in an existing context to wrap around + // if a context is passed in, we know a canvas already exist + if (options.ctx) { + this.__ctx = options.ctx + } else { + this.__canvas = this.__document.createElement('canvas') + this.__ctx = this.__canvas.getContext('2d') + } + + this.__setDefaultStyles() + this.__stack = [this.__getStyleState()] + this.__groupStack = [] + + //the root svg element + this.__root = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + 'svg' + ) + this.__root.setAttribute('version', 1.1) + this.__root.setAttribute('xmlns', 'http://www.w3.org/2000/svg') + this.__root.setAttributeNS( + 'http://www.w3.org/2000/xmlns/', + 'xmlns:xlink', + 'http://www.w3.org/1999/xlink' + ) + this.__root.setAttribute('width', this.width) + this.__root.setAttribute('height', this.height) + + //make sure we don't generate the same ids in defs + this.__ids = {} + + //defs tag + this.__defs = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + 'defs' + ) + this.__root.appendChild(this.__defs) + + //also add a group child. the svg element can't use the transform attribute + this.__currentElement = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + 'g' + ) + this.__root.appendChild(this.__currentElement) + } + + /** + * Creates the specified svg element + * @private + */ + ctx.prototype.__createElement = function ( + elementName, + properties, + resetFill + ) { + if (typeof properties === 'undefined') { + properties = {} + } + + var element = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + elementName + ), + keys = Object.keys(properties), + i, + key + if (resetFill) { + //if fill or stroke is not specified, the svg element should not display. By default SVG's fill is black. + element.setAttribute('fill', 'none') + element.setAttribute('stroke', 'none') + } + for (i = 0; i < keys.length; i++) { + key = keys[i] + element.setAttribute(key, properties[key]) + } + return element + } + + /** + * Applies default canvas styles to the context + * @private + */ + ctx.prototype.__setDefaultStyles = function () { + //default 2d canvas context properties see:http://www.w3.org/TR/2dcontext/ + var keys = Object.keys(STYLES), + i, + key + for (i = 0; i < keys.length; i++) { + key = keys[i] + this[key] = STYLES[key].canvas + } + } + + /** + * Applies styles on restore + * @param styleState + * @private + */ + ctx.prototype.__applyStyleState = function (styleState) { + var keys = Object.keys(styleState), + i, + key + for (i = 0; i < keys.length; i++) { + key = keys[i] + this[key] = styleState[key] + } + } + + /** + * Gets the current style state + * @return {Object} + * @private + */ + ctx.prototype.__getStyleState = function () { + var i, + styleState = {}, + keys = Object.keys(STYLES), + key + for (i = 0; i < keys.length; i++) { + key = keys[i] + styleState[key] = this[key] + } + return styleState + } + + /** + * Apples the current styles to the current SVG element. On "ctx.fill" or "ctx.stroke" + * @param type + * @private + */ + ctx.prototype.__applyStyleToCurrentElement = function (type) { + var currentElement = this.__currentElement + var currentStyleGroup = this.__currentElementsToStyle + if (currentStyleGroup) { + currentElement.setAttribute(type, '') + currentElement = currentStyleGroup.element + currentStyleGroup.children.forEach(function (node) { + node.setAttribute(type, '') + }) + } + + var keys = Object.keys(STYLES), + i, + style, + value, + id, + regex, + matches + for (i = 0; i < keys.length; i++) { + style = STYLES[keys[i]] + value = this[keys[i]] + if (style.apply) { + //is this a gradient or pattern? + if (value instanceof CanvasPattern) { + //pattern + if (value.__ctx) { + //copy over defs + while (value.__ctx.__defs.childNodes.length) { + id = + value.__ctx.__defs.childNodes[0].getAttribute( + 'id' + ) + this.__ids[id] = id + this.__defs.appendChild( + value.__ctx.__defs.childNodes[0] + ) + } + } + currentElement.setAttribute( + style.apply, + format('url(#{id})', { + id: value.__root.getAttribute('id'), + }) + ) + } else if (value instanceof CanvasGradient) { + //gradient + currentElement.setAttribute( + style.apply, + format('url(#{id})', { + id: value.__root.getAttribute('id'), + }) + ) + } else if ( + style.apply.indexOf(type) !== -1 && + style.svg !== value + ) { + if ( + (style.svgAttr === 'stroke' || + style.svgAttr === 'fill') && + value.indexOf('rgba') !== -1 + ) { + //separate alpha value, since illustrator can't handle it + regex = + /rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d?\.?\d*)\s*\)/gi + matches = regex.exec(value) + currentElement.setAttribute( + style.svgAttr, + format('rgb({r},{g},{b})', { + r: matches[1], + g: matches[2], + b: matches[3], + }) + ) + //should take globalAlpha here + var opacity = matches[4] + var globalAlpha = this.globalAlpha + if (globalAlpha != null) { + opacity *= globalAlpha + } + currentElement.setAttribute( + style.svgAttr + '-opacity', + opacity + ) + } else { + var attr = style.svgAttr + if (keys[i] === 'globalAlpha') { + attr = type + '-' + style.svgAttr + if (currentElement.getAttribute(attr)) { + //fill-opacity or stroke-opacity has already been set by stroke or fill. + continue + } + } + //otherwise only update attribute if right type, and not svg default + currentElement.setAttribute(attr, value) + } + } + } + } + } + + /** + * Will return the closest group or svg node. May return the current element. + * @private + */ + ctx.prototype.__closestGroupOrSvg = function (node) { + node = node || this.__currentElement + if (node.nodeName === 'g' || node.nodeName === 'svg') { + return node + } else { + return this.__closestGroupOrSvg(node.parentNode) + } + } + + /** + * Returns the serialized value of the svg so far + * @param fixNamedEntities - Standalone SVG doesn't support named entities, which document.createTextNode encodes. + * If true, we attempt to find all named entities and encode it as a numeric entity. + * @return serialized svg + */ + ctx.prototype.getSerializedSvg = function (fixNamedEntities) { + var serialized = new XMLSerializer().serializeToString(this.__root), + keys, + i, + key, + value, + regexp, + xmlns + + //IE search for a duplicate xmnls because they didn't implement setAttributeNS correctly + xmlns = + /xmlns="http:\/\/www\.w3\.org\/2000\/svg".+xmlns="http:\/\/www\.w3\.org\/2000\/svg/gi + if (xmlns.test(serialized)) { + serialized = serialized.replace( + 'xmlns="http://www.w3.org/2000/svg', + 'xmlns:xlink="http://www.w3.org/1999/xlink' + ) + } + + if (fixNamedEntities) { + keys = Object.keys(namedEntities) + //loop over each named entity and replace with the proper equivalent. + for (i = 0; i < keys.length; i++) { + key = keys[i] + value = namedEntities[key] + regexp = new RegExp(key, 'gi') + if (regexp.test(serialized)) { + serialized = serialized.replace(regexp, value) + } + } + } + + return serialized + } + + /** + * Returns the root svg + * @return + */ + ctx.prototype.getSvg = function () { + return this.__root + } + /** + * Will generate a group tag. + */ + ctx.prototype.save = function () { + var group = this.__createElement('g') + var parent = this.__closestGroupOrSvg() + this.__groupStack.push(parent) + parent.appendChild(group) + this.__currentElement = group + this.__stack.push(this.__getStyleState()) + } + /** + * Sets current element to parent, or just root if already root + */ + ctx.prototype.restore = function () { + this.__currentElement = this.__groupStack.pop() + this.__currentElementsToStyle = null + //Clearing canvas will make the poped group invalid, currentElement is set to the root group node. + if (!this.__currentElement) { + this.__currentElement = this.__root.childNodes[1] + } + var state = this.__stack.pop() + this.__applyStyleState(state) + } + + /** + * Helper method to add transform + * @private + */ + ctx.prototype.__addTransform = function (t) { + //if the current element has siblings, add another group + var parent = this.__closestGroupOrSvg() + if (parent.childNodes.length > 0) { + if (this.__currentElement.nodeName === 'path') { + if (!this.__currentElementsToStyle) + this.__currentElementsToStyle = { + element: parent, + children: [], + } + this.__currentElementsToStyle.children.push( + this.__currentElement + ) + this.__applyCurrentDefaultPath() + } + + var group = this.__createElement('g') + parent.appendChild(group) + this.__currentElement = group + } + + var transform = this.__currentElement.getAttribute('transform') + if (transform) { + transform += ' ' + } else { + transform = '' + } + transform += t + this.__currentElement.setAttribute('transform', transform) + } + + /** + * scales the current element + */ + ctx.prototype.scale = function (x, y) { + if (y === undefined) { + y = x + } + this.__addTransform(format('scale({x},{y})', { x: x, y: y })) + } + + /** + * rotates the current element + */ + ctx.prototype.rotate = function (angle) { + var degrees = (angle * 180) / Math.PI + this.__addTransform( + format('rotate({angle},{cx},{cy})', { + angle: degrees, + cx: 0, + cy: 0, + }) + ) + } + + /** + * translates the current element + */ + ctx.prototype.translate = function (x, y) { + this.__addTransform(format('translate({x},{y})', { x: x, y: y })) + } + + /** + * applies a transform to the current element + */ + ctx.prototype.transform = function (a, b, c, d, e, f) { + this.__addTransform( + format('matrix({a},{b},{c},{d},{e},{f})', { + a: a, + b: b, + c: c, + d: d, + e: e, + f: f, + }) + ) + } + + /** + * Create a new Path Element + */ + ctx.prototype.beginPath = function () { + var path, parent + + // Note that there is only one current default path, it is not part of the drawing state. + // See also: https://html.spec.whatwg.org/multipage/scripting.html#current-default-path + this.__currentDefaultPath = '' + this.__currentPosition = {} + + path = this.__createElement('path', {}, true) + parent = this.__closestGroupOrSvg() + parent.appendChild(path) + this.__currentElement = path + } + + /** + * Helper function to apply currentDefaultPath to current path element + * @private + */ + ctx.prototype.__applyCurrentDefaultPath = function () { + var currentElement = this.__currentElement + if (currentElement.nodeName === 'path') { + currentElement.setAttribute('d', this.__currentDefaultPath) + } else { + console.error( + 'Attempted to apply path command to node', + currentElement.nodeName + ) + } + } + + /** + * Helper function to add path command + * @private + */ + ctx.prototype.__addPathCommand = function (command) { + this.__currentDefaultPath += ' ' + this.__currentDefaultPath += command + } + + /** + * Adds the move command to the current path element, + * if the currentPathElement is not empty create a new path element + */ + ctx.prototype.moveTo = function (x, y) { + if (this.__currentElement.nodeName !== 'path') { + this.beginPath() + } + + // creates a new subpath with the given point + this.__currentPosition = { x: x, y: y } + this.__addPathCommand(format('M {x} {y}', { x: x, y: y })) + } + + /** + * Closes the current path + */ + ctx.prototype.closePath = function () { + if (this.__currentDefaultPath) { + this.__addPathCommand('Z') + } + } + + /** + * Adds a line to command + */ + ctx.prototype.lineTo = function (x, y) { + this.__currentPosition = { x: x, y: y } + if (this.__currentDefaultPath.indexOf('M') > -1) { + this.__addPathCommand(format('L {x} {y}', { x: x, y: y })) + } else { + this.__addPathCommand(format('M {x} {y}', { x: x, y: y })) + } + } + + /** + * Add a bezier command + */ + ctx.prototype.bezierCurveTo = function (cp1x, cp1y, cp2x, cp2y, x, y) { + this.__currentPosition = { x: x, y: y } + this.__addPathCommand( + format('C {cp1x} {cp1y} {cp2x} {cp2y} {x} {y}', { + cp1x: cp1x, + cp1y: cp1y, + cp2x: cp2x, + cp2y: cp2y, + x: x, + y: y, + }) + ) + } + + /** + * Adds a quadratic curve to command + */ + ctx.prototype.quadraticCurveTo = function (cpx, cpy, x, y) { + this.__currentPosition = { x: x, y: y } + this.__addPathCommand( + format('Q {cpx} {cpy} {x} {y}', { cpx: cpx, cpy: cpy, x: x, y: y }) + ) + } + + /** + * Return a new normalized vector of given vector + */ + var normalize = function (vector) { + var len = Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1]) + return [vector[0] / len, vector[1] / len] + } + + /** + * Adds the arcTo to the current path + * + * @see http://www.w3.org/TR/2015/WD-2dcontext-20150514/#dom-context-2d-arcto + */ + ctx.prototype.arcTo = function (x1, y1, x2, y2, radius) { + // Let the point (x0, y0) be the last point in the subpath. + var x0 = this.__currentPosition && this.__currentPosition.x + var y0 = this.__currentPosition && this.__currentPosition.y + + // First ensure there is a subpath for (x1, y1). + if (typeof x0 == 'undefined' || typeof y0 == 'undefined') { + return + } + + // Negative values for radius must cause the implementation to throw an IndexSizeError exception. + if (radius < 0) { + throw new Error( + 'IndexSizeError: The radius provided (' + + radius + + ') is negative.' + ) + } + + // If the point (x0, y0) is equal to the point (x1, y1), + // or if the point (x1, y1) is equal to the point (x2, y2), + // or if the radius radius is zero, + // then the method must add the point (x1, y1) to the subpath, + // and connect that point to the previous point (x0, y0) by a straight line. + if ( + (x0 === x1 && y0 === y1) || + (x1 === x2 && y1 === y2) || + radius === 0 + ) { + this.lineTo(x1, y1) + return + } + + // Otherwise, if the points (x0, y0), (x1, y1), and (x2, y2) all lie on a single straight line, + // then the method must add the point (x1, y1) to the subpath, + // and connect that point to the previous point (x0, y0) by a straight line. + var unit_vec_p1_p0 = normalize([x0 - x1, y0 - y1]) + var unit_vec_p1_p2 = normalize([x2 - x1, y2 - y1]) + if ( + unit_vec_p1_p0[0] * unit_vec_p1_p2[1] === + unit_vec_p1_p0[1] * unit_vec_p1_p2[0] + ) { + this.lineTo(x1, y1) + return + } + + // Otherwise, let The Arc be the shortest arc given by circumference of the circle that has radius radius, + // and that has one point tangent to the half-infinite line that crosses the point (x0, y0) and ends at the point (x1, y1), + // and that has a different point tangent to the half-infinite line that ends at the point (x1, y1), and crosses the point (x2, y2). + // The points at which this circle touches these two lines are called the start and end tangent points respectively. + + // note that both vectors are unit vectors, so the length is 1 + var cos = + unit_vec_p1_p0[0] * unit_vec_p1_p2[0] + + unit_vec_p1_p0[1] * unit_vec_p1_p2[1] + var theta = Math.acos(Math.abs(cos)) + + // Calculate origin + var unit_vec_p1_origin = normalize([ + unit_vec_p1_p0[0] + unit_vec_p1_p2[0], + unit_vec_p1_p0[1] + unit_vec_p1_p2[1], + ]) + var len_p1_origin = radius / Math.sin(theta / 2) + var x = x1 + len_p1_origin * unit_vec_p1_origin[0] + var y = y1 + len_p1_origin * unit_vec_p1_origin[1] + + // Calculate start angle and end angle + // rotate 90deg clockwise (note that y axis points to its down) + var unit_vec_origin_start_tangent = [ + -unit_vec_p1_p0[1], + unit_vec_p1_p0[0], + ] + // rotate 90deg counter clockwise (note that y axis points to its down) + var unit_vec_origin_end_tangent = [ + unit_vec_p1_p2[1], + -unit_vec_p1_p2[0], + ] + var getAngle = function (vector) { + // get angle (clockwise) between vector and (1, 0) + var x = vector[0] + var y = vector[1] + if (y >= 0) { + // note that y axis points to its down + return Math.acos(x) + } else { + return -Math.acos(x) + } + } + var startAngle = getAngle(unit_vec_origin_start_tangent) + var endAngle = getAngle(unit_vec_origin_end_tangent) + + // Connect the point (x0, y0) to the start tangent point by a straight line + this.lineTo( + x + unit_vec_origin_start_tangent[0] * radius, + y + unit_vec_origin_start_tangent[1] * radius + ) + + // Connect the start tangent point to the end tangent point by arc + // and adding the end tangent point to the subpath. + this.arc(x, y, radius, startAngle, endAngle) + } + + /** + * Sets the stroke property on the current element + */ + ctx.prototype.stroke = function () { + if (this.__currentElement.nodeName === 'path') { + this.__currentElement.setAttribute( + 'paint-order', + 'fill stroke markers' + ) + } + this.__applyCurrentDefaultPath() + this.__applyStyleToCurrentElement('stroke') + } + + /** + * Sets fill properties on the current element + */ + ctx.prototype.fill = function () { + if (this.__currentElement.nodeName === 'path') { + this.__currentElement.setAttribute( + 'paint-order', + 'stroke fill markers' + ) + } + this.__applyCurrentDefaultPath() + this.__applyStyleToCurrentElement('fill') + } + + /** + * Adds a rectangle to the path. + */ + ctx.prototype.rect = function (x, y, width, height) { + if (this.__currentElement.nodeName !== 'path') { + this.beginPath() + } + this.moveTo(x, y) + this.lineTo(x + width, y) + this.lineTo(x + width, y + height) + this.lineTo(x, y + height) + this.lineTo(x, y) + this.closePath() + } + + /** + * adds a rectangle element + */ + ctx.prototype.fillRect = function (x, y, width, height) { + var rect, parent + rect = this.__createElement( + 'rect', + { + x: x, + y: y, + width: width, + height: height, + }, + true + ) + parent = this.__closestGroupOrSvg() + parent.appendChild(rect) + this.__currentElement = rect + this.__applyStyleToCurrentElement('fill') + } + + /** + * Draws a rectangle with no fill + * @param x + * @param y + * @param width + * @param height + */ + ctx.prototype.strokeRect = function (x, y, width, height) { + var rect, parent + rect = this.__createElement( + 'rect', + { + x: x, + y: y, + width: width, + height: height, + }, + true + ) + parent = this.__closestGroupOrSvg() + parent.appendChild(rect) + this.__currentElement = rect + this.__applyStyleToCurrentElement('stroke') + } + + /** + * Clear entire canvas: + * 1. save current transforms + * 2. remove all the childNodes of the root g element + */ + ctx.prototype.__clearCanvas = function () { + var current = this.__closestGroupOrSvg(), + transform = current.getAttribute('transform') + var rootGroup = this.__root.childNodes[1] + var childNodes = rootGroup.childNodes + for (var i = childNodes.length - 1; i >= 0; i--) { + if (childNodes[i]) { + rootGroup.removeChild(childNodes[i]) + } + } + this.__currentElement = rootGroup + //reset __groupStack as all the child group nodes are all removed. + this.__groupStack = [] + if (transform) { + this.__addTransform(transform) + } + } + + /** + * "Clears" a canvas by just drawing a white rectangle in the current group. + */ + ctx.prototype.clearRect = function (x, y, width, height) { + //clear entire canvas + if ( + x === 0 && + y === 0 && + width === this.width && + height === this.height + ) { + this.__clearCanvas() + return + } + var rect, + parent = this.__closestGroupOrSvg() + rect = this.__createElement( + 'rect', + { + x: x, + y: y, + width: width, + height: height, + fill: '#FFFFFF', + }, + true + ) + parent.appendChild(rect) + } + + /** + * Adds a linear gradient to a defs tag. + * Returns a canvas gradient object that has a reference to it's parent def + */ + ctx.prototype.createLinearGradient = function (x1, y1, x2, y2) { + var grad = this.__createElement( + 'linearGradient', + { + id: randomString(this.__ids), + x1: x1 + 'px', + x2: x2 + 'px', + y1: y1 + 'px', + y2: y2 + 'px', + gradientUnits: 'userSpaceOnUse', + }, + false + ) + this.__defs.appendChild(grad) + return new CanvasGradient(grad, this) + } + + /** + * Adds a radial gradient to a defs tag. + * Returns a canvas gradient object that has a reference to it's parent def + */ + ctx.prototype.createRadialGradient = function (x0, y0, r0, x1, y1, r1) { + var grad = this.__createElement( + 'radialGradient', + { + id: randomString(this.__ids), + cx: x1 + 'px', + cy: y1 + 'px', + r: r1 + 'px', + fx: x0 + 'px', + fy: y0 + 'px', + gradientUnits: 'userSpaceOnUse', + }, + false + ) + this.__defs.appendChild(grad) + return new CanvasGradient(grad, this) + } + + /** + * Parses the font string and returns svg mapping + * @private + */ + ctx.prototype.__parseFont = function () { + var regex = + /^\s*(?=(?:(?:[-a-z]+\s*){0,2}(italic|oblique))?)(?=(?:(?:[-a-z]+\s*){0,2}(small-caps))?)(?=(?:(?:[-a-z]+\s*){0,2}(bold(?:er)?|lighter|[1-9]00))?)(?:(?:normal|\1|\2|\3)\s*){0,3}((?:xx?-)?(?:small|large)|medium|smaller|larger|[.\d]+(?:\%|in|[cem]m|ex|p[ctx]))(?:\s*\/\s*(normal|[.\d]+(?:\%|in|[cem]m|ex|p[ctx])))?\s*([-,\'\"\sa-z0-9]+?)\s*$/i + var fontPart = regex.exec(this.font) + var data = { + style: fontPart[1] || 'normal', + size: fontPart[4] || '10px', + family: fontPart[6] || 'sans-serif', + weight: fontPart[3] || 'normal', + decoration: fontPart[2] || 'normal', + href: null, + } + + //canvas doesn't support underline natively, but we can pass this attribute + if (this.__fontUnderline === 'underline') { + data.decoration = 'underline' + } + + //canvas also doesn't support linking, but we can pass this as well + if (this.__fontHref) { + data.href = this.__fontHref + } + + return data + } + + /** + * Helper to link text fragments + * @param font + * @param element + * @return {*} + * @private + */ + ctx.prototype.__wrapTextLink = function (font, element) { + if (font.href) { + var a = this.__createElement('a') + a.setAttributeNS( + 'http://www.w3.org/1999/xlink', + 'xlink:href', + font.href + ) + a.appendChild(element) + return a + } + return element + } + + /** + * Fills or strokes text + * @param text + * @param x + * @param y + * @param action - stroke or fill + * @private + */ + ctx.prototype.__applyText = function (text, x, y, action) { + var font = this.__parseFont(), + parent = this.__closestGroupOrSvg(), + textElement = this.__createElement( + 'text', + { + 'font-family': font.family, + 'font-size': font.size, + 'font-style': font.style, + 'font-weight': font.weight, + 'text-decoration': font.decoration, + x: x, + y: y, + 'text-anchor': getTextAnchor(this.textAlign), + 'dominant-baseline': getDominantBaseline(this.textBaseline), + }, + true + ) + + textElement.appendChild(this.__document.createTextNode(text)) + this.__currentElement = textElement + this.__applyStyleToCurrentElement(action) + parent.appendChild(this.__wrapTextLink(font, textElement)) + } + + /** + * Creates a text element + * @param text + * @param x + * @param y + */ + ctx.prototype.fillText = function (text, x, y) { + this.__applyText(text, x, y, 'fill') + } + + /** + * Strokes text + * @param text + * @param x + * @param y + */ + ctx.prototype.strokeText = function (text, x, y) { + this.__applyText(text, x, y, 'stroke') + } + + /** + * No need to implement this for svg. + * @param text + * @return {TextMetrics} + */ + ctx.prototype.measureText = function (text) { + this.__ctx.font = this.font + return this.__ctx.measureText(text) + } + + /** + * Arc command! + */ + ctx.prototype.arc = function ( + x, + y, + radius, + startAngle, + endAngle, + counterClockwise + ) { + // in canvas no circle is drawn if no angle is provided. + if (startAngle === endAngle) { + return + } + startAngle = startAngle % (2 * Math.PI) + endAngle = endAngle % (2 * Math.PI) + if (startAngle === endAngle) { + //circle time! subtract some of the angle so svg is happy (svg elliptical arc can't draw a full circle) + endAngle = + (endAngle + 2 * Math.PI - 0.001 * (counterClockwise ? -1 : 1)) % + (2 * Math.PI) + } + var endX = x + radius * Math.cos(endAngle), + endY = y + radius * Math.sin(endAngle), + startX = x + radius * Math.cos(startAngle), + startY = y + radius * Math.sin(startAngle), + sweepFlag = counterClockwise ? 0 : 1, + largeArcFlag = 0, + diff = endAngle - startAngle + + // https://github.com/gliffy/canvas2svg/issues/4 + if (diff < 0) { + diff += 2 * Math.PI + } + + if (counterClockwise) { + largeArcFlag = diff > Math.PI ? 0 : 1 + } else { + largeArcFlag = diff > Math.PI ? 1 : 0 + } + + this.lineTo(startX, startY) + this.__addPathCommand( + format( + 'A {rx} {ry} {xAxisRotation} {largeArcFlag} {sweepFlag} {endX} {endY}', + { + rx: radius, + ry: radius, + xAxisRotation: 0, + largeArcFlag: largeArcFlag, + sweepFlag: sweepFlag, + endX: endX, + endY: endY, + } + ) + ) + + this.__currentPosition = { x: endX, y: endY } + } + + /** + * Generates a ClipPath from the clip command. + */ + ctx.prototype.clip = function () { + var group = this.__closestGroupOrSvg(), + clipPath = this.__createElement('clipPath'), + id = randomString(this.__ids), + newGroup = this.__createElement('g') + + this.__applyCurrentDefaultPath() + group.removeChild(this.__currentElement) + clipPath.setAttribute('id', id) + clipPath.appendChild(this.__currentElement) + + this.__defs.appendChild(clipPath) + + //set the clip path to this group + group.setAttribute('clip-path', format('url(#{id})', { id: id })) + + //clip paths can be scaled and transformed, we need to add another wrapper group to avoid later transformations + // to this path + group.appendChild(newGroup) + + this.__currentElement = newGroup + } + + /** + * Draws a canvas, image or mock context to this canvas. + * Note that all svg dom manipulation uses node.childNodes rather than node.children for IE support. + * http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage + */ + ctx.prototype.drawImage = function () { + //convert arguments to a real array + var args = Array.prototype.slice.call(arguments), + image = args[0], + dx, + dy, + dw, + dh, + sx = 0, + sy = 0, + sw, + sh, + parent, + svg, + defs, + group, + currentElement, + svgImage, + canvas, + context, + id + + if (args.length === 3) { + dx = args[1] + dy = args[2] + sw = image.width + sh = image.height + dw = sw + dh = sh + } else if (args.length === 5) { + dx = args[1] + dy = args[2] + dw = args[3] + dh = args[4] + sw = image.width + sh = image.height + } else if (args.length === 9) { + sx = args[1] + sy = args[2] + sw = args[3] + sh = args[4] + dx = args[5] + dy = args[6] + dw = args[7] + dh = args[8] + } else { + throw new Error( + 'Invalid number of arguments passed to drawImage: ' + + arguments.length + ) + } + + parent = this.__closestGroupOrSvg() + currentElement = this.__currentElement + var translateDirective = 'translate(' + dx + ', ' + dy + ')' + if (image instanceof ctx) { + //canvas2svg mock canvas context. In the future we may want to clone nodes instead. + //also I'm currently ignoring dw, dh, sw, sh, sx, sy for a mock context. + svg = image.getSvg().cloneNode(true) + if (svg.childNodes && svg.childNodes.length > 1) { + defs = svg.childNodes[0] + while (defs.childNodes.length) { + id = defs.childNodes[0].getAttribute('id') + this.__ids[id] = id + this.__defs.appendChild(defs.childNodes[0]) + } + group = svg.childNodes[1] + if (group) { + //save original transform + var originTransform = group.getAttribute('transform') + var transformDirective + if (originTransform) { + transformDirective = + originTransform + ' ' + translateDirective + } else { + transformDirective = translateDirective + } + group.setAttribute('transform', transformDirective) + parent.appendChild(group) + } + } + } else if (image.nodeName === 'CANVAS' || image.nodeName === 'IMG') { + //canvas or image + svgImage = this.__createElement('image') + svgImage.setAttribute('width', dw) + svgImage.setAttribute('height', dh) + svgImage.setAttribute('preserveAspectRatio', 'none') + + if (sx || sy || sw !== image.width || sh !== image.height) { + //crop the image using a temporary canvas + canvas = this.__document.createElement('canvas') + canvas.width = dw + canvas.height = dh + context = canvas.getContext('2d') + context.drawImage(image, sx, sy, sw, sh, 0, 0, dw, dh) + image = canvas + } + svgImage.setAttribute('transform', translateDirective) + svgImage.setAttributeNS( + 'http://www.w3.org/1999/xlink', + 'xlink:href', + image.nodeName === 'CANVAS' + ? image.toDataURL() + : image.getAttribute('src') + ) + parent.appendChild(svgImage) + } + } + + /** + * Generates a pattern tag + */ + ctx.prototype.createPattern = function (image, repetition) { + var pattern = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + 'pattern' + ), + id = randomString(this.__ids), + img + pattern.setAttribute('id', id) + pattern.setAttribute('width', image.width) + pattern.setAttribute('height', image.height) + if (image.nodeName === 'CANVAS' || image.nodeName === 'IMG') { + img = this.__document.createElementNS( + 'http://www.w3.org/2000/svg', + 'image' + ) + img.setAttribute('width', image.width) + img.setAttribute('height', image.height) + img.setAttributeNS( + 'http://www.w3.org/1999/xlink', + 'xlink:href', + image.nodeName === 'CANVAS' + ? image.toDataURL() + : image.getAttribute('src') + ) + pattern.appendChild(img) + this.__defs.appendChild(pattern) + } else if (image instanceof ctx) { + pattern.appendChild(image.__root.childNodes[1]) + this.__defs.appendChild(pattern) + } + return new CanvasPattern(pattern, this) + } + + ctx.prototype.setLineDash = function (dashArray) { + if (dashArray && dashArray.length > 0) { + this.lineDash = dashArray.join(',') + } else { + this.lineDash = null + } + } + + /** + * Not yet implemented + */ + ctx.prototype.drawFocusRing = function () {} + ctx.prototype.createImageData = function () {} + ctx.prototype.getImageData = function () {} + ctx.prototype.putImageData = function () {} + ctx.prototype.globalCompositeOperation = function () {} + ctx.prototype.setTransform = function () {} + + //add options for alternative namespace + if (typeof window === 'object') { + window.C2S = ctx + } + + // CommonJS/Browserify + if (typeof module === 'object' && typeof module.exports === 'object') { + module.exports = ctx + } +})() diff --git a/v1/src/simulator/vendor/images/ui-icons_444444_256x240.png b/v1/src/simulator/vendor/images/ui-icons_444444_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..8cc6f5db46457a0311d6c47791c1fc50243dc560 GIT binary patch literal 5005 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 F_FpV)`5XWM literal 0 HcmV?d00001 diff --git a/v1/src/simulator/vendor/images/ui-icons_555555_256x240.png b/v1/src/simulator/vendor/images/ui-icons_555555_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..c852a05639215f2fac0bafa2e574f6ecaca42042 GIT binary patch literal 5004 zcmZ8lXH=8h(th)j97qDv5fMy~sZ)d_1^}-Uk%#uM6C3TQYi0-lfr0=)hy;NBlP$su0Qh16U=XnphywP=_AU}HlnvY)@s1^_IcdYWn$_r}S# zt+CuX92H^M5kE?r=Wk(cEnuGClT+f>FTy+n3J5C;^c#c z6-A#T2ePp@Dj8>TQ;ep zm|-OKDQW3x=3TDj&(kafSz?O%!s@Heh{#cVG>nw$E)q^t352YwTk+7#5;wRhD%cxB z>nCVFR6&rQ3TWSF#H zW$Xcm!TE<{I^Pj#>;ODQj={|2nz;#=<|~UWpQj&tKfFo2#MyZ|Ebsg&eX*>Rls~4Y zGzTcpxga-!p(KXN$)2L{9SsE(IzHd^hdT`eZBV22feH%yiNNiS!slga0%!!rCY?OTTV zd%OJoS92-`&qk&bWXMUcBtoDFaUiB3Llc%#$0sPTZ7?qz|omM zHB2vZ&aK(MrLcYN&jRT*bFK%n5<2Q;zN{Oh56pj*z(tFP0rC zhfi5ODp1%+g^Jp``TfJ>LRoFf? zppl!>`TEP(8uM_dE=*rz9)Yhv{V2M7Q{UWK0B_v-_WaZ*cY@&n??)ClW#?Gn&e1P} zQ(+<2#58m4%3brsK(}IJUqdbvZ>OM|VrJ+{Sq{C}(a~A$$8x(~+ve5elmXiFm$?lF z@a`F~xsJ9fe7!8Us6=QBuwOuC6&3s#3|-B^NliRVWKSVkq+nnhP~9;G%rp2?2g*yG5po?0Dc=ZTN+3<#OC=aG4$}Ud(56U#ai*5e`9yVF*$`yv3#Ck zgr4y=a@+@oON+U##X6XE$LTtGtTWNr#$?MWkT7Ppya!8gQ{(*qh2{Fip+x~gXL5>E zi;H#OxZ`%0DvyWEZaFiW9W}5Pv!gfivxv(U%k#Vi`QpK+A_;L(su3I;G1VS2pv}?{ z@i0S5y-hv|+xCu?OfN)7c9ouuDcV*I&vFY#*vSd`DMWcfWbB%revH@&DcPOc%>~F_ zE_Pr+yH{nwP=~r1zuN=nm|_6QJD9oi5L#h`*X>ktenL041fPYTz`-lnz(`~z+&aJW zLPVIc?6%dirtTA#Z{>E6(V?x<>ee=uIGGA5i{l1AEp-T?B_p|#X)xjj;$#$}K9-D9aSL`Wy zi?n;W;Z4T6IOJo$g+B>g5Z$JxC$Yl)<3ivD7hwy(vl2(hzBs8uHHQorLL00@RET0pkAY>m zZh41p$le@(^>7!-1&Ou2`j%ZO976c5{gP)xdoxy)ULmI8-9HG09X*l`ZJ?O z)CVoLl&VAP9Yl;}x|IxpKF01XA*hmRk`0xGOp5B5W}Gso2^UCzX+DE1A)o zEx9v{Sc>>KBjyLD5~rm9vpT(BVO%gdVqPHtxjdm?L83D;#nW25XHt~|MQQ{eVRX$+r@-t7VTehuy!HX8@VtnPggKJzwKYJ`9-dg zryf_kpf8B?Yk<8CZ$o8nWY*BSDSKH!s}3y}JKT{F7A7gDtB5jv+68k1#n<)me6H4P zWMnKVA+V%1h)PZqI;~>KE%p%;(6*3S|Sw;A~#k@{AGewh}dT&(&zJfS%{T_N{HeXP&&Rz*bkDl4gm@ zKW5<^Fa|g1y^oouo6lq+PpCj6>>k*T!rpTc%P*rFaXKgK76+r8r4Nm2vn#usa$Aan zBy^M*5?ry}PS8ao_Nk zZ)*;qck`k9Mr*{n`LDf3Myp6%?4&UfH_%CbJvM_NpR>%PJ z@PhoM?}mgp`${|Nlo&b~TG^-CIanVhQ!$I8R12uCDNTLL-*_O~D|8clawmPu_an1` z=<49ak*_d>qJ}@>j9w3HjF^%nPLzW!WPU>Uw<%5cYktR{yLuR&hwAkx|N4>dce<60 zr&S=d%@zsSs8#i5CU~k*tq}Y9N2~$$XAVMD0on2iiRB&om{bX??YkYs7%-a8w}yjc zDpd0s)cd|{(d>RYl2a$?EA@E={_mdUcP~X$vtRRay3!)oZm6bW+4QXVlZCA3)PZ?DEYw@Rh5x4p!yKNX@6p!&b9fH=c>*l5A0SmjqzKsmOk$PnWN#AFEH)eZg+q`e8RYLY1 z`XTHI<}99n+N!gl_I6bkO{(O862EIU2j1G|{CG~eSJWFR+)ZBMOW}rqp*Yl79LLQ| zc}<@)e_XmIxjOg*$#0KeXQeBK(ak7kSFatgCOo6_s-gTG*>F|d{yaYSh4mq9UB~9t zyh4IEk1JY<%tG?8_W9n-54b`?%ih}sjkH#3D_)h!zW1}GiUr+v&~+qq8?2w8JO)u5 zs_*slu3%9lde_1|e;;thAwm92&^UZ+7ZU2e4Z+oYa?xt`9}H-@!tpbDdrd?M!oKab z_@mm^*JrD0AmzYiHP|$ST09fF^^>MQd6wQ)j%K!O0@@Q5exQQ5XFCvI!_Iix)y6)$ z&{rY#g4r@#l_>!_d-tNoXR=7WJ>Hr3;?{Q>rX>Mx=!*1im?{;>x^~0Lz zl(s0AQl%JB_;^Qh4ZZyrOWW}N8N;yxPS}E~P+1<{OO?=0x|lov*7-Ou9u{c!>0%o@ zva4Q_sWr8rA%gwyuKGtLaCg~nh;dzGEPM~bSiN%cV_Tw`aMt37MW6eq+DK1#XuaLV z-O%D4bJtlG>vE!ePlNI8gkw05l#9Ok^La1a^W!~E`1;E@`5F(Rz6b=j;|JB_dmt^M zM_Ifw$)26 z!KRDq^wEVV>{TRQB&zVPwUsUPR^rDz`6uu(qXr~DjM;r7sLO6wNj@7T2yw|7S4N&E z#@(ESN6Mx>niQPsf3t6;PUv)We5u?kl@zc5LaF5HqGJn+{dO*cFuJa%=W^mMR*gDy!Bn=0u|M~vw`ba?Iw-mFifgXV;T9psOcuBS(*q@m+r<5XR5RoW#M?M0r_dUTa=<# zl^gC4-Gzw73_gYwzePk5V`T*ca5};8`i9AkP+V7&5Tu&5ei@pAVRYQ<)D4#?Ne=>cm>1S|Qv z50kZv6QQlPeSGkBVuLa1KG(tA!ld@&i8Rjxs-IY*AmD$FsQ;a&dNEPob9O%MFu>8? z*}rsb`O6{s4r|g;p-eNGN-t9UXlpsXM5baZN-S(%=@oAhFzGThd9`Y!uKU3^-@?TA zb}6}otw+tCfi}37!yn(K79H1RTHcN3ZcH5Ry1&qJd$%E1LA$V!<+m$oPJE|<4m;A$ z&(AodLLW(>KJQH#hkh|RKF5ML)n?V8LsMJCU|p@P{SlGZ2yf;l#*!4%7^k432p0Fg z$nML$Y=*>j!QMw=Z1Q4QTPh6;L6H&rMemkBm`CgL>{04NAG5_A-HzT1av@nNA&Xhs zM1PzH8uCtseqtNrGqC~TR&(_4{4vg4*I%Yp>r|`+xcIn{rsu0rqCU z9bB-~WF^+f1qr`pA+azKp3#|vTt{3og<_mfy=*FHLQ4eaMNsdkhQHXfw0oO~MbrQY zGL5hgTfT|vKg7j9cWY}CEJ7e1tmx2K9d$q6iRvXqno^Kf5PL1y&k(5aE8W-efXHpX z-1o;rUXs6-8mof!qif^C`epkyj9%|Wv0uWCsU=vd8%*03vbtBg&o}_S*k=r88#1Pj z)5-~}5)4nyc7{NA%qHc3(_;T|@bGlH=@Rfi4j4IwOVa=6VC%-s yf8ucF_Y3BpEK-@g6(007`S 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 DC)F%1 literal 0 HcmV?d00001 diff --git a/v1/src/simulator/vendor/images/ui-icons_777777_256x240.png b/v1/src/simulator/vendor/images/ui-icons_777777_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..e055acb943dea40e2443715ea6615b873561c7c7 GIT binary patch literal 4990 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 iJ2zWZK?(E((Gcn*faPR;C06Z5A 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 B6-WR8 literal 0 HcmV?d00001 diff --git a/v1/src/simulator/vendor/images/ui-icons_ffffff_256x240.png b/v1/src/simulator/vendor/images/ui-icons_ffffff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..7e4d1d08ebe2e9422b7266a529378ae6a1b2bd7b GIT binary patch literal 4948 zcmZWtc{tSF+dtn~EF&7*pu|{WDrKUqVeHCISt=P@S(3?4;Y&hUE2NC2kToGiQ6^g+ z*?KBuEJKmqkX?B7JlF4ipWpNTbMDVM=lWddKG(U=z1=c1(dWeM!2kd_Pa5c0008Yk zz+^-1jJlcLq#c2}q-m@PKzSm^F9-C_9PeacVGKa96aa7}0P8zT@HhZ|L;xnq0H~w^ zAV8tMHb1emfp9d`*8$tniEVW|GgjY|#=5LyEPQ;s#PT8eLI8LaPwHr%4(yw;tBV!Z z$CZYW3MKTpWU1rz@%?wG1UDRCORRvZ4N*zZsuF=_y|PP73)4(RNH^4{HAGi5$h~H? z9cJTP9vl~5O`%>bWM`2+^uJe5FC(GkWQot{uV{eyozSCpabbf;%CZiS|aj>WNzBI$Vh*LbQf#dIstZ% zkRoERF%ky&Qu2S|}1Wy8i^Rabn@aryDm$hjLPL_{NbC!(`g+Z1Uf6{7-TZF<~vEZ8o@Pya& z6gVqI``3UQO3mrgUIV4xukC#+Yk@yV_P@{);UDa! zqrV5M4~))2RFY|RM5$B^pDyT_40{cah;W+sz-JoH7rtw4@(T#e{~2_H$wPdyZ(-?G zBFsRLB%72DGHUn5Br}aBE`^V)!dc!eJ**zhW-^e{&k$^0gxIV|YOG=SOf5GFzvw+L z1$rgfi*MpN*gn3nMh|6$tqAT_X;dwkv4K|=gxfCY83pryjV77REVzw04g$8x$@z64 zhpC=j*)6EoT5T_^`48RyhG|mJvIEEGfzsE84{9=^Pwek4@9uqJ8ICd#GSvQtAy*5; z+`+FF{WK+2Kk3%9)W4R)i2&)N#SR7sJOXL|MVvU93N2vyOnQO7(Y+ zWn&UFRkcemckertn}RJOJp>0{L3+oa>lj)c7uWqg;gEe(%aC1|okG$E?qD^$!7WvN z1xS4+a8HtcYhV4%9Jov`@={&@;p#U6jnDLsW{_S_QJWVb#urP@r@BWAo%AGY6#`?z zkBCbra4E&{S+~3m(rV--{QFINFx78S3?&PT`kpq!L^Uh>U!NR`UwOp?Ve6s~*3H&+ z8Sd2)Dl9|j&qi)^0fE%ed=zl1qTGMZZDh^FTIyk`NI{HMg6kzE&9bca$iolE!Vrpk z!ZFrL(*7z@9?)^S+D9KFWWUf0ZcyUx0`kps1q0)}b^)3!-ehyzkw6xuEUXE~z2)y(FbhPxaKTu2lINo2?zjVj zTX(eReuaG;^b5>OEIJ=rd!hwTG1&W4*U>y2|MVAecYy7ve#^_d+tIKf>*kd$WRvq|3wT)uHumThZFOBJhPN_;!Tv{6==f zGc>?GrF^Q#Zh5XiXFmtMNBL6@{aUG%N)VeuEJ3$TRnFri>K5O&A#O;&MdZ+(>} zb-Rifp{gwhHn?UNORK+5q6T-lehWfn?`|?fL2oNM?%O!r%3ojUzYiAg5JVNpq3?L9 z3>5L9Ss%h#sS&}knO?|VFe-*pa)UB#MuchlX-)|>V60m{yv^9`YLnMq(e&U;lF&sI z#3%#BFV~&ey27eE_fXQSAB2NsbW70@h8Wj1znIjV$@(L4o%Xno=X-uG6Uc+twu4|a z1B-vjUY6(O5B)3^rRl(JYr$7E0Mo8gl-%n;ejaGm;U@dwY9(iC#5a{7!zsE?X*Qdg zC4R`%lpM9|14~85iJSDVayqj$)MWquGj)v!NgQ7HAJK|3GmnsUWJ@CAE?Sn$9H$Yb z<)eJ&jz^iV1pldfi8{b}{+Y@GKew#vV8nUN;Y6La?*rivS-E`iA41L?ZBxMFp(HVR z3$mp$KFet^wkainnsTJ?K8uEM?dPGotqbpYLp#UW4h&y-_1*hR+aY@fbK&BW&7RYV zMVRI0sk0SD1(%DS2mqKvYco$`qQDr=UATLxIVGs@zG$0pJZosaMrR2+d7_VMyI{>_ zP4K(E5%!45g4r%-x%}g-TtG{TWhgAfC9_bmdfz7aK3-+;y3$Pg*Lwc_H98j8c-k!w z$~DZmA&&jPq_I;(1DK#{9u*+t6D#LgEAKHM$;+?@TZJ0iFAtV2F4l}@*^WLx=sWE{ zx;*L`aD8McR5sYc$DWL22&Fz`;Y8FYCKOC#YzI5YleZ!d&1>c+t2oEJ1K4%=>tg*G3)OySt35W(n#>*8Pm(C>~m&{R&nYD8#*HH&2Q@)OyLF!*u7LcX$i#2mM`ftY^viXnc{mxE^2V`UtO8Nv?sl!*NS? zhKRPOu_D(8lxqT0P_(n#Z(k;)W~JlwNt(kPz<$K=dW0#s?k>oNq&+{idHi-=e-kfQ zxhhKI?e`1Rl0S5K=BE&jMZde=Lp{>PPHO|LXhROK;=**%E4>nd;pTat9Lv1bs_w~v zjfTXy(o%ct)s&9{ubZ_r-reOcDc3g)s-f0%dmJA{?)%v8DGW*JsmOk~p6I6={t&ag?j=rB4HQtMAm>K*jBBy?x1(%* zgA3Ip&v!CHO9}&XtLyVWoV}pQiS*zwZ+NyF$Q-m`W5}0Y=AQVRNYJyM0mPQ^r*y`iKcbv$k zf}_|sDY?}V=)a1M9pjvi1RPWTU5WGBU&7a*#Jurl1GopkJy9HW6HDH8ck1`YoJCENbk~vgKg336^`T{h z?c>t4Jo9($;!0B|J5R7sYS&PYy1%&}J%yk!gO1DMRz<5ezC z-;Rk6r$td3cLhi`mNF}zv%mZ*DkQZJf=Ed;6IjL0v0d!F9&3bm!@{TK3~QFPq7+Mm zY6WR(yRw9zEn>}vogp3`3)+1*9ZRQ7O09cqe9CxfshQef_EoL$fo3B>zf#8sP5vP= z6H!v!(6 zWc%;5J53xKZ)itJ>?cJGX+x_x(X;-aWD*lib9vKVS7Z``;7vuZuWTU zh%NV{C!QbBD5x83m9S^a(8Y>ddrU3C_m$~WqX=n;2Y6*?GY@+cYRfZC?51yX=~n$VA9>P%a~>{mzQzOq;r^u zQKofUJ68?;1X$#L;UCYF)rdBDIuYx!K7lskFk{5Oh`Jwg^M#YDvpl5k`N*rj>W~07 z1U7a8)s>e=EF!gHe;&kTqLNG)nY`puMX#U)#qQ8hA32>X%0Jwld7nJ_&YCvm`55l; zwyFKcN7*TN@8N-;2&shH=j={j@T?mu9le9f?m)(*Skl`(&%K>lp}#nB7bM1SpwzFF z$(opW9((1v_HxLpXTcR=_5-SwQzu!6S_N@*sx18Mu5aD4dj6yNSGzZV(pJjRHxrwD z2lRE;KXiZIb1qmnwXPzw2WtS_o%S!j*hl=QU@=n zW9+|qT%RG-Ej-KDK5Stb^}bvUzh9O-32v)zsYsD4FBzFJ0=L(y=*qQ$>-T9oNO=w@mVw-afS~% zopOWVbqGb+dc`-LTEiYW==IiHAROfgq5fpWwh&18(BEy7|Ag7UVO$(2Tt!4llYZe6 zN&frkl{i&oEP_>vRHRWO1v>Z|8C{aaT?huivLL^%B zEB|h9{U5>8%h~N>(7y;oC6#0He-rH7g(Y_gLcdS2^t$L9;Na~7G@ZR1UGOJ89WJ?8 YxHvcmUH!x5cdHAW)HTs5)gnjy4|6WDzyJUM literal 0 HcmV?d00001 diff --git a/v1/src/simulator/vendor/jquery-ui.min.css b/v1/src/simulator/vendor/jquery-ui.min.css new file mode 100644 index 00000000..4c702d0f --- /dev/null +++ b/v1/src/simulator/vendor/jquery-ui.min.css @@ -0,0 +1,1137 @@ +/*! jQuery UI - v1.13.1 - 2022-01-22 +* http://jqueryui.com +* Includes: draggable.css, core.css, resizable.css, sortable.css, accordion.css, button.css, controlgroup.css, checkboxradio.css, dialog.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-draggable-handle { + -ms-touch-action: none; + touch-action: none; +} +.ui-helper-hidden { + display: none; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.ui-helper-reset { + margin: 0; + padding: 0; + border: 0; + outline: 0; + line-height: 1.3; + text-decoration: none; + font-size: 100%; + list-style: none; +} +.ui-helper-clearfix:before, +.ui-helper-clearfix:after { + content: ''; + display: table; + border-collapse: collapse; +} +.ui-helper-clearfix:after { + clear: both; +} +.ui-helper-zfix { + width: 100%; + height: 100%; + top: 0; + left: 0; + position: absolute; + opacity: 0; + -ms-filter: 'alpha(opacity=0)'; +} +.ui-front { + z-index: 100; +} +.ui-state-disabled { + cursor: default !important; + pointer-events: none; +} +.ui-icon { + display: inline-block; + vertical-align: middle; + margin-top: -0.25em; + position: relative; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; +} +.ui-widget-icon-block { + left: 50%; + margin-left: -8px; + display: block; +} +.ui-widget-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.ui-resizable { + position: relative; +} +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + display: block; + -ms-touch-action: none; + touch-action: none; +} +.ui-resizable-disabled .ui-resizable-handle, +.ui-resizable-autohide .ui-resizable-handle { + display: none; +} +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0; +} +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0; +} +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0; + height: 100%; +} +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0; + height: 100%; +} +.ui-resizable-se { + cursor: se-resize; + width: 12px; + height: 12px; + right: 1px; + bottom: 1px; +} +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: -5px; + bottom: -5px; +} +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: -5px; + top: -5px; +} +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: -5px; + top: -5px; +} +.ui-sortable-handle { + -ms-touch-action: none; + touch-action: none; +} +.ui-accordion .ui-accordion-header { + display: block; + cursor: pointer; + position: relative; + margin: 2px 0 0 0; + padding: 0.5em 0.5em 0.5em 0.7em; + font-size: 100%; +} +.ui-accordion .ui-accordion-content { + padding: 1em 2.2em; + border-top: 0; + overflow: auto; +} +.ui-button { + padding: 0.4em 1em; + display: inline-block; + position: relative; + line-height: normal; + margin-right: 0.1em; + cursor: pointer; + vertical-align: middle; + text-align: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + overflow: visible; +} +.ui-button, +.ui-button:link, +.ui-button:visited, +.ui-button:hover, +.ui-button:active { + text-decoration: none; +} +.ui-button-icon-only { + width: 2em; + box-sizing: border-box; + text-indent: -9999px; + white-space: nowrap; +} +input.ui-button.ui-button-icon-only { + text-indent: 0; +} +.ui-button-icon-only .ui-icon { + position: absolute; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; +} +.ui-button.ui-icon-notext .ui-icon { + padding: 0; + width: 2.1em; + height: 2.1em; + text-indent: -9999px; + white-space: nowrap; +} +input.ui-button.ui-icon-notext .ui-icon { + width: auto; + height: auto; + text-indent: 0; + white-space: normal; + padding: 0.4em 1em; +} +input.ui-button::-moz-focus-inner, +button.ui-button::-moz-focus-inner { + border: 0; + padding: 0; +} +.ui-controlgroup { + vertical-align: middle; + display: inline-block; +} +.ui-controlgroup > .ui-controlgroup-item { + float: left; + margin-left: 0; + margin-right: 0; +} +.ui-controlgroup > .ui-controlgroup-item:focus, +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus { + z-index: 9999; +} +.ui-controlgroup-vertical > .ui-controlgroup-item { + display: block; + float: none; + width: 100%; + margin-top: 0; + margin-bottom: 0; + text-align: left; +} +.ui-controlgroup-vertical .ui-controlgroup-item { + box-sizing: border-box; +} +.ui-controlgroup .ui-controlgroup-label { + padding: 0.4em 1em; +} +.ui-controlgroup .ui-controlgroup-label span { + font-size: 80%; +} +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item { + border-left: none; +} +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item { + border-top: none; +} +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content { + border-right: none; +} +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content { + border-bottom: none; +} +.ui-controlgroup-vertical .ui-spinner-input { + width: 75%; + width: calc(100% - 2.4em); +} +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up { + border-top-style: solid; +} +.ui-checkboxradio-label .ui-icon-background { + box-shadow: inset 1px 1px 1px #ccc; + border-radius: 0.12em; + border: none; +} +.ui-checkboxradio-radio-label .ui-icon-background { + width: 16px; + height: 16px; + border-radius: 1em; + overflow: visible; + border: none; +} +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon, +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon { + background-image: none; + width: 8px; + height: 8px; + border-width: 4px; + border-style: solid; +} +.ui-checkboxradio-disabled { + pointer-events: none; +} +.ui-dialog { + position: absolute; + top: 0; + left: 0; + padding: 0.2em; + outline: 0; +} +.ui-dialog .ui-dialog-titlebar { + padding: 0.4em 1em; + position: relative; +} +.ui-dialog .ui-dialog-title { + float: left; + margin: 0.1em 0; + white-space: nowrap; + width: 90%; + overflow: hidden; + text-overflow: ellipsis; +} +.ui-dialog .ui-dialog-titlebar-close { + position: absolute; + right: 0.3em; + top: 50%; + width: 20px; + margin: -10px 0 0 0; + padding: 1px; + height: 20px; +} +.ui-dialog .ui-dialog-content { + position: relative; + border: 0; + padding: 0.5em 1em; + background: none; + overflow: auto; +} +.ui-dialog .ui-dialog-buttonpane { + text-align: left; + border-width: 1px 0 0 0; + background-image: none; + margin-top: 0.5em; + padding: 0.3em 1em 0.5em 0.4em; +} +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { + float: right; +} +.ui-dialog .ui-dialog-buttonpane button { + margin: 0.5em 0.4em 0.5em 0; + cursor: pointer; +} +.ui-dialog .ui-resizable-n { + height: 2px; + top: 0; +} +.ui-dialog .ui-resizable-e { + width: 2px; + right: 0; +} +.ui-dialog .ui-resizable-s { + height: 2px; + bottom: 0; +} +.ui-dialog .ui-resizable-w { + width: 2px; + left: 0; +} +.ui-dialog .ui-resizable-se, +.ui-dialog .ui-resizable-sw, +.ui-dialog .ui-resizable-ne, +.ui-dialog .ui-resizable-nw { + width: 7px; + height: 7px; +} +.ui-dialog .ui-resizable-se { + right: 0; + bottom: 0; +} +.ui-dialog .ui-resizable-sw { + left: 0; + bottom: 0; +} +.ui-dialog .ui-resizable-ne { + right: 0; + top: 0; +} +.ui-dialog .ui-resizable-nw { + left: 0; + top: 0; +} +.ui-draggable .ui-dialog-titlebar { + cursor: move; +} +.ui-widget { + font-family: Arial, Helvetica, sans-serif; + font-size: 1em; +} +.ui-widget .ui-widget { + font-size: 1em; +} +.ui-widget input, +.ui-widget select, +.ui-widget textarea, +.ui-widget button { + font-family: Arial, Helvetica, sans-serif; + font-size: 1em; +} +.ui-widget.ui-widget-content { + border: 1px solid #c5c5c5; +} +.ui-widget-content { + border: 1px solid #ddd; + background: #fff; + color: #333; +} +.ui-widget-content a { + color: #333; +} +.ui-widget-header { + border: 1px solid #ddd; + background: #e9e9e9; + color: #333; + font-weight: bold; +} +.ui-widget-header a { + color: #333; +} +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default, +.ui-button, +html .ui-button.ui-state-disabled:hover, +html .ui-button.ui-state-disabled:active { + border: 1px solid #c5c5c5; + background: #f6f6f6; + font-weight: normal; + color: #454545; +} +.ui-state-default a, +.ui-state-default a:link, +.ui-state-default a:visited, +a.ui-button, +a:link.ui-button, +a:visited.ui-button, +.ui-button { + color: #454545; + text-decoration: none; +} +.ui-state-hover, +.ui-widget-content .ui-state-hover, +.ui-widget-header .ui-state-hover, +.ui-state-focus, +.ui-widget-content .ui-state-focus, +.ui-widget-header .ui-state-focus, +.ui-button:hover, +.ui-button:focus { + border: 1px solid #ccc; + background: #ededed; + font-weight: normal; + color: #2b2b2b; +} +.ui-state-hover a, +.ui-state-hover a:hover, +.ui-state-hover a:link, +.ui-state-hover a:visited, +.ui-state-focus a, +.ui-state-focus a:hover, +.ui-state-focus a:link, +.ui-state-focus a:visited, +a.ui-button:hover, +a.ui-button:focus { + color: #2b2b2b; + text-decoration: none; +} +.ui-visual-focus { + box-shadow: 0 0 3px 1px rgb(94, 158, 214); +} +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active, +a.ui-button:active, +.ui-button:active, +.ui-button.ui-state-active:hover { + border: 1px solid #003eff; + background: #007fff; + font-weight: normal; + color: #fff; +} +.ui-icon-background, +.ui-state-active .ui-icon-background { + border: #003eff; + background-color: #fff; +} +.ui-state-active a, +.ui-state-active a:link, +.ui-state-active a:visited { + color: #fff; + text-decoration: none; +} +.ui-state-highlight, +.ui-widget-content .ui-state-highlight, +.ui-widget-header .ui-state-highlight { + border: 1px solid #dad55e; + background: #fffa90; + color: #777620; +} +.ui-state-checked { + border: 1px solid #dad55e; + background: #fffa90; +} +.ui-state-highlight a, +.ui-widget-content .ui-state-highlight a, +.ui-widget-header .ui-state-highlight a { + color: #777620; +} +.ui-state-error, +.ui-widget-content .ui-state-error, +.ui-widget-header .ui-state-error { + border: 1px solid #f1a899; + background: #fddfdf; + color: #5f3f3f; +} +.ui-state-error a, +.ui-widget-content .ui-state-error a, +.ui-widget-header .ui-state-error a { + color: #5f3f3f; +} +.ui-state-error-text, +.ui-widget-content .ui-state-error-text, +.ui-widget-header .ui-state-error-text { + color: #5f3f3f; +} +.ui-priority-primary, +.ui-widget-content .ui-priority-primary, +.ui-widget-header .ui-priority-primary { + font-weight: bold; +} +.ui-priority-secondary, +.ui-widget-content .ui-priority-secondary, +.ui-widget-header .ui-priority-secondary { + opacity: 0.7; + -ms-filter: 'alpha(opacity=70)'; + font-weight: normal; +} +.ui-state-disabled, +.ui-widget-content .ui-state-disabled, +.ui-widget-header .ui-state-disabled { + opacity: 0.35; + -ms-filter: 'alpha(opacity=35)'; + background-image: none; +} +.ui-state-disabled .ui-icon { + -ms-filter: 'alpha(opacity=35)'; +} +.ui-icon { + width: 16px; + height: 16px; +} +.ui-icon, +.ui-widget-content .ui-icon { + background-image: url('images/ui-icons_444444_256x240.png'); +} +.ui-widget-header .ui-icon { + background-image: url('images/ui-icons_444444_256x240.png'); +} +.ui-state-hover .ui-icon, +.ui-state-focus .ui-icon, +.ui-button:hover .ui-icon, +.ui-button:focus .ui-icon { + background-image: url('images/ui-icons_555555_256x240.png'); +} +.ui-state-active .ui-icon, +.ui-button:active .ui-icon { + background-image: url('images/ui-icons_ffffff_256x240.png'); +} +.ui-state-highlight .ui-icon, +.ui-button .ui-state-highlight.ui-icon { + background-image: url('images/ui-icons_777620_256x240.png'); +} +.ui-state-error .ui-icon, +.ui-state-error-text .ui-icon { + background-image: url('images/ui-icons_cc0000_256x240.png'); +} +.ui-button .ui-icon { + background-image: url('images/ui-icons_777777_256x240.png'); +} +.ui-icon-blank.ui-icon-blank.ui-icon-blank { + background-image: none; +} +.ui-icon-caret-1-n { + background-position: 0 0; +} +.ui-icon-caret-1-ne { + background-position: -16px 0; +} +.ui-icon-caret-1-e { + background-position: -32px 0; +} +.ui-icon-caret-1-se { + background-position: -48px 0; +} +.ui-icon-caret-1-s { + background-position: -65px 0; +} +.ui-icon-caret-1-sw { + background-position: -80px 0; +} +.ui-icon-caret-1-w { + background-position: -96px 0; +} +.ui-icon-caret-1-nw { + background-position: -112px 0; +} +.ui-icon-caret-2-n-s { + background-position: -128px 0; +} +.ui-icon-caret-2-e-w { + background-position: -144px 0; +} +.ui-icon-triangle-1-n { + background-position: 0 -16px; +} +.ui-icon-triangle-1-ne { + background-position: -16px -16px; +} +.ui-icon-triangle-1-e { + background-position: -32px -16px; +} +.ui-icon-triangle-1-se { + background-position: -48px -16px; +} +.ui-icon-triangle-1-s { + background-position: -65px -16px; +} +.ui-icon-triangle-1-sw { + background-position: -80px -16px; +} +.ui-icon-triangle-1-w { + background-position: -96px -16px; +} +.ui-icon-triangle-1-nw { + background-position: -112px -16px; +} +.ui-icon-triangle-2-n-s { + background-position: -128px -16px; +} +.ui-icon-triangle-2-e-w { + background-position: -144px -16px; +} +.ui-icon-arrow-1-n { + background-position: 0 -32px; +} +.ui-icon-arrow-1-ne { + background-position: -16px -32px; +} +.ui-icon-arrow-1-e { + background-position: -32px -32px; +} +.ui-icon-arrow-1-se { + background-position: -48px -32px; +} +.ui-icon-arrow-1-s { + background-position: -65px -32px; +} +.ui-icon-arrow-1-sw { + background-position: -80px -32px; +} +.ui-icon-arrow-1-w { + background-position: -96px -32px; +} +.ui-icon-arrow-1-nw { + background-position: -112px -32px; +} +.ui-icon-arrow-2-n-s { + background-position: -128px -32px; +} +.ui-icon-arrow-2-ne-sw { + background-position: -144px -32px; +} +.ui-icon-arrow-2-e-w { + background-position: -160px -32px; +} +.ui-icon-arrow-2-se-nw { + background-position: -176px -32px; +} +.ui-icon-arrowstop-1-n { + background-position: -192px -32px; +} +.ui-icon-arrowstop-1-e { + background-position: -208px -32px; +} +.ui-icon-arrowstop-1-s { + background-position: -224px -32px; +} +.ui-icon-arrowstop-1-w { + background-position: -240px -32px; +} +.ui-icon-arrowthick-1-n { + background-position: 1px -48px; +} +.ui-icon-arrowthick-1-ne { + background-position: -16px -48px; +} +.ui-icon-arrowthick-1-e { + background-position: -32px -48px; +} +.ui-icon-arrowthick-1-se { + background-position: -48px -48px; +} +.ui-icon-arrowthick-1-s { + background-position: -64px -48px; +} +.ui-icon-arrowthick-1-sw { + background-position: -80px -48px; +} +.ui-icon-arrowthick-1-w { + background-position: -96px -48px; +} +.ui-icon-arrowthick-1-nw { + background-position: -112px -48px; +} +.ui-icon-arrowthick-2-n-s { + background-position: -128px -48px; +} +.ui-icon-arrowthick-2-ne-sw { + background-position: -144px -48px; +} +.ui-icon-arrowthick-2-e-w { + background-position: -160px -48px; +} +.ui-icon-arrowthick-2-se-nw { + background-position: -176px -48px; +} +.ui-icon-arrowthickstop-1-n { + background-position: -192px -48px; +} +.ui-icon-arrowthickstop-1-e { + background-position: -208px -48px; +} +.ui-icon-arrowthickstop-1-s { + background-position: -224px -48px; +} +.ui-icon-arrowthickstop-1-w { + background-position: -240px -48px; +} +.ui-icon-arrowreturnthick-1-w { + background-position: 0 -64px; +} +.ui-icon-arrowreturnthick-1-n { + background-position: -16px -64px; +} +.ui-icon-arrowreturnthick-1-e { + background-position: -32px -64px; +} +.ui-icon-arrowreturnthick-1-s { + background-position: -48px -64px; +} +.ui-icon-arrowreturn-1-w { + background-position: -64px -64px; +} +.ui-icon-arrowreturn-1-n { + background-position: -80px -64px; +} +.ui-icon-arrowreturn-1-e { + background-position: -96px -64px; +} +.ui-icon-arrowreturn-1-s { + background-position: -112px -64px; +} +.ui-icon-arrowrefresh-1-w { + background-position: -128px -64px; +} +.ui-icon-arrowrefresh-1-n { + background-position: -144px -64px; +} +.ui-icon-arrowrefresh-1-e { + background-position: -160px -64px; +} +.ui-icon-arrowrefresh-1-s { + background-position: -176px -64px; +} +.ui-icon-arrow-4 { + background-position: 0 -80px; +} +.ui-icon-arrow-4-diag { + background-position: -16px -80px; +} +.ui-icon-extlink { + background-position: -32px -80px; +} +.ui-icon-newwin { + background-position: -48px -80px; +} +.ui-icon-refresh { + background-position: -64px -80px; +} +.ui-icon-shuffle { + background-position: -80px -80px; +} +.ui-icon-transfer-e-w { + background-position: -96px -80px; +} +.ui-icon-transferthick-e-w { + background-position: -112px -80px; +} +.ui-icon-folder-collapsed { + background-position: 0 -96px; +} +.ui-icon-folder-open { + background-position: -16px -96px; +} +.ui-icon-document { + background-position: -32px -96px; +} +.ui-icon-document-b { + background-position: -48px -96px; +} +.ui-icon-note { + background-position: -64px -96px; +} +.ui-icon-mail-closed { + background-position: -80px -96px; +} +.ui-icon-mail-open { + background-position: -96px -96px; +} +.ui-icon-suitcase { + background-position: -112px -96px; +} +.ui-icon-comment { + background-position: -128px -96px; +} +.ui-icon-person { + background-position: -144px -96px; +} +.ui-icon-print { + background-position: -160px -96px; +} +.ui-icon-trash { + background-position: -176px -96px; +} +.ui-icon-locked { + background-position: -192px -96px; +} +.ui-icon-unlocked { + background-position: -208px -96px; +} +.ui-icon-bookmark { + background-position: -224px -96px; +} +.ui-icon-tag { + background-position: -240px -96px; +} +.ui-icon-home { + background-position: 0 -112px; +} +.ui-icon-flag { + background-position: -16px -112px; +} +.ui-icon-calendar { + background-position: -32px -112px; +} +.ui-icon-cart { + background-position: -48px -112px; +} +.ui-icon-pencil { + background-position: -64px -112px; +} +.ui-icon-clock { + background-position: -80px -112px; +} +.ui-icon-disk { + background-position: -96px -112px; +} +.ui-icon-calculator { + background-position: -112px -112px; +} +.ui-icon-zoomin { + background-position: -128px -112px; +} +.ui-icon-zoomout { + background-position: -144px -112px; +} +.ui-icon-search { + background-position: -160px -112px; +} +.ui-icon-wrench { + background-position: -176px -112px; +} +.ui-icon-gear { + background-position: -192px -112px; +} +.ui-icon-heart { + background-position: -208px -112px; +} +.ui-icon-star { + background-position: -224px -112px; +} +.ui-icon-link { + background-position: -240px -112px; +} +.ui-icon-cancel { + background-position: 0 -128px; +} +.ui-icon-plus { + background-position: -16px -128px; +} +.ui-icon-plusthick { + background-position: -32px -128px; +} +.ui-icon-minus { + background-position: -48px -128px; +} +.ui-icon-minusthick { + background-position: -64px -128px; +} +.ui-icon-close { + background-position: -80px -128px; +} +.ui-icon-closethick { + background-position: -96px -128px; +} +.ui-icon-key { + background-position: -112px -128px; +} +.ui-icon-lightbulb { + background-position: -128px -128px; +} +.ui-icon-scissors { + background-position: -144px -128px; +} +.ui-icon-clipboard { + background-position: -160px -128px; +} +.ui-icon-copy { + background-position: -176px -128px; +} +.ui-icon-contact { + background-position: -192px -128px; +} +.ui-icon-image { + background-position: -208px -128px; +} +.ui-icon-video { + background-position: -224px -128px; +} +.ui-icon-script { + background-position: -240px -128px; +} +.ui-icon-alert { + background-position: 0 -144px; +} +.ui-icon-info { + background-position: -16px -144px; +} +.ui-icon-notice { + background-position: -32px -144px; +} +.ui-icon-help { + background-position: -48px -144px; +} +.ui-icon-check { + background-position: -64px -144px; +} +.ui-icon-bullet { + background-position: -80px -144px; +} +.ui-icon-radio-on { + background-position: -96px -144px; +} +.ui-icon-radio-off { + background-position: -112px -144px; +} +.ui-icon-pin-w { + background-position: -128px -144px; +} +.ui-icon-pin-s { + background-position: -144px -144px; +} +.ui-icon-play { + background-position: 0 -160px; +} +.ui-icon-pause { + background-position: -16px -160px; +} +.ui-icon-seek-next { + background-position: -32px -160px; +} +.ui-icon-seek-prev { + background-position: -48px -160px; +} +.ui-icon-seek-end { + background-position: -64px -160px; +} +.ui-icon-seek-start { + background-position: -80px -160px; +} +.ui-icon-seek-first { + background-position: -80px -160px; +} +.ui-icon-stop { + background-position: -96px -160px; +} +.ui-icon-eject { + background-position: -112px -160px; +} +.ui-icon-volume-off { + background-position: -128px -160px; +} +.ui-icon-volume-on { + background-position: -144px -160px; +} +.ui-icon-power { + background-position: 0 -176px; +} +.ui-icon-signal-diag { + background-position: -16px -176px; +} +.ui-icon-signal { + background-position: -32px -176px; +} +.ui-icon-battery-0 { + background-position: -48px -176px; +} +.ui-icon-battery-1 { + background-position: -64px -176px; +} +.ui-icon-battery-2 { + background-position: -80px -176px; +} +.ui-icon-battery-3 { + background-position: -96px -176px; +} +.ui-icon-circle-plus { + background-position: 0 -192px; +} +.ui-icon-circle-minus { + background-position: -16px -192px; +} +.ui-icon-circle-close { + background-position: -32px -192px; +} +.ui-icon-circle-triangle-e { + background-position: -48px -192px; +} +.ui-icon-circle-triangle-s { + background-position: -64px -192px; +} +.ui-icon-circle-triangle-w { + background-position: -80px -192px; +} +.ui-icon-circle-triangle-n { + background-position: -96px -192px; +} +.ui-icon-circle-arrow-e { + background-position: -112px -192px; +} +.ui-icon-circle-arrow-s { + background-position: -128px -192px; +} +.ui-icon-circle-arrow-w { + background-position: -144px -192px; +} +.ui-icon-circle-arrow-n { + background-position: -160px -192px; +} +.ui-icon-circle-zoomin { + background-position: -176px -192px; +} +.ui-icon-circle-zoomout { + background-position: -192px -192px; +} +.ui-icon-circle-check { + background-position: -208px -192px; +} +.ui-icon-circlesmall-plus { + background-position: 0 -208px; +} +.ui-icon-circlesmall-minus { + background-position: -16px -208px; +} +.ui-icon-circlesmall-close { + background-position: -32px -208px; +} +.ui-icon-squaresmall-plus { + background-position: -48px -208px; +} +.ui-icon-squaresmall-minus { + background-position: -64px -208px; +} +.ui-icon-squaresmall-close { + background-position: -80px -208px; +} +.ui-icon-grip-dotted-vertical { + background-position: 0 -224px; +} +.ui-icon-grip-dotted-horizontal { + background-position: -16px -224px; +} +.ui-icon-grip-solid-vertical { + background-position: -32px -224px; +} +.ui-icon-grip-solid-horizontal { + background-position: -48px -224px; +} +.ui-icon-gripsmall-diagonal-se { + background-position: -64px -224px; +} +.ui-icon-grip-diagonal-se { + background-position: -80px -224px; +} +.ui-corner-all, +.ui-corner-top, +.ui-corner-left, +.ui-corner-tl { + border-top-left-radius: 3px; +} +.ui-corner-all, +.ui-corner-top, +.ui-corner-right, +.ui-corner-tr { + border-top-right-radius: 3px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-left, +.ui-corner-bl { + border-bottom-left-radius: 3px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-br { + border-bottom-right-radius: 3px; +} +.ui-widget-overlay { + background: #aaa; + opacity: 0.3; + -ms-filter: Alpha(Opacity=30); +} +.ui-widget-shadow { + -webkit-box-shadow: 0 0 5px #666; + box-shadow: 0 0 5px #666; +} diff --git a/v1/src/simulator/vendor/jquery-ui.min.js b/v1/src/simulator/vendor/jquery-ui.min.js new file mode 100644 index 00000000..8453fa2f --- /dev/null +++ b/v1/src/simulator/vendor/jquery-ui.min.js @@ -0,0 +1,7887 @@ +/*! jQuery UI - v1.13.1 - 2022-01-22 + * http://jqueryui.com + * Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-patch.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/draggable.js, widgets/resizable.js, widgets/sortable.js, widgets/accordion.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/dialog.js, widgets/mouse.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js + * Copyright jQuery Foundation and other contributors; Licensed MIT */ + +!(function (t) { + 'use strict' + 'function' == typeof define && define.amd + ? define(['jquery'], t) + : t(jQuery) +})(function (x) { + 'use strict' + x.ui = x.ui || {} + x.ui.version = '1.13.1' + var o, + i = 0, + r = Array.prototype.hasOwnProperty, + a = Array.prototype.slice + ;(x.cleanData = + ((o = x.cleanData), + function (t) { + for (var e, i, s = 0; null != (i = t[s]); s++) + (e = x._data(i, 'events')) && + e.remove && + x(i).triggerHandler('remove') + o(t) + })), + (x.widget = function (t, i, e) { + var s, + o, + n, + r = {}, + a = t.split('.')[0], + h = a + '-' + (t = t.split('.')[1]) + return ( + e || ((e = i), (i = x.Widget)), + Array.isArray(e) && (e = x.extend.apply(null, [{}].concat(e))), + (x.expr.pseudos[h.toLowerCase()] = function (t) { + return !!x.data(t, h) + }), + (x[a] = x[a] || {}), + (s = x[a][t]), + (o = x[a][t] = + function (t, e) { + if (!this || !this._createWidget) return new o(t, e) + arguments.length && this._createWidget(t, e) + }), + x.extend(o, s, { + version: e.version, + _proto: x.extend({}, e), + _childConstructors: [], + }), + ((n = new i()).options = x.widget.extend({}, n.options)), + x.each(e, function (e, s) { + function o() { + return i.prototype[e].apply(this, arguments) + } + function n(t) { + return i.prototype[e].apply(this, t) + } + r[e] = + 'function' == typeof s + ? function () { + var t, + e = this._super, + i = this._superApply + return ( + (this._super = o), + (this._superApply = n), + (t = s.apply(this, arguments)), + (this._super = e), + (this._superApply = i), + t + ) + } + : s + }), + (o.prototype = x.widget.extend( + n, + { widgetEventPrefix: (s && n.widgetEventPrefix) || t }, + r, + { + constructor: o, + namespace: a, + widgetName: t, + widgetFullName: h, + } + )), + s + ? (x.each(s._childConstructors, function (t, e) { + var i = e.prototype + x.widget( + i.namespace + '.' + i.widgetName, + o, + e._proto + ) + }), + delete s._childConstructors) + : i._childConstructors.push(o), + x.widget.bridge(t, o), + o + ) + }), + (x.widget.extend = function (t) { + for ( + var e, i, s = a.call(arguments, 1), o = 0, n = s.length; + o < n; + o++ + ) + for (e in s[o]) + (i = s[o][e]), + r.call(s[o], e) && + void 0 !== i && + (x.isPlainObject(i) + ? (t[e] = x.isPlainObject(t[e]) + ? x.widget.extend({}, t[e], i) + : x.widget.extend({}, i)) + : (t[e] = i)) + return t + }), + (x.widget.bridge = function (n, e) { + var r = e.prototype.widgetFullName || n + x.fn[n] = function (i) { + var t = 'string' == typeof i, + s = a.call(arguments, 1), + o = this + return ( + t + ? this.length || 'instance' !== i + ? this.each(function () { + var t, + e = x.data(this, r) + return 'instance' === i + ? ((o = e), !1) + : e + ? 'function' != typeof e[i] || + '_' === i.charAt(0) + ? x.error( + "no such method '" + + i + + "' for " + + n + + ' widget instance' + ) + : (t = e[i].apply(e, s)) !== e && + void 0 !== t + ? ((o = + t && t.jquery + ? o.pushStack(t.get()) + : t), + !1) + : void 0 + : x.error( + 'cannot call methods on ' + + n + + " prior to initialization; attempted to call method '" + + i + + "'" + ) + }) + : (o = void 0) + : (s.length && + (i = x.widget.extend.apply(null, [i].concat(s))), + this.each(function () { + var t = x.data(this, r) + t + ? (t.option(i || {}), t._init && t._init()) + : x.data(this, r, new e(i, this)) + })), + o + ) + } + }), + (x.Widget = function () {}), + (x.Widget._childConstructors = []), + (x.Widget.prototype = { + widgetName: 'widget', + widgetEventPrefix: '', + defaultElement: '
', + options: { classes: {}, disabled: !1, create: null }, + _createWidget: function (t, e) { + ;(e = x(e || this.defaultElement || this)[0]), + (this.element = x(e)), + (this.uuid = i++), + (this.eventNamespace = '.' + this.widgetName + this.uuid), + (this.bindings = x()), + (this.hoverable = x()), + (this.focusable = x()), + (this.classesElementLookup = {}), + e !== this && + (x.data(e, this.widgetFullName, this), + this._on(!0, this.element, { + remove: function (t) { + t.target === e && this.destroy() + }, + }), + (this.document = x( + e.style ? e.ownerDocument : e.document || e + )), + (this.window = x( + this.document[0].defaultView || + this.document[0].parentWindow + ))), + (this.options = x.widget.extend( + {}, + this.options, + this._getCreateOptions(), + t + )), + this._create(), + this.options.disabled && + this._setOptionDisabled(this.options.disabled), + this._trigger('create', null, this._getCreateEventData()), + this._init() + }, + _getCreateOptions: function () { + return {} + }, + _getCreateEventData: x.noop, + _create: x.noop, + _init: x.noop, + destroy: function () { + var i = this + this._destroy(), + x.each(this.classesElementLookup, function (t, e) { + i._removeClass(e, t) + }), + this.element + .off(this.eventNamespace) + .removeData(this.widgetFullName), + this.widget() + .off(this.eventNamespace) + .removeAttr('aria-disabled'), + this.bindings.off(this.eventNamespace) + }, + _destroy: x.noop, + widget: function () { + return this.element + }, + option: function (t, e) { + var i, + s, + o, + n = t + if (0 === arguments.length) + return x.widget.extend({}, this.options) + if ('string' == typeof t) + if ( + ((n = {}), (t = (i = t.split('.')).shift()), i.length) + ) { + for ( + s = n[t] = x.widget.extend({}, this.options[t]), + o = 0; + o < i.length - 1; + o++ + ) + (s[i[o]] = s[i[o]] || {}), (s = s[i[o]]) + if (((t = i.pop()), 1 === arguments.length)) + return void 0 === s[t] ? null : s[t] + s[t] = e + } else { + if (1 === arguments.length) + return void 0 === this.options[t] + ? null + : this.options[t] + n[t] = e + } + return this._setOptions(n), this + }, + _setOptions: function (t) { + for (var e in t) this._setOption(e, t[e]) + return this + }, + _setOption: function (t, e) { + return ( + 'classes' === t && this._setOptionClasses(e), + (this.options[t] = e), + 'disabled' === t && this._setOptionDisabled(e), + this + ) + }, + _setOptionClasses: function (t) { + var e, i, s + for (e in t) + (s = this.classesElementLookup[e]), + t[e] !== this.options.classes[e] && + s && + s.length && + ((i = x(s.get())), + this._removeClass(s, e), + i.addClass( + this._classes({ + element: i, + keys: e, + classes: t, + add: !0, + }) + )) + }, + _setOptionDisabled: function (t) { + this._toggleClass( + this.widget(), + this.widgetFullName + '-disabled', + null, + !!t + ), + t && + (this._removeClass( + this.hoverable, + null, + 'ui-state-hover' + ), + this._removeClass( + this.focusable, + null, + 'ui-state-focus' + )) + }, + enable: function () { + return this._setOptions({ disabled: !1 }) + }, + disable: function () { + return this._setOptions({ disabled: !0 }) + }, + _classes: function (o) { + var n = [], + r = this + function t(t, e) { + for (var i, s = 0; s < t.length; s++) + (i = r.classesElementLookup[t[s]] || x()), + (i = o.add + ? ((function () { + var i = [] + o.element.each(function (t, e) { + x + .map( + r.classesElementLookup, + function (t) { + return t + } + ) + .some(function (t) { + return t.is(e) + }) || i.push(e) + }), + r._on(x(i), { + remove: '_untrackClassesElement', + }) + })(), + x( + x.uniqueSort( + i.get().concat(o.element.get()) + ) + )) + : x(i.not(o.element).get())), + (r.classesElementLookup[t[s]] = i), + n.push(t[s]), + e && o.classes[t[s]] && n.push(o.classes[t[s]]) + } + return ( + (o = x.extend( + { + element: this.element, + classes: this.options.classes || {}, + }, + o + )).keys && t(o.keys.match(/\S+/g) || [], !0), + o.extra && t(o.extra.match(/\S+/g) || []), + n.join(' ') + ) + }, + _untrackClassesElement: function (i) { + var s = this + x.each(s.classesElementLookup, function (t, e) { + ;-1 !== x.inArray(i.target, e) && + (s.classesElementLookup[t] = x(e.not(i.target).get())) + }), + this._off(x(i.target)) + }, + _removeClass: function (t, e, i) { + return this._toggleClass(t, e, i, !1) + }, + _addClass: function (t, e, i) { + return this._toggleClass(t, e, i, !0) + }, + _toggleClass: function (t, e, i, s) { + var o = 'string' == typeof t || null === t, + i = { + extra: o ? e : i, + keys: o ? t : e, + element: o ? this.element : t, + add: (s = 'boolean' == typeof s ? s : i), + } + return i.element.toggleClass(this._classes(i), s), this + }, + _on: function (o, n, t) { + var r, + a = this + 'boolean' != typeof o && ((t = n), (n = o), (o = !1)), + t + ? ((n = r = x(n)), + (this.bindings = this.bindings.add(n))) + : ((t = n), (n = this.element), (r = this.widget())), + x.each(t, function (t, e) { + function i() { + if ( + o || + (!0 !== a.options.disabled && + !x(this).hasClass('ui-state-disabled')) + ) + return ('string' == typeof e ? a[e] : e).apply( + a, + arguments + ) + } + 'string' != typeof e && + (i.guid = e.guid = e.guid || i.guid || x.guid++) + var s = t.match(/^([\w:-]*)\s*(.*)$/), + t = s[1] + a.eventNamespace, + s = s[2] + s ? r.on(t, s, i) : n.on(t, i) + }) + }, + _off: function (t, e) { + ;(e = + (e || '').split(' ').join(this.eventNamespace + ' ') + + this.eventNamespace), + t.off(e), + (this.bindings = x(this.bindings.not(t).get())), + (this.focusable = x(this.focusable.not(t).get())), + (this.hoverable = x(this.hoverable.not(t).get())) + }, + _delay: function (t, e) { + var i = this + return setTimeout(function () { + return ('string' == typeof t ? i[t] : t).apply(i, arguments) + }, e || 0) + }, + _hoverable: function (t) { + ;(this.hoverable = this.hoverable.add(t)), + this._on(t, { + mouseenter: function (t) { + this._addClass( + x(t.currentTarget), + null, + 'ui-state-hover' + ) + }, + mouseleave: function (t) { + this._removeClass( + x(t.currentTarget), + null, + 'ui-state-hover' + ) + }, + }) + }, + _focusable: function (t) { + ;(this.focusable = this.focusable.add(t)), + this._on(t, { + focusin: function (t) { + this._addClass( + x(t.currentTarget), + null, + 'ui-state-focus' + ) + }, + focusout: function (t) { + this._removeClass( + x(t.currentTarget), + null, + 'ui-state-focus' + ) + }, + }) + }, + _trigger: function (t, e, i) { + var s, + o, + n = this.options[t] + if ( + ((i = i || {}), + ((e = x.Event(e)).type = ( + t === this.widgetEventPrefix + ? t + : this.widgetEventPrefix + t + ).toLowerCase()), + (e.target = this.element[0]), + (o = e.originalEvent)) + ) + for (s in o) s in e || (e[s] = o[s]) + return ( + this.element.trigger(e, i), + !( + ('function' == typeof n && + !1 === n.apply(this.element[0], [e].concat(i))) || + e.isDefaultPrevented() + ) + ) + }, + }), + x.each({ show: 'fadeIn', hide: 'fadeOut' }, function (n, r) { + x.Widget.prototype['_' + n] = function (e, t, i) { + var s, + o = (t = 'string' == typeof t ? { effect: t } : t) + ? (!0 !== t && 'number' != typeof t && t.effect) || r + : n + 'number' == typeof (t = t || {}) + ? (t = { duration: t }) + : !0 === t && (t = {}), + (s = !x.isEmptyObject(t)), + (t.complete = i), + t.delay && e.delay(t.delay), + s && x.effects && x.effects.effect[o] + ? e[n](t) + : o !== n && e[o] + ? e[o](t.duration, t.easing, i) + : e.queue(function (t) { + x(this)[n](), i && i.call(e[0]), t() + }) + } + }) + var s, P, C, n, h, l, c, p, z + x.widget + function T(t, e, i) { + return [ + parseFloat(t[0]) * (p.test(t[0]) ? e / 100 : 1), + parseFloat(t[1]) * (p.test(t[1]) ? i / 100 : 1), + ] + } + function k(t, e) { + return parseInt(x.css(t, e), 10) || 0 + } + function H(t) { + return null != t && t === t.window + } + ;(P = Math.max), + (C = Math.abs), + (n = /left|center|right/), + (h = /top|center|bottom/), + (l = /[\+\-]\d+(\.[\d]+)?%?/), + (c = /^\w+/), + (p = /%$/), + (z = x.fn.position), + (x.position = { + scrollbarWidth: function () { + if (void 0 !== s) return s + var t, + e = x( + "
" + ), + i = e.children()[0] + return ( + x('body').append(e), + (t = i.offsetWidth), + e.css('overflow', 'scroll'), + t === (i = i.offsetWidth) && (i = e[0].clientWidth), + e.remove(), + (s = t - i) + ) + }, + getScrollInfo: function (t) { + var e = + t.isWindow || t.isDocument + ? '' + : t.element.css('overflow-x'), + i = + t.isWindow || t.isDocument + ? '' + : t.element.css('overflow-y'), + e = + 'scroll' === e || + ('auto' === e && t.width < t.element[0].scrollWidth) + return { + width: + 'scroll' === i || + ('auto' === i && t.height < t.element[0].scrollHeight) + ? x.position.scrollbarWidth() + : 0, + height: e ? x.position.scrollbarWidth() : 0, + } + }, + getWithinInfo: function (t) { + var e = x(t || window), + i = H(e[0]), + s = !!e[0] && 9 === e[0].nodeType + return { + element: e, + isWindow: i, + isDocument: s, + offset: !i && !s ? x(t).offset() : { left: 0, top: 0 }, + scrollLeft: e.scrollLeft(), + scrollTop: e.scrollTop(), + width: e.outerWidth(), + height: e.outerHeight(), + } + }, + }), + (x.fn.position = function (p) { + if (!p || !p.of) return z.apply(this, arguments) + var u, + d, + f, + g, + m, + t, + v = + 'string' == typeof (p = x.extend({}, p)).of + ? x(document).find(p.of) + : x(p.of), + _ = x.position.getWithinInfo(p.within), + b = x.position.getScrollInfo(_), + y = (p.collision || 'flip').split(' '), + w = {}, + e = + 9 === (t = (e = v)[0]).nodeType + ? { + width: e.width(), + height: e.height(), + offset: { top: 0, left: 0 }, + } + : H(t) + ? { + width: e.width(), + height: e.height(), + offset: { + top: e.scrollTop(), + left: e.scrollLeft(), + }, + } + : t.preventDefault + ? { + width: 0, + height: 0, + offset: { top: t.pageY, left: t.pageX }, + } + : { + width: e.outerWidth(), + height: e.outerHeight(), + offset: e.offset(), + } + return ( + v[0].preventDefault && (p.at = 'left top'), + (d = e.width), + (f = e.height), + (m = x.extend({}, (g = e.offset))), + x.each(['my', 'at'], function () { + var t, + e, + i = (p[this] || '').split(' ') + ;((i = + 1 === i.length + ? n.test(i[0]) + ? i.concat(['center']) + : h.test(i[0]) + ? ['center'].concat(i) + : ['center', 'center'] + : i)[0] = n.test(i[0]) ? i[0] : 'center'), + (i[1] = h.test(i[1]) ? i[1] : 'center'), + (t = l.exec(i[0])), + (e = l.exec(i[1])), + (w[this] = [t ? t[0] : 0, e ? e[0] : 0]), + (p[this] = [c.exec(i[0])[0], c.exec(i[1])[0]]) + }), + 1 === y.length && (y[1] = y[0]), + 'right' === p.at[0] + ? (m.left += d) + : 'center' === p.at[0] && (m.left += d / 2), + 'bottom' === p.at[1] + ? (m.top += f) + : 'center' === p.at[1] && (m.top += f / 2), + (u = T(w.at, d, f)), + (m.left += u[0]), + (m.top += u[1]), + this.each(function () { + var i, + t, + r = x(this), + a = r.outerWidth(), + h = r.outerHeight(), + e = k(this, 'marginLeft'), + s = k(this, 'marginTop'), + o = a + e + k(this, 'marginRight') + b.width, + n = h + s + k(this, 'marginBottom') + b.height, + l = x.extend({}, m), + c = T(w.my, r.outerWidth(), r.outerHeight()) + 'right' === p.my[0] + ? (l.left -= a) + : 'center' === p.my[0] && (l.left -= a / 2), + 'bottom' === p.my[1] + ? (l.top -= h) + : 'center' === p.my[1] && (l.top -= h / 2), + (l.left += c[0]), + (l.top += c[1]), + (i = { marginLeft: e, marginTop: s }), + x.each(['left', 'top'], function (t, e) { + x.ui.position[y[t]] && + x.ui.position[y[t]][e](l, { + targetWidth: d, + targetHeight: f, + elemWidth: a, + elemHeight: h, + collisionPosition: i, + collisionWidth: o, + collisionHeight: n, + offset: [u[0] + c[0], u[1] + c[1]], + my: p.my, + at: p.at, + within: _, + elem: r, + }) + }), + p.using && + (t = function (t) { + var e = g.left - l.left, + i = e + d - a, + s = g.top - l.top, + o = s + f - h, + n = { + target: { + element: v, + left: g.left, + top: g.top, + width: d, + height: f, + }, + element: { + element: r, + left: l.left, + top: l.top, + width: a, + height: h, + }, + horizontal: + i < 0 + ? 'left' + : 0 < e + ? 'right' + : 'center', + vertical: + o < 0 + ? 'top' + : 0 < s + ? 'bottom' + : 'middle', + } + d < a && + C(e + i) < d && + (n.horizontal = 'center'), + f < h && + C(s + o) < f && + (n.vertical = 'middle'), + P(C(e), C(i)) > P(C(s), C(o)) + ? (n.important = 'horizontal') + : (n.important = 'vertical'), + p.using.call(this, t, n) + }), + r.offset(x.extend(l, { using: t })) + }) + ) + }), + (x.ui.position = { + fit: { + left: function (t, e) { + var i = e.within, + s = i.isWindow ? i.scrollLeft : i.offset.left, + o = i.width, + n = t.left - e.collisionPosition.marginLeft, + r = s - n, + a = n + e.collisionWidth - o - s + e.collisionWidth > o + ? 0 < r && a <= 0 + ? ((i = t.left + r + e.collisionWidth - o - s), + (t.left += r - i)) + : (t.left = + !(0 < a && r <= 0) && a < r + ? s + o - e.collisionWidth + : s) + : 0 < r + ? (t.left += r) + : 0 < a + ? (t.left -= a) + : (t.left = P(t.left - n, t.left)) + }, + top: function (t, e) { + var i = e.within, + s = i.isWindow ? i.scrollTop : i.offset.top, + o = e.within.height, + n = t.top - e.collisionPosition.marginTop, + r = s - n, + a = n + e.collisionHeight - o - s + e.collisionHeight > o + ? 0 < r && a <= 0 + ? ((i = t.top + r + e.collisionHeight - o - s), + (t.top += r - i)) + : (t.top = + !(0 < a && r <= 0) && a < r + ? s + o - e.collisionHeight + : s) + : 0 < r + ? (t.top += r) + : 0 < a + ? (t.top -= a) + : (t.top = P(t.top - n, t.top)) + }, + }, + flip: { + left: function (t, e) { + var i = e.within, + s = i.offset.left + i.scrollLeft, + o = i.width, + n = i.isWindow ? i.scrollLeft : i.offset.left, + r = t.left - e.collisionPosition.marginLeft, + a = r - n, + h = r + e.collisionWidth - o - n, + l = + 'left' === e.my[0] + ? -e.elemWidth + : 'right' === e.my[0] + ? e.elemWidth + : 0, + i = + 'left' === e.at[0] + ? e.targetWidth + : 'right' === e.at[0] + ? -e.targetWidth + : 0, + r = -2 * e.offset[0] + a < 0 + ? ((s = t.left + l + i + r + e.collisionWidth - o - s) < + 0 || + s < C(a)) && + (t.left += l + i + r) + : 0 < h && + (0 < + (n = + t.left - + e.collisionPosition.marginLeft + + l + + i + + r - + n) || + C(n) < h) && + (t.left += l + i + r) + }, + top: function (t, e) { + var i = e.within, + s = i.offset.top + i.scrollTop, + o = i.height, + n = i.isWindow ? i.scrollTop : i.offset.top, + r = t.top - e.collisionPosition.marginTop, + a = r - n, + h = r + e.collisionHeight - o - n, + l = + 'top' === e.my[1] + ? -e.elemHeight + : 'bottom' === e.my[1] + ? e.elemHeight + : 0, + i = + 'top' === e.at[1] + ? e.targetHeight + : 'bottom' === e.at[1] + ? -e.targetHeight + : 0, + r = -2 * e.offset[1] + a < 0 + ? ((s = t.top + l + i + r + e.collisionHeight - o - s) < + 0 || + s < C(a)) && + (t.top += l + i + r) + : 0 < h && + (0 < + (n = + t.top - + e.collisionPosition.marginTop + + l + + i + + r - + n) || + C(n) < h) && + (t.top += l + i + r) + }, + }, + flipfit: { + left: function () { + x.ui.position.flip.left.apply(this, arguments), + x.ui.position.fit.left.apply(this, arguments) + }, + top: function () { + x.ui.position.flip.top.apply(this, arguments), + x.ui.position.fit.top.apply(this, arguments) + }, + }, + }) + var t + x.ui.position, + x.extend(x.expr.pseudos, { + data: x.expr.createPseudo + ? x.expr.createPseudo(function (e) { + return function (t) { + return !!x.data(t, e) + } + }) + : function (t, e, i) { + return !!x.data(t, i[3]) + }, + }), + x.fn.extend({ + disableSelection: + ((t = + 'onselectstart' in document.createElement('div') + ? 'selectstart' + : 'mousedown'), + function () { + return this.on(t + '.ui-disableSelection', function (t) { + t.preventDefault() + }) + }), + enableSelection: function () { + return this.off('.ui-disableSelection') + }, + }) + ;(x.ui.focusable = function (t, e) { + var i, + s, + o, + n, + r = t.nodeName.toLowerCase() + return 'area' === r + ? ((s = (i = t.parentNode).name), + !(!t.href || !s || 'map' !== i.nodeName.toLowerCase()) && + 0 < (s = x("img[usemap='#" + s + "']")).length && + s.is(':visible')) + : (/^(input|select|textarea|button|object)$/.test(r) + ? (o = !t.disabled) && + (n = x(t).closest('fieldset')[0]) && + (o = !n.disabled) + : (o = ('a' === r && t.href) || e), + o && + x(t).is(':visible') && + (function (t) { + var e = t.css('visibility') + for (; 'inherit' === e; ) + (t = t.parent()), (e = t.css('visibility')) + return 'visible' === e + })(x(t))) + }), + x.extend(x.expr.pseudos, { + focusable: function (t) { + return x.ui.focusable(t, null != x.attr(t, 'tabindex')) + }, + }) + var e, u + x.ui.focusable, + (x.fn._form = function () { + return 'string' == typeof this[0].form + ? this.closest('form') + : x(this[0].form) + }), + (x.ui.formResetMixin = { + _formResetHandler: function () { + var e = x(this) + setTimeout(function () { + var t = e.data('ui-form-reset-instances') + x.each(t, function () { + this.refresh() + }) + }) + }, + _bindFormResetHandler: function () { + var t + ;(this.form = this.element._form()), + this.form.length && + ((t = this.form.data('ui-form-reset-instances') || []) + .length || + this.form.on( + 'reset.ui-form-reset', + this._formResetHandler + ), + t.push(this), + this.form.data('ui-form-reset-instances', t)) + }, + _unbindFormResetHandler: function () { + var t + this.form.length && + ((t = this.form.data('ui-form-reset-instances')).splice( + x.inArray(this, t), + 1 + ), + t.length + ? this.form.data('ui-form-reset-instances', t) + : this.form + .removeData('ui-form-reset-instances') + .off('reset.ui-form-reset')) + }, + }) + x.expr.pseudos || (x.expr.pseudos = x.expr[':']), + x.uniqueSort || (x.uniqueSort = x.unique), + x.escapeSelector || + ((e = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g), + (u = function (t, e) { + return e + ? '\0' === t + ? '�' + : t.slice(0, -1) + + '\\' + + t.charCodeAt(t.length - 1).toString(16) + + ' ' + : '\\' + t + }), + (x.escapeSelector = function (t) { + return (t + '').replace(e, u) + })), + (x.fn.even && x.fn.odd) || + x.fn.extend({ + even: function () { + return this.filter(function (t) { + return t % 2 == 0 + }) + }, + odd: function () { + return this.filter(function (t) { + return t % 2 == 1 + }) + }, + }) + ;(x.ui.keyCode = { + BACKSPACE: 8, + COMMA: 188, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + LEFT: 37, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SPACE: 32, + TAB: 9, + UP: 38, + }), + (x.fn.labels = function () { + var t, e, i + return this.length + ? this[0].labels && this[0].labels.length + ? this.pushStack(this[0].labels) + : ((e = this.eq(0).parents('label')), + (t = this.attr('id')) && + ((i = (i = this.eq(0).parents().last()).add( + (i.length ? i : this).siblings() + )), + (t = "label[for='" + x.escapeSelector(t) + "']"), + (e = e.add(i.find(t).addBack(t)))), + this.pushStack(e)) + : this.pushStack([]) + }), + (x.fn.scrollParent = function (t) { + var e = this.css('position'), + i = 'absolute' === e, + s = t ? /(auto|scroll|hidden)/ : /(auto|scroll)/, + t = this.parents() + .filter(function () { + var t = x(this) + return ( + (!i || 'static' !== t.css('position')) && + s.test( + t.css('overflow') + + t.css('overflow-y') + + t.css('overflow-x') + ) + ) + }) + .eq(0) + return 'fixed' !== e && t.length + ? t + : x(this[0].ownerDocument || document) + }), + x.extend(x.expr.pseudos, { + tabbable: function (t) { + var e = x.attr(t, 'tabindex'), + i = null != e + return (!i || 0 <= e) && x.ui.focusable(t, i) + }, + }), + x.fn.extend({ + uniqueId: + ((d = 0), + function () { + return this.each(function () { + this.id || (this.id = 'ui-id-' + ++d) + }) + }), + removeUniqueId: function () { + return this.each(function () { + ;/^ui-id-\d+$/.test(this.id) && x(this).removeAttr('id') + }) + }, + }), + (x.ui.ie = !!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase())) + var d, + f = !1 + x(document).on('mouseup', function () { + f = !1 + }) + x.widget('ui.mouse', { + version: '1.13.1', + options: { + cancel: 'input, textarea, button, select, option', + distance: 1, + delay: 0, + }, + _mouseInit: function () { + var e = this + this.element + .on('mousedown.' + this.widgetName, function (t) { + return e._mouseDown(t) + }) + .on('click.' + this.widgetName, function (t) { + if ( + !0 === + x.data(t.target, e.widgetName + '.preventClickEvent') + ) + return ( + x.removeData( + t.target, + e.widgetName + '.preventClickEvent' + ), + t.stopImmediatePropagation(), + !1 + ) + }), + (this.started = !1) + }, + _mouseDestroy: function () { + this.element.off('.' + this.widgetName), + this._mouseMoveDelegate && + this.document + .off( + 'mousemove.' + this.widgetName, + this._mouseMoveDelegate + ) + .off( + 'mouseup.' + this.widgetName, + this._mouseUpDelegate + ) + }, + _mouseDown: function (t) { + if (!f) { + ;(this._mouseMoved = !1), + this._mouseStarted && this._mouseUp(t), + (this._mouseDownEvent = t) + var e = this, + i = 1 === t.which, + s = + !( + 'string' != typeof this.options.cancel || + !t.target.nodeName + ) && x(t.target).closest(this.options.cancel).length + return i && !s && this._mouseCapture(t) + ? ((this.mouseDelayMet = !this.options.delay), + this.mouseDelayMet || + (this._mouseDelayTimer = setTimeout(function () { + e.mouseDelayMet = !0 + }, this.options.delay)), + this._mouseDistanceMet(t) && + this._mouseDelayMet(t) && + ((this._mouseStarted = !1 !== this._mouseStart(t)), + !this._mouseStarted) + ? (t.preventDefault(), !0) + : (!0 === + x.data( + t.target, + this.widgetName + '.preventClickEvent' + ) && + x.removeData( + t.target, + this.widgetName + '.preventClickEvent' + ), + (this._mouseMoveDelegate = function (t) { + return e._mouseMove(t) + }), + (this._mouseUpDelegate = function (t) { + return e._mouseUp(t) + }), + this.document + .on( + 'mousemove.' + this.widgetName, + this._mouseMoveDelegate + ) + .on( + 'mouseup.' + this.widgetName, + this._mouseUpDelegate + ), + t.preventDefault(), + (f = !0))) + : !0 + } + }, + _mouseMove: function (t) { + if (this._mouseMoved) { + if ( + x.ui.ie && + (!document.documentMode || document.documentMode < 9) && + !t.button + ) + return this._mouseUp(t) + if (!t.which) + if ( + t.originalEvent.altKey || + t.originalEvent.ctrlKey || + t.originalEvent.metaKey || + t.originalEvent.shiftKey + ) + this.ignoreMissingWhich = !0 + else if (!this.ignoreMissingWhich) return this._mouseUp(t) + } + return ( + (t.which || t.button) && (this._mouseMoved = !0), + this._mouseStarted + ? (this._mouseDrag(t), t.preventDefault()) + : (this._mouseDistanceMet(t) && + this._mouseDelayMet(t) && + ((this._mouseStarted = + !1 !== this._mouseStart(this._mouseDownEvent, t)), + this._mouseStarted + ? this._mouseDrag(t) + : this._mouseUp(t)), + !this._mouseStarted) + ) + }, + _mouseUp: function (t) { + this.document + .off('mousemove.' + this.widgetName, this._mouseMoveDelegate) + .off('mouseup.' + this.widgetName, this._mouseUpDelegate), + this._mouseStarted && + ((this._mouseStarted = !1), + t.target === this._mouseDownEvent.target && + x.data( + t.target, + this.widgetName + '.preventClickEvent', + !0 + ), + this._mouseStop(t)), + this._mouseDelayTimer && + (clearTimeout(this._mouseDelayTimer), + delete this._mouseDelayTimer), + (this.ignoreMissingWhich = !1), + (f = !1), + t.preventDefault() + }, + _mouseDistanceMet: function (t) { + return ( + Math.max( + Math.abs(this._mouseDownEvent.pageX - t.pageX), + Math.abs(this._mouseDownEvent.pageY - t.pageY) + ) >= this.options.distance + ) + }, + _mouseDelayMet: function () { + return this.mouseDelayMet + }, + _mouseStart: function () {}, + _mouseDrag: function () {}, + _mouseStop: function () {}, + _mouseCapture: function () { + return !0 + }, + }), + (x.ui.plugin = { + add: function (t, e, i) { + var s, + o = x.ui[t].prototype + for (s in i) + (o.plugins[s] = o.plugins[s] || []), + o.plugins[s].push([e, i[s]]) + }, + call: function (t, e, i, s) { + var o, + n = t.plugins[e] + if ( + n && + (s || + (t.element[0].parentNode && + 11 !== t.element[0].parentNode.nodeType)) + ) + for (o = 0; o < n.length; o++) + t.options[n[o][0]] && n[o][1].apply(t.element, i) + }, + }), + (x.ui.safeActiveElement = function (e) { + var i + try { + i = e.activeElement + } catch (t) { + i = e.body + } + return (i = !(i = i || e.body).nodeName ? e.body : i) + }), + (x.ui.safeBlur = function (t) { + t && 'body' !== t.nodeName.toLowerCase() && x(t).trigger('blur') + }) + x.widget('ui.draggable', x.ui.mouse, { + version: '1.13.1', + widgetEventPrefix: 'drag', + options: { + addClasses: !0, + appendTo: 'parent', + axis: !1, + connectToSortable: !1, + containment: !1, + cursor: 'auto', + cursorAt: !1, + grid: !1, + handle: !1, + helper: 'original', + iframeFix: !1, + opacity: !1, + refreshPositions: !1, + revert: !1, + revertDuration: 500, + scope: 'default', + scroll: !0, + scrollSensitivity: 20, + scrollSpeed: 20, + snap: !1, + snapMode: 'both', + snapTolerance: 20, + stack: !1, + zIndex: !1, + drag: null, + start: null, + stop: null, + }, + _create: function () { + 'original' === this.options.helper && this._setPositionRelative(), + this.options.addClasses && this._addClass('ui-draggable'), + this._setHandleClassName(), + this._mouseInit() + }, + _setOption: function (t, e) { + this._super(t, e), + 'handle' === t && + (this._removeHandleClassName(), this._setHandleClassName()) + }, + _destroy: function () { + ;(this.helper || this.element).is('.ui-draggable-dragging') + ? (this.destroyOnClear = !0) + : (this._removeHandleClassName(), this._mouseDestroy()) + }, + _mouseCapture: function (t) { + var e = this.options + return ( + !( + this.helper || + e.disabled || + 0 < x(t.target).closest('.ui-resizable-handle').length + ) && + ((this.handle = this._getHandle(t)), + !!this.handle && + (this._blurActiveElement(t), + this._blockFrames( + !0 === e.iframeFix ? 'iframe' : e.iframeFix + ), + !0)) + ) + }, + _blockFrames: function (t) { + this.iframeBlocks = this.document.find(t).map(function () { + var t = x(this) + return x('
') + .css('position', 'absolute') + .appendTo(t.parent()) + .outerWidth(t.outerWidth()) + .outerHeight(t.outerHeight()) + .offset(t.offset())[0] + }) + }, + _unblockFrames: function () { + this.iframeBlocks && + (this.iframeBlocks.remove(), delete this.iframeBlocks) + }, + _blurActiveElement: function (t) { + var e = x.ui.safeActiveElement(this.document[0]) + x(t.target).closest(e).length || x.ui.safeBlur(e) + }, + _mouseStart: function (t) { + var e = this.options + return ( + (this.helper = this._createHelper(t)), + this._addClass(this.helper, 'ui-draggable-dragging'), + this._cacheHelperProportions(), + x.ui.ddmanager && (x.ui.ddmanager.current = this), + this._cacheMargins(), + (this.cssPosition = this.helper.css('position')), + (this.scrollParent = this.helper.scrollParent(!0)), + (this.offsetParent = this.helper.offsetParent()), + (this.hasFixedAncestor = + 0 < + this.helper.parents().filter(function () { + return 'fixed' === x(this).css('position') + }).length), + (this.positionAbs = this.element.offset()), + this._refreshOffsets(t), + (this.originalPosition = this.position = + this._generatePosition(t, !1)), + (this.originalPageX = t.pageX), + (this.originalPageY = t.pageY), + e.cursorAt && this._adjustOffsetFromHelper(e.cursorAt), + this._setContainment(), + !1 === this._trigger('start', t) + ? (this._clear(), !1) + : (this._cacheHelperProportions(), + x.ui.ddmanager && + !e.dropBehaviour && + x.ui.ddmanager.prepareOffsets(this, t), + this._mouseDrag(t, !0), + x.ui.ddmanager && x.ui.ddmanager.dragStart(this, t), + !0) + ) + }, + _refreshOffsets: function (t) { + ;(this.offset = { + top: this.positionAbs.top - this.margins.top, + left: this.positionAbs.left - this.margins.left, + scroll: !1, + parent: this._getParentOffset(), + relative: this._getRelativeOffset(), + }), + (this.offset.click = { + left: t.pageX - this.offset.left, + top: t.pageY - this.offset.top, + }) + }, + _mouseDrag: function (t, e) { + if ( + (this.hasFixedAncestor && + (this.offset.parent = this._getParentOffset()), + (this.position = this._generatePosition(t, !0)), + (this.positionAbs = this._convertPositionTo('absolute')), + !e) + ) { + e = this._uiHash() + if (!1 === this._trigger('drag', t, e)) + return this._mouseUp(new x.Event('mouseup', t)), !1 + this.position = e.position + } + return ( + (this.helper[0].style.left = this.position.left + 'px'), + (this.helper[0].style.top = this.position.top + 'px'), + x.ui.ddmanager && x.ui.ddmanager.drag(this, t), + !1 + ) + }, + _mouseStop: function (t) { + var e = this, + i = !1 + return ( + x.ui.ddmanager && + !this.options.dropBehaviour && + (i = x.ui.ddmanager.drop(this, t)), + this.dropped && ((i = this.dropped), (this.dropped = !1)), + ('invalid' === this.options.revert && !i) || + ('valid' === this.options.revert && i) || + !0 === this.options.revert || + ('function' == typeof this.options.revert && + this.options.revert.call(this.element, i)) + ? x(this.helper).animate( + this.originalPosition, + parseInt(this.options.revertDuration, 10), + function () { + !1 !== e._trigger('stop', t) && e._clear() + } + ) + : !1 !== this._trigger('stop', t) && this._clear(), + !1 + ) + }, + _mouseUp: function (t) { + return ( + this._unblockFrames(), + x.ui.ddmanager && x.ui.ddmanager.dragStop(this, t), + this.handleElement.is(t.target) && + this.element.trigger('focus'), + x.ui.mouse.prototype._mouseUp.call(this, t) + ) + }, + cancel: function () { + return ( + this.helper.is('.ui-draggable-dragging') + ? this._mouseUp( + new x.Event('mouseup', { target: this.element[0] }) + ) + : this._clear(), + this + ) + }, + _getHandle: function (t) { + return ( + !this.options.handle || + !!x(t.target).closest(this.element.find(this.options.handle)) + .length + ) + }, + _setHandleClassName: function () { + ;(this.handleElement = this.options.handle + ? this.element.find(this.options.handle) + : this.element), + this._addClass(this.handleElement, 'ui-draggable-handle') + }, + _removeHandleClassName: function () { + this._removeClass(this.handleElement, 'ui-draggable-handle') + }, + _createHelper: function (t) { + var e = this.options, + i = 'function' == typeof e.helper, + t = i + ? x(e.helper.apply(this.element[0], [t])) + : 'clone' === e.helper + ? this.element.clone().removeAttr('id') + : this.element + return ( + t.parents('body').length || + t.appendTo( + 'parent' === e.appendTo + ? this.element[0].parentNode + : e.appendTo + ), + i && t[0] === this.element[0] && this._setPositionRelative(), + t[0] === this.element[0] || + /(fixed|absolute)/.test(t.css('position')) || + t.css('position', 'absolute'), + t + ) + }, + _setPositionRelative: function () { + ;/^(?:r|a|f)/.test(this.element.css('position')) || + (this.element[0].style.position = 'relative') + }, + _adjustOffsetFromHelper: function (t) { + 'string' == typeof t && (t = t.split(' ')), + 'left' in + (t = Array.isArray(t) + ? { left: +t[0], top: +t[1] || 0 } + : t) && + (this.offset.click.left = t.left + this.margins.left), + 'right' in t && + (this.offset.click.left = + this.helperProportions.width - + t.right + + this.margins.left), + 'top' in t && + (this.offset.click.top = t.top + this.margins.top), + 'bottom' in t && + (this.offset.click.top = + this.helperProportions.height - + t.bottom + + this.margins.top) + }, + _isRootNode: function (t) { + return /(html|body)/i.test(t.tagName) || t === this.document[0] + }, + _getParentOffset: function () { + var t = this.offsetParent.offset(), + e = this.document[0] + return ( + 'absolute' === this.cssPosition && + this.scrollParent[0] !== e && + x.contains(this.scrollParent[0], this.offsetParent[0]) && + ((t.left += this.scrollParent.scrollLeft()), + (t.top += this.scrollParent.scrollTop())), + { + top: + (t = this._isRootNode(this.offsetParent[0]) + ? { top: 0, left: 0 } + : t).top + + (parseInt( + this.offsetParent.css('borderTopWidth'), + 10 + ) || 0), + left: + t.left + + (parseInt( + this.offsetParent.css('borderLeftWidth'), + 10 + ) || 0), + } + ) + }, + _getRelativeOffset: function () { + if ('relative' !== this.cssPosition) return { top: 0, left: 0 } + var t = this.element.position(), + e = this._isRootNode(this.scrollParent[0]) + return { + top: + t.top - + (parseInt(this.helper.css('top'), 10) || 0) + + (e ? 0 : this.scrollParent.scrollTop()), + left: + t.left - + (parseInt(this.helper.css('left'), 10) || 0) + + (e ? 0 : this.scrollParent.scrollLeft()), + } + }, + _cacheMargins: function () { + this.margins = { + left: parseInt(this.element.css('marginLeft'), 10) || 0, + top: parseInt(this.element.css('marginTop'), 10) || 0, + right: parseInt(this.element.css('marginRight'), 10) || 0, + bottom: parseInt(this.element.css('marginBottom'), 10) || 0, + } + }, + _cacheHelperProportions: function () { + this.helperProportions = { + width: this.helper.outerWidth(), + height: this.helper.outerHeight(), + } + }, + _setContainment: function () { + var t, + e, + i, + s = this.options, + o = this.document[0] + ;(this.relativeContainer = null), + s.containment + ? 'window' !== s.containment + ? 'document' !== s.containment + ? s.containment.constructor !== Array + ? ('parent' === s.containment && + (s.containment = + this.helper[0].parentNode), + (i = (e = x(s.containment))[0]) && + ((t = /(scroll|auto)/.test( + e.css('overflow') + )), + (this.containment = [ + (parseInt( + e.css('borderLeftWidth'), + 10 + ) || 0) + + (parseInt( + e.css('paddingLeft'), + 10 + ) || 0), + (parseInt( + e.css('borderTopWidth'), + 10 + ) || 0) + + (parseInt( + e.css('paddingTop'), + 10 + ) || 0), + (t + ? Math.max( + i.scrollWidth, + i.offsetWidth + ) + : i.offsetWidth) - + (parseInt( + e.css('borderRightWidth'), + 10 + ) || 0) - + (parseInt( + e.css('paddingRight'), + 10 + ) || 0) - + this.helperProportions.width - + this.margins.left - + this.margins.right, + (t + ? Math.max( + i.scrollHeight, + i.offsetHeight + ) + : i.offsetHeight) - + (parseInt( + e.css('borderBottomWidth'), + 10 + ) || 0) - + (parseInt( + e.css('paddingBottom'), + 10 + ) || 0) - + this.helperProportions.height - + this.margins.top - + this.margins.bottom, + ]), + (this.relativeContainer = e))) + : (this.containment = s.containment) + : (this.containment = [ + 0, + 0, + x(o).width() - + this.helperProportions.width - + this.margins.left, + (x(o).height() || + o.body.parentNode.scrollHeight) - + this.helperProportions.height - + this.margins.top, + ]) + : (this.containment = [ + x(window).scrollLeft() - + this.offset.relative.left - + this.offset.parent.left, + x(window).scrollTop() - + this.offset.relative.top - + this.offset.parent.top, + x(window).scrollLeft() + + x(window).width() - + this.helperProportions.width - + this.margins.left, + x(window).scrollTop() + + (x(window).height() || + o.body.parentNode.scrollHeight) - + this.helperProportions.height - + this.margins.top, + ]) + : (this.containment = null) + }, + _convertPositionTo: function (t, e) { + e = e || this.position + var i = 'absolute' === t ? 1 : -1, + t = this._isRootNode(this.scrollParent[0]) + return { + top: + e.top + + this.offset.relative.top * i + + this.offset.parent.top * i - + ('fixed' === this.cssPosition + ? -this.offset.scroll.top + : t + ? 0 + : this.offset.scroll.top) * + i, + left: + e.left + + this.offset.relative.left * i + + this.offset.parent.left * i - + ('fixed' === this.cssPosition + ? -this.offset.scroll.left + : t + ? 0 + : this.offset.scroll.left) * + i, + } + }, + _generatePosition: function (t, e) { + var i, + s = this.options, + o = this._isRootNode(this.scrollParent[0]), + n = t.pageX, + r = t.pageY + return ( + (o && this.offset.scroll) || + (this.offset.scroll = { + top: this.scrollParent.scrollTop(), + left: this.scrollParent.scrollLeft(), + }), + e && + (this.containment && + ((i = this.relativeContainer + ? ((i = this.relativeContainer.offset()), + [ + this.containment[0] + i.left, + this.containment[1] + i.top, + this.containment[2] + i.left, + this.containment[3] + i.top, + ]) + : this.containment), + t.pageX - this.offset.click.left < i[0] && + (n = i[0] + this.offset.click.left), + t.pageY - this.offset.click.top < i[1] && + (r = i[1] + this.offset.click.top), + t.pageX - this.offset.click.left > i[2] && + (n = i[2] + this.offset.click.left), + t.pageY - this.offset.click.top > i[3] && + (r = i[3] + this.offset.click.top)), + s.grid && + ((t = s.grid[1] + ? this.originalPageY + + Math.round((r - this.originalPageY) / s.grid[1]) * + s.grid[1] + : this.originalPageY), + (r = + !i || + t - this.offset.click.top >= i[1] || + t - this.offset.click.top > i[3] + ? t + : t - this.offset.click.top >= i[1] + ? t - s.grid[1] + : t + s.grid[1]), + (t = s.grid[0] + ? this.originalPageX + + Math.round((n - this.originalPageX) / s.grid[0]) * + s.grid[0] + : this.originalPageX), + (n = + !i || + t - this.offset.click.left >= i[0] || + t - this.offset.click.left > i[2] + ? t + : t - this.offset.click.left >= i[0] + ? t - s.grid[0] + : t + s.grid[0])), + 'y' === s.axis && (n = this.originalPageX), + 'x' === s.axis && (r = this.originalPageY)), + { + top: + r - + this.offset.click.top - + this.offset.relative.top - + this.offset.parent.top + + ('fixed' === this.cssPosition + ? -this.offset.scroll.top + : o + ? 0 + : this.offset.scroll.top), + left: + n - + this.offset.click.left - + this.offset.relative.left - + this.offset.parent.left + + ('fixed' === this.cssPosition + ? -this.offset.scroll.left + : o + ? 0 + : this.offset.scroll.left), + } + ) + }, + _clear: function () { + this._removeClass(this.helper, 'ui-draggable-dragging'), + this.helper[0] === this.element[0] || + this.cancelHelperRemoval || + this.helper.remove(), + (this.helper = null), + (this.cancelHelperRemoval = !1), + this.destroyOnClear && this.destroy() + }, + _trigger: function (t, e, i) { + return ( + (i = i || this._uiHash()), + x.ui.plugin.call(this, t, [e, i, this], !0), + /^(drag|start|stop)/.test(t) && + ((this.positionAbs = this._convertPositionTo('absolute')), + (i.offset = this.positionAbs)), + x.Widget.prototype._trigger.call(this, t, e, i) + ) + }, + plugins: {}, + _uiHash: function () { + return { + helper: this.helper, + position: this.position, + originalPosition: this.originalPosition, + offset: this.positionAbs, + } + }, + }), + x.ui.plugin.add('draggable', 'connectToSortable', { + start: function (e, t, i) { + var s = x.extend({}, t, { item: i.element }) + ;(i.sortables = []), + x(i.options.connectToSortable).each(function () { + var t = x(this).sortable('instance') + t && + !t.options.disabled && + (i.sortables.push(t), + t.refreshPositions(), + t._trigger('activate', e, s)) + }) + }, + stop: function (e, t, i) { + var s = x.extend({}, t, { item: i.element }) + ;(i.cancelHelperRemoval = !1), + x.each(i.sortables, function () { + var t = this + t.isOver + ? ((t.isOver = 0), + (i.cancelHelperRemoval = !0), + (t.cancelHelperRemoval = !1), + (t._storedCSS = { + position: t.placeholder.css('position'), + top: t.placeholder.css('top'), + left: t.placeholder.css('left'), + }), + t._mouseStop(e), + (t.options.helper = t.options._helper)) + : ((t.cancelHelperRemoval = !0), + t._trigger('deactivate', e, s)) + }) + }, + drag: function (i, s, o) { + x.each(o.sortables, function () { + var t = !1, + e = this + ;(e.positionAbs = o.positionAbs), + (e.helperProportions = o.helperProportions), + (e.offset.click = o.offset.click), + e._intersectsWith(e.containerCache) && + ((t = !0), + x.each(o.sortables, function () { + return ( + (this.positionAbs = o.positionAbs), + (this.helperProportions = + o.helperProportions), + (this.offset.click = o.offset.click), + (t = + this !== e && + this._intersectsWith( + this.containerCache + ) && + x.contains( + e.element[0], + this.element[0] + ) + ? !1 + : t) + ) + })), + t + ? (e.isOver || + ((e.isOver = 1), + (o._parent = s.helper.parent()), + (e.currentItem = s.helper + .appendTo(e.element) + .data('ui-sortable-item', !0)), + (e.options._helper = e.options.helper), + (e.options.helper = function () { + return s.helper[0] + }), + (i.target = e.currentItem[0]), + e._mouseCapture(i, !0), + e._mouseStart(i, !0, !0), + (e.offset.click.top = o.offset.click.top), + (e.offset.click.left = o.offset.click.left), + (e.offset.parent.left -= + o.offset.parent.left - + e.offset.parent.left), + (e.offset.parent.top -= + o.offset.parent.top - + e.offset.parent.top), + o._trigger('toSortable', i), + (o.dropped = e.element), + x.each(o.sortables, function () { + this.refreshPositions() + }), + (o.currentItem = o.element), + (e.fromOutside = o)), + e.currentItem && + (e._mouseDrag(i), (s.position = e.position))) + : e.isOver && + ((e.isOver = 0), + (e.cancelHelperRemoval = !0), + (e.options._revert = e.options.revert), + (e.options.revert = !1), + e._trigger('out', i, e._uiHash(e)), + e._mouseStop(i, !0), + (e.options.revert = e.options._revert), + (e.options.helper = e.options._helper), + e.placeholder && e.placeholder.remove(), + s.helper.appendTo(o._parent), + o._refreshOffsets(i), + (s.position = o._generatePosition(i, !0)), + o._trigger('fromSortable', i), + (o.dropped = !1), + x.each(o.sortables, function () { + this.refreshPositions() + })) + }) + }, + }), + x.ui.plugin.add('draggable', 'cursor', { + start: function (t, e, i) { + var s = x('body'), + i = i.options + s.css('cursor') && (i._cursor = s.css('cursor')), + s.css('cursor', i.cursor) + }, + stop: function (t, e, i) { + i = i.options + i._cursor && x('body').css('cursor', i._cursor) + }, + }), + x.ui.plugin.add('draggable', 'opacity', { + start: function (t, e, i) { + ;(e = x(e.helper)), (i = i.options) + e.css('opacity') && (i._opacity = e.css('opacity')), + e.css('opacity', i.opacity) + }, + stop: function (t, e, i) { + i = i.options + i._opacity && x(e.helper).css('opacity', i._opacity) + }, + }), + x.ui.plugin.add('draggable', 'scroll', { + start: function (t, e, i) { + i.scrollParentNotHidden || + (i.scrollParentNotHidden = i.helper.scrollParent(!1)), + i.scrollParentNotHidden[0] !== i.document[0] && + 'HTML' !== i.scrollParentNotHidden[0].tagName && + (i.overflowOffset = i.scrollParentNotHidden.offset()) + }, + drag: function (t, e, i) { + var s = i.options, + o = !1, + n = i.scrollParentNotHidden[0], + r = i.document[0] + n !== r && 'HTML' !== n.tagName + ? ((s.axis && 'x' === s.axis) || + (i.overflowOffset.top + n.offsetHeight - t.pageY < + s.scrollSensitivity + ? (n.scrollTop = o = n.scrollTop + s.scrollSpeed) + : t.pageY - i.overflowOffset.top < + s.scrollSensitivity && + (n.scrollTop = o = + n.scrollTop - s.scrollSpeed)), + (s.axis && 'y' === s.axis) || + (i.overflowOffset.left + n.offsetWidth - t.pageX < + s.scrollSensitivity + ? (n.scrollLeft = o = + n.scrollLeft + s.scrollSpeed) + : t.pageX - i.overflowOffset.left < + s.scrollSensitivity && + (n.scrollLeft = o = + n.scrollLeft - s.scrollSpeed))) + : ((s.axis && 'x' === s.axis) || + (t.pageY - x(r).scrollTop() < s.scrollSensitivity + ? (o = x(r).scrollTop( + x(r).scrollTop() - s.scrollSpeed + )) + : x(window).height() - + (t.pageY - x(r).scrollTop()) < + s.scrollSensitivity && + (o = x(r).scrollTop( + x(r).scrollTop() + s.scrollSpeed + ))), + (s.axis && 'y' === s.axis) || + (t.pageX - x(r).scrollLeft() < s.scrollSensitivity + ? (o = x(r).scrollLeft( + x(r).scrollLeft() - s.scrollSpeed + )) + : x(window).width() - + (t.pageX - x(r).scrollLeft()) < + s.scrollSensitivity && + (o = x(r).scrollLeft( + x(r).scrollLeft() + s.scrollSpeed + )))), + !1 !== o && + x.ui.ddmanager && + !s.dropBehaviour && + x.ui.ddmanager.prepareOffsets(i, t) + }, + }), + x.ui.plugin.add('draggable', 'snap', { + start: function (t, e, i) { + var s = i.options + ;(i.snapElements = []), + x( + s.snap.constructor !== String + ? s.snap.items || ':data(ui-draggable)' + : s.snap + ).each(function () { + var t = x(this), + e = t.offset() + this !== i.element[0] && + i.snapElements.push({ + item: this, + width: t.outerWidth(), + height: t.outerHeight(), + top: e.top, + left: e.left, + }) + }) + }, + drag: function (t, e, i) { + for ( + var s, + o, + n, + r, + a, + h, + l, + c, + p, + u = i.options, + d = u.snapTolerance, + f = e.offset.left, + g = f + i.helperProportions.width, + m = e.offset.top, + v = m + i.helperProportions.height, + _ = i.snapElements.length - 1; + 0 <= _; + _-- + ) + (h = + (a = i.snapElements[_].left - i.margins.left) + + i.snapElements[_].width), + (c = + (l = i.snapElements[_].top - i.margins.top) + + i.snapElements[_].height), + g < a - d || + h + d < f || + v < l - d || + c + d < m || + !x.contains( + i.snapElements[_].item.ownerDocument, + i.snapElements[_].item + ) + ? (i.snapElements[_].snapping && + i.options.snap.release && + i.options.snap.release.call( + i.element, + t, + x.extend(i._uiHash(), { + snapItem: i.snapElements[_].item, + }) + ), + (i.snapElements[_].snapping = !1)) + : ('inner' !== u.snapMode && + ((s = Math.abs(l - v) <= d), + (o = Math.abs(c - m) <= d), + (n = Math.abs(a - g) <= d), + (r = Math.abs(h - f) <= d), + s && + (e.position.top = i._convertPositionTo( + 'relative', + { + top: + l - + i.helperProportions.height, + left: 0, + } + ).top), + o && + (e.position.top = i._convertPositionTo( + 'relative', + { top: c, left: 0 } + ).top), + n && + (e.position.left = i._convertPositionTo( + 'relative', + { + top: 0, + left: + a - i.helperProportions.width, + } + ).left), + r && + (e.position.left = i._convertPositionTo( + 'relative', + { top: 0, left: h } + ).left)), + (p = s || o || n || r), + 'outer' !== u.snapMode && + ((s = Math.abs(l - m) <= d), + (o = Math.abs(c - v) <= d), + (n = Math.abs(a - f) <= d), + (r = Math.abs(h - g) <= d), + s && + (e.position.top = i._convertPositionTo( + 'relative', + { top: l, left: 0 } + ).top), + o && + (e.position.top = i._convertPositionTo( + 'relative', + { + top: + c - + i.helperProportions.height, + left: 0, + } + ).top), + n && + (e.position.left = i._convertPositionTo( + 'relative', + { top: 0, left: a } + ).left), + r && + (e.position.left = i._convertPositionTo( + 'relative', + { + top: 0, + left: + h - i.helperProportions.width, + } + ).left)), + !i.snapElements[_].snapping && + (s || o || n || r || p) && + i.options.snap.snap && + i.options.snap.snap.call( + i.element, + t, + x.extend(i._uiHash(), { + snapItem: i.snapElements[_].item, + }) + ), + (i.snapElements[_].snapping = + s || o || n || r || p)) + }, + }), + x.ui.plugin.add('draggable', 'stack', { + start: function (t, e, i) { + var s, + i = i.options, + i = x.makeArray(x(i.stack)).sort(function (t, e) { + return ( + (parseInt(x(t).css('zIndex'), 10) || 0) - + (parseInt(x(e).css('zIndex'), 10) || 0) + ) + }) + i.length && + ((s = parseInt(x(i[0]).css('zIndex'), 10) || 0), + x(i).each(function (t) { + x(this).css('zIndex', s + t) + }), + this.css('zIndex', s + i.length)) + }, + }), + x.ui.plugin.add('draggable', 'zIndex', { + start: function (t, e, i) { + ;(e = x(e.helper)), (i = i.options) + e.css('zIndex') && (i._zIndex = e.css('zIndex')), + e.css('zIndex', i.zIndex) + }, + stop: function (t, e, i) { + i = i.options + i._zIndex && x(e.helper).css('zIndex', i._zIndex) + }, + }) + x.ui.draggable + x.widget('ui.resizable', x.ui.mouse, { + version: '1.13.1', + widgetEventPrefix: 'resize', + options: { + alsoResize: !1, + animate: !1, + animateDuration: 'slow', + animateEasing: 'swing', + aspectRatio: !1, + autoHide: !1, + classes: { + 'ui-resizable-se': 'ui-icon ui-icon-gripsmall-diagonal-se', + }, + containment: !1, + ghost: !1, + grid: !1, + handles: 'e,s,se', + helper: !1, + maxHeight: null, + maxWidth: null, + minHeight: 10, + minWidth: 10, + zIndex: 90, + resize: null, + start: null, + stop: null, + }, + _num: function (t) { + return parseFloat(t) || 0 + }, + _isNumber: function (t) { + return !isNaN(parseFloat(t)) + }, + _hasScroll: function (t, e) { + if ('hidden' === x(t).css('overflow')) return !1 + var i = e && 'left' === e ? 'scrollLeft' : 'scrollTop', + e = !1 + if (0 < t[i]) return !0 + try { + ;(t[i] = 1), (e = 0 < t[i]), (t[i] = 0) + } catch (t) {} + return e + }, + _create: function () { + var t, + e = this.options, + i = this + this._addClass('ui-resizable'), + x.extend(this, { + _aspectRatio: !!e.aspectRatio, + aspectRatio: e.aspectRatio, + originalElement: this.element, + _proportionallyResizeElements: [], + _helper: + e.helper || e.ghost || e.animate + ? e.helper || 'ui-resizable-helper' + : null, + }), + this.element[0].nodeName.match( + /^(canvas|textarea|input|select|button|img)$/i + ) && + (this.element.wrap( + x("
").css({ + overflow: 'hidden', + position: this.element.css('position'), + width: this.element.outerWidth(), + height: this.element.outerHeight(), + top: this.element.css('top'), + left: this.element.css('left'), + }) + ), + (this.element = this.element + .parent() + .data( + 'ui-resizable', + this.element.resizable('instance') + )), + (this.elementIsWrapper = !0), + (t = { + marginTop: this.originalElement.css('marginTop'), + marginRight: this.originalElement.css('marginRight'), + marginBottom: this.originalElement.css('marginBottom'), + marginLeft: this.originalElement.css('marginLeft'), + }), + this.element.css(t), + this.originalElement.css('margin', 0), + (this.originalResizeStyle = + this.originalElement.css('resize')), + this.originalElement.css('resize', 'none'), + this._proportionallyResizeElements.push( + this.originalElement.css({ + position: 'static', + zoom: 1, + display: 'block', + }) + ), + this.originalElement.css(t), + this._proportionallyResize()), + this._setupHandles(), + e.autoHide && + x(this.element) + .on('mouseenter', function () { + e.disabled || + (i._removeClass('ui-resizable-autohide'), + i._handles.show()) + }) + .on('mouseleave', function () { + e.disabled || + i.resizing || + (i._addClass('ui-resizable-autohide'), + i._handles.hide()) + }), + this._mouseInit() + }, + _destroy: function () { + this._mouseDestroy(), this._addedHandles.remove() + function t(t) { + x(t) + .removeData('resizable') + .removeData('ui-resizable') + .off('.resizable') + } + var e + return ( + this.elementIsWrapper && + (t(this.element), + (e = this.element), + this.originalElement + .css({ + position: e.css('position'), + width: e.outerWidth(), + height: e.outerHeight(), + top: e.css('top'), + left: e.css('left'), + }) + .insertAfter(e), + e.remove()), + this.originalElement.css('resize', this.originalResizeStyle), + t(this.originalElement), + this + ) + }, + _setOption: function (t, e) { + switch ((this._super(t, e), t)) { + case 'handles': + this._removeHandles(), this._setupHandles() + break + case 'aspectRatio': + this._aspectRatio = !!e + } + }, + _setupHandles: function () { + var t, + e, + i, + s, + o, + n = this.options, + r = this + if ( + ((this.handles = + n.handles || + (x('.ui-resizable-handle', this.element).length + ? { + n: '.ui-resizable-n', + e: '.ui-resizable-e', + s: '.ui-resizable-s', + w: '.ui-resizable-w', + se: '.ui-resizable-se', + sw: '.ui-resizable-sw', + ne: '.ui-resizable-ne', + nw: '.ui-resizable-nw', + } + : 'e,s,se')), + (this._handles = x()), + (this._addedHandles = x()), + this.handles.constructor === String) + ) + for ( + 'all' === this.handles && + (this.handles = 'n,e,s,w,se,sw,ne,nw'), + i = this.handles.split(','), + this.handles = {}, + e = 0; + e < i.length; + e++ + ) + (s = + 'ui-resizable-' + + (t = String.prototype.trim.call(i[e]))), + (o = x('
')), + this._addClass(o, 'ui-resizable-handle ' + s), + o.css({ zIndex: n.zIndex }), + (this.handles[t] = '.ui-resizable-' + t), + this.element.children(this.handles[t]).length || + (this.element.append(o), + (this._addedHandles = this._addedHandles.add(o))) + ;(this._renderAxis = function (t) { + var e, i, s + for (e in ((t = t || this.element), this.handles)) + this.handles[e].constructor === String + ? (this.handles[e] = this.element + .children(this.handles[e]) + .first() + .show()) + : (this.handles[e].jquery || + this.handles[e].nodeType) && + ((this.handles[e] = x(this.handles[e])), + this._on(this.handles[e], { + mousedown: r._mouseDown, + })), + this.elementIsWrapper && + this.originalElement[0].nodeName.match( + /^(textarea|input|select|button)$/i + ) && + ((i = x(this.handles[e], this.element)), + (s = /sw|ne|nw|se|n|s/.test(e) + ? i.outerHeight() + : i.outerWidth()), + (i = [ + 'padding', + /ne|nw|n/.test(e) + ? 'Top' + : /se|sw|s/.test(e) + ? 'Bottom' + : /^e$/.test(e) + ? 'Right' + : 'Left', + ].join('')), + t.css(i, s), + this._proportionallyResize()), + (this._handles = this._handles.add(this.handles[e])) + }), + this._renderAxis(this.element), + (this._handles = this._handles.add( + this.element.find('.ui-resizable-handle') + )), + this._handles.disableSelection(), + this._handles.on('mouseover', function () { + r.resizing || + (this.className && + (o = this.className.match( + /ui-resizable-(se|sw|ne|nw|n|e|s|w)/i + )), + (r.axis = o && o[1] ? o[1] : 'se')) + }), + n.autoHide && + (this._handles.hide(), + this._addClass('ui-resizable-autohide')) + }, + _removeHandles: function () { + this._addedHandles.remove() + }, + _mouseCapture: function (t) { + var e, + i, + s = !1 + for (e in this.handles) + ((i = x(this.handles[e])[0]) !== t.target && + !x.contains(i, t.target)) || + (s = !0) + return !this.options.disabled && s + }, + _mouseStart: function (t) { + var e, + i, + s = this.options, + o = this.element + return ( + (this.resizing = !0), + this._renderProxy(), + (e = this._num(this.helper.css('left'))), + (i = this._num(this.helper.css('top'))), + s.containment && + ((e += x(s.containment).scrollLeft() || 0), + (i += x(s.containment).scrollTop() || 0)), + (this.offset = this.helper.offset()), + (this.position = { left: e, top: i }), + (this.size = this._helper + ? { + width: this.helper.width(), + height: this.helper.height(), + } + : { width: o.width(), height: o.height() }), + (this.originalSize = this._helper + ? { width: o.outerWidth(), height: o.outerHeight() } + : { width: o.width(), height: o.height() }), + (this.sizeDiff = { + width: o.outerWidth() - o.width(), + height: o.outerHeight() - o.height(), + }), + (this.originalPosition = { left: e, top: i }), + (this.originalMousePosition = { left: t.pageX, top: t.pageY }), + (this.aspectRatio = + 'number' == typeof s.aspectRatio + ? s.aspectRatio + : this.originalSize.width / this.originalSize.height || + 1), + (s = x('.ui-resizable-' + this.axis).css('cursor')), + x('body').css( + 'cursor', + 'auto' === s ? this.axis + '-resize' : s + ), + this._addClass('ui-resizable-resizing'), + this._propagate('start', t), + !0 + ) + }, + _mouseDrag: function (t) { + var e = this.originalMousePosition, + i = this.axis, + s = t.pageX - e.left || 0, + e = t.pageY - e.top || 0, + i = this._change[i] + return ( + this._updatePrevProperties(), + i && + ((e = i.apply(this, [t, s, e])), + this._updateVirtualBoundaries(t.shiftKey), + (this._aspectRatio || t.shiftKey) && + (e = this._updateRatio(e, t)), + (e = this._respectSize(e, t)), + this._updateCache(e), + this._propagate('resize', t), + (e = this._applyChanges()), + !this._helper && + this._proportionallyResizeElements.length && + this._proportionallyResize(), + x.isEmptyObject(e) || + (this._updatePrevProperties(), + this._trigger('resize', t, this.ui()), + this._applyChanges())), + !1 + ) + }, + _mouseStop: function (t) { + this.resizing = !1 + var e, + i, + s, + o = this.options, + n = this + return ( + this._helper && + ((s = + (e = + (i = this._proportionallyResizeElements).length && + /textarea/i.test(i[0].nodeName)) && + this._hasScroll(i[0], 'left') + ? 0 + : n.sizeDiff.height), + (i = e ? 0 : n.sizeDiff.width), + (e = { + width: n.helper.width() - i, + height: n.helper.height() - s, + }), + (i = + parseFloat(n.element.css('left')) + + (n.position.left - n.originalPosition.left) || + null), + (s = + parseFloat(n.element.css('top')) + + (n.position.top - n.originalPosition.top) || null), + o.animate || + this.element.css(x.extend(e, { top: s, left: i })), + n.helper.height(n.size.height), + n.helper.width(n.size.width), + this._helper && !o.animate && this._proportionallyResize()), + x('body').css('cursor', 'auto'), + this._removeClass('ui-resizable-resizing'), + this._propagate('stop', t), + this._helper && this.helper.remove(), + !1 + ) + }, + _updatePrevProperties: function () { + ;(this.prevPosition = { + top: this.position.top, + left: this.position.left, + }), + (this.prevSize = { + width: this.size.width, + height: this.size.height, + }) + }, + _applyChanges: function () { + var t = {} + return ( + this.position.top !== this.prevPosition.top && + (t.top = this.position.top + 'px'), + this.position.left !== this.prevPosition.left && + (t.left = this.position.left + 'px'), + this.size.width !== this.prevSize.width && + (t.width = this.size.width + 'px'), + this.size.height !== this.prevSize.height && + (t.height = this.size.height + 'px'), + this.helper.css(t), + t + ) + }, + _updateVirtualBoundaries: function (t) { + var e, + i, + s = this.options, + o = { + minWidth: this._isNumber(s.minWidth) ? s.minWidth : 0, + maxWidth: this._isNumber(s.maxWidth) ? s.maxWidth : 1 / 0, + minHeight: this._isNumber(s.minHeight) ? s.minHeight : 0, + maxHeight: this._isNumber(s.maxHeight) + ? s.maxHeight + : 1 / 0, + } + ;(this._aspectRatio || t) && + ((e = o.minHeight * this.aspectRatio), + (i = o.minWidth / this.aspectRatio), + (s = o.maxHeight * this.aspectRatio), + (t = o.maxWidth / this.aspectRatio), + e > o.minWidth && (o.minWidth = e), + i > o.minHeight && (o.minHeight = i), + s < o.maxWidth && (o.maxWidth = s), + t < o.maxHeight && (o.maxHeight = t)), + (this._vBoundaries = o) + }, + _updateCache: function (t) { + ;(this.offset = this.helper.offset()), + this._isNumber(t.left) && (this.position.left = t.left), + this._isNumber(t.top) && (this.position.top = t.top), + this._isNumber(t.height) && (this.size.height = t.height), + this._isNumber(t.width) && (this.size.width = t.width) + }, + _updateRatio: function (t) { + var e = this.position, + i = this.size, + s = this.axis + return ( + this._isNumber(t.height) + ? (t.width = t.height * this.aspectRatio) + : this._isNumber(t.width) && + (t.height = t.width / this.aspectRatio), + 'sw' === s && + ((t.left = e.left + (i.width - t.width)), (t.top = null)), + 'nw' === s && + ((t.top = e.top + (i.height - t.height)), + (t.left = e.left + (i.width - t.width))), + t + ) + }, + _respectSize: function (t) { + var e = this._vBoundaries, + i = this.axis, + s = + this._isNumber(t.width) && + e.maxWidth && + e.maxWidth < t.width, + o = + this._isNumber(t.height) && + e.maxHeight && + e.maxHeight < t.height, + n = + this._isNumber(t.width) && + e.minWidth && + e.minWidth > t.width, + r = + this._isNumber(t.height) && + e.minHeight && + e.minHeight > t.height, + a = this.originalPosition.left + this.originalSize.width, + h = this.originalPosition.top + this.originalSize.height, + l = /sw|nw|w/.test(i), + i = /nw|ne|n/.test(i) + return ( + n && (t.width = e.minWidth), + r && (t.height = e.minHeight), + s && (t.width = e.maxWidth), + o && (t.height = e.maxHeight), + n && l && (t.left = a - e.minWidth), + s && l && (t.left = a - e.maxWidth), + r && i && (t.top = h - e.minHeight), + o && i && (t.top = h - e.maxHeight), + t.width || t.height || t.left || !t.top + ? t.width || t.height || t.top || !t.left || (t.left = null) + : (t.top = null), + t + ) + }, + _getPaddingPlusBorderDimensions: function (t) { + for ( + var e = 0, + i = [], + s = [ + t.css('borderTopWidth'), + t.css('borderRightWidth'), + t.css('borderBottomWidth'), + t.css('borderLeftWidth'), + ], + o = [ + t.css('paddingTop'), + t.css('paddingRight'), + t.css('paddingBottom'), + t.css('paddingLeft'), + ]; + e < 4; + e++ + ) + (i[e] = parseFloat(s[e]) || 0), (i[e] += parseFloat(o[e]) || 0) + return { height: i[0] + i[2], width: i[1] + i[3] } + }, + _proportionallyResize: function () { + if (this._proportionallyResizeElements.length) + for ( + var t, e = 0, i = this.helper || this.element; + e < this._proportionallyResizeElements.length; + e++ + ) + (t = this._proportionallyResizeElements[e]), + this.outerDimensions || + (this.outerDimensions = + this._getPaddingPlusBorderDimensions(t)), + t.css({ + height: + i.height() - this.outerDimensions.height || 0, + width: i.width() - this.outerDimensions.width || 0, + }) + }, + _renderProxy: function () { + var t = this.element, + e = this.options + ;(this.elementOffset = t.offset()), + this._helper + ? ((this.helper = + this.helper || + x('
').css({ overflow: 'hidden' })), + this._addClass(this.helper, this._helper), + this.helper.css({ + width: this.element.outerWidth(), + height: this.element.outerHeight(), + position: 'absolute', + left: this.elementOffset.left + 'px', + top: this.elementOffset.top + 'px', + zIndex: ++e.zIndex, + }), + this.helper.appendTo('body').disableSelection()) + : (this.helper = this.element) + }, + _change: { + e: function (t, e) { + return { width: this.originalSize.width + e } + }, + w: function (t, e) { + var i = this.originalSize + return { + left: this.originalPosition.left + e, + width: i.width - e, + } + }, + n: function (t, e, i) { + var s = this.originalSize + return { + top: this.originalPosition.top + i, + height: s.height - i, + } + }, + s: function (t, e, i) { + return { height: this.originalSize.height + i } + }, + se: function (t, e, i) { + return x.extend( + this._change.s.apply(this, arguments), + this._change.e.apply(this, [t, e, i]) + ) + }, + sw: function (t, e, i) { + return x.extend( + this._change.s.apply(this, arguments), + this._change.w.apply(this, [t, e, i]) + ) + }, + ne: function (t, e, i) { + return x.extend( + this._change.n.apply(this, arguments), + this._change.e.apply(this, [t, e, i]) + ) + }, + nw: function (t, e, i) { + return x.extend( + this._change.n.apply(this, arguments), + this._change.w.apply(this, [t, e, i]) + ) + }, + }, + _propagate: function (t, e) { + x.ui.plugin.call(this, t, [e, this.ui()]), + 'resize' !== t && this._trigger(t, e, this.ui()) + }, + plugins: {}, + ui: function () { + return { + originalElement: this.originalElement, + element: this.element, + helper: this.helper, + position: this.position, + size: this.size, + originalSize: this.originalSize, + originalPosition: this.originalPosition, + } + }, + }), + x.ui.plugin.add('resizable', 'animate', { + stop: function (e) { + var i = x(this).resizable('instance'), + t = i.options, + s = i._proportionallyResizeElements, + o = s.length && /textarea/i.test(s[0].nodeName), + n = o && i._hasScroll(s[0], 'left') ? 0 : i.sizeDiff.height, + r = o ? 0 : i.sizeDiff.width, + o = { width: i.size.width - r, height: i.size.height - n }, + r = + parseFloat(i.element.css('left')) + + (i.position.left - i.originalPosition.left) || null, + n = + parseFloat(i.element.css('top')) + + (i.position.top - i.originalPosition.top) || null + i.element.animate( + x.extend(o, n && r ? { top: n, left: r } : {}), + { + duration: t.animateDuration, + easing: t.animateEasing, + step: function () { + var t = { + width: parseFloat(i.element.css('width')), + height: parseFloat(i.element.css('height')), + top: parseFloat(i.element.css('top')), + left: parseFloat(i.element.css('left')), + } + s && + s.length && + x(s[0]).css({ + width: t.width, + height: t.height, + }), + i._updateCache(t), + i._propagate('resize', e) + }, + } + ) + }, + }), + x.ui.plugin.add('resizable', 'containment', { + start: function () { + var i, + s, + o = x(this).resizable('instance'), + t = o.options, + e = o.element, + n = t.containment, + r = + n instanceof x + ? n.get(0) + : /parent/.test(n) + ? e.parent().get(0) + : n + r && + ((o.containerElement = x(r)), + /document/.test(n) || n === document + ? ((o.containerOffset = { left: 0, top: 0 }), + (o.containerPosition = { left: 0, top: 0 }), + (o.parentData = { + element: x(document), + left: 0, + top: 0, + width: x(document).width(), + height: + x(document).height() || + document.body.parentNode.scrollHeight, + })) + : ((i = x(r)), + (s = []), + x(['Top', 'Right', 'Left', 'Bottom']).each(function ( + t, + e + ) { + s[t] = o._num(i.css('padding' + e)) + }), + (o.containerOffset = i.offset()), + (o.containerPosition = i.position()), + (o.containerSize = { + height: i.innerHeight() - s[3], + width: i.innerWidth() - s[1], + }), + (t = o.containerOffset), + (e = o.containerSize.height), + (n = o.containerSize.width), + (n = o._hasScroll(r, 'left') ? r.scrollWidth : n), + (e = o._hasScroll(r) ? r.scrollHeight : e), + (o.parentData = { + element: r, + left: t.left, + top: t.top, + width: n, + height: e, + }))) + }, + resize: function (t) { + var e = x(this).resizable('instance'), + i = e.options, + s = e.containerOffset, + o = e.position, + n = e._aspectRatio || t.shiftKey, + r = { top: 0, left: 0 }, + a = e.containerElement, + t = !0 + a[0] !== document && + /static/.test(a.css('position')) && + (r = s), + o.left < (e._helper ? s.left : 0) && + ((e.size.width = + e.size.width + + (e._helper + ? e.position.left - s.left + : e.position.left - r.left)), + n && + ((e.size.height = e.size.width / e.aspectRatio), + (t = !1)), + (e.position.left = i.helper ? s.left : 0)), + o.top < (e._helper ? s.top : 0) && + ((e.size.height = + e.size.height + + (e._helper + ? e.position.top - s.top + : e.position.top)), + n && + ((e.size.width = e.size.height * e.aspectRatio), + (t = !1)), + (e.position.top = e._helper ? s.top : 0)), + (i = + e.containerElement.get(0) === + e.element.parent().get(0)), + (o = /relative|absolute/.test( + e.containerElement.css('position') + )), + i && o + ? ((e.offset.left = + e.parentData.left + e.position.left), + (e.offset.top = e.parentData.top + e.position.top)) + : ((e.offset.left = e.element.offset().left), + (e.offset.top = e.element.offset().top)), + (o = Math.abs( + e.sizeDiff.width + + (e._helper + ? e.offset.left - r.left + : e.offset.left - s.left) + )), + (s = Math.abs( + e.sizeDiff.height + + (e._helper + ? e.offset.top - r.top + : e.offset.top - s.top) + )), + o + e.size.width >= e.parentData.width && + ((e.size.width = e.parentData.width - o), + n && + ((e.size.height = e.size.width / e.aspectRatio), + (t = !1))), + s + e.size.height >= e.parentData.height && + ((e.size.height = e.parentData.height - s), + n && + ((e.size.width = e.size.height * e.aspectRatio), + (t = !1))), + t || + ((e.position.left = e.prevPosition.left), + (e.position.top = e.prevPosition.top), + (e.size.width = e.prevSize.width), + (e.size.height = e.prevSize.height)) + }, + stop: function () { + var t = x(this).resizable('instance'), + e = t.options, + i = t.containerOffset, + s = t.containerPosition, + o = t.containerElement, + n = x(t.helper), + r = n.offset(), + a = n.outerWidth() - t.sizeDiff.width, + n = n.outerHeight() - t.sizeDiff.height + t._helper && + !e.animate && + /relative/.test(o.css('position')) && + x(this).css({ + left: r.left - s.left - i.left, + width: a, + height: n, + }), + t._helper && + !e.animate && + /static/.test(o.css('position')) && + x(this).css({ + left: r.left - s.left - i.left, + width: a, + height: n, + }) + }, + }), + x.ui.plugin.add('resizable', 'alsoResize', { + start: function () { + var t = x(this).resizable('instance').options + x(t.alsoResize).each(function () { + var t = x(this) + t.data('ui-resizable-alsoresize', { + width: parseFloat(t.width()), + height: parseFloat(t.height()), + left: parseFloat(t.css('left')), + top: parseFloat(t.css('top')), + }) + }) + }, + resize: function (t, i) { + var e = x(this).resizable('instance'), + s = e.options, + o = e.originalSize, + n = e.originalPosition, + r = { + height: e.size.height - o.height || 0, + width: e.size.width - o.width || 0, + top: e.position.top - n.top || 0, + left: e.position.left - n.left || 0, + } + x(s.alsoResize).each(function () { + var t = x(this), + s = x(this).data('ui-resizable-alsoresize'), + o = {}, + e = t.parents(i.originalElement[0]).length + ? ['width', 'height'] + : ['width', 'height', 'top', 'left'] + x.each(e, function (t, e) { + var i = (s[e] || 0) + (r[e] || 0) + i && 0 <= i && (o[e] = i || null) + }), + t.css(o) + }) + }, + stop: function () { + x(this).removeData('ui-resizable-alsoresize') + }, + }), + x.ui.plugin.add('resizable', 'ghost', { + start: function () { + var t = x(this).resizable('instance'), + e = t.size + ;(t.ghost = t.originalElement.clone()), + t.ghost.css({ + opacity: 0.25, + display: 'block', + position: 'relative', + height: e.height, + width: e.width, + margin: 0, + left: 0, + top: 0, + }), + t._addClass(t.ghost, 'ui-resizable-ghost'), + !1 !== x.uiBackCompat && + 'string' == typeof t.options.ghost && + t.ghost.addClass(this.options.ghost), + t.ghost.appendTo(t.helper) + }, + resize: function () { + var t = x(this).resizable('instance') + t.ghost && + t.ghost.css({ + position: 'relative', + height: t.size.height, + width: t.size.width, + }) + }, + stop: function () { + var t = x(this).resizable('instance') + t.ghost && + t.helper && + t.helper.get(0).removeChild(t.ghost.get(0)) + }, + }), + x.ui.plugin.add('resizable', 'grid', { + resize: function () { + var t, + e = x(this).resizable('instance'), + i = e.options, + s = e.size, + o = e.originalSize, + n = e.originalPosition, + r = e.axis, + a = 'number' == typeof i.grid ? [i.grid, i.grid] : i.grid, + h = a[0] || 1, + l = a[1] || 1, + c = Math.round((s.width - o.width) / h) * h, + p = Math.round((s.height - o.height) / l) * l, + u = o.width + c, + d = o.height + p, + f = i.maxWidth && i.maxWidth < u, + g = i.maxHeight && i.maxHeight < d, + m = i.minWidth && i.minWidth > u, + s = i.minHeight && i.minHeight > d + ;(i.grid = a), + m && (u += h), + s && (d += l), + f && (u -= h), + g && (d -= l), + /^(se|s|e)$/.test(r) + ? ((e.size.width = u), (e.size.height = d)) + : /^(ne)$/.test(r) + ? ((e.size.width = u), + (e.size.height = d), + (e.position.top = n.top - p)) + : /^(sw)$/.test(r) + ? ((e.size.width = u), + (e.size.height = d), + (e.position.left = n.left - c)) + : ((d - l <= 0 || u - h <= 0) && + (t = e._getPaddingPlusBorderDimensions(this)), + 0 < d - l + ? ((e.size.height = d), + (e.position.top = n.top - p)) + : ((d = l - t.height), + (e.size.height = d), + (e.position.top = n.top + o.height - d)), + 0 < u - h + ? ((e.size.width = u), + (e.position.left = n.left - c)) + : ((u = h - t.width), + (e.size.width = u), + (e.position.left = n.left + o.width - u))) + }, + }) + x.ui.resizable, + x.widget('ui.sortable', x.ui.mouse, { + version: '1.13.1', + widgetEventPrefix: 'sort', + ready: !1, + options: { + appendTo: 'parent', + axis: !1, + connectWith: !1, + containment: !1, + cursor: 'auto', + cursorAt: !1, + dropOnEmpty: !0, + forcePlaceholderSize: !1, + forceHelperSize: !1, + grid: !1, + handle: !1, + helper: 'original', + items: '> *', + opacity: !1, + placeholder: !1, + revert: !1, + scroll: !0, + scrollSensitivity: 20, + scrollSpeed: 20, + scope: 'default', + tolerance: 'intersect', + zIndex: 1e3, + activate: null, + beforeStop: null, + change: null, + deactivate: null, + out: null, + over: null, + receive: null, + remove: null, + sort: null, + start: null, + stop: null, + update: null, + }, + _isOverAxis: function (t, e, i) { + return e <= t && t < e + i + }, + _isFloating: function (t) { + return ( + /left|right/.test(t.css('float')) || + /inline|table-cell/.test(t.css('display')) + ) + }, + _create: function () { + ;(this.containerCache = {}), + this._addClass('ui-sortable'), + this.refresh(), + (this.offset = this.element.offset()), + this._mouseInit(), + this._setHandleClassName(), + (this.ready = !0) + }, + _setOption: function (t, e) { + this._super(t, e), 'handle' === t && this._setHandleClassName() + }, + _setHandleClassName: function () { + var t = this + this._removeClass( + this.element.find('.ui-sortable-handle'), + 'ui-sortable-handle' + ), + x.each(this.items, function () { + t._addClass( + this.instance.options.handle + ? this.item.find(this.instance.options.handle) + : this.item, + 'ui-sortable-handle' + ) + }) + }, + _destroy: function () { + this._mouseDestroy() + for (var t = this.items.length - 1; 0 <= t; t--) + this.items[t].item.removeData(this.widgetName + '-item') + return this + }, + _mouseCapture: function (t, e) { + var i = null, + s = !1, + o = this + return ( + !this.reverting && + !this.options.disabled && + 'static' !== this.options.type && + (this._refreshItems(t), + x(t.target) + .parents() + .each(function () { + if (x.data(this, o.widgetName + '-item') === o) + return (i = x(this)), !1 + }), + !!(i = + x.data(t.target, o.widgetName + '-item') === o + ? x(t.target) + : i) && + !( + this.options.handle && + !e && + (x(this.options.handle, i) + .find('*') + .addBack() + .each(function () { + this === t.target && (s = !0) + }), + !s) + ) && + ((this.currentItem = i), + this._removeCurrentsFromItems(), + !0)) + ) + }, + _mouseStart: function (t, e, i) { + var s, + o, + n = this.options + if ( + ((this.currentContainer = this).refreshPositions(), + (this.appendTo = x( + 'parent' !== n.appendTo + ? n.appendTo + : this.currentItem.parent() + )), + (this.helper = this._createHelper(t)), + this._cacheHelperProportions(), + this._cacheMargins(), + (this.offset = this.currentItem.offset()), + (this.offset = { + top: this.offset.top - this.margins.top, + left: this.offset.left - this.margins.left, + }), + x.extend(this.offset, { + click: { + left: t.pageX - this.offset.left, + top: t.pageY - this.offset.top, + }, + relative: this._getRelativeOffset(), + }), + this.helper.css('position', 'absolute'), + (this.cssPosition = this.helper.css('position')), + n.cursorAt && this._adjustOffsetFromHelper(n.cursorAt), + (this.domPosition = { + prev: this.currentItem.prev()[0], + parent: this.currentItem.parent()[0], + }), + this.helper[0] !== this.currentItem[0] && + this.currentItem.hide(), + this._createPlaceholder(), + (this.scrollParent = this.placeholder.scrollParent()), + x.extend(this.offset, { parent: this._getParentOffset() }), + n.containment && this._setContainment(), + n.cursor && + 'auto' !== n.cursor && + ((o = this.document.find('body')), + (this.storedCursor = o.css('cursor')), + o.css('cursor', n.cursor), + (this.storedStylesheet = x( + '' + ).appendTo(o))), + n.zIndex && + (this.helper.css('zIndex') && + (this._storedZIndex = this.helper.css('zIndex')), + this.helper.css('zIndex', n.zIndex)), + n.opacity && + (this.helper.css('opacity') && + (this._storedOpacity = this.helper.css('opacity')), + this.helper.css('opacity', n.opacity)), + this.scrollParent[0] !== this.document[0] && + 'HTML' !== this.scrollParent[0].tagName && + (this.overflowOffset = this.scrollParent.offset()), + this._trigger('start', t, this._uiHash()), + this._preserveHelperProportions || + this._cacheHelperProportions(), + !i) + ) + for (s = this.containers.length - 1; 0 <= s; s--) + this.containers[s]._trigger( + 'activate', + t, + this._uiHash(this) + ) + return ( + x.ui.ddmanager && (x.ui.ddmanager.current = this), + x.ui.ddmanager && + !n.dropBehaviour && + x.ui.ddmanager.prepareOffsets(this, t), + (this.dragging = !0), + this._addClass(this.helper, 'ui-sortable-helper'), + this.helper.parent().is(this.appendTo) || + (this.helper.detach().appendTo(this.appendTo), + (this.offset.parent = this._getParentOffset())), + (this.position = this.originalPosition = + this._generatePosition(t)), + (this.originalPageX = t.pageX), + (this.originalPageY = t.pageY), + (this.lastPositionAbs = this.positionAbs = + this._convertPositionTo('absolute')), + this._mouseDrag(t), + !0 + ) + }, + _scroll: function (t) { + var e = this.options, + i = !1 + return ( + this.scrollParent[0] !== this.document[0] && + 'HTML' !== this.scrollParent[0].tagName + ? (this.overflowOffset.top + + this.scrollParent[0].offsetHeight - + t.pageY < + e.scrollSensitivity + ? (this.scrollParent[0].scrollTop = i = + this.scrollParent[0].scrollTop + + e.scrollSpeed) + : t.pageY - this.overflowOffset.top < + e.scrollSensitivity && + (this.scrollParent[0].scrollTop = i = + this.scrollParent[0].scrollTop - + e.scrollSpeed), + this.overflowOffset.left + + this.scrollParent[0].offsetWidth - + t.pageX < + e.scrollSensitivity + ? (this.scrollParent[0].scrollLeft = i = + this.scrollParent[0].scrollLeft + + e.scrollSpeed) + : t.pageX - this.overflowOffset.left < + e.scrollSensitivity && + (this.scrollParent[0].scrollLeft = i = + this.scrollParent[0].scrollLeft - + e.scrollSpeed)) + : (t.pageY - this.document.scrollTop() < + e.scrollSensitivity + ? (i = this.document.scrollTop( + this.document.scrollTop() - e.scrollSpeed + )) + : this.window.height() - + (t.pageY - this.document.scrollTop()) < + e.scrollSensitivity && + (i = this.document.scrollTop( + this.document.scrollTop() + e.scrollSpeed + )), + t.pageX - this.document.scrollLeft() < + e.scrollSensitivity + ? (i = this.document.scrollLeft( + this.document.scrollLeft() - e.scrollSpeed + )) + : this.window.width() - + (t.pageX - this.document.scrollLeft()) < + e.scrollSensitivity && + (i = this.document.scrollLeft( + this.document.scrollLeft() + e.scrollSpeed + ))), + i + ) + }, + _mouseDrag: function (t) { + var e, + i, + s, + o, + n = this.options + for ( + this.position = this._generatePosition(t), + this.positionAbs = this._convertPositionTo('absolute'), + (this.options.axis && 'y' === this.options.axis) || + (this.helper[0].style.left = + this.position.left + 'px'), + (this.options.axis && 'x' === this.options.axis) || + (this.helper[0].style.top = + this.position.top + 'px'), + n.scroll && + !1 !== this._scroll(t) && + (this._refreshItemPositions(!0), + x.ui.ddmanager && + !n.dropBehaviour && + x.ui.ddmanager.prepareOffsets(this, t)), + this.dragDirection = { + vertical: this._getDragVerticalDirection(), + horizontal: this._getDragHorizontalDirection(), + }, + e = this.items.length - 1; + 0 <= e; + e-- + ) + if ( + ((s = (i = this.items[e]).item[0]), + (o = this._intersectsWithPointer(i)) && + i.instance === this.currentContainer && + !( + s === this.currentItem[0] || + this.placeholder[ + 1 === o ? 'next' : 'prev' + ]()[0] === s || + x.contains(this.placeholder[0], s) || + ('semi-dynamic' === this.options.type && + x.contains(this.element[0], s)) + )) + ) { + if ( + ((this.direction = 1 === o ? 'down' : 'up'), + 'pointer' !== this.options.tolerance && + !this._intersectsWithSides(i)) + ) + break + this._rearrange(t, i), + this._trigger('change', t, this._uiHash()) + break + } + return ( + this._contactContainers(t), + x.ui.ddmanager && x.ui.ddmanager.drag(this, t), + this._trigger('sort', t, this._uiHash()), + (this.lastPositionAbs = this.positionAbs), + !1 + ) + }, + _mouseStop: function (t, e) { + var i, s, o, n + if (t) + return ( + x.ui.ddmanager && + !this.options.dropBehaviour && + x.ui.ddmanager.drop(this, t), + this.options.revert + ? ((s = (i = this).placeholder.offset()), + (n = {}), + ((o = this.options.axis) && 'x' !== o) || + (n.left = + s.left - + this.offset.parent.left - + this.margins.left + + (this.offsetParent[0] === + this.document[0].body + ? 0 + : this.offsetParent[0].scrollLeft)), + (o && 'y' !== o) || + (n.top = + s.top - + this.offset.parent.top - + this.margins.top + + (this.offsetParent[0] === + this.document[0].body + ? 0 + : this.offsetParent[0].scrollTop)), + (this.reverting = !0), + x(this.helper).animate( + n, + parseInt(this.options.revert, 10) || 500, + function () { + i._clear(t) + } + )) + : this._clear(t, e), + !1 + ) + }, + cancel: function () { + if (this.dragging) { + this._mouseUp(new x.Event('mouseup', { target: null })), + 'original' === this.options.helper + ? (this.currentItem.css(this._storedCSS), + this._removeClass( + this.currentItem, + 'ui-sortable-helper' + )) + : this.currentItem.show() + for (var t = this.containers.length - 1; 0 <= t; t--) + this.containers[t]._trigger( + 'deactivate', + null, + this._uiHash(this) + ), + this.containers[t].containerCache.over && + (this.containers[t]._trigger( + 'out', + null, + this._uiHash(this) + ), + (this.containers[t].containerCache.over = 0)) + } + return ( + this.placeholder && + (this.placeholder[0].parentNode && + this.placeholder[0].parentNode.removeChild( + this.placeholder[0] + ), + 'original' !== this.options.helper && + this.helper && + this.helper[0].parentNode && + this.helper.remove(), + x.extend(this, { + helper: null, + dragging: !1, + reverting: !1, + _noFinalSort: null, + }), + this.domPosition.prev + ? x(this.domPosition.prev).after(this.currentItem) + : x(this.domPosition.parent).prepend( + this.currentItem + )), + this + ) + }, + serialize: function (e) { + var t = this._getItemsAsjQuery(e && e.connected), + i = [] + return ( + (e = e || {}), + x(t).each(function () { + var t = ( + x(e.item || this).attr(e.attribute || 'id') || '' + ).match(e.expression || /(.+)[\-=_](.+)/) + t && + i.push( + (e.key || t[1] + '[]') + + '=' + + (e.key && e.expression ? t[1] : t[2]) + ) + }), + !i.length && e.key && i.push(e.key + '='), + i.join('&') + ) + }, + toArray: function (t) { + var e = this._getItemsAsjQuery(t && t.connected), + i = [] + return ( + (t = t || {}), + e.each(function () { + i.push( + x(t.item || this).attr(t.attribute || 'id') || '' + ) + }), + i + ) + }, + _intersectsWith: function (t) { + var e = this.positionAbs.left, + i = e + this.helperProportions.width, + s = this.positionAbs.top, + o = s + this.helperProportions.height, + n = t.left, + r = n + t.width, + a = t.top, + h = a + t.height, + l = this.offset.click.top, + c = this.offset.click.left, + l = 'x' === this.options.axis || (a < s + l && s + l < h), + c = 'y' === this.options.axis || (n < e + c && e + c < r) + return 'pointer' === this.options.tolerance || + this.options.forcePointerForContainers || + ('pointer' !== this.options.tolerance && + this.helperProportions[ + this.floating ? 'width' : 'height' + ] > t[this.floating ? 'width' : 'height']) + ? l && c + : n < e + this.helperProportions.width / 2 && + i - this.helperProportions.width / 2 < r && + a < s + this.helperProportions.height / 2 && + o - this.helperProportions.height / 2 < h + }, + _intersectsWithPointer: function (t) { + var e = + 'x' === this.options.axis || + this._isOverAxis( + this.positionAbs.top + this.offset.click.top, + t.top, + t.height + ), + t = + 'y' === this.options.axis || + this._isOverAxis( + this.positionAbs.left + this.offset.click.left, + t.left, + t.width + ) + return ( + !(!e || !t) && + ((e = this.dragDirection.vertical), + (t = this.dragDirection.horizontal), + this.floating + ? 'right' === t || 'down' === e + ? 2 + : 1 + : e && ('down' === e ? 2 : 1)) + ) + }, + _intersectsWithSides: function (t) { + var e = this._isOverAxis( + this.positionAbs.top + this.offset.click.top, + t.top + t.height / 2, + t.height + ), + i = this._isOverAxis( + this.positionAbs.left + this.offset.click.left, + t.left + t.width / 2, + t.width + ), + s = this.dragDirection.vertical, + t = this.dragDirection.horizontal + return this.floating && t + ? ('right' === t && i) || ('left' === t && !i) + : s && (('down' === s && e) || ('up' === s && !e)) + }, + _getDragVerticalDirection: function () { + var t = this.positionAbs.top - this.lastPositionAbs.top + return 0 != t && (0 < t ? 'down' : 'up') + }, + _getDragHorizontalDirection: function () { + var t = this.positionAbs.left - this.lastPositionAbs.left + return 0 != t && (0 < t ? 'right' : 'left') + }, + refresh: function (t) { + return ( + this._refreshItems(t), + this._setHandleClassName(), + this.refreshPositions(), + this + ) + }, + _connectWith: function () { + var t = this.options + return t.connectWith.constructor === String + ? [t.connectWith] + : t.connectWith + }, + _getItemsAsjQuery: function (t) { + var e, + i, + s, + o, + n = [], + r = [], + a = this._connectWith() + if (a && t) + for (e = a.length - 1; 0 <= e; e--) + for ( + i = (s = x(a[e], this.document[0])).length - 1; + 0 <= i; + i-- + ) + (o = x.data(s[i], this.widgetFullName)) && + o !== this && + !o.options.disabled && + r.push([ + 'function' == typeof o.options.items + ? o.options.items.call(o.element) + : x(o.options.items, o.element) + .not('.ui-sortable-helper') + .not('.ui-sortable-placeholder'), + o, + ]) + function h() { + n.push(this) + } + for ( + r.push([ + 'function' == typeof this.options.items + ? this.options.items.call(this.element, null, { + options: this.options, + item: this.currentItem, + }) + : x(this.options.items, this.element) + .not('.ui-sortable-helper') + .not('.ui-sortable-placeholder'), + this, + ]), + e = r.length - 1; + 0 <= e; + e-- + ) + r[e][0].each(h) + return x(n) + }, + _removeCurrentsFromItems: function () { + var i = this.currentItem.find( + ':data(' + this.widgetName + '-item)' + ) + this.items = x.grep(this.items, function (t) { + for (var e = 0; e < i.length; e++) + if (i[e] === t.item[0]) return !1 + return !0 + }) + }, + _refreshItems: function (t) { + ;(this.items = []), (this.containers = [this]) + var e, + i, + s, + o, + n, + r, + a, + h, + l = this.items, + c = [ + [ + 'function' == typeof this.options.items + ? this.options.items.call(this.element[0], t, { + item: this.currentItem, + }) + : x(this.options.items, this.element), + this, + ], + ], + p = this._connectWith() + if (p && this.ready) + for (e = p.length - 1; 0 <= e; e--) + for ( + i = (s = x(p[e], this.document[0])).length - 1; + 0 <= i; + i-- + ) + (o = x.data(s[i], this.widgetFullName)) && + o !== this && + !o.options.disabled && + (c.push([ + 'function' == typeof o.options.items + ? o.options.items.call( + o.element[0], + t, + { item: this.currentItem } + ) + : x(o.options.items, o.element), + o, + ]), + this.containers.push(o)) + for (e = c.length - 1; 0 <= e; e--) + for ( + n = c[e][1], h = (r = c[e][(i = 0)]).length; + i < h; + i++ + ) + (a = x(r[i])).data(this.widgetName + '-item', n), + l.push({ + item: a, + instance: n, + width: 0, + height: 0, + left: 0, + top: 0, + }) + }, + _refreshItemPositions: function (t) { + for (var e, i, s = this.items.length - 1; 0 <= s; s--) + (e = this.items[s]), + (this.currentContainer && + e.instance !== this.currentContainer && + e.item[0] !== this.currentItem[0]) || + ((i = this.options.toleranceElement + ? x(this.options.toleranceElement, e.item) + : e.item), + t || + ((e.width = i.outerWidth()), + (e.height = i.outerHeight())), + (i = i.offset()), + (e.left = i.left), + (e.top = i.top)) + }, + refreshPositions: function (t) { + var e, i + if ( + ((this.floating = + !!this.items.length && + ('x' === this.options.axis || + this._isFloating(this.items[0].item))), + this.offsetParent && + this.helper && + (this.offset.parent = this._getParentOffset()), + this._refreshItemPositions(t), + this.options.custom && + this.options.custom.refreshContainers) + ) + this.options.custom.refreshContainers.call(this) + else + for (e = this.containers.length - 1; 0 <= e; e--) + (i = this.containers[e].element.offset()), + (this.containers[e].containerCache.left = i.left), + (this.containers[e].containerCache.top = i.top), + (this.containers[e].containerCache.width = + this.containers[e].element.outerWidth()), + (this.containers[e].containerCache.height = + this.containers[e].element.outerHeight()) + return this + }, + _createPlaceholder: function (i) { + var s, + o, + n = (i = i || this).options + ;(n.placeholder && n.placeholder.constructor !== String) || + ((s = n.placeholder), + (o = i.currentItem[0].nodeName.toLowerCase()), + (n.placeholder = { + element: function () { + var t = x('<' + o + '>', i.document[0]) + return ( + i + ._addClass( + t, + 'ui-sortable-placeholder', + s || i.currentItem[0].className + ) + ._removeClass(t, 'ui-sortable-helper'), + 'tbody' === o + ? i._createTrPlaceholder( + i.currentItem.find('tr').eq(0), + x('', i.document[0]).appendTo(t) + ) + : 'tr' === o + ? i._createTrPlaceholder(i.currentItem, t) + : 'img' === o && + t.attr('src', i.currentItem.attr('src')), + s || t.css('visibility', 'hidden'), + t + ) + }, + update: function (t, e) { + ;(s && !n.forcePlaceholderSize) || + ((e.height() && + (!n.forcePlaceholderSize || + ('tbody' !== o && 'tr' !== o))) || + e.height( + i.currentItem.innerHeight() - + parseInt( + i.currentItem.css( + 'paddingTop' + ) || 0, + 10 + ) - + parseInt( + i.currentItem.css( + 'paddingBottom' + ) || 0, + 10 + ) + ), + e.width() || + e.width( + i.currentItem.innerWidth() - + parseInt( + i.currentItem.css( + 'paddingLeft' + ) || 0, + 10 + ) - + parseInt( + i.currentItem.css( + 'paddingRight' + ) || 0, + 10 + ) + )) + }, + })), + (i.placeholder = x( + n.placeholder.element.call(i.element, i.currentItem) + )), + i.currentItem.after(i.placeholder), + n.placeholder.update(i, i.placeholder) + }, + _createTrPlaceholder: function (t, e) { + var i = this + t.children().each(function () { + x(' ', i.document[0]) + .attr('colspan', x(this).attr('colspan') || 1) + .appendTo(e) + }) + }, + _contactContainers: function (t) { + for ( + var e, + i, + s, + o, + n, + r, + a, + h, + l, + c = null, + p = null, + u = this.containers.length - 1; + 0 <= u; + u-- + ) + x.contains( + this.currentItem[0], + this.containers[u].element[0] + ) || + (this._intersectsWith(this.containers[u].containerCache) + ? (c && + x.contains( + this.containers[u].element[0], + c.element[0] + )) || + ((c = this.containers[u]), (p = u)) + : this.containers[u].containerCache.over && + (this.containers[u]._trigger( + 'out', + t, + this._uiHash(this) + ), + (this.containers[u].containerCache.over = 0))) + if (c) + if (1 === this.containers.length) + this.containers[p].containerCache.over || + (this.containers[p]._trigger( + 'over', + t, + this._uiHash(this) + ), + (this.containers[p].containerCache.over = 1)) + else { + for ( + i = 1e4, + s = null, + o = (h = + c.floating || + this._isFloating(this.currentItem)) + ? 'left' + : 'top', + n = h ? 'width' : 'height', + l = h ? 'pageX' : 'pageY', + e = this.items.length - 1; + 0 <= e; + e-- + ) + x.contains( + this.containers[p].element[0], + this.items[e].item[0] + ) && + this.items[e].item[0] !== this.currentItem[0] && + ((r = this.items[e].item.offset()[o]), + (a = !1), + t[l] - r > this.items[e][n] / 2 && (a = !0), + Math.abs(t[l] - r) < i && + ((i = Math.abs(t[l] - r)), + (s = this.items[e]), + (this.direction = a ? 'up' : 'down'))) + ;(s || this.options.dropOnEmpty) && + (this.currentContainer !== this.containers[p] + ? (s + ? this._rearrange(t, s, null, !0) + : this._rearrange( + t, + null, + this.containers[p].element, + !0 + ), + this._trigger('change', t, this._uiHash()), + this.containers[p]._trigger( + 'change', + t, + this._uiHash(this) + ), + (this.currentContainer = this.containers[p]), + this.options.placeholder.update( + this.currentContainer, + this.placeholder + ), + (this.scrollParent = + this.placeholder.scrollParent()), + this.scrollParent[0] !== this.document[0] && + 'HTML' !== this.scrollParent[0].tagName && + (this.overflowOffset = + this.scrollParent.offset()), + this.containers[p]._trigger( + 'over', + t, + this._uiHash(this) + ), + (this.containers[p].containerCache.over = 1)) + : this.currentContainer.containerCache.over || + (this.containers[p]._trigger( + 'over', + t, + this._uiHash() + ), + (this.currentContainer.containerCache.over = 1))) + } + }, + _createHelper: function (t) { + var e = this.options, + t = + 'function' == typeof e.helper + ? x( + e.helper.apply(this.element[0], [ + t, + this.currentItem, + ]) + ) + : 'clone' === e.helper + ? this.currentItem.clone() + : this.currentItem + return ( + t.parents('body').length || + this.appendTo[0].appendChild(t[0]), + t[0] === this.currentItem[0] && + (this._storedCSS = { + width: this.currentItem[0].style.width, + height: this.currentItem[0].style.height, + position: this.currentItem.css('position'), + top: this.currentItem.css('top'), + left: this.currentItem.css('left'), + }), + (t[0].style.width && !e.forceHelperSize) || + t.width(this.currentItem.width()), + (t[0].style.height && !e.forceHelperSize) || + t.height(this.currentItem.height()), + t + ) + }, + _adjustOffsetFromHelper: function (t) { + 'string' == typeof t && (t = t.split(' ')), + 'left' in + (t = Array.isArray(t) + ? { left: +t[0], top: +t[1] || 0 } + : t) && + (this.offset.click.left = t.left + this.margins.left), + 'right' in t && + (this.offset.click.left = + this.helperProportions.width - + t.right + + this.margins.left), + 'top' in t && + (this.offset.click.top = t.top + this.margins.top), + 'bottom' in t && + (this.offset.click.top = + this.helperProportions.height - + t.bottom + + this.margins.top) + }, + _getParentOffset: function () { + this.offsetParent = this.helper.offsetParent() + var t = this.offsetParent.offset() + return ( + 'absolute' === this.cssPosition && + this.scrollParent[0] !== this.document[0] && + x.contains( + this.scrollParent[0], + this.offsetParent[0] + ) && + ((t.left += this.scrollParent.scrollLeft()), + (t.top += this.scrollParent.scrollTop())), + { + top: + (t = + this.offsetParent[0] === + this.document[0].body || + (this.offsetParent[0].tagName && + 'html' === + this.offsetParent[0].tagName.toLowerCase() && + x.ui.ie) + ? { top: 0, left: 0 } + : t).top + + (parseInt( + this.offsetParent.css('borderTopWidth'), + 10 + ) || 0), + left: + t.left + + (parseInt( + this.offsetParent.css('borderLeftWidth'), + 10 + ) || 0), + } + ) + }, + _getRelativeOffset: function () { + if ('relative' !== this.cssPosition) return { top: 0, left: 0 } + var t = this.currentItem.position() + return { + top: + t.top - + (parseInt(this.helper.css('top'), 10) || 0) + + this.scrollParent.scrollTop(), + left: + t.left - + (parseInt(this.helper.css('left'), 10) || 0) + + this.scrollParent.scrollLeft(), + } + }, + _cacheMargins: function () { + this.margins = { + left: parseInt(this.currentItem.css('marginLeft'), 10) || 0, + top: parseInt(this.currentItem.css('marginTop'), 10) || 0, + } + }, + _cacheHelperProportions: function () { + this.helperProportions = { + width: this.helper.outerWidth(), + height: this.helper.outerHeight(), + } + }, + _setContainment: function () { + var t, + e, + i = this.options + 'parent' === i.containment && + (i.containment = this.helper[0].parentNode), + ('document' !== i.containment && + 'window' !== i.containment) || + (this.containment = [ + 0 - + this.offset.relative.left - + this.offset.parent.left, + 0 - + this.offset.relative.top - + this.offset.parent.top, + 'document' === i.containment + ? this.document.width() + : this.window.width() - + this.helperProportions.width - + this.margins.left, + ('document' === i.containment + ? this.document.height() || + document.body.parentNode.scrollHeight + : this.window.height() || + this.document[0].body.parentNode + .scrollHeight) - + this.helperProportions.height - + this.margins.top, + ]), + /^(document|window|parent)$/.test(i.containment) || + ((t = x(i.containment)[0]), + (e = x(i.containment).offset()), + (i = 'hidden' !== x(t).css('overflow')), + (this.containment = [ + e.left + + (parseInt(x(t).css('borderLeftWidth'), 10) || + 0) + + (parseInt(x(t).css('paddingLeft'), 10) || 0) - + this.margins.left, + e.top + + (parseInt(x(t).css('borderTopWidth'), 10) || + 0) + + (parseInt(x(t).css('paddingTop'), 10) || 0) - + this.margins.top, + e.left + + (i + ? Math.max(t.scrollWidth, t.offsetWidth) + : t.offsetWidth) - + (parseInt(x(t).css('borderLeftWidth'), 10) || + 0) - + (parseInt(x(t).css('paddingRight'), 10) || 0) - + this.helperProportions.width - + this.margins.left, + e.top + + (i + ? Math.max(t.scrollHeight, t.offsetHeight) + : t.offsetHeight) - + (parseInt(x(t).css('borderTopWidth'), 10) || + 0) - + (parseInt(x(t).css('paddingBottom'), 10) || 0) - + this.helperProportions.height - + this.margins.top, + ])) + }, + _convertPositionTo: function (t, e) { + e = e || this.position + var i = 'absolute' === t ? 1 : -1, + s = + 'absolute' !== this.cssPosition || + (this.scrollParent[0] !== this.document[0] && + x.contains( + this.scrollParent[0], + this.offsetParent[0] + )) + ? this.scrollParent + : this.offsetParent, + t = /(html|body)/i.test(s[0].tagName) + return { + top: + e.top + + this.offset.relative.top * i + + this.offset.parent.top * i - + ('fixed' === this.cssPosition + ? -this.scrollParent.scrollTop() + : t + ? 0 + : s.scrollTop()) * + i, + left: + e.left + + this.offset.relative.left * i + + this.offset.parent.left * i - + ('fixed' === this.cssPosition + ? -this.scrollParent.scrollLeft() + : t + ? 0 + : s.scrollLeft()) * + i, + } + }, + _generatePosition: function (t) { + var e = this.options, + i = t.pageX, + s = t.pageY, + o = + 'absolute' !== this.cssPosition || + (this.scrollParent[0] !== this.document[0] && + x.contains( + this.scrollParent[0], + this.offsetParent[0] + )) + ? this.scrollParent + : this.offsetParent, + n = /(html|body)/i.test(o[0].tagName) + return ( + 'relative' !== this.cssPosition || + (this.scrollParent[0] !== this.document[0] && + this.scrollParent[0] !== this.offsetParent[0]) || + (this.offset.relative = this._getRelativeOffset()), + this.originalPosition && + (this.containment && + (t.pageX - this.offset.click.left < + this.containment[0] && + (i = + this.containment[0] + + this.offset.click.left), + t.pageY - this.offset.click.top < + this.containment[1] && + (s = + this.containment[1] + + this.offset.click.top), + t.pageX - this.offset.click.left > + this.containment[2] && + (i = + this.containment[2] + + this.offset.click.left), + t.pageY - this.offset.click.top > + this.containment[3] && + (s = + this.containment[3] + + this.offset.click.top)), + e.grid && + ((t = + this.originalPageY + + Math.round( + (s - this.originalPageY) / e.grid[1] + ) * + e.grid[1]), + (s = + !this.containment || + (t - this.offset.click.top >= + this.containment[1] && + t - this.offset.click.top <= + this.containment[3]) + ? t + : t - this.offset.click.top >= + this.containment[1] + ? t - e.grid[1] + : t + e.grid[1]), + (t = + this.originalPageX + + Math.round( + (i - this.originalPageX) / e.grid[0] + ) * + e.grid[0]), + (i = + !this.containment || + (t - this.offset.click.left >= + this.containment[0] && + t - this.offset.click.left <= + this.containment[2]) + ? t + : t - this.offset.click.left >= + this.containment[0] + ? t - e.grid[0] + : t + e.grid[0]))), + { + top: + s - + this.offset.click.top - + this.offset.relative.top - + this.offset.parent.top + + ('fixed' === this.cssPosition + ? -this.scrollParent.scrollTop() + : n + ? 0 + : o.scrollTop()), + left: + i - + this.offset.click.left - + this.offset.relative.left - + this.offset.parent.left + + ('fixed' === this.cssPosition + ? -this.scrollParent.scrollLeft() + : n + ? 0 + : o.scrollLeft()), + } + ) + }, + _rearrange: function (t, e, i, s) { + i + ? i[0].appendChild(this.placeholder[0]) + : e.item[0].parentNode.insertBefore( + this.placeholder[0], + 'down' === this.direction + ? e.item[0] + : e.item[0].nextSibling + ), + (this.counter = this.counter ? ++this.counter : 1) + var o = this.counter + this._delay(function () { + o === this.counter && this.refreshPositions(!s) + }) + }, + _clear: function (t, e) { + this.reverting = !1 + var i, + s = [] + if ( + (!this._noFinalSort && + this.currentItem.parent().length && + this.placeholder.before(this.currentItem), + (this._noFinalSort = null), + this.helper[0] === this.currentItem[0]) + ) { + for (i in this._storedCSS) + ('auto' !== this._storedCSS[i] && + 'static' !== this._storedCSS[i]) || + (this._storedCSS[i] = '') + this.currentItem.css(this._storedCSS), + this._removeClass( + this.currentItem, + 'ui-sortable-helper' + ) + } else this.currentItem.show() + function o(e, i, s) { + return function (t) { + s._trigger(e, t, i._uiHash(i)) + } + } + for ( + this.fromOutside && + !e && + s.push(function (t) { + this._trigger( + 'receive', + t, + this._uiHash(this.fromOutside) + ) + }), + (!this.fromOutside && + this.domPosition.prev === + this.currentItem + .prev() + .not('.ui-sortable-helper')[0] && + this.domPosition.parent === + this.currentItem.parent()[0]) || + e || + s.push(function (t) { + this._trigger('update', t, this._uiHash()) + }), + this !== this.currentContainer && + (e || + (s.push(function (t) { + this._trigger('remove', t, this._uiHash()) + }), + s.push( + function (e) { + return function (t) { + e._trigger( + 'receive', + t, + this._uiHash(this) + ) + } + }.call(this, this.currentContainer) + ), + s.push( + function (e) { + return function (t) { + e._trigger( + 'update', + t, + this._uiHash(this) + ) + } + }.call(this, this.currentContainer) + ))), + i = this.containers.length - 1; + 0 <= i; + i-- + ) + e || s.push(o('deactivate', this, this.containers[i])), + this.containers[i].containerCache.over && + (s.push(o('out', this, this.containers[i])), + (this.containers[i].containerCache.over = 0)) + if ( + (this.storedCursor && + (this.document + .find('body') + .css('cursor', this.storedCursor), + this.storedStylesheet.remove()), + this._storedOpacity && + this.helper.css('opacity', this._storedOpacity), + this._storedZIndex && + this.helper.css( + 'zIndex', + 'auto' === this._storedZIndex + ? '' + : this._storedZIndex + ), + (this.dragging = !1), + e || this._trigger('beforeStop', t, this._uiHash()), + this.placeholder[0].parentNode.removeChild( + this.placeholder[0] + ), + this.cancelHelperRemoval || + (this.helper[0] !== this.currentItem[0] && + this.helper.remove(), + (this.helper = null)), + !e) + ) { + for (i = 0; i < s.length; i++) s[i].call(this, t) + this._trigger('stop', t, this._uiHash()) + } + return (this.fromOutside = !1), !this.cancelHelperRemoval + }, + _trigger: function () { + !1 === x.Widget.prototype._trigger.apply(this, arguments) && + this.cancel() + }, + _uiHash: function (t) { + var e = t || this + return { + helper: e.helper, + placeholder: e.placeholder || x([]), + position: e.position, + originalPosition: e.originalPosition, + offset: e.positionAbs, + item: e.currentItem, + sender: t ? t.element : null, + } + }, + }), + x.widget('ui.accordion', { + version: '1.13.1', + options: { + active: 0, + animate: {}, + classes: { + 'ui-accordion-header': 'ui-corner-top', + 'ui-accordion-header-collapsed': 'ui-corner-all', + 'ui-accordion-content': 'ui-corner-bottom', + }, + collapsible: !1, + event: 'click', + header: function (t) { + return t + .find('> li > :first-child') + .add(t.find('> :not(li)').even()) + }, + heightStyle: 'auto', + icons: { + activeHeader: 'ui-icon-triangle-1-s', + header: 'ui-icon-triangle-1-e', + }, + activate: null, + beforeActivate: null, + }, + hideProps: { + borderTopWidth: 'hide', + borderBottomWidth: 'hide', + paddingTop: 'hide', + paddingBottom: 'hide', + height: 'hide', + }, + showProps: { + borderTopWidth: 'show', + borderBottomWidth: 'show', + paddingTop: 'show', + paddingBottom: 'show', + height: 'show', + }, + _create: function () { + var t = this.options + ;(this.prevShow = this.prevHide = x()), + this._addClass('ui-accordion', 'ui-widget ui-helper-reset'), + this.element.attr('role', 'tablist'), + t.collapsible || + (!1 !== t.active && null != t.active) || + (t.active = 0), + this._processPanels(), + t.active < 0 && (t.active += this.headers.length), + this._refresh() + }, + _getCreateEventData: function () { + return { + header: this.active, + panel: this.active.length ? this.active.next() : x(), + } + }, + _createIcons: function () { + var t, + e = this.options.icons + e && + ((t = x('')), + this._addClass( + t, + 'ui-accordion-header-icon', + 'ui-icon ' + e.header + ), + t.prependTo(this.headers), + (t = this.active.children('.ui-accordion-header-icon')), + this._removeClass(t, e.header) + ._addClass(t, null, e.activeHeader) + ._addClass(this.headers, 'ui-accordion-icons')) + }, + _destroyIcons: function () { + this._removeClass(this.headers, 'ui-accordion-icons'), + this.headers.children('.ui-accordion-header-icon').remove() + }, + _destroy: function () { + var t + this.element.removeAttr('role'), + this.headers + .removeAttr( + 'role aria-expanded aria-selected aria-controls tabIndex' + ) + .removeUniqueId(), + this._destroyIcons(), + (t = this.headers + .next() + .css('display', '') + .removeAttr('role aria-hidden aria-labelledby') + .removeUniqueId()), + 'content' !== this.options.heightStyle && + t.css('height', '') + }, + _setOption: function (t, e) { + 'active' !== t + ? ('event' === t && + (this.options.event && + this._off(this.headers, this.options.event), + this._setupEvents(e)), + this._super(t, e), + 'collapsible' !== t || + e || + !1 !== this.options.active || + this._activate(0), + 'icons' === t && + (this._destroyIcons(), e && this._createIcons())) + : this._activate(e) + }, + _setOptionDisabled: function (t) { + this._super(t), + this.element.attr('aria-disabled', t), + this._toggleClass(null, 'ui-state-disabled', !!t), + this._toggleClass( + this.headers.add(this.headers.next()), + null, + 'ui-state-disabled', + !!t + ) + }, + _keydown: function (t) { + if (!t.altKey && !t.ctrlKey) { + var e = x.ui.keyCode, + i = this.headers.length, + s = this.headers.index(t.target), + o = !1 + switch (t.keyCode) { + case e.RIGHT: + case e.DOWN: + o = this.headers[(s + 1) % i] + break + case e.LEFT: + case e.UP: + o = this.headers[(s - 1 + i) % i] + break + case e.SPACE: + case e.ENTER: + this._eventHandler(t) + break + case e.HOME: + o = this.headers[0] + break + case e.END: + o = this.headers[i - 1] + } + o && + (x(t.target).attr('tabIndex', -1), + x(o).attr('tabIndex', 0), + x(o).trigger('focus'), + t.preventDefault()) + } + }, + _panelKeyDown: function (t) { + t.keyCode === x.ui.keyCode.UP && + t.ctrlKey && + x(t.currentTarget).prev().trigger('focus') + }, + refresh: function () { + var t = this.options + this._processPanels(), + (!1 === t.active && !0 === t.collapsible) || + !this.headers.length + ? ((t.active = !1), (this.active = x())) + : !1 === t.active + ? this._activate(0) + : this.active.length && + !x.contains(this.element[0], this.active[0]) + ? this.headers.length === + this.headers.find('.ui-state-disabled').length + ? ((t.active = !1), (this.active = x())) + : this._activate(Math.max(0, t.active - 1)) + : (t.active = this.headers.index(this.active)), + this._destroyIcons(), + this._refresh() + }, + _processPanels: function () { + var t = this.headers, + e = this.panels + 'function' == typeof this.options.header + ? (this.headers = this.options.header(this.element)) + : (this.headers = this.element.find(this.options.header)), + this._addClass( + this.headers, + 'ui-accordion-header ui-accordion-header-collapsed', + 'ui-state-default' + ), + (this.panels = this.headers + .next() + .filter(':not(.ui-accordion-content-active)') + .hide()), + this._addClass( + this.panels, + 'ui-accordion-content', + 'ui-helper-reset ui-widget-content' + ), + e && + (this._off(t.not(this.headers)), + this._off(e.not(this.panels))) + }, + _refresh: function () { + var i, + t = this.options, + e = t.heightStyle, + s = this.element.parent() + ;(this.active = this._findActive(t.active)), + this._addClass( + this.active, + 'ui-accordion-header-active', + 'ui-state-active' + )._removeClass( + this.active, + 'ui-accordion-header-collapsed' + ), + this._addClass( + this.active.next(), + 'ui-accordion-content-active' + ), + this.active.next().show(), + this.headers + .attr('role', 'tab') + .each(function () { + var t = x(this), + e = t.uniqueId().attr('id'), + i = t.next(), + s = i.uniqueId().attr('id') + t.attr('aria-controls', s), + i.attr('aria-labelledby', e) + }) + .next() + .attr('role', 'tabpanel'), + this.headers + .not(this.active) + .attr({ + 'aria-selected': 'false', + 'aria-expanded': 'false', + tabIndex: -1, + }) + .next() + .attr({ 'aria-hidden': 'true' }) + .hide(), + this.active.length + ? this.active + .attr({ + 'aria-selected': 'true', + 'aria-expanded': 'true', + tabIndex: 0, + }) + .next() + .attr({ 'aria-hidden': 'false' }) + : this.headers.eq(0).attr('tabIndex', 0), + this._createIcons(), + this._setupEvents(t.event), + 'fill' === e + ? ((i = s.height()), + this.element.siblings(':visible').each(function () { + var t = x(this), + e = t.css('position') + 'absolute' !== e && + 'fixed' !== e && + (i -= t.outerHeight(!0)) + }), + this.headers.each(function () { + i -= x(this).outerHeight(!0) + }), + this.headers + .next() + .each(function () { + x(this).height( + Math.max( + 0, + i - + x(this).innerHeight() + + x(this).height() + ) + ) + }) + .css('overflow', 'auto')) + : 'auto' === e && + ((i = 0), + this.headers + .next() + .each(function () { + var t = x(this).is(':visible') + t || x(this).show(), + (i = Math.max( + i, + x(this).css('height', '').height() + )), + t || x(this).hide() + }) + .height(i)) + }, + _activate: function (t) { + t = this._findActive(t)[0] + t !== this.active[0] && + ((t = t || this.active[0]), + this._eventHandler({ + target: t, + currentTarget: t, + preventDefault: x.noop, + })) + }, + _findActive: function (t) { + return 'number' == typeof t ? this.headers.eq(t) : x() + }, + _setupEvents: function (t) { + var i = { keydown: '_keydown' } + t && + x.each(t.split(' '), function (t, e) { + i[e] = '_eventHandler' + }), + this._off(this.headers.add(this.headers.next())), + this._on(this.headers, i), + this._on(this.headers.next(), { keydown: '_panelKeyDown' }), + this._hoverable(this.headers), + this._focusable(this.headers) + }, + _eventHandler: function (t) { + var e = this.options, + i = this.active, + s = x(t.currentTarget), + o = s[0] === i[0], + n = o && e.collapsible, + r = n ? x() : s.next(), + a = i.next(), + r = { + oldHeader: i, + oldPanel: a, + newHeader: n ? x() : s, + newPanel: r, + } + t.preventDefault(), + (o && !e.collapsible) || + !1 === this._trigger('beforeActivate', t, r) || + ((e.active = !n && this.headers.index(s)), + (this.active = o ? x() : s), + this._toggle(r), + this._removeClass( + i, + 'ui-accordion-header-active', + 'ui-state-active' + ), + e.icons && + ((i = i.children('.ui-accordion-header-icon')), + this._removeClass( + i, + null, + e.icons.activeHeader + )._addClass(i, null, e.icons.header)), + o || + (this._removeClass( + s, + 'ui-accordion-header-collapsed' + )._addClass( + s, + 'ui-accordion-header-active', + 'ui-state-active' + ), + e.icons && + ((o = s.children('.ui-accordion-header-icon')), + this._removeClass( + o, + null, + e.icons.header + )._addClass(o, null, e.icons.activeHeader)), + this._addClass( + s.next(), + 'ui-accordion-content-active' + ))) + }, + _toggle: function (t) { + var e = t.newPanel, + i = this.prevShow.length ? this.prevShow : t.oldPanel + this.prevShow.add(this.prevHide).stop(!0, !0), + (this.prevShow = e), + (this.prevHide = i), + this.options.animate + ? this._animate(e, i, t) + : (i.hide(), e.show(), this._toggleComplete(t)), + i.attr({ 'aria-hidden': 'true' }), + i.prev().attr({ + 'aria-selected': 'false', + 'aria-expanded': 'false', + }), + e.length && i.length + ? i + .prev() + .attr({ tabIndex: -1, 'aria-expanded': 'false' }) + : e.length && + this.headers + .filter(function () { + return ( + 0 === + parseInt(x(this).attr('tabIndex'), 10) + ) + }) + .attr('tabIndex', -1), + e.attr('aria-hidden', 'false').prev().attr({ + 'aria-selected': 'true', + 'aria-expanded': 'true', + tabIndex: 0, + }) + }, + _animate: function (t, i, e) { + var s, + o, + n, + r = this, + a = 0, + h = t.css('box-sizing'), + l = t.length && (!i.length || t.index() < i.index()), + c = this.options.animate || {}, + p = (l && c.down) || c, + l = function () { + r._toggleComplete(e) + } + return ( + (o = + (o = 'string' == typeof p ? p : o) || + p.easing || + c.easing), + (n = + (n = 'number' == typeof p ? p : n) || + p.duration || + c.duration), + i.length + ? t.length + ? ((s = t.show().outerHeight()), + i.animate(this.hideProps, { + duration: n, + easing: o, + step: function (t, e) { + e.now = Math.round(t) + }, + }), + void t.hide().animate(this.showProps, { + duration: n, + easing: o, + complete: l, + step: function (t, e) { + ;(e.now = Math.round(t)), + 'height' !== e.prop + ? 'content-box' === h && + (a += e.now) + : 'content' !== + r.options.heightStyle && + ((e.now = Math.round( + s - i.outerHeight() - a + )), + (a = 0)) + }, + })) + : i.animate(this.hideProps, n, o, l) + : t.animate(this.showProps, n, o, l) + ) + }, + _toggleComplete: function (t) { + var e = t.oldPanel, + i = e.prev() + this._removeClass(e, 'ui-accordion-content-active'), + this._removeClass( + i, + 'ui-accordion-header-active' + )._addClass(i, 'ui-accordion-header-collapsed'), + e.length && + (e.parent()[0].className = e.parent()[0].className), + this._trigger('activate', null, t) + }, + }) + var g = /ui-corner-([a-z]){2,6}/g + x.widget('ui.controlgroup', { + version: '1.13.1', + defaultElement: '
', + options: { + direction: 'horizontal', + disabled: null, + onlyVisible: !0, + items: { + button: 'input[type=button], input[type=submit], input[type=reset], button, a', + controlgroupLabel: '.ui-controlgroup-label', + checkboxradio: "input[type='checkbox'], input[type='radio']", + selectmenu: 'select', + spinner: '.ui-spinner-input', + }, + }, + _create: function () { + this._enhance() + }, + _enhance: function () { + this.element.attr('role', 'toolbar'), this.refresh() + }, + _destroy: function () { + this._callChildMethod('destroy'), + this.childWidgets.removeData('ui-controlgroup-data'), + this.element.removeAttr('role'), + this.options.items.controlgroupLabel && + this.element + .find(this.options.items.controlgroupLabel) + .find('.ui-controlgroup-label-contents') + .contents() + .unwrap() + }, + _initWidgets: function () { + var n = this, + r = [] + x.each(this.options.items, function (s, t) { + var e, + o = {} + if (t) + return 'controlgroupLabel' === s + ? ((e = n.element.find(t)).each(function () { + var t = x(this) + t.children('.ui-controlgroup-label-contents') + .length || + t + .contents() + .wrapAll( + "" + ) + }), + n._addClass( + e, + null, + 'ui-widget ui-widget-content ui-state-default' + ), + void (r = r.concat(e.get()))) + : void ( + x.fn[s] && + ((o = n['_' + s + 'Options'] + ? n['_' + s + 'Options']('middle') + : { classes: {} }), + n.element.find(t).each(function () { + var t = x(this), + e = t[s]('instance'), + i = x.widget.extend({}, o) + ;('button' === s && + t.parent('.ui-spinner').length) || + ((e = e || t[s]()[s]('instance')) && + (i.classes = n._resolveClassesValues( + i.classes, + e + )), + t[s](i), + (i = t[s]('widget')), + x.data( + i[0], + 'ui-controlgroup-data', + e || t[s]('instance') + ), + r.push(i[0])) + })) + ) + }), + (this.childWidgets = x(x.uniqueSort(r))), + this._addClass(this.childWidgets, 'ui-controlgroup-item') + }, + _callChildMethod: function (e) { + this.childWidgets.each(function () { + var t = x(this).data('ui-controlgroup-data') + t && t[e] && t[e]() + }) + }, + _updateCornerClass: function (t, e) { + e = this._buildSimpleOptions(e, 'label').classes.label + this._removeClass( + t, + null, + 'ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all' + ), + this._addClass(t, null, e) + }, + _buildSimpleOptions: function (t, e) { + var i = 'vertical' === this.options.direction, + s = { classes: {} } + return ( + (s.classes[e] = { + middle: '', + first: 'ui-corner-' + (i ? 'top' : 'left'), + last: 'ui-corner-' + (i ? 'bottom' : 'right'), + only: 'ui-corner-all', + }[t]), + s + ) + }, + _spinnerOptions: function (t) { + t = this._buildSimpleOptions(t, 'ui-spinner') + return ( + (t.classes['ui-spinner-up'] = ''), + (t.classes['ui-spinner-down'] = ''), + t + ) + }, + _buttonOptions: function (t) { + return this._buildSimpleOptions(t, 'ui-button') + }, + _checkboxradioOptions: function (t) { + return this._buildSimpleOptions(t, 'ui-checkboxradio-label') + }, + _selectmenuOptions: function (t) { + var e = 'vertical' === this.options.direction + return { + width: e && 'auto', + classes: { + middle: { + 'ui-selectmenu-button-open': '', + 'ui-selectmenu-button-closed': '', + }, + first: { + 'ui-selectmenu-button-open': + 'ui-corner-' + (e ? 'top' : 'tl'), + 'ui-selectmenu-button-closed': + 'ui-corner-' + (e ? 'top' : 'left'), + }, + last: { + 'ui-selectmenu-button-open': e ? '' : 'ui-corner-tr', + 'ui-selectmenu-button-closed': + 'ui-corner-' + (e ? 'bottom' : 'right'), + }, + only: { + 'ui-selectmenu-button-open': 'ui-corner-top', + 'ui-selectmenu-button-closed': 'ui-corner-all', + }, + }[t], + } + }, + _resolveClassesValues: function (i, s) { + var o = {} + return ( + x.each(i, function (t) { + var e = s.options.classes[t] || '', + e = String.prototype.trim.call(e.replace(g, '')) + o[t] = (e + ' ' + i[t]).replace(/\s+/g, ' ') + }), + o + ) + }, + _setOption: function (t, e) { + 'direction' === t && + this._removeClass('ui-controlgroup-' + this.options.direction), + this._super(t, e), + 'disabled' !== t + ? this.refresh() + : this._callChildMethod(e ? 'disable' : 'enable') + }, + refresh: function () { + var o, + n = this + this._addClass( + 'ui-controlgroup ui-controlgroup-' + this.options.direction + ), + 'horizontal' === this.options.direction && + this._addClass(null, 'ui-helper-clearfix'), + this._initWidgets(), + (o = this.childWidgets), + (o = this.options.onlyVisible ? o.filter(':visible') : o) + .length && + (x.each(['first', 'last'], function (t, e) { + var i, + s = o[e]().data('ui-controlgroup-data') + s && n['_' + s.widgetName + 'Options'] + ? (((i = n['_' + s.widgetName + 'Options']( + 1 === o.length ? 'only' : e + )).classes = n._resolveClassesValues( + i.classes, + s + )), + s.element[s.widgetName](i)) + : n._updateCornerClass(o[e](), e) + }), + this._callChildMethod('refresh')) + }, + }) + x.widget('ui.checkboxradio', [ + x.ui.formResetMixin, + { + version: '1.13.1', + options: { + disabled: null, + label: null, + icon: !0, + classes: { + 'ui-checkboxradio-label': 'ui-corner-all', + 'ui-checkboxradio-icon': 'ui-corner-all', + }, + }, + _getCreateOptions: function () { + var t, + e = this, + i = this._super() || {} + return ( + this._readType(), + (t = this.element.labels()), + (this.label = x(t[t.length - 1])), + this.label.length || + x.error('No label found for checkboxradio widget'), + (this.originalLabel = ''), + this.label + .contents() + .not(this.element[0]) + .each(function () { + e.originalLabel += + 3 === this.nodeType + ? x(this).text() + : this.outerHTML + }), + this.originalLabel && (i.label = this.originalLabel), + null != (t = this.element[0].disabled) && (i.disabled = t), + i + ) + }, + _create: function () { + var t = this.element[0].checked + this._bindFormResetHandler(), + null == this.options.disabled && + (this.options.disabled = this.element[0].disabled), + this._setOption('disabled', this.options.disabled), + this._addClass( + 'ui-checkboxradio', + 'ui-helper-hidden-accessible' + ), + this._addClass( + this.label, + 'ui-checkboxradio-label', + 'ui-button ui-widget' + ), + 'radio' === this.type && + this._addClass( + this.label, + 'ui-checkboxradio-radio-label' + ), + this.options.label && + this.options.label !== this.originalLabel + ? this._updateLabel() + : this.originalLabel && + (this.options.label = this.originalLabel), + this._enhance(), + t && + this._addClass( + this.label, + 'ui-checkboxradio-checked', + 'ui-state-active' + ), + this._on({ + change: '_toggleClasses', + focus: function () { + this._addClass( + this.label, + null, + 'ui-state-focus ui-visual-focus' + ) + }, + blur: function () { + this._removeClass( + this.label, + null, + 'ui-state-focus ui-visual-focus' + ) + }, + }) + }, + _readType: function () { + var t = this.element[0].nodeName.toLowerCase() + ;(this.type = this.element[0].type), + ('input' === t && /radio|checkbox/.test(this.type)) || + x.error( + "Can't create checkboxradio on element.nodeName=" + + t + + ' and element.type=' + + this.type + ) + }, + _enhance: function () { + this._updateIcon(this.element[0].checked) + }, + widget: function () { + return this.label + }, + _getRadioGroup: function () { + var t = this.element[0].name, + e = "input[name='" + x.escapeSelector(t) + "']" + return t + ? (this.form.length + ? x(this.form[0].elements).filter(e) + : x(e).filter(function () { + return 0 === x(this)._form().length + }) + ).not(this.element) + : x([]) + }, + _toggleClasses: function () { + var t = this.element[0].checked + this._toggleClass( + this.label, + 'ui-checkboxradio-checked', + 'ui-state-active', + t + ), + this.options.icon && + 'checkbox' === this.type && + this._toggleClass( + this.icon, + null, + 'ui-icon-check ui-state-checked', + t + )._toggleClass(this.icon, null, 'ui-icon-blank', !t), + 'radio' === this.type && + this._getRadioGroup().each(function () { + var t = x(this).checkboxradio('instance') + t && + t._removeClass( + t.label, + 'ui-checkboxradio-checked', + 'ui-state-active' + ) + }) + }, + _destroy: function () { + this._unbindFormResetHandler(), + this.icon && (this.icon.remove(), this.iconSpace.remove()) + }, + _setOption: function (t, e) { + if ('label' !== t || e) { + if ((this._super(t, e), 'disabled' === t)) + return ( + this._toggleClass( + this.label, + null, + 'ui-state-disabled', + e + ), + void (this.element[0].disabled = e) + ) + this.refresh() + } + }, + _updateIcon: function (t) { + var e = 'ui-icon ui-icon-background ' + this.options.icon + ? (this.icon || + ((this.icon = x('')), + (this.iconSpace = x(' ')), + this._addClass( + this.iconSpace, + 'ui-checkboxradio-icon-space' + )), + 'checkbox' === this.type + ? ((e += t + ? 'ui-icon-check ui-state-checked' + : 'ui-icon-blank'), + this._removeClass( + this.icon, + null, + t ? 'ui-icon-blank' : 'ui-icon-check' + )) + : (e += 'ui-icon-blank'), + this._addClass(this.icon, 'ui-checkboxradio-icon', e), + t || + this._removeClass( + this.icon, + null, + 'ui-icon-check ui-state-checked' + ), + this.icon.prependTo(this.label).after(this.iconSpace)) + : void 0 !== this.icon && + (this.icon.remove(), + this.iconSpace.remove(), + delete this.icon) + }, + _updateLabel: function () { + var t = this.label.contents().not(this.element[0]) + this.icon && (t = t.not(this.icon[0])), + (t = this.iconSpace + ? t.not(this.iconSpace[0]) + : t).remove(), + this.label.append(this.options.label) + }, + refresh: function () { + var t = this.element[0].checked, + e = this.element[0].disabled + this._updateIcon(t), + this._toggleClass( + this.label, + 'ui-checkboxradio-checked', + 'ui-state-active', + t + ), + null !== this.options.label && this._updateLabel(), + e !== this.options.disabled && + this._setOptions({ disabled: e }) + }, + }, + ]) + var m + x.ui.checkboxradio + x.widget('ui.button', { + version: '1.13.1', + defaultElement: '" + ) + .button({ + label: x('').text(this.options.closeText).html(), + icon: 'ui-icon-closethick', + showLabel: !1, + }) + .appendTo(this.uiDialogTitlebar)), + this._addClass( + this.uiDialogTitlebarClose, + 'ui-dialog-titlebar-close' + ), + this._on(this.uiDialogTitlebarClose, { + click: function (t) { + t.preventDefault(), this.close(t) + }, + }), + (t = x('').uniqueId().prependTo(this.uiDialogTitlebar)), + this._addClass(t, 'ui-dialog-title'), + this._title(t), + this.uiDialogTitlebar.prependTo(this.uiDialog), + this.uiDialog.attr({ 'aria-labelledby': t.attr('id') }) + }, + _title: function (t) { + this.options.title ? t.text(this.options.title) : t.html(' ') + }, + _createButtonPane: function () { + ;(this.uiDialogButtonPane = x('
')), + this._addClass( + this.uiDialogButtonPane, + 'ui-dialog-buttonpane', + 'ui-widget-content ui-helper-clearfix' + ), + (this.uiButtonSet = x('
').appendTo( + this.uiDialogButtonPane + )), + this._addClass(this.uiButtonSet, 'ui-dialog-buttonset'), + this._createButtons() + }, + _createButtons: function () { + var s = this, + t = this.options.buttons + this.uiDialogButtonPane.remove(), + this.uiButtonSet.empty(), + x.isEmptyObject(t) || (Array.isArray(t) && !t.length) + ? this._removeClass(this.uiDialog, 'ui-dialog-buttons') + : (x.each(t, function (t, e) { + var i + ;(e = x.extend( + { type: 'button' }, + (e = + 'function' == typeof e + ? { click: e, text: t } + : e) + )), + (i = e.click), + (t = { + icon: e.icon, + iconPosition: e.iconPosition, + showLabel: e.showLabel, + icons: e.icons, + text: e.text, + }), + delete e.click, + delete e.icon, + delete e.iconPosition, + delete e.showLabel, + delete e.icons, + 'boolean' == typeof e.text && delete e.text, + x('', e) + .button(t) + .appendTo(s.uiButtonSet) + .on('click', function () { + i.apply(s.element[0], arguments) + }) + }), + this._addClass(this.uiDialog, 'ui-dialog-buttons'), + this.uiDialogButtonPane.appendTo(this.uiDialog)) + }, + _makeDraggable: function () { + var o = this, + n = this.options + function r(t) { + return { position: t.position, offset: t.offset } + } + this.uiDialog.draggable({ + cancel: '.ui-dialog-content, .ui-dialog-titlebar-close', + handle: '.ui-dialog-titlebar', + containment: 'document', + start: function (t, e) { + o._addClass(x(this), 'ui-dialog-dragging'), + o._blockFrames(), + o._trigger('dragStart', t, r(e)) + }, + drag: function (t, e) { + o._trigger('drag', t, r(e)) + }, + stop: function (t, e) { + var i = e.offset.left - o.document.scrollLeft(), + s = e.offset.top - o.document.scrollTop() + ;(n.position = { + my: 'left top', + at: + 'left' + + (0 <= i ? '+' : '') + + i + + ' top' + + (0 <= s ? '+' : '') + + s, + of: o.window, + }), + o._removeClass(x(this), 'ui-dialog-dragging'), + o._unblockFrames(), + o._trigger('dragStop', t, r(e)) + }, + }) + }, + _makeResizable: function () { + var o = this, + n = this.options, + t = n.resizable, + e = this.uiDialog.css('position'), + t = 'string' == typeof t ? t : 'n,e,s,w,se,sw,ne,nw' + function r(t) { + return { + originalPosition: t.originalPosition, + originalSize: t.originalSize, + position: t.position, + size: t.size, + } + } + this.uiDialog + .resizable({ + cancel: '.ui-dialog-content', + containment: 'document', + alsoResize: this.element, + maxWidth: n.maxWidth, + maxHeight: n.maxHeight, + minWidth: n.minWidth, + minHeight: this._minHeight(), + handles: t, + start: function (t, e) { + o._addClass(x(this), 'ui-dialog-resizing'), + o._blockFrames(), + o._trigger('resizeStart', t, r(e)) + }, + resize: function (t, e) { + o._trigger('resize', t, r(e)) + }, + stop: function (t, e) { + var i = o.uiDialog.offset(), + s = i.left - o.document.scrollLeft(), + i = i.top - o.document.scrollTop() + ;(n.height = o.uiDialog.height()), + (n.width = o.uiDialog.width()), + (n.position = { + my: 'left top', + at: + 'left' + + (0 <= s ? '+' : '') + + s + + ' top' + + (0 <= i ? '+' : '') + + i, + of: o.window, + }), + o._removeClass(x(this), 'ui-dialog-resizing'), + o._unblockFrames(), + o._trigger('resizeStop', t, r(e)) + }, + }) + .css('position', e) + }, + _trackFocus: function () { + this._on(this.widget(), { + focusin: function (t) { + this._makeFocusTarget(), + (this._focusedElement = x(t.target)) + }, + }) + }, + _makeFocusTarget: function () { + this._untrackInstance(), this._trackingInstances().unshift(this) + }, + _untrackInstance: function () { + var t = this._trackingInstances(), + e = x.inArray(this, t) + ;-1 !== e && t.splice(e, 1) + }, + _trackingInstances: function () { + var t = this.document.data('ui-dialog-instances') + return t || this.document.data('ui-dialog-instances', (t = [])), t + }, + _minHeight: function () { + var t = this.options + return 'auto' === t.height + ? t.minHeight + : Math.min(t.minHeight, t.height) + }, + _position: function () { + var t = this.uiDialog.is(':visible') + t || this.uiDialog.show(), + this.uiDialog.position(this.options.position), + t || this.uiDialog.hide() + }, + _setOptions: function (t) { + var i = this, + s = !1, + o = {} + x.each(t, function (t, e) { + i._setOption(t, e), + t in i.sizeRelatedOptions && (s = !0), + t in i.resizableRelatedOptions && (o[t] = e) + }), + s && (this._size(), this._position()), + this.uiDialog.is(':data(ui-resizable)') && + this.uiDialog.resizable('option', o) + }, + _setOption: function (t, e) { + var i, + s = this.uiDialog + 'disabled' !== t && + (this._super(t, e), + 'appendTo' === t && this.uiDialog.appendTo(this._appendTo()), + 'buttons' === t && this._createButtons(), + 'closeText' === t && + this.uiDialogTitlebarClose.button({ + label: x('') + .text('' + this.options.closeText) + .html(), + }), + 'draggable' === t && + ((i = s.is(':data(ui-draggable)')) && + !e && + s.draggable('destroy'), + !i && e && this._makeDraggable()), + 'position' === t && this._position(), + 'resizable' === t && + ((i = s.is(':data(ui-resizable)')) && + !e && + s.resizable('destroy'), + i && + 'string' == typeof e && + s.resizable('option', 'handles', e), + i || !1 === e || this._makeResizable()), + 'title' === t && + this._title(this.uiDialogTitlebar.find('.ui-dialog-title'))) + }, + _size: function () { + var t, + e, + i, + s = this.options + this.element.show().css({ + width: 'auto', + minHeight: 0, + maxHeight: 'none', + height: 0, + }), + s.minWidth > s.width && (s.width = s.minWidth), + (t = this.uiDialog + .css({ height: 'auto', width: s.width }) + .outerHeight()), + (e = Math.max(0, s.minHeight - t)), + (i = + 'number' == typeof s.maxHeight + ? Math.max(0, s.maxHeight - t) + : 'none'), + 'auto' === s.height + ? this.element.css({ + minHeight: e, + maxHeight: i, + height: 'auto', + }) + : this.element.height(Math.max(0, s.height - t)), + this.uiDialog.is(':data(ui-resizable)') && + this.uiDialog.resizable( + 'option', + 'minHeight', + this._minHeight() + ) + }, + _blockFrames: function () { + this.iframeBlocks = this.document.find('iframe').map(function () { + var t = x(this) + return x('
') + .css({ + position: 'absolute', + width: t.outerWidth(), + height: t.outerHeight(), + }) + .appendTo(t.parent()) + .offset(t.offset())[0] + }) + }, + _unblockFrames: function () { + this.iframeBlocks && + (this.iframeBlocks.remove(), delete this.iframeBlocks) + }, + _allowInteraction: function (t) { + return ( + !!x(t.target).closest('.ui-dialog').length || + !!x(t.target).closest('.ui-datepicker').length + ) + }, + _createOverlay: function () { + var i, s + this.options.modal && + ((i = x.fn.jquery.substring(0, 4)), + (s = !0), + this._delay(function () { + s = !1 + }), + this.document.data('ui-dialog-overlays') || + this.document.on( + 'focusin.ui-dialog', + function (t) { + var e + s || + (e = + this._trackingInstances()[0])._allowInteraction( + t + ) || + (t.preventDefault(), + e._focusTabbable(), + ('3.4.' !== i && '3.5.' !== i) || + e._delay(e._restoreTabbableFocus)) + }.bind(this) + ), + (this.overlay = x('
').appendTo(this._appendTo())), + this._addClass( + this.overlay, + null, + 'ui-widget-overlay ui-front' + ), + this._on(this.overlay, { mousedown: '_keepFocus' }), + this.document.data( + 'ui-dialog-overlays', + (this.document.data('ui-dialog-overlays') || 0) + 1 + )) + }, + _destroyOverlay: function () { + var t + this.options.modal && + this.overlay && + ((t = this.document.data('ui-dialog-overlays') - 1) + ? this.document.data('ui-dialog-overlays', t) + : (this.document.off('focusin.ui-dialog'), + this.document.removeData('ui-dialog-overlays')), + this.overlay.remove(), + (this.overlay = null)) + }, + }), + !1 !== x.uiBackCompat && + x.widget('ui.dialog', x.ui.dialog, { + options: { dialogClass: '' }, + _createWrapper: function () { + this._super(), + this.uiDialog.addClass(this.options.dialogClass) + }, + _setOption: function (t, e) { + 'dialogClass' === t && + this.uiDialog + .removeClass(this.options.dialogClass) + .addClass(e), + this._superApply(arguments) + }, + }) + x.ui.dialog + var v = x, + _ = {}, + b = _.toString, + y = /^([\-+])=\s*(\d+\.?\d*)/, + w = [ + { + re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, + parse: function (t) { + return [t[1], t[2], t[3], t[4]] + }, + }, + { + re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, + parse: function (t) { + return [2.55 * t[1], 2.55 * t[2], 2.55 * t[3], t[4]] + }, + }, + { + re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})?/, + parse: function (t) { + return [ + parseInt(t[1], 16), + parseInt(t[2], 16), + parseInt(t[3], 16), + t[4] ? (parseInt(t[4], 16) / 255).toFixed(2) : 1, + ] + }, + }, + { + re: /#([a-f0-9])([a-f0-9])([a-f0-9])([a-f0-9])?/, + parse: function (t) { + return [ + parseInt(t[1] + t[1], 16), + parseInt(t[2] + t[2], 16), + parseInt(t[3] + t[3], 16), + t[4] ? (parseInt(t[4] + t[4], 16) / 255).toFixed(2) : 1, + ] + }, + }, + { + re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, + space: 'hsla', + parse: function (t) { + return [t[1], t[2] / 100, t[3] / 100, t[4]] + }, + }, + ], + I = (v.Color = function (t, e, i, s) { + return new v.Color.fn.parse(t, e, i, s) + }), + S = { + rgba: { + props: { + red: { idx: 0, type: 'byte' }, + green: { idx: 1, type: 'byte' }, + blue: { idx: 2, type: 'byte' }, + }, + }, + hsla: { + props: { + hue: { idx: 0, type: 'degrees' }, + saturation: { idx: 1, type: 'percent' }, + lightness: { idx: 2, type: 'percent' }, + }, + }, + }, + D = { + byte: { floor: !0, max: 255 }, + percent: { max: 1 }, + degrees: { mod: 360, floor: !0 }, + }, + W = (I.support = {}), + O = v('

')[0], + E = v.each + function L(t) { + return null == t + ? t + '' + : 'object' == typeof t + ? _[b.call(t)] || 'object' + : typeof t + } + function N(t, e, i) { + var s = D[e.type] || {} + return null == t + ? i || !e.def + ? null + : e.def + : ((t = s.floor ? ~~t : parseFloat(t)), + isNaN(t) + ? e.def + : s.mod + ? (t + s.mod) % s.mod + : Math.min(s.max, Math.max(0, t))) + } + function R(s) { + var o = I(), + n = (o._rgba = []) + return ( + (s = s.toLowerCase()), + E(w, function (t, e) { + var i = e.re.exec(s), + i = i && e.parse(i), + e = e.space || 'rgba' + if (i) + return ( + (i = o[e](i)), + (o[S[e].cache] = i[S[e].cache]), + (n = o._rgba = i._rgba), + !1 + ) + }), + n.length + ? ('0,0,0,0' === n.join() && v.extend(n, V.transparent), o) + : V[s] + ) + } + function M(t, e, i) { + return 6 * (i = (i + 1) % 1) < 1 + ? t + (e - t) * i * 6 + : 2 * i < 1 + ? e + : 3 * i < 2 + ? t + (e - t) * (2 / 3 - i) * 6 + : t + } + ;(O.style.cssText = 'background-color:rgba(1,1,1,.5)'), + (W.rgba = -1 < O.style.backgroundColor.indexOf('rgba')), + E(S, function (t, e) { + ;(e.cache = '_' + t), + (e.props.alpha = { idx: 3, type: 'percent', def: 1 }) + }), + v.each( + 'Boolean Number String Function Array Date RegExp Object Error Symbol'.split( + ' ' + ), + function (t, e) { + _['[object ' + e + ']'] = e.toLowerCase() + } + ), + ((I.fn = v.extend(I.prototype, { + parse: function (o, t, e, i) { + if (void 0 === o) + return (this._rgba = [null, null, null, null]), this + ;(o.jquery || o.nodeType) && ((o = v(o).css(t)), (t = void 0)) + var n = this, + s = L(o), + r = (this._rgba = []) + return ( + void 0 !== t && ((o = [o, t, e, i]), (s = 'array')), + 'string' === s + ? this.parse(R(o) || V._default) + : 'array' === s + ? (E(S.rgba.props, function (t, e) { + r[e.idx] = N(o[e.idx], e) + }), + this) + : 'object' === s + ? (E( + S, + o instanceof I + ? function (t, e) { + o[e.cache] && + (n[e.cache] = o[e.cache].slice()) + } + : function (t, i) { + var s = i.cache + E(i.props, function (t, e) { + if (!n[s] && i.to) { + if ( + 'alpha' === t || + null == o[t] + ) + return + n[s] = i.to(n._rgba) + } + n[s][e.idx] = N(o[t], e, !0) + }), + n[s] && + v.inArray( + null, + n[s].slice(0, 3) + ) < 0 && + (null == n[s][3] && + (n[s][3] = 1), + i.from && + (n._rgba = i.from(n[s]))) + } + ), + this) + : void 0 + ) + }, + is: function (t) { + var o = I(t), + n = !0, + r = this + return ( + E(S, function (t, e) { + var i, + s = o[e.cache] + return ( + s && + ((i = + r[e.cache] || + (e.to && e.to(r._rgba)) || + []), + E(e.props, function (t, e) { + if (null != s[e.idx]) + return (n = s[e.idx] === i[e.idx]) + })), + n + ) + }), + n + ) + }, + _space: function () { + var i = [], + s = this + return ( + E(S, function (t, e) { + s[e.cache] && i.push(t) + }), + i.pop() + ) + }, + transition: function (t, r) { + var e = (l = I(t))._space(), + i = S[e], + t = 0 === this.alpha() ? I('transparent') : this, + a = t[i.cache] || i.to(t._rgba), + h = a.slice(), + l = l[i.cache] + return ( + E(i.props, function (t, e) { + var i = e.idx, + s = a[i], + o = l[i], + n = D[e.type] || {} + null !== o && + (null === s + ? (h[i] = o) + : (n.mod && + (o - s > n.mod / 2 + ? (s += n.mod) + : s - o > n.mod / 2 && (s -= n.mod)), + (h[i] = N((o - s) * r + s, e)))) + }), + this[e](h) + ) + }, + blend: function (t) { + if (1 === this._rgba[3]) return this + var e = this._rgba.slice(), + i = e.pop(), + s = I(t)._rgba + return I( + v.map(e, function (t, e) { + return (1 - i) * s[e] + i * t + }) + ) + }, + toRgbaString: function () { + var t = 'rgba(', + e = v.map(this._rgba, function (t, e) { + return null != t ? t : 2 < e ? 1 : 0 + }) + return 1 === e[3] && (e.pop(), (t = 'rgb(')), t + e.join() + ')' + }, + toHslaString: function () { + var t = 'hsla(', + e = v.map(this.hsla(), function (t, e) { + return ( + null == t && (t = 2 < e ? 1 : 0), + (t = e && e < 3 ? Math.round(100 * t) + '%' : t) + ) + }) + return 1 === e[3] && (e.pop(), (t = 'hsl(')), t + e.join() + ')' + }, + toHexString: function (t) { + var e = this._rgba.slice(), + i = e.pop() + return ( + t && e.push(~~(255 * i)), + '#' + + v + .map(e, function (t) { + return 1 === (t = (t || 0).toString(16)).length + ? '0' + t + : t + }) + .join('') + ) + }, + toString: function () { + return 0 === this._rgba[3] ? 'transparent' : this.toRgbaString() + }, + })).parse.prototype = I.fn), + (S.hsla.to = function (t) { + if (null == t[0] || null == t[1] || null == t[2]) + return [null, null, null, t[3]] + var e = t[0] / 255, + i = t[1] / 255, + s = t[2] / 255, + o = t[3], + n = Math.max(e, i, s), + r = Math.min(e, i, s), + a = n - r, + h = n + r, + t = 0.5 * h, + i = + r === n + ? 0 + : e === n + ? (60 * (i - s)) / a + 360 + : i === n + ? (60 * (s - e)) / a + 120 + : (60 * (e - i)) / a + 240, + h = 0 == a ? 0 : t <= 0.5 ? a / h : a / (2 - h) + return [Math.round(i) % 360, h, t, null == o ? 1 : o] + }), + (S.hsla.from = function (t) { + if (null == t[0] || null == t[1] || null == t[2]) + return [null, null, null, t[3]] + var e = t[0] / 360, + i = t[1], + s = t[2], + t = t[3], + i = s <= 0.5 ? s * (1 + i) : s + i - s * i, + s = 2 * s - i + return [ + Math.round(255 * M(s, i, e + 1 / 3)), + Math.round(255 * M(s, i, e)), + Math.round(255 * M(s, i, e - 1 / 3)), + t, + ] + }), + E(S, function (h, t) { + var e = t.props, + n = t.cache, + r = t.to, + a = t.from + ;(I.fn[h] = function (t) { + if ((r && !this[n] && (this[n] = r(this._rgba)), void 0 === t)) + return this[n].slice() + var i = L(t), + s = 'array' === i || 'object' === i ? t : arguments, + o = this[n].slice() + return ( + E(e, function (t, e) { + t = s['object' === i ? t : e.idx] + null == t && (t = o[e.idx]), (o[e.idx] = N(t, e)) + }), + a ? (((t = I(a(o)))[n] = o), t) : I(o) + ) + }), + E(e, function (r, a) { + I.fn[r] || + (I.fn[r] = function (t) { + var e, + i = L(t), + s = + 'alpha' === r + ? this._hsla + ? 'hsla' + : 'rgba' + : h, + o = this[s](), + n = o[a.idx] + return 'undefined' === i + ? n + : ('function' === i && + (i = L((t = t.call(this, n)))), + null == t && a.empty + ? this + : ('string' === i && + (e = y.exec(t)) && + (t = + n + + parseFloat(e[2]) * + ('+' === e[1] ? 1 : -1)), + (o[a.idx] = t), + this[s](o))) + }) + }) + }), + (I.hook = function (t) { + t = t.split(' ') + E(t, function (t, n) { + ;(v.cssHooks[n] = { + set: function (t, e) { + var i, + s, + o = '' + if ( + 'transparent' !== e && + ('string' !== L(e) || (i = R(e))) + ) { + if ( + ((e = I(i || e)), !W.rgba && 1 !== e._rgba[3]) + ) { + for ( + s = + 'backgroundColor' === n + ? t.parentNode + : t; + ('' === o || 'transparent' === o) && + s && + s.style; + + ) + try { + ;(o = v.css(s, 'backgroundColor')), + (s = s.parentNode) + } catch (t) {} + e = e.blend( + o && 'transparent' !== o ? o : '_default' + ) + } + e = e.toRgbaString() + } + try { + t.style[n] = e + } catch (t) {} + }, + }), + (v.fx.step[n] = function (t) { + t.colorInit || + ((t.start = I(t.elem, n)), + (t.end = I(t.end)), + (t.colorInit = !0)), + v.cssHooks[n].set( + t.elem, + t.start.transition(t.end, t.pos) + ) + }) + }) + })( + 'backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor' + ), + (v.cssHooks.borderColor = { + expand: function (i) { + var s = {} + return ( + E(['Top', 'Right', 'Bottom', 'Left'], function (t, e) { + s['border' + e + 'Color'] = i + }), + s + ) + }, + }) + var A, + B, + F, + q, + j, + X, + Y, + U, + K, + $, + V = (v.Color.names = { + aqua: '#00ffff', + black: '#000000', + blue: '#0000ff', + fuchsia: '#ff00ff', + gray: '#808080', + green: '#008000', + lime: '#00ff00', + maroon: '#800000', + navy: '#000080', + olive: '#808000', + purple: '#800080', + red: '#ff0000', + silver: '#c0c0c0', + teal: '#008080', + white: '#ffffff', + yellow: '#ffff00', + transparent: [null, null, null, 0], + _default: '#ffffff', + }), + Q = 'ui-effects-', + G = 'ui-effects-style', + Z = 'ui-effects-animated' + function J(t) { + var e, + i, + s = t.ownerDocument.defaultView + ? t.ownerDocument.defaultView.getComputedStyle(t, null) + : t.currentStyle, + o = {} + if (s && s.length && s[0] && s[s[0]]) + for (i = s.length; i--; ) + 'string' == typeof s[(e = s[i])] && + (o[ + e.replace(/-([\da-z])/gi, function (t, e) { + return e.toUpperCase() + }) + ] = s[e]) + else for (e in s) 'string' == typeof s[e] && (o[e] = s[e]) + return o + } + function tt(t, e, i, s) { + return ( + (t = { effect: (t = x.isPlainObject(t) ? (e = t).effect : t) }), + 'function' == typeof (e = null == e ? {} : e) && + ((s = e), (i = null), (e = {})), + ('number' != typeof e && !x.fx.speeds[e]) || + ((s = i), (i = e), (e = {})), + 'function' == typeof i && ((s = i), (i = null)), + e && x.extend(t, e), + (i = i || e.duration), + (t.duration = x.fx.off + ? 0 + : 'number' == typeof i + ? i + : i in x.fx.speeds + ? x.fx.speeds[i] + : x.fx.speeds._default), + (t.complete = s || e.complete), + t + ) + } + function et(t) { + return ( + !t || + 'number' == typeof t || + x.fx.speeds[t] || + ('string' == typeof t && !x.effects.effect[t]) || + 'function' == typeof t || + ('object' == typeof t && !t.effect) + ) + } + function it(t, e) { + var i = e.outerWidth(), + e = e.outerHeight(), + t = + /^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/.exec( + t + ) || ['', 0, i, e, 0] + return { + top: parseFloat(t[1]) || 0, + right: 'auto' === t[2] ? i : parseFloat(t[2]), + bottom: 'auto' === t[3] ? e : parseFloat(t[3]), + left: parseFloat(t[4]) || 0, + } + } + ;(x.effects = { effect: {} }), + (q = ['add', 'remove', 'toggle']), + (j = { + border: 1, + borderBottom: 1, + borderColor: 1, + borderLeft: 1, + borderRight: 1, + borderTop: 1, + borderWidth: 1, + margin: 1, + padding: 1, + }), + x.each( + [ + 'borderLeftStyle', + 'borderRightStyle', + 'borderBottomStyle', + 'borderTopStyle', + ], + function (t, e) { + x.fx.step[e] = function (t) { + ;(('none' !== t.end && !t.setAttr) || + (1 === t.pos && !t.setAttr)) && + (v.style(t.elem, e, t.end), (t.setAttr = !0)) + } + } + ), + x.fn.addBack || + (x.fn.addBack = function (t) { + return this.add( + null == t ? this.prevObject : this.prevObject.filter(t) + ) + }), + (x.effects.animateClass = function (o, t, e, i) { + var n = x.speed(t, e, i) + return this.queue(function () { + var i = x(this), + t = i.attr('class') || '', + e = (e = n.children ? i.find('*').addBack() : i).map( + function () { + return { el: x(this), start: J(this) } + } + ), + s = function () { + x.each(q, function (t, e) { + o[e] && i[e + 'Class'](o[e]) + }) + } + s(), + (e = e.map(function () { + return ( + (this.end = J(this.el[0])), + (this.diff = (function (t, e) { + var i, + s, + o = {} + for (i in e) + (s = e[i]), + t[i] !== s && + (j[i] || + (!x.fx.step[i] && + isNaN(parseFloat(s))) || + (o[i] = s)) + return o + })(this.start, this.end)), + this + ) + })), + i.attr('class', t), + (e = e.map(function () { + var t = this, + e = x.Deferred(), + i = x.extend({}, n, { + queue: !1, + complete: function () { + e.resolve(t) + }, + }) + return this.el.animate(this.diff, i), e.promise() + })), + x.when.apply(x, e.get()).done(function () { + s(), + x.each(arguments, function () { + var e = this.el + x.each(this.diff, function (t) { + e.css(t, '') + }) + }), + n.complete.call(i[0]) + }) + }) + }), + x.fn.extend({ + addClass: + ((F = x.fn.addClass), + function (t, e, i, s) { + return e + ? x.effects.animateClass.call(this, { add: t }, e, i, s) + : F.apply(this, arguments) + }), + removeClass: + ((B = x.fn.removeClass), + function (t, e, i, s) { + return 1 < arguments.length + ? x.effects.animateClass.call( + this, + { remove: t }, + e, + i, + s + ) + : B.apply(this, arguments) + }), + toggleClass: + ((A = x.fn.toggleClass), + function (t, e, i, s, o) { + return 'boolean' == typeof e || void 0 === e + ? i + ? x.effects.animateClass.call( + this, + e ? { add: t } : { remove: t }, + i, + s, + o + ) + : A.apply(this, arguments) + : x.effects.animateClass.call( + this, + { toggle: t }, + e, + i, + s + ) + }), + switchClass: function (t, e, i, s, o) { + return x.effects.animateClass.call( + this, + { add: e, remove: t }, + i, + s, + o + ) + }, + }), + x.expr && + x.expr.pseudos && + x.expr.pseudos.animated && + (x.expr.pseudos.animated = + ((X = x.expr.pseudos.animated), + function (t) { + return !!x(t).data(Z) || X(t) + })), + !1 !== x.uiBackCompat && + x.extend(x.effects, { + save: function (t, e) { + for (var i = 0, s = e.length; i < s; i++) + null !== e[i] && t.data(Q + e[i], t[0].style[e[i]]) + }, + restore: function (t, e) { + for (var i, s = 0, o = e.length; s < o; s++) + null !== e[s] && + ((i = t.data(Q + e[s])), t.css(e[s], i)) + }, + setMode: function (t, e) { + return (e = + 'toggle' === e + ? t.is(':hidden') + ? 'show' + : 'hide' + : e) + }, + createWrapper: function (i) { + if (i.parent().is('.ui-effects-wrapper')) return i.parent() + var s = { + width: i.outerWidth(!0), + height: i.outerHeight(!0), + float: i.css('float'), + }, + t = x('

') + .addClass('ui-effects-wrapper') + .css({ + fontSize: '100%', + background: 'transparent', + border: 'none', + margin: 0, + padding: 0, + }), + e = { width: i.width(), height: i.height() }, + o = document.activeElement + try { + o.id + } catch (t) { + o = document.body + } + return ( + i.wrap(t), + (i[0] !== o && !x.contains(i[0], o)) || + x(o).trigger('focus'), + (t = i.parent()), + 'static' === i.css('position') + ? (t.css({ position: 'relative' }), + i.css({ position: 'relative' })) + : (x.extend(s, { + position: i.css('position'), + zIndex: i.css('z-index'), + }), + x.each( + ['top', 'left', 'bottom', 'right'], + function (t, e) { + ;(s[e] = i.css(e)), + isNaN(parseInt(s[e], 10)) && + (s[e] = 'auto') + } + ), + i.css({ + position: 'relative', + top: 0, + left: 0, + right: 'auto', + bottom: 'auto', + })), + i.css(e), + t.css(s).show() + ) + }, + removeWrapper: function (t) { + var e = document.activeElement + return ( + t.parent().is('.ui-effects-wrapper') && + (t.parent().replaceWith(t), + (t[0] !== e && !x.contains(t[0], e)) || + x(e).trigger('focus')), + t + ) + }, + }), + x.extend(x.effects, { + version: '1.13.1', + define: function (t, e, i) { + return ( + i || ((i = e), (e = 'effect')), + (x.effects.effect[t] = i), + (x.effects.effect[t].mode = e), + i + ) + }, + scaledDimensions: function (t, e, i) { + if (0 === e) + return { + height: 0, + width: 0, + outerHeight: 0, + outerWidth: 0, + } + var s = 'horizontal' !== i ? (e || 100) / 100 : 1, + e = 'vertical' !== i ? (e || 100) / 100 : 1 + return { + height: t.height() * e, + width: t.width() * s, + outerHeight: t.outerHeight() * e, + outerWidth: t.outerWidth() * s, + } + }, + clipToBox: function (t) { + return { + width: t.clip.right - t.clip.left, + height: t.clip.bottom - t.clip.top, + left: t.clip.left, + top: t.clip.top, + } + }, + unshift: function (t, e, i) { + var s = t.queue() + 1 < e && s.splice.apply(s, [1, 0].concat(s.splice(e, i))), + t.dequeue() + }, + saveStyle: function (t) { + t.data(G, t[0].style.cssText) + }, + restoreStyle: function (t) { + ;(t[0].style.cssText = t.data(G) || ''), t.removeData(G) + }, + mode: function (t, e) { + t = t.is(':hidden') + return ( + 'toggle' === e && (e = t ? 'show' : 'hide'), + (e = (t ? 'hide' === e : 'show' === e) ? 'none' : e) + ) + }, + getBaseline: function (t, e) { + var i, s + switch (t[0]) { + case 'top': + i = 0 + break + case 'middle': + i = 0.5 + break + case 'bottom': + i = 1 + break + default: + i = t[0] / e.height + } + switch (t[1]) { + case 'left': + s = 0 + break + case 'center': + s = 0.5 + break + case 'right': + s = 1 + break + default: + s = t[1] / e.width + } + return { x: s, y: i } + }, + createPlaceholder: function (t) { + var e, + i = t.css('position'), + s = t.position() + return ( + t + .css({ + marginTop: t.css('marginTop'), + marginBottom: t.css('marginBottom'), + marginLeft: t.css('marginLeft'), + marginRight: t.css('marginRight'), + }) + .outerWidth(t.outerWidth()) + .outerHeight(t.outerHeight()), + /^(static|relative)/.test(i) && + ((i = 'absolute'), + (e = x('<' + t[0].nodeName + '>') + .insertAfter(t) + .css({ + display: /^(inline|ruby)/.test(t.css('display')) + ? 'inline-block' + : 'block', + visibility: 'hidden', + marginTop: t.css('marginTop'), + marginBottom: t.css('marginBottom'), + marginLeft: t.css('marginLeft'), + marginRight: t.css('marginRight'), + float: t.css('float'), + }) + .outerWidth(t.outerWidth()) + .outerHeight(t.outerHeight()) + .addClass('ui-effects-placeholder')), + t.data(Q + 'placeholder', e)), + t.css({ position: i, left: s.left, top: s.top }), + e + ) + }, + removePlaceholder: function (t) { + var e = Q + 'placeholder', + i = t.data(e) + i && (i.remove(), t.removeData(e)) + }, + cleanUp: function (t) { + x.effects.restoreStyle(t), x.effects.removePlaceholder(t) + }, + setTransition: function (s, t, o, n) { + return ( + (n = n || {}), + x.each(t, function (t, e) { + var i = s.cssUnit(e) + 0 < i[0] && (n[e] = i[0] * o + i[1]) + }), + n + ) + }, + }), + x.fn.extend({ + effect: function () { + function t(t) { + var e = x(this), + i = x.effects.mode(e, a) || n + e.data(Z, !0), + h.push(i), + n && + ('show' === i || (i === n && 'hide' === i)) && + e.show(), + (n && 'none' === i) || x.effects.saveStyle(e), + 'function' == typeof t && t() + } + var s = tt.apply(this, arguments), + o = x.effects.effect[s.effect], + n = o.mode, + e = s.queue, + i = e || 'fx', + r = s.complete, + a = s.mode, + h = [] + return x.fx.off || !o + ? a + ? this[a](s.duration, r) + : this.each(function () { + r && r.call(this) + }) + : !1 === e + ? this.each(t).each(l) + : this.queue(i, t).queue(i, l) + function l(t) { + var e = x(this) + function i() { + 'function' == typeof r && r.call(e[0]), + 'function' == typeof t && t() + } + ;(s.mode = h.shift()), + !1 === x.uiBackCompat || n + ? 'none' === s.mode + ? (e[a](), i()) + : o.call(e[0], s, function () { + e.removeData(Z), + x.effects.cleanUp(e), + 'hide' === s.mode && e.hide(), + i() + }) + : (e.is(':hidden') ? 'hide' === a : 'show' === a) + ? (e[a](), i()) + : o.call(e[0], s, i) + } + }, + show: + ((K = x.fn.show), + function (t) { + if (et(t)) return K.apply(this, arguments) + t = tt.apply(this, arguments) + return (t.mode = 'show'), this.effect.call(this, t) + }), + hide: + ((U = x.fn.hide), + function (t) { + if (et(t)) return U.apply(this, arguments) + t = tt.apply(this, arguments) + return (t.mode = 'hide'), this.effect.call(this, t) + }), + toggle: + ((Y = x.fn.toggle), + function (t) { + if (et(t) || 'boolean' == typeof t) + return Y.apply(this, arguments) + t = tt.apply(this, arguments) + return (t.mode = 'toggle'), this.effect.call(this, t) + }), + cssUnit: function (t) { + var i = this.css(t), + s = [] + return ( + x.each(['em', 'px', '%', 'pt'], function (t, e) { + 0 < i.indexOf(e) && (s = [parseFloat(i), e]) + }), + s + ) + }, + cssClip: function (t) { + return t + ? this.css( + 'clip', + 'rect(' + + t.top + + 'px ' + + t.right + + 'px ' + + t.bottom + + 'px ' + + t.left + + 'px)' + ) + : it(this.css('clip'), this) + }, + transfer: function (t, e) { + var i = x(this), + s = x(t.to), + o = 'fixed' === s.css('position'), + n = x('body'), + r = o ? n.scrollTop() : 0, + a = o ? n.scrollLeft() : 0, + n = s.offset(), + n = { + top: n.top - r, + left: n.left - a, + height: s.innerHeight(), + width: s.innerWidth(), + }, + s = i.offset(), + h = x("
") + h.appendTo('body') + .addClass(t.className) + .css({ + top: s.top - r, + left: s.left - a, + height: i.innerHeight(), + width: i.innerWidth(), + position: o ? 'fixed' : 'absolute', + }) + .animate(n, t.duration, t.easing, function () { + h.remove(), 'function' == typeof e && e() + }) + }, + }), + (x.fx.step.clip = function (t) { + t.clipInit || + ((t.start = x(t.elem).cssClip()), + 'string' == typeof t.end && (t.end = it(t.end, t.elem)), + (t.clipInit = !0)), + x(t.elem).cssClip({ + top: t.pos * (t.end.top - t.start.top) + t.start.top, + right: + t.pos * (t.end.right - t.start.right) + t.start.right, + bottom: + t.pos * (t.end.bottom - t.start.bottom) + + t.start.bottom, + left: t.pos * (t.end.left - t.start.left) + t.start.left, + }) + }), + ($ = {}), + x.each(['Quad', 'Cubic', 'Quart', 'Quint', 'Expo'], function (e, t) { + $[t] = function (t) { + return Math.pow(t, e + 2) + } + }), + x.extend($, { + Sine: function (t) { + return 1 - Math.cos((t * Math.PI) / 2) + }, + Circ: function (t) { + return 1 - Math.sqrt(1 - t * t) + }, + Elastic: function (t) { + return 0 === t || 1 === t + ? t + : -Math.pow(2, 8 * (t - 1)) * + Math.sin(((80 * (t - 1) - 7.5) * Math.PI) / 15) + }, + Back: function (t) { + return t * t * (3 * t - 2) + }, + Bounce: function (t) { + for (var e, i = 4; t < ((e = Math.pow(2, --i)) - 1) / 11; ); + return ( + 1 / Math.pow(4, 3 - i) - + 7.5625 * Math.pow((3 * e - 2) / 22 - t, 2) + ) + }, + }), + x.each($, function (t, e) { + ;(x.easing['easeIn' + t] = e), + (x.easing['easeOut' + t] = function (t) { + return 1 - e(1 - t) + }), + (x.easing['easeInOut' + t] = function (t) { + return t < 0.5 ? e(2 * t) / 2 : 1 - e(-2 * t + 2) / 2 + }) + }) + ;(O = x.effects), + x.effects.define('blind', 'hide', function (t, e) { + var i = { + up: ['bottom', 'top'], + vertical: ['bottom', 'top'], + down: ['top', 'bottom'], + left: ['right', 'left'], + horizontal: ['right', 'left'], + right: ['left', 'right'], + }, + s = x(this), + o = t.direction || 'up', + n = s.cssClip(), + r = { clip: x.extend({}, n) }, + a = x.effects.createPlaceholder(s) + ;(r.clip[i[o][0]] = r.clip[i[o][1]]), + 'show' === t.mode && + (s.cssClip(r.clip), + a && a.css(x.effects.clipToBox(r)), + (r.clip = n)), + a && a.animate(x.effects.clipToBox(r), t.duration, t.easing), + s.animate(r, { + queue: !1, + duration: t.duration, + easing: t.easing, + complete: e, + }) + }), + x.effects.define('bounce', function (t, e) { + var i, + s, + o = x(this), + n = t.mode, + r = 'hide' === n, + a = 'show' === n, + h = t.direction || 'up', + l = t.distance, + c = t.times || 5, + n = 2 * c + (a || r ? 1 : 0), + p = t.duration / n, + u = t.easing, + d = 'up' === h || 'down' === h ? 'top' : 'left', + f = 'up' === h || 'left' === h, + g = 0, + t = o.queue().length + for ( + x.effects.createPlaceholder(o), + h = o.css(d), + l = l || o['top' == d ? 'outerHeight' : 'outerWidth']() / 3, + a && + (((s = { opacity: 1 })[d] = h), + o + .css('opacity', 0) + .css(d, f ? 2 * -l : 2 * l) + .animate(s, p, u)), + r && (l /= Math.pow(2, c - 1)), + (s = {})[d] = h; + g < c; + g++ + ) + ((i = {})[d] = (f ? '-=' : '+=') + l), + o.animate(i, p, u).animate(s, p, u), + (l = r ? 2 * l : l / 2) + r && + (((i = { opacity: 0 })[d] = (f ? '-=' : '+=') + l), + o.animate(i, p, u)), + o.queue(e), + x.effects.unshift(o, t, 1 + n) + }), + x.effects.define('clip', 'hide', function (t, e) { + var i = {}, + s = x(this), + o = t.direction || 'vertical', + n = 'both' === o, + r = n || 'horizontal' === o, + n = n || 'vertical' === o, + o = s.cssClip() + ;(i.clip = { + top: n ? (o.bottom - o.top) / 2 : o.top, + right: r ? (o.right - o.left) / 2 : o.right, + bottom: n ? (o.bottom - o.top) / 2 : o.bottom, + left: r ? (o.right - o.left) / 2 : o.left, + }), + x.effects.createPlaceholder(s), + 'show' === t.mode && (s.cssClip(i.clip), (i.clip = o)), + s.animate(i, { + queue: !1, + duration: t.duration, + easing: t.easing, + complete: e, + }) + }), + x.effects.define('drop', 'hide', function (t, e) { + var i = x(this), + s = 'show' === t.mode, + o = t.direction || 'left', + n = 'up' === o || 'down' === o ? 'top' : 'left', + r = 'up' === o || 'left' === o ? '-=' : '+=', + a = '+=' == r ? '-=' : '+=', + h = { opacity: 0 } + x.effects.createPlaceholder(i), + (o = + t.distance || + i['top' == n ? 'outerHeight' : 'outerWidth'](!0) / 2), + (h[n] = r + o), + s && (i.css(h), (h[n] = a + o), (h.opacity = 1)), + i.animate(h, { + queue: !1, + duration: t.duration, + easing: t.easing, + complete: e, + }) + }), + x.effects.define('explode', 'hide', function (t, e) { + var i, + s, + o, + n, + r, + a, + h = t.pieces ? Math.round(Math.sqrt(t.pieces)) : 3, + l = h, + c = x(this), + p = 'show' === t.mode, + u = c.show().css('visibility', 'hidden').offset(), + d = Math.ceil(c.outerWidth() / l), + f = Math.ceil(c.outerHeight() / h), + g = [] + function m() { + g.push(this), + g.length === h * l && + (c.css({ visibility: 'visible' }), x(g).remove(), e()) + } + for (i = 0; i < h; i++) + for (n = u.top + i * f, a = i - (h - 1) / 2, s = 0; s < l; s++) + (o = u.left + s * d), + (r = s - (l - 1) / 2), + c + .clone() + .appendTo('body') + .wrap('
') + .css({ + position: 'absolute', + visibility: 'visible', + left: -s * d, + top: -i * f, + }) + .parent() + .addClass('ui-effects-explode') + .css({ + position: 'absolute', + overflow: 'hidden', + width: d, + height: f, + left: o + (p ? r * d : 0), + top: n + (p ? a * f : 0), + opacity: p ? 0 : 1, + }) + .animate( + { + left: o + (p ? 0 : r * d), + top: n + (p ? 0 : a * f), + opacity: p ? 1 : 0, + }, + t.duration || 500, + t.easing, + m + ) + }), + x.effects.define('fade', 'toggle', function (t, e) { + var i = 'show' === t.mode + x(this) + .css('opacity', i ? 0 : 1) + .animate( + { opacity: i ? 1 : 0 }, + { + queue: !1, + duration: t.duration, + easing: t.easing, + complete: e, + } + ) + }), + x.effects.define('fold', 'hide', function (e, t) { + var i = x(this), + s = e.mode, + o = 'show' === s, + n = 'hide' === s, + r = e.size || 15, + a = /([0-9]+)%/.exec(r), + h = e.horizFirst ? ['right', 'bottom'] : ['bottom', 'right'], + l = e.duration / 2, + c = x.effects.createPlaceholder(i), + p = i.cssClip(), + u = { clip: x.extend({}, p) }, + d = { clip: x.extend({}, p) }, + f = [p[h[0]], p[h[1]]], + s = i.queue().length + a && (r = (parseInt(a[1], 10) / 100) * f[n ? 0 : 1]), + (u.clip[h[0]] = r), + (d.clip[h[0]] = r), + (d.clip[h[1]] = 0), + o && + (i.cssClip(d.clip), + c && c.css(x.effects.clipToBox(d)), + (d.clip = p)), + i + .queue(function (t) { + c && + c + .animate(x.effects.clipToBox(u), l, e.easing) + .animate(x.effects.clipToBox(d), l, e.easing), + t() + }) + .animate(u, l, e.easing) + .animate(d, l, e.easing) + .queue(t), + x.effects.unshift(i, s, 4) + }), + x.effects.define('highlight', 'show', function (t, e) { + var i = x(this), + s = { backgroundColor: i.css('backgroundColor') } + 'hide' === t.mode && (s.opacity = 0), + x.effects.saveStyle(i), + i + .css({ + backgroundImage: 'none', + backgroundColor: t.color || '#ffff99', + }) + .animate(s, { + queue: !1, + duration: t.duration, + easing: t.easing, + complete: e, + }) + }), + x.effects.define('size', function (s, e) { + var o, + i = x(this), + t = ['fontSize'], + n = [ + 'borderTopWidth', + 'borderBottomWidth', + 'paddingTop', + 'paddingBottom', + ], + r = [ + 'borderLeftWidth', + 'borderRightWidth', + 'paddingLeft', + 'paddingRight', + ], + a = s.mode, + h = 'effect' !== a, + l = s.scale || 'both', + c = s.origin || ['middle', 'center'], + p = i.css('position'), + u = i.position(), + d = x.effects.scaledDimensions(i), + f = s.from || d, + g = s.to || x.effects.scaledDimensions(i, 0) + x.effects.createPlaceholder(i), + 'show' === a && ((a = f), (f = g), (g = a)), + (o = { + from: { y: f.height / d.height, x: f.width / d.width }, + to: { y: g.height / d.height, x: g.width / d.width }, + }), + ('box' !== l && 'both' !== l) || + (o.from.y !== o.to.y && + ((f = x.effects.setTransition(i, n, o.from.y, f)), + (g = x.effects.setTransition(i, n, o.to.y, g))), + o.from.x !== o.to.x && + ((f = x.effects.setTransition(i, r, o.from.x, f)), + (g = x.effects.setTransition(i, r, o.to.x, g)))), + ('content' !== l && 'both' !== l) || + (o.from.y !== o.to.y && + ((f = x.effects.setTransition(i, t, o.from.y, f)), + (g = x.effects.setTransition(i, t, o.to.y, g)))), + c && + ((c = x.effects.getBaseline(c, d)), + (f.top = (d.outerHeight - f.outerHeight) * c.y + u.top), + (f.left = (d.outerWidth - f.outerWidth) * c.x + u.left), + (g.top = (d.outerHeight - g.outerHeight) * c.y + u.top), + (g.left = (d.outerWidth - g.outerWidth) * c.x + u.left)), + delete f.outerHeight, + delete f.outerWidth, + i.css(f), + ('content' !== l && 'both' !== l) || + ((n = n.concat(['marginTop', 'marginBottom']).concat(t)), + (r = r.concat(['marginLeft', 'marginRight'])), + i.find('*[width]').each(function () { + var t = x(this), + e = x.effects.scaledDimensions(t), + i = { + height: e.height * o.from.y, + width: e.width * o.from.x, + outerHeight: e.outerHeight * o.from.y, + outerWidth: e.outerWidth * o.from.x, + }, + e = { + height: e.height * o.to.y, + width: e.width * o.to.x, + outerHeight: e.height * o.to.y, + outerWidth: e.width * o.to.x, + } + o.from.y !== o.to.y && + ((i = x.effects.setTransition(t, n, o.from.y, i)), + (e = x.effects.setTransition(t, n, o.to.y, e))), + o.from.x !== o.to.x && + ((i = x.effects.setTransition( + t, + r, + o.from.x, + i + )), + (e = x.effects.setTransition(t, r, o.to.x, e))), + h && x.effects.saveStyle(t), + t.css(i), + t.animate(e, s.duration, s.easing, function () { + h && x.effects.restoreStyle(t) + }) + })), + i.animate(g, { + queue: !1, + duration: s.duration, + easing: s.easing, + complete: function () { + var t = i.offset() + 0 === g.opacity && i.css('opacity', f.opacity), + h || + (i + .css( + 'position', + 'static' === p ? 'relative' : p + ) + .offset(t), + x.effects.saveStyle(i)), + e() + }, + }) + }), + x.effects.define('scale', function (t, e) { + var i = x(this), + s = t.mode, + s = + parseInt(t.percent, 10) || + (0 === parseInt(t.percent, 10) || 'effect' !== s ? 0 : 100), + s = x.extend( + !0, + { + from: x.effects.scaledDimensions(i), + to: x.effects.scaledDimensions( + i, + s, + t.direction || 'both' + ), + origin: t.origin || ['middle', 'center'], + }, + t + ) + t.fade && ((s.from.opacity = 1), (s.to.opacity = 0)), + x.effects.effect.size.call(this, s, e) + }), + x.effects.define('puff', 'hide', function (t, e) { + t = x.extend(!0, {}, t, { + fade: !0, + percent: parseInt(t.percent, 10) || 150, + }) + x.effects.effect.scale.call(this, t, e) + }), + x.effects.define('pulsate', 'show', function (t, e) { + var i = x(this), + s = t.mode, + o = 'show' === s, + n = 2 * (t.times || 5) + (o || 'hide' === s ? 1 : 0), + r = t.duration / n, + a = 0, + h = 1, + s = i.queue().length + for ( + (!o && i.is(':visible')) || + (i.css('opacity', 0).show(), (a = 1)); + h < n; + h++ + ) + i.animate({ opacity: a }, r, t.easing), (a = 1 - a) + i.animate({ opacity: a }, r, t.easing), + i.queue(e), + x.effects.unshift(i, s, 1 + n) + }), + x.effects.define('shake', function (t, e) { + var i = 1, + s = x(this), + o = t.direction || 'left', + n = t.distance || 20, + r = t.times || 3, + a = 2 * r + 1, + h = Math.round(t.duration / a), + l = 'up' === o || 'down' === o ? 'top' : 'left', + c = 'up' === o || 'left' === o, + p = {}, + u = {}, + d = {}, + o = s.queue().length + for ( + x.effects.createPlaceholder(s), + p[l] = (c ? '-=' : '+=') + n, + u[l] = (c ? '+=' : '-=') + 2 * n, + d[l] = (c ? '-=' : '+=') + 2 * n, + s.animate(p, h, t.easing); + i < r; + i++ + ) + s.animate(u, h, t.easing).animate(d, h, t.easing) + s + .animate(u, h, t.easing) + .animate(p, h / 2, t.easing) + .queue(e), + x.effects.unshift(s, o, 1 + a) + }), + x.effects.define('slide', 'show', function (t, e) { + var i, + s, + o = x(this), + n = { + up: ['bottom', 'top'], + down: ['top', 'bottom'], + left: ['right', 'left'], + right: ['left', 'right'], + }, + r = t.mode, + a = t.direction || 'left', + h = 'up' === a || 'down' === a ? 'top' : 'left', + l = 'up' === a || 'left' === a, + c = + t.distance || + o['top' == h ? 'outerHeight' : 'outerWidth'](!0), + p = {} + x.effects.createPlaceholder(o), + (i = o.cssClip()), + (s = o.position()[h]), + (p[h] = (l ? -1 : 1) * c + s), + (p.clip = o.cssClip()), + (p.clip[n[a][1]] = p.clip[n[a][0]]), + 'show' === r && + (o.cssClip(p.clip), + o.css(h, p[h]), + (p.clip = i), + (p[h] = s)), + o.animate(p, { + queue: !1, + duration: t.duration, + easing: t.easing, + complete: e, + }) + }), + !1 !== x.uiBackCompat && + x.effects.define('transfer', function (t, e) { + x(this).transfer(t, e) + }) +}) diff --git a/v1/src/simulator/vendor/table2csv.js b/v1/src/simulator/vendor/table2csv.js new file mode 100644 index 00000000..ab734062 --- /dev/null +++ b/v1/src/simulator/vendor/table2csv.js @@ -0,0 +1,113 @@ +jQuery.fn.table2CSV = function (options) { + var options = jQuery.extend( + { + separator: ',', + header: [], + headerSelector: 'none', + columnSelector: 'td, th', + delivery: 'value', // popup, value, download + // filename: 'test.csv', // filename to download + transform_gt_lt: true, // make > and < to > and < + }, + options + ) + + var csvData = [] + var headerArr = [] + var el = this + + //header + var numCols = options.header.length + var tmpRow = [] // construct header avalible array + + if (numCols > 0) { + for (var i = 0; i < numCols; i++) { + tmpRow[tmpRow.length] = formatData(options.header[i]) + } + } else { + $(el) + .filter(':visible') + .find(options.headerSelector) + .each(function () { + if ($(this).css('display') != 'none') + tmpRow[tmpRow.length] = formatData($(this).html()) + }) + } + + row2CSV(tmpRow) + + // actual data + $(el) + .find('tr') + .each(function () { + var tmpRow = [] + $(this) + .filter(':visible') + .find(options.columnSelector) + .each(function () { + if ($(this).css('display') != 'none') + tmpRow[tmpRow.length] = formatData($(this).html()) + }) + row2CSV(tmpRow) + }) + if (options.delivery == 'popup') { + var mydata = csvData.join('\n') + if (options.transform_gt_lt) { + mydata = sinri_recover_gt_and_lt(mydata) + } + return popup(mydata) + } else if (options.delivery == 'download') { + var mydata = csvData.join('\n') + if (options.transform_gt_lt) { + mydata = sinri_recover_gt_and_lt(mydata) + } + var url = 'data:text/csv;charset=utf8,' + encodeURIComponent(mydata) + window.open(url) + return true + } else { + var mydata = csvData.join('\n') + if (options.transform_gt_lt) { + mydata = sinri_recover_gt_and_lt(mydata) + } + return mydata + } + + function sinri_recover_gt_and_lt(input) { + var regexp = new RegExp(/>/g) + var input = input.replace(regexp, '>') + var regexp = new RegExp(/</g) + var input = input.replace(regexp, '<') + return input + } + + function row2CSV(tmpRow) { + var tmp = tmpRow.join('') // to remove any blank rows + // alert(tmp); + if (tmpRow.length > 0 && tmp != '') { + var mystr = tmpRow.join(options.separator) + csvData[csvData.length] = mystr + } + } + function formatData(input) { + // double " according to rfc4180 + var regexp = new RegExp(/["]/g) + var output = input.replace(regexp, '""') + //HTML + var regexp = new RegExp(/\<[^\<]+\>/g) + var output = output.replace(regexp, '') + output = output.replace(/ /gi, ' ') //replace   + if (output == '') return '' + return '"' + output.trim() + '"' + } + function popup(data) { + var generator = window.open('', 'csv', 'height=400,width=600') + generator.document.write('CSV') + generator.document.write('') + generator.document.write('') + generator.document.write('') + generator.document.close() + return true + } +} diff --git a/v1/src/store/SimulatorStore/SimulatorStore.ts b/v1/src/store/SimulatorStore/SimulatorStore.ts new file mode 100644 index 00000000..69aa9cb3 --- /dev/null +++ b/v1/src/store/SimulatorStore/SimulatorStore.ts @@ -0,0 +1,13 @@ +import { extractStore } from '../extractStore' +import { defineStore } from 'pinia' +import { useActions } from './actions' +import { useGetters } from './getters' +import { useState } from './state' + +export const SimulatorStore = defineStore('simulatorStore', () => { + return { + ...extractStore(useState()), + ...extractStore(useGetters()), + ...extractStore(useActions()), + } +}) diff --git a/v1/src/store/SimulatorStore/actions.ts b/v1/src/store/SimulatorStore/actions.ts new file mode 100644 index 00000000..e127bc5f --- /dev/null +++ b/v1/src/store/SimulatorStore/actions.ts @@ -0,0 +1,16 @@ +import { defineStore } from 'pinia' +import { useState } from './state' + +export const useActions = defineStore('simulatorStore.actions', () => { + const state = useState() + + function showTitle(): void { + console.log(state.title) + } + + // Note you are free to define as many internal functions as you want. + // You only expose the functions that are returned. + return { + showTitle, + } +}) diff --git a/v1/src/store/SimulatorStore/getters.ts b/v1/src/store/SimulatorStore/getters.ts new file mode 100644 index 00000000..6d409942 --- /dev/null +++ b/v1/src/store/SimulatorStore/getters.ts @@ -0,0 +1,15 @@ +import { defineStore } from 'pinia' +import { computed } from 'vue' +import { useState } from './state' + +export const useGetters = defineStore('simulatorStore.getters', () => { + const state = useState() + + const getTitle = computed((): string => { + return `${state.title} !!!` + }) + + return { + getTitle, + } +}) diff --git a/v1/src/store/SimulatorStore/state.ts b/v1/src/store/SimulatorStore/state.ts new file mode 100644 index 00000000..1bad89ad --- /dev/null +++ b/v1/src/store/SimulatorStore/state.ts @@ -0,0 +1,66 @@ +import { defineStore } from 'pinia' + +// use camel case variable names +export interface State { + title: string + activeCircuit: + | Object + | { + id: number | string + name: string + } + circuit_list: Array + dialogBox: { + // create_circuit: boolean + // delete_circuit: boolean + combinationalanalysis_dialog: boolean + hex_bin_dec_converter_dialog: boolean + saveimage_dialog: boolean + theme_dialog: boolean + customshortcut_dialog: boolean + insertsubcircuit_dialog: boolean + exportverilog_dialog: boolean + save_project_dialog: boolean + open_project_dialog: boolean + export_project_dialog: boolean + import_project_dialog: boolean + } + // createCircuit: Object | { circuitName: string } + combinationalAnalysis: Object +} + +export const useState = defineStore({ + id: 'simulatorStore.state', + + state: (): State => { + return { + title: 'Welcome to CircuitVerse Simulator', + activeCircuit: {}, + circuit_list: [], + dialogBox: { + // create_circuit: false, + // delete_circuit: false, + combinationalanalysis_dialog: false, + hex_bin_dec_converter_dialog: false, + saveimage_dialog: false, + theme_dialog: false, + customshortcut_dialog: false, + insertsubcircuit_dialog: false, + exportverilog_dialog: false, + save_project_dialog: false, + open_project_dialog: false, + export_project_dialog: false, + import_project_dialog: false, + }, + // createCircuit: { + // circuitName: 'Untitled Circuit', + // }, + combinationalAnalysis: { + inputNameList: 'eg. In A, In B', + outputNameList: 'eg. Out X, Out Y', + booleanExpression: 'Example: (AB)', + decimalColumnBox: false, + }, + } + }, +}) diff --git a/v1/src/store/authStore.ts b/v1/src/store/authStore.ts new file mode 100644 index 00000000..12dd433c --- /dev/null +++ b/v1/src/store/authStore.ts @@ -0,0 +1,57 @@ +import { defineStore } from 'pinia' + +interface AuthStoreType { + isLoggedIn: boolean + userId: string | number + username: string + locale: string + isAdmin: boolean +} + +interface UserInfo { + isLoggedIn: boolean + id: string + attributes: { + name: string + locale: string + admin: boolean + } +} +export const useAuthStore = defineStore({ + id: 'authStore', + state: (): AuthStoreType => ({ + isLoggedIn: false, + userId: '', + username: '', + locale: 'en', + isAdmin: false, + }), + actions: { + setUserInfo(userInfo: UserInfo): void { + this.isLoggedIn = true + this.userId = userInfo.id ?? '' + this.username = userInfo.attributes.name ?? '' + this.locale = userInfo.attributes.locale ?? 'en' + this.isAdmin = userInfo.attributes.admin + }, + }, + getters: { + getIsLoggedIn(): boolean { + return this.isLoggedIn + }, + getUserId(): string | number { + return this.userId + }, + getUsername(): string { + return this.username + }, + getLocale(): string { + return this.locale + }, + getIsAdmin(): boolean { + return this.isAdmin + }, + }, +}) + +// TODO: extract store verify and check better ways to impliment diff --git a/v1/src/store/extractStore.ts b/v1/src/store/extractStore.ts new file mode 100644 index 00000000..f7b48129 --- /dev/null +++ b/v1/src/store/extractStore.ts @@ -0,0 +1,40 @@ +import type { + PiniaCustomStateProperties, + StoreActions, + StoreGeneric, + StoreGetters, + StoreState, +} from 'pinia' +import type { ToRefs } from 'vue' +import { isReactive, isRef, toRaw, toRef } from 'vue' + +type Extracted = ToRefs< + StoreState & + StoreGetters & + PiniaCustomStateProperties> +> & + StoreActions + +/** + * Creates an object of references with all the state, getters, actions + * and plugin-added state properties of the store. + * + * @param store - store to extract the refs from + */ +export function extractStore( + store: SS +): Extracted { + const rawStore = toRaw(store) + const refs: Record = {} + + for (const [key, value] of Object.entries(rawStore)) { + if (isRef(value) || isReactive(value)) { + refs[key] = toRef(store, key) + } else if (typeof value === 'function') { + refs[key] = value + } + } + + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + return refs as Extracted +} diff --git a/v1/src/store/projectStore.ts b/v1/src/store/projectStore.ts new file mode 100644 index 00000000..3a09d0c8 --- /dev/null +++ b/v1/src/store/projectStore.ts @@ -0,0 +1,37 @@ +import { defineStore } from 'pinia' + +interface projectStoreType { + project: { + // id: number //use later if needed + name: string + nameDefined: boolean + } +} + +export const useProjectStore = defineStore({ + id: 'projectStore', + state: (): projectStoreType => ({ + project: { + // id: 0, //use later if needed + name: 'Untitled', + nameDefined: false, + }, + }), + actions: { + setProjectName(projectName: string): void { + this.project.name = projectName + this.project.nameDefined = true + }, + setProjectNameDefined(defined: boolean = true): void { + this.project.nameDefined = defined + }, + }, + getters: { + getProjectName(): string { + return this.project.name + }, + getProjectNameDefined(): boolean { + return this.project.nameDefined + }, + }, +}) diff --git a/v1/src/store/promptStore.ts b/v1/src/store/promptStore.ts new file mode 100644 index 00000000..612c35b3 --- /dev/null +++ b/v1/src/store/promptStore.ts @@ -0,0 +1,113 @@ +import { HTMLContent } from '@tiptap/core' +import { defineStore } from 'pinia' + +interface promptStoreType { + resolvePromise: Function + // resolvePromise: (value?: string | undefined) => void + prompt: { + activate: boolean + messageText: string + isPersistent: boolean + buttonList: Array<{ + text: string + emitOption: string + }> + inputList: Array<{ + text: string + val: string + placeholder: string + id: string + class: string + style: string + type: string + }> + } + confirm: { + activate: boolean + messageText: string + isPersistent: boolean + buttonList: Array<{ + text: string + emitOption: string | boolean + }> + } + DeleteCircuit: { + activate: boolean + messageText: string + isPersistent: boolean + buttonList: Array<{ + text: string + emitOption: string + }> + circuitItem: object + } + UpdateProjectDetail: { + activate: boolean + projectId: number + projectName: string + projectTags: string + projectType: Readonly | string + projectDescription: HTMLContent + } +} + +export const usePromptStore = defineStore({ + id: 'promptStore', + state: (): promptStoreType => ({ + resolvePromise: (): any => {}, + prompt: { + activate: false, + messageText: '', + isPersistent: false, + buttonList: [], + inputList: [], + }, + confirm: { + activate: false, + messageText: '', + isPersistent: false, + buttonList: [], + }, + DeleteCircuit: { + activate: false, + messageText: '', + isPersistent: false, + buttonList: [], + circuitItem: {}, + }, + UpdateProjectDetail: { + activate: false, + projectId: 0, + projectName: '', + projectTags: '', + projectType: 'Public', + projectDescription: '', + }, + }), + actions: { + // resolvePromise(): any {}, + setProjectName(projectName: string): void { + this.UpdateProjectDetail.projectName = projectName + }, + setProjectId(projectId: number): void { + this.UpdateProjectDetail.projectId = projectId + }, + }, + getters: { + getProjectName(): string { + return this.UpdateProjectDetail.projectName + }, + getProjectId(): number { + return this.UpdateProjectDetail.projectId + }, + getProjectTags(): string { + return this.UpdateProjectDetail.projectTags + }, + getProjectType(): Readonly | string { + return this.UpdateProjectDetail.projectType + }, + getProjectDescription(): HTMLContent { + return this.UpdateProjectDetail.projectDescription + }, + }, +}) diff --git a/v1/src/styles/color_theme.scss b/v1/src/styles/color_theme.scss new file mode 100644 index 00000000..5bdc9fff --- /dev/null +++ b/v1/src/styles/color_theme.scss @@ -0,0 +1,551 @@ +:root { + --primary: #454545; + + --bg-navbar: #454545; + --text-navbar--alt: #000; + --qp-br-tl: #333; + --qp-br-rd: #535353; + + --br-circuit: #454545; + --br-circuit-cur: #fff; + --bg-tabs: #8b8b8b; + --bg-circuit: #bbb; + + --text-lite: #fff; + --text-dark: #000; + --text-panel: #fff; + --text-circuit: #000; + + --context-text: #fff; + --context-text-hov: #000; + + --cus-radio_label: #656565; + + --br-secondary: #7d7d7d; + + --br-primary: #fff; + --bg-primary-moz: hsla(0, 0%, 27%, 0.902); + --bg-primary-chr: hsla(0, 0%, 27%, 0.702); + --bg-icons: #7d7d7d; + --bg-text: #cacaca; + --bg-secondary: #bbb; + --canvas-stroke:#eee; + --canvas-fill: #fff; + --bg-toggle-btn-primary: #42b983; + --primary-btn-hov: #3ca877; + --btn-danger: #dc5656; + --btn-danger-darken: #b03662; + --disable: #6c8b93; + --qp-box-shadow-1: #3b3b3b; + --qp-box-shadow-2: #4f4f4f; + --cus-btn-hov--bg: #ddd; + --cus-btn-hov-text: #000; + --node: green; + --stroke: black; + --fill: white; + --hover-and-sel: rgba(255, 255, 32, 0.8); + --wire-draw: #000; + --wire-cnt: green; + --wire-pow: Lime; + --wire-sel: blue; + --wire-lose: red; + --mini-map: green; + --mini-map-stroke: darkgreen; + --input-text: green; + --secondary-stroke: red; + --text: black; + --wire-norm: black; + --node-norm: green; + --splitter: black; + --output-rect: blue; +} + +::-moz-selection { + color: var(--text-lite); + background: var(--bg-icons); +} + +::selection { + color: var(--text-lite); + background: var(--bg-icons); +} + +.navbar-menu > li > a { + color: #fff; +} + +.projectName { + color: #fff; +} + +.header { + background: var(--bg-navbar); +} + +.dropdown > ul { + background-color: var(--bg-primary-moz); + border: 0.5px solid var(--bg-tabs); +} + +@supports (backdrop-filter: blur()) { + .dropdown > ul { + background-color: var(--bg-primary-chr); + } +} + +.dropdown > ul::before { + border-top: 1px solid var(--bg-tabs); + border-right: 1px solid var(--bg-tabs); +} + +.dropdown > ul::after { + border-top: 1.5px solid var(--primary); +} + +.dropdown-menu > li > a { + color: #fff !important; +} + +.signIn-btn { + color: #fff !important; +} + +.dropdown-menu > li > a:hover { + color: var(--text-navbar--alt) !important; + background: var(--bg-text); +} + +#contextMenu { + border: 0.5px solid var(--bg-tabs); + background-color: var(--bg-primary-moz); + color: var(--context-text); +} + +#contextMenu ul li:hover { + color: var(--context-text-hov); + background: var(--bg-text); +} + +@supports (backdrop-filter: blur()) { + #contextMenu { + background-color: var(--bg-primary-chr); + } +} + +.draggable-panel { + background: var(--primary); + border: 2px solid var(--br-primary); + box-shadow: 0px 0px 10px #4545457f; +} + +.panel-header { + color: var(--text-panel); + background: var(--primary); +} + +.panel-body { + color: var(--text-panel); + border-top: 1px solid var(--br-secondary); +} + +.panel-header::before { + border-top: 2px solid var(--text-panel); +} + +.search-input { + color: var(--text-panel); + border: 1px solid var(--br-secondary); +} + +.timing-diagram-toolbar input { + color: var(--text-panel); + border: 1px solid var(--br-secondary); +} + +.search-results, +.search-close { + color: var(--text-panel); +} + +#exitViewBtn { + border: 1px solid var(--br-primary); +} +.ce-hidden, +.prop-hidden, +#exitViewBtn { + color: var(--text-panel); + background: var(--primary); +} + +.ui-accordion-header { + color: var(--text-panel) !important; +} + +.panelHeader:hover { + background-color: var(--bg-icons); +} + +.panelHeader:after, +.panelHeader:before { + background-color: var(--br-primary); + border: 1px solid var(--br-primary); +} + +.ui-accordion .ui-accordion-content { + background-color: white; +} + +.icon { + background-color: white; +} + +.custom-tooltip-styling { + background-color: var(--bg-icons) !important; + color: var(--text-panel) !important; + border: 1px solid var(--br-primary); +} + +.icon:hover { + background-color: var(--bg-icons); +} + +.search-results::-webkit-scrollbar-thumb { + background-color: #585858; +} + +.search-results::-webkit-scrollbar-thumb:hover { + background-color: var(--primary); +} + +.timing-diagram-toolbar { + background-color: var(--bg-tabs); +} + +#tabsBar { + background-color: var(--bg-tabs); + border-top: 1px solid var(--br-primary); + border-bottom: 1px solid var(--br-primary); +} + +#tabsBar .circuits { + border: 1px solid var(--br-circuit); +} + +#tabsBar .circuits { + color: var(--text-circuit); + background-color: var(--bg-tabs); +} + +#tabsBar .current { + color: var(--text-circuit); + background-color: var(--bg-circuit); + border: 1px solid var(--br-circuit-cur); +} + +#tabsBar .current > span { +} + +#tabsBar button { + color: var(--text-panel); + background-color: var(--primary); + border: 1px solid var(--br-circuit-cur); +} + +#tabsBar button:hover { + color: var(--text-panel); + + border: 1px solid var(--br-circuit-cur); +} + +.moduleProperty input, +.moduleProperty textarea { + color: var(--text-panel); +} + +.moduleProperty { + background: var(--primary); + border: 2px solid var(--br-primary); + box-shadow: 0px 0px 10px #4545457f; + color: var(--text-panel); +} + +#moduleProperty-title { + color: var(--text-panel); +} + +.moduleProperty input, +.moduleProperty select, +.moduleProperty textarea { + border: 1px solid var(--br-secondary) !important; + color: var(--text-panel); +} + +.moduleProperty input:focus, +.moduleProperty select:focus, +.moduleProperty textarea:focus { + color: var(--text-panel); + border-color: var(--br-primary) !important; +} + +.input-group div button { + color: var(--text-lite); +} + +.input-group-prepend button:hover { + background: rgba(202, 202, 202, 0.5); +} + +.input-group-append button:hover { + background: rgba(202, 202, 202, 0.5); +} + +.slider { + background-color: #ccc; + box-shadow: inset 0px 0px 5px rgba(69, 69, 69, 0.255); +} + +.slider:before { + background-color: white; + box-shadow: 0px 0px 7px rgba(69, 69, 69, 0.8); +} + +input:checked + .slider { + background-color: var(--bg-toggle-btn-primary); +} + +.custom-btn--primary { + background-color: var(--bg-toggle-btn-primary); + color: var(--text-lite); +} +.custom-btn--primary:hover { + background-color: var(--primary-btn-hov); + color: var(--text-lite); +} +.custom-btn--secondary { + border: 1px solid white; + color: var(--text-lite); +} +.custom-btn--secondary:hover { + background-color: #ddd; + color: var(--cus-btn-hov-text); +} + +.custom-btn--secondary:active, +.custom-btn--secondary:focus { + border: 1px solid white; +} + +.custom-btn--tertiary { + background-color: var(--btn-danger); + color: var(--text-lite); +} + +.custom-btn--tertiary:hover { + background-color: var(--btn-danger-darken); + color: var(--text-lite); +} + +#HelpButton { + border: 2px solid var(--br-primary); + color: var(--text-panel); +} + +select { + background: var(--bg-secondary); + background-color: var(--primary); + color: var(--text-lite); +} + +#layoutDialog { + border: 2px solid var(--br-primary); + box-shadow: 0px 0px 10px #4545457f; + background-color: var(--primary); + color: var(--text-panel); +} + +#layoutDialog > div span:before { + color: var(--text-panel); +} + +.panel-heading { + color: var(--text-panel); +} + +.ui-dialog { + border: 0.5px solid var(--br-primary) !important; + background: var(--bg-primary-moz) !important; +} + +@supports (backdrop-filter: blur()) { + .ui-dialog { + background-color: var(--bg-primary-chr) !important; + } +} + +.ui-widget-header { + color: var(--text-lite) !important; + border-bottom: 0.5px solid var(--br-primary); +} + +.option { + background-color: white; + color: var(--cus-radio_label); +} + +.custom-radio span { + border: 3px solid var(--cus-radio_label); +} + +.custom-radio span:after { + background: var(--cus-radio_label); +} + +#saveImageDialog { + border: 1px solid var(--br-secondary); +} +.download-dialog-section-2 { + color: var(--text-lite); +} + +.download-dialog-section-2 .active-btn { + background: var(--bg-toggle-btn-primary); + color: var(--text-lite); +} + +.download-dialog-section-2 .inactive-btn { + color: var(--text-lite); +} + +.download-dialog-section-3 { + border: 1px solid var(--br-secondary); +} + +.download-dialog-section-3 > span { + color: var(--text-lite); +} + +.ui-dialog-titlebar-close::before:hover { + background-color: var(--primary); +} + +.ui-dialog .ui-dialog-buttonpane button:hover { + color: var(--cus-btn-hov-text) !important; + background: var(--cus-btn-hov--bg); + border: 1px solid transparent; +} + +.render-btn { + color: var(--text-lite); + border: 1px solid white; +} + +.render-btn:active { + border: 1px solid var(--br-primary); +} + +.render-btn:hover { + background: #3ba374; + color: var(--text-lite); + border: 1px solid transparent; +} + +#combinationalAnalysis { + border: 1px solid var(--br-secondary); + color: var(--text-lite); +} + +#combinationalAnalysis p input { + border-bottom: 1px solid white !important; + color: var(--text-lite); +} + +.content-table tr th { + background-color: var(--primary); + color: var(--text-lite); +} + +.content-table th, +.content-table td { + background-color: #f3f3f3; +} + +#openProjectDialog { + color: var(--text-lite); +} + +#openProjectDialog > label { + border: 1px solid var(--br-primary); + color: var(--text-lite); +} + +#openProjectDialog > label > span { + border: 3px solid white; +} + +#openProjectDialog > label > span:after { + background: var(--text-lite); +} + +#insertSubcircuitDialog { + color: var(--text-lite); +} + +.disable::after { + background: var(--disable); +} + +.radio-green { + background: #42b983; +} + +.btn-group-toggle { + border: 1px solid var(--br-secondary) !important; +} + +.set { + border: 2px solid cyan !important; +} + +.theme { + color: var(--text-panel) !important; + background: var(--bg-icons) !important; + border-radius: 1.5px; +} + +.input-group-prepend button:hover { + background: var(--bg-secondary) !important; + color: var(--text-lite) !important; +} + +.input-group-append button:hover { + background: var(--bg-secondary) !important; + color: var(--text-lite) !important; +} + +.input-group-prepend button { + color: var(--text-panel) !important; +} + +.input-group-append button { + color: var(--text-panel) !important; +} + +#Rectangle_1072 { + stroke: var(--text-panel); +} + +#Path_36 { + fill: var(--text-panel); +} + +.layout--btn-group { + display: block; + margin-right: 25px; + margin-top: -10px; +} + +#clockProperty { + background: var(--primary); + border: 1px solid var(--br-primary); + color: var(--text-panel); +} diff --git a/v1/src/styles/css/0-helpers/_color-config.scss b/v1/src/styles/css/0-helpers/_color-config.scss new file mode 100644 index 00000000..dfe909f0 --- /dev/null +++ b/v1/src/styles/css/0-helpers/_color-config.scss @@ -0,0 +1,22 @@ +// +// Color configuration +// + +$primary: $charcoal; //base color theme +$input: $silver; //input border (mainly bottom) +$text-primary: $white; //global font color +$text-secondary: $silver; //placeholder text +$sim-primary: $white; //simulator bg +$sim-secondary: $very-light-grey; //simulator gridlines +$dialog-primary: $primary; //dialog boxes bg color +$dialog-secondary: $grey; //dialog boxes box border color +$button-primary: $medium-sea-green; //btn primary +$button-secondary: $roman; //delete button +$error-primary: $carousel-pink; //error text color +$box-shadow: $grey-shadow; //box shadow +$border-primary: $white; //border color +$border-secondary: $suva-grey; //dropdown border color +$border-tertiary: $silver; //input box border +$bg-primary--nav: $suva-grey; //nav-bar bg color +$bg-secondary--nav: $primary; //active nav-bar menu bg color +$bg-tertiary--nav: $gainsboro; //inactive nav-bar menu bg color diff --git a/v1/src/styles/css/0-helpers/_functions.scss b/v1/src/styles/css/0-helpers/_functions.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/0-helpers/_mixins.scss b/v1/src/styles/css/0-helpers/_mixins.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/0-helpers/_variables.scss b/v1/src/styles/css/0-helpers/_variables.scss new file mode 100644 index 00000000..93711734 --- /dev/null +++ b/v1/src/styles/css/0-helpers/_variables.scss @@ -0,0 +1,16 @@ +// +// Color Variables +// + +$charcoal: #454545; +$silver: #bbbbbb; +$gainsboro: #dddddd; +$white: #ffffff; +$grey: #7d7d7d; +$very-light-grey: #cacaca; +$suva-grey: #8b8b8b; +$medium-sea-green: #42b983; +$roman: #dc5656; +$grey-shadow: #4545457f; +$fire-brick: #ac3522; +$carousel-pink: #f8d7da; diff --git a/v1/src/styles/css/2-basics/_buttons.scss b/v1/src/styles/css/2-basics/_buttons.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/2-basics/_close.scss b/v1/src/styles/css/2-basics/_close.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/2-basics/_global.scss b/v1/src/styles/css/2-basics/_global.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/2-basics/_links.scss b/v1/src/styles/css/2-basics/_links.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/2-basics/_toggle.scss b/v1/src/styles/css/2-basics/_toggle.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/2-basics/_typography.scss b/v1/src/styles/css/2-basics/_typography.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/2-basics/base.scss b/v1/src/styles/css/2-basics/base.scss new file mode 100644 index 00000000..f7f722b9 --- /dev/null +++ b/v1/src/styles/css/2-basics/base.scss @@ -0,0 +1,11 @@ +/* base/default rule set here + no class or ID selectors +*/ + +html { + box-sizing: border-box; +} + +* *:before *:after { + box-sizing: inherit; +} diff --git a/v1/src/styles/css/2-basics/reset.scss b/v1/src/styles/css/2-basics/reset.scss new file mode 100644 index 00000000..ba934af9 --- /dev/null +++ b/v1/src/styles/css/2-basics/reset.scss @@ -0,0 +1,64 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +/* File modified - uncomment below */ +/* +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +*/ +/* HTML5 display-role reset for older browsers */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { + display: block; +} +body { + line-height: 1; +} +ol, +ul { + list-style: none; +} +blockquote, +q { + quotes: none; +} +blockquote:before, +blockquote:after, +q:before, +q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/v1/src/styles/css/3-sub-components/_navigation.scss b/v1/src/styles/css/3-sub-components/_navigation.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/3-sub-components/_searchbar.scss b/v1/src/styles/css/3-sub-components/_searchbar.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/3-sub-components/_shortcut-menu.scss b/v1/src/styles/css/3-sub-components/_shortcut-menu.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/3-sub-components/_zoom-slider.scss b/v1/src/styles/css/3-sub-components/_zoom-slider.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/4-components/_bool-logic-dialog.scss b/v1/src/styles/css/4-components/_bool-logic-dialog.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/4-components/_canvas.scss b/v1/src/styles/css/4-components/_canvas.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/4-components/_circuitelements.scss b/v1/src/styles/css/4-components/_circuitelements.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/4-components/_context-menu.scss b/v1/src/styles/css/4-components/_context-menu.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/4-components/_dropdown.scss b/v1/src/styles/css/4-components/_dropdown.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/4-components/_header.scss b/v1/src/styles/css/4-components/_header.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/4-components/_layout-dialog.scss b/v1/src/styles/css/4-components/_layout-dialog.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/4-components/_navbar.scss b/v1/src/styles/css/4-components/_navbar.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/4-components/_new-circuit-dialog.scss b/v1/src/styles/css/4-components/_new-circuit-dialog.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/4-components/_properties.scss b/v1/src/styles/css/4-components/_properties.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/4-components/_save-img-dialog.scss b/v1/src/styles/css/4-components/_save-img-dialog.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/4-components/_shortcut-dialog.scss b/v1/src/styles/css/4-components/_shortcut-dialog.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/4-components/_tabs-bar.scss b/v1/src/styles/css/4-components/_tabs-bar.scss new file mode 100644 index 00000000..e69de29b diff --git a/v1/src/styles/css/5-layout/simulator.scss b/v1/src/styles/css/5-layout/simulator.scss new file mode 100644 index 00000000..89b84d4d --- /dev/null +++ b/v1/src/styles/css/5-layout/simulator.scss @@ -0,0 +1,321 @@ +/* old ui ruleset starts here */ +.deleteOfflineProject { + float: right; + cursor: pointer; + padding: 2px; +} + +.pointerCursor { + cursor: pointer; +} + +.defaultCursor { + cursor: default; +} + +#container { + display: table; + width: 100%; + height: 100%; +} + +#container > div { + display: table-row; + height: 0; +} + +#container > div.fill { + height: auto; +} + +/* END OF MODULES */ + +#restrictedDiv { + position: absolute; + top: 10px; + margin-left: 10px; + width: 560px; + z-index: 100; +} + +#restrictedElementsDiv { + position: absolute; + top: 90px; + right: 10px; + z-index: 100; + width: 200px; +} + +#MessageDiv { + position: absolute; + left: 30px; + bottom: 30px; + z-index: 110; +} + +.errorMessage { + height: auto; + width: 100%; + padding: 2px; + margin: 2px; + border: 1px solid red; + border-radius: 3px; + background-color: #fee; + font-size: 15px; +} + +.normalMessage { + height: auto; + width: 100%; + padding: 2px; + margin: 2px; + border: 1px solid green; + border-radius: 3px; + background-color: #99ff33; + font-size: 15px; +} + +#canvasArea { + display: block; + position: relative; + width: 100%; + background-color: red; +} + +.simulation { + position: relative; + width: auto; + height: 100%; + overflow: hidden; + background-color: 'white'; +} + +.left { + float: left; +} + +.right { + float: right; +} + +.objectPropertyAttributeChecked.btn { + width: 100%; + margin-bottom: 5px; +} + +/* For loading screen - pace.js */ + +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + position: fixed; + width: 100vw; + height: 100vh; + background-color: #fff; + z-index: 100000; +} + +.pace-inactive { + display: none; +} + +#Help { + visibility: hidden; + /* Hidden by default. Visible on click */ + min-width: 250px; + /* Set a default minimum width */ + margin-left: -125px; + /* Divide value of min-width by 2 */ + background-color: #333; + /* Black background color */ + color: #fff; + /* White text color */ + text-align: center; + /* Centered text */ + border-radius: 2px; + /* Rounded borders */ + padding: 16px; + /* Padding */ + position: fixed; + /* Sit on top of the screen */ + z-index: 1; + /* Add a z-index if needed */ + right: 50px; + /* Center the snackbar */ + bottom: 50px; + /* 30px from the bottom */ + opacity: 0; +} + +#Help.show { + visibility: visible; + /* Show the snackbar */ + opacity: 1; + -webkit-transition-delay: 0.5s; + /* Safari */ + transition-delay: 0.5s; + -webkit-transition-duration: 0.3s; + /* Safari */ + transition-duration: 0.3s; +} + +@-webkit-keyframes fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@-webkit-keyframes fadeout { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +@keyframes fadeout { + from { + bottom: 0px; + opacity: 1; + } + to { + bottom: 0; + opacity: 0; + } +} + +.pace .pace-progress { + background: #29d; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 50%; + height: 5px; +} + +/* LOADING ICON CSS STARTS*/ + +.sk-folding-cube { + margin: 20px auto; + width: 40px; + height: 40px; + position: relative; + -webkit-transform: rotateZ(45deg); + transform: rotateZ(45deg); +} + +.sk-folding-cube .sk-cube { + float: left; + width: 50%; + height: 50%; + position: relative; + -webkit-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} + +.sk-folding-cube .sk-cube:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #09f; + -webkit-animation: sk-foldCubeAngle 2.4s infinite linear both; + animation: sk-foldCubeAngle 2.4s infinite linear both; + -webkit-transform-origin: 100% 100%; + -ms-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} + +.sk-folding-cube .sk-cube2 { + -webkit-transform: scale(1.1) rotateZ(90deg); + transform: scale(1.1) rotateZ(90deg); +} + +.sk-folding-cube .sk-cube3 { + -webkit-transform: scale(1.1) rotateZ(180deg); + transform: scale(1.1) rotateZ(180deg); +} + +.sk-folding-cube .sk-cube4 { + -webkit-transform: scale(1.1) rotateZ(270deg); + transform: scale(1.1) rotateZ(270deg); +} + +.sk-folding-cube .sk-cube2:before { + -webkit-animation-delay: 0.3s; + animation-delay: 0.3s; +} + +.sk-folding-cube .sk-cube3:before { + -webkit-animation-delay: 0.6s; + animation-delay: 0.6s; +} + +.sk-folding-cube .sk-cube4:before { + -webkit-animation-delay: 0.9s; + animation-delay: 0.9s; +} + +@-webkit-keyframes sk-foldCubeAngle { + 0%, + 10% { + -webkit-transform: perspective(140px) rotateX(-180deg); + transform: perspective(140px) rotateX(-180deg); + opacity: 0; + } + 25%, + 75% { + -webkit-transform: perspective(140px) rotateX(0deg); + transform: perspective(140px) rotateX(0deg); + opacity: 1; + } + 90%, + 100% { + -webkit-transform: perspective(140px) rotateY(180deg); + transform: perspective(140px) rotateY(180deg); + opacity: 0; + } +} + +@keyframes sk-foldCubeAngle { + 0%, + 10% { + -webkit-transform: perspective(140px) rotateX(-180deg); + transform: perspective(140px) rotateX(-180deg); + opacity: 0; + } + 25%, + 75% { + -webkit-transform: perspective(140px) rotateX(0deg); + transform: perspective(140px) rotateX(0deg); + opacity: 1; + } + 90%, + 100% { + -webkit-transform: perspective(140px) rotateY(180deg); + transform: perspective(140px) rotateY(180deg); + opacity: 0; + } +} + +/* LOADING ICON CSS ENDS*/ diff --git a/v1/src/styles/css/UX.css b/v1/src/styles/css/UX.css new file mode 100644 index 00000000..e5011d8a --- /dev/null +++ b/v1/src/styles/css/UX.css @@ -0,0 +1,969 @@ +.deleteOfflineProject { + float: right; + cursor: pointer; + padding: 2px; +} + +#contextMenu { + width: 150px; + visibility: hidden; + box-shadow: 0px 2px 7px rgba(0, 0, 0, 0.2); + border: 1px solid rgba(0, 0, 0, 0.2); + position: fixed; + z-index: 100; + background: #fff; + opacity: 0; + top: 100; + left: 100; + cursor: pointer; + color: #000; + padding-bottom: 4px; + padding-top: 4px; + transition: opacity 0.2s ease-in-out; + user-select: none; +} + +#contextMenu ul { + margin: 0; + padding: 0; + font: 16px sans-serif; +} + +#contextMenu ul li { + list-style: none; + padding: 8px; + padding-left: 20px; +} + +#contextMenu ul li a { + text-decoration: none; + color: #000 !important; +} + +#contextMenu ul li:hover { + background: rgba(0, 0, 0, 0.1); +} + +button:focus { + outline: 0; +} + +.side { + height: 100%; + background-color: #333; + padding: 3px; + color: #fff; + border-side: 1px solid #0099ff; + border-bottom: 40px solid #0099ff; + padding: 0.5em; +} + +.option { + display: block; + background-color: black; + border: 1px solid #005cb3; + color: #0099ff; + padding: 5px; + width: 200px; + margin: 3px; + word-wrap: break-word; + overflow-x: hidden; +} + +.pannel-heading { + background-color: #f5f5f5; +} + +#layoutDialog { + position: absolute; + right: 100px; + top: 100px; + z-index: 101; + width: 200px; + height: 230px; + border: 1px solid grey; + border-radius: 2px; + background-color: white; + overflow-x: hidden; +} + +.projectName { + /*margin:3px;*/ + color: #0099ff; + margin: 0 auto; + text-align: center; + font-size: 1.4em; + position: static; + left: 50%; + display: block; + width: 500px; + text-align: center; + margin-left: -250px; +} + +.inline { + width: auto; + padding-right: 20px; + display: inline-block; +} + +.option:hover { + border-color: #0099ff; +} + +input[type='radio']:checked ~ label { + color: #0dff92; +} + +.option input[type='radio'] { + margin-right: 5px; + /*position: absolute;*/ + visibility: hidden; +} + +.option input[type='radio']:checked { + /*position: absolute;*/ + visibility: visible; +} + +.zoomButton:focus { + outline: 0; +} + +.zoomButton { + padding: 5px; + opacity: 0.3; +} + +.zoomButton:hover { + /*height:20px; + width:20px;*/ + opacity: 0.8; + transition: opacity 0.2s; +} + +.ui-accordion-header-icon.ui-icon { + /*background-image: url("./ui-icons_white_256x240.png");*/ +} + +.noSelect { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + -o-user-select: none; +} + +.pointerCursor { + cursor: pointer; +} + +.defaultCursor { + cursor: default; +} + +#container { + display: table; + width: 100%; + height: 100%; +} + +#container > div { + display: table-row; + height: 0; +} + +#container > div.fill { + height: auto; +} + +#modules-header { + margin-bottom: 0.5em; + font-size: 1.3em; + text-transform: uppercase; + font-family: Arial, Helvetica, sans-serif; + color: #0099ff; + text-align: center; + padding-top: 0.3em; +} + +.panel { + padding: 0em; + background-color: #333; + margin: 0; + border-radius: 0; + margin-bottom: 0em; + border: 1px solid #0099ff; +} + +.ui-accordion-header { + background-color: #333; + color: #fff; + border: 1px solid #0099ff; + border-radius: 0; + margin: 0em; + padding: 0em; + outline: none; +} + +.ui-accordion-header.ui-accordion-header-active.ui-state-active { + background-color: #0099ff; + outline: none; + margin-bottom: 0; +} + +.ui-accordion-header.ui-state-hover { + background-color: #0066cc; + outline: none; + /*margin-bottom: 0;*/ +} + +/* MODULES */ + +.moduleProperty { + display: none; + background-color: #333; + color: #fff; + /*padding-bottom: 2em;*/ + margin-top: 1em; +} + +#moduleProperty-inner { + border: 1px solid #0099ff; + padding: 1em; + /*margin-bottom: 1em;*/ +} + +#moduleProperty-toolTip { + padding: 10px; + /*font-size: 1.1em;*/ + color: #0099ff; +} + +#moduleProperty-title { + text-transform: uppercase; + font-size: 1.3em; + color: #0099ff; + margin-bottom: 0.55em; + text-align: center; +} + +#moduleProperty-header { + font-size: 1.1em; + text-transform: uppercase; + margin-bottom: 0.5em; +} + +#moduleProperty-inner > p { + margin: 0; + margin-top: 0.2em; +} + +input, +select { + padding: 0.25rem; +} + +.moduleProperty input, +.moduleProperty select { + background-color: #333; + border: none; + border-bottom: 2px solid #ccc; +} + +.moduleProperty input:active, +.moduleProperty input:focus, +.moduleProperty select:active, +.moduleProperty select:focus { + border-bottom: 2px solid #0099ff; +} + +.navbar.navbar-default { + margin: 0px; + border-radius: 0px; + border: 0; + padding: 0px; + min-height: 0px; + border-bottom: 1px solid #0099ff; +} + +.navbar-brand { + padding: 7px 15px; + height: auto; +} + +/* END OF MODULES */ + +#tabsBar { + width: 100%; + /*height: 3em;*/ + margin-left: 20px; + background-color: #000; +} + +#tabsBar div { + display: inline-block; + /*padding-left: 0.5em;*/ + margin: 0.1em; + color: #fff; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + position: relative; +} + +#tabsBar .circuits { + color: #fff; + text-align: center; + background-color: #00284d; + padding-left: 0.5em; + padding-right: 1.5em; + border: 1px solid #005cb3; + border-radius: 0.1em; +} + +#tabsBar .circuits:hover { + background-color: #00ace6; + /*border: 1px solid #0099ff;*/ + transition-duration: 100ms; +} + +#tabsBar .current { + /*background-color: #0086b3;*/ + background-color: #004280; + border: 1px solid #0099ff; +} + +.tabsCloseButton:hover { + color: #fff; + font-family: 'Gill Sans', sans-serif; + margin-left: 1em; + opacity: 0.5; +} +.tabsCloseButton { + color: #111; + font-family: 'Gill Sans', sans-serif; + margin-left: 1em; + opacity: 1; + position: absolute; + top: 5px; + right: 3; +} + +th, +td { + padding-left: 15px; + padding-right: 15px; + text-align: left; + border: 1px solid #0099ff; + color: white; +} + +#booleanTable { + width: 200px; +} + +table { + border-collapse: collapse; + -webkit-user-select: none; + /* Chrome/Safari */ + -moz-user-select: none; + /* Firefox */ + -ms-user-select: none; + /* IE10+ */ + /* Rules below not implemented in browsers yet */ + -o-user-select: none; + user-select: none; +} + +body, +html { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + overflow: hidden; +} + +#restrictedDiv { + position: absolute; + top: 10px; + margin-left: 10px; + width: 560px; + z-index: 100; +} + +#restrictedElementsDiv { + position: absolute; + top: 90px; + right: 10px; + z-index: 100; + width: 200px; +} + +#MessageDiv { + position: absolute; + margin-left: 30px; + bottom: 100px; + /*height:auto;*/ + /*width:60%;*/ + /*padding: 2px;*/ + /*border: 3px solid red;*/ + /*border-radius: 6px;*/ + /*background-color: #fcc;*/ + z-index: 10; +} + +.errorMessage { + /*position: absolute;*/ + /*margin-left: 30%;*/ + /*bottom: 1px;*/ + height: auto; + width: 100%; + /*margin-bottom: 10px;*/ + padding: 2px; + margin: 2px; + border: 1px solid red; + border-radius: 3px; + background-color: #fee; + font-size: 15px; + /*z-index: 10;*/ +} + +.normalMessage { + /*position: absolute;*/ + /*margin-left: 30%;*/ + /*bottom: 150px;*/ + height: auto; + width: 100%; + /*margin-bottom: 10px;*/ + padding: 2px; + margin: 2px; + border: 1px solid green; + border-radius: 3px; + background-color: #99ff33; + font-size: 15px; + /*z-index: 10;*/ +} + +#canvasArea { + display: block; + position: relative; + /*height: 100%;*/ + width: 100%; + background-color: red; +} + +.simulation { + position: relative; + width: auto; + height: 100%; + overflow: hidden; + background-color: 'white'; +} + +.switch { + position: relative; + display: inline-block; + width: 43px; + height: 17px; + margin-bottom: 0px; +} + +.switch input { + display: none; +} + +.slider { + position: absolute; + cursor: pointer; + top: 2; + left: 0; + right: 0; + bottom: -2; + background-color: #ccc; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.slider:before { + position: absolute; + content: ''; + height: 17px; + width: 17px; + left: 0px; + bottom: 0px; + background-color: white; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +input:checked + .slider { + background-color: #2196f3; +} + +input:focus + .slider { + box-shadow: 0 0 1px #2196f3; +} + +input:checked + .slider:before { + -webkit-transform: translateX(26px); + -ms-transform: translateX(26px); + transform: translateX(26px); +} + +/* Rounded sliders */ + +.slider.round { + border-radius: 34px; +} + +.slider.round:before { + border-radius: 50%; +} + +/* Slider for white background */ +.slider2 { + position: absolute; + cursor: pointer; + top: 2; + left: 0; + right: 0; + bottom: -2; + /* border: 1px solid black; */ + background-color: #ccc; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.slider2:before { + position: absolute; + content: ''; + height: 17px; + width: 17px; + left: 0px; + bottom: 0px; + background-color: #aaa; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +input:checked + .slider2 { + background-color: #2196f3; +} + +input:focus + .slider2 { + box-shadow: 0 0 1px #2196f3; +} + +input:checked + .slider2:before { + -webkit-transform: translateX(26px); + -ms-transform: translateX(26px); + transform: translateX(26px); +} + +/* Rounded sliders */ + +.slider2.round { + border-radius: 34px; +} + +.slider2.round:before { + border-radius: 50%; +} + +#miniMap { + position: fixed; + z-index: 2; + bottom: 20px; + right: 40px; + /*height:150px; + width: 25%;*/ + overflow-y: scroll; + background-color: black; + /*border:1px solid #aaa;*/ + opacity: 0.97; + box-shadow: 0px 0px 15px #888888; + overflow: hidden; + /*transition: opacity .25s ease-in-out;*/ +} + +#plot { + position: fixed; + z-index: 1; + bottom: 0; + right: 0; + /*display: block;*/ + /*height: 0px;*/ + /*width: 100%;*/ + overflow-y: scroll; + background-color: #eee; + /*background-blend-mode: color;*/ +} + +.left { + float: left; +} + +.right { + float: right; +} + +.icon { + position: relative; + height: 70px; + width: 70px; + /*margin: 1px;*/ + margin-bottom: 5px; + margin-left: 3px; + display: inline-block; + background-color: white; + border-radius: 4px; + /*border-color: #0099ff;*/ + border: 2px solid #0099ff; + text-align: center; + font-size: 8px; + padding: 5px; +} + +img { + display: none; +} + +div.icon img { + -webkit-user-drag: none; + -khtml-user-drag: none; + -moz-user-drag: none; + -o-user-drag: none; + user-drag: none; + /*margin: auto;*/ + width: 100%; + /*height:100%;*/ + display: inline-block; +} + +.img__description { + position: absolute; + /*top: 0;*/ + bottom: -16; + text-align: center; + left: 0; + right: 0; + background-color: #0099ff; + color: white; + font-size: 8px; + /*background: rgba(29, 106, 154, 0.72); + color: #fff;*/ + visibility: hidden; + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; + opacity: 0; + /* transition effect. not necessary */ + transition: opacity 0.2s, visibility 0.2s; +} + +.icon:hover .img__description { + visibility: visible; + opacity: 1; +} + +.icon:hover { + /*background-color: #cce5ff;*/ + /*border-color: blue;*/ + margin-bottom: 1px; + height: 74px; + background-color: #f5f5f5; + transition: height 0.2s margin 0.2s; +} + +.objectPropertyAttributeChecked.btn { + width: 100%; + margin-bottom: 5px; +} + +/* For loading screen - pace.js */ + +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + width: 100%; + height: 100%; + background-color: #fff; +} + +.pace-inactive { + display: none; +} + +#Help { + visibility: hidden; + /* Hidden by default. Visible on click */ + min-width: 250px; + /* Set a default minimum width */ + margin-left: -125px; + /* Divide value of min-width by 2 */ + background-color: #333; + /* Black background color */ + color: #fff; + /* White text color */ + text-align: center; + /* Centered text */ + border-radius: 2px; + /* Rounded borders */ + padding: 16px; + /* Padding */ + position: fixed; + /* Sit on top of the screen */ + z-index: 1; + /* Add a z-index if needed */ + right: 50px; + /* Center the snackbar */ + bottom: 50px; + /* 30px from the bottom */ + opacity: 0; +} + +#Help.show { + visibility: visible; + /* Show the snackbar */ + opacity: 1; + -webkit-transition-delay: 0.5s; + /* Safari */ + transition-delay: 0.5s; + -webkit-transition-duration: 0.3s; + /* Safari */ + transition-duration: 0.3s; +} + +/* Animations to fade the snackbar in and out */ + +@-webkit-keyframes fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@-webkit-keyframes fadeout { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +@keyframes fadeout { + from { + bottom: 0px; + opacity: 1; + } + to { + bottom: 0; + opacity: 0; + } +} + +.pace .pace-progress { + background: #29d; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 50%; + height: 5px; +} + +/* dropdown-menu styles */ + +.dropdown-menu { + background-color: black; + border: 1px solid #09f; + border-top: none; +} + +.navbar-nav > li > a { + padding: 7px 15px; +} + +.dropdown-menu > li > a { + color: #939393 !important; + padding: 3px 14px; +} + +.dropdown-menu > li > a:hover { + color: #4db8ff !important; + background-color: black; +} + +.ui-dialog { + background: #222; +} + +.ui-dialog p { + color: #9d9d9d; +} + +.ui-widget-header { + border: 1px solid #0099ff; + color: #0099ff; +} + +.ui-dialog-buttonpane { + background-color: black; +} + +.ui-dialog-titlebar { + background-color: black; +} + +.ui-dialog-titlebar-close { + background-image: url('../img/cross.png'); + position: absolute; + right: 0.3em; + top: 50%; + width: 21px; + margin: -10px 0 0 0; + padding: 1px; + height: 20px; +} + +.ui-icon-close { + background-position: -80px -128px; +} + +.ui-dialog .ui-dialog-buttonpane button { + background-color: #004280; + border: 1px solid #09f; + color: white; +} + +.navbar .nav.pull-right { + float: right; + margin-right: 10px; + /*set margin this way in your custom stylesheet*/ +} + +/* LOADING ICON CSS STARTS*/ + +.sk-folding-cube { + margin: 20px auto; + width: 40px; + height: 40px; + position: relative; + -webkit-transform: rotateZ(45deg); + transform: rotateZ(45deg); +} + +.sk-folding-cube .sk-cube { + float: left; + width: 50%; + height: 50%; + position: relative; + -webkit-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} + +.sk-folding-cube .sk-cube:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #09f; + -webkit-animation: sk-foldCubeAngle 2.4s infinite linear both; + animation: sk-foldCubeAngle 2.4s infinite linear both; + -webkit-transform-origin: 100% 100%; + -ms-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} + +.sk-folding-cube .sk-cube2 { + -webkit-transform: scale(1.1) rotateZ(90deg); + transform: scale(1.1) rotateZ(90deg); +} + +.sk-folding-cube .sk-cube3 { + -webkit-transform: scale(1.1) rotateZ(180deg); + transform: scale(1.1) rotateZ(180deg); +} + +.sk-folding-cube .sk-cube4 { + -webkit-transform: scale(1.1) rotateZ(270deg); + transform: scale(1.1) rotateZ(270deg); +} + +.sk-folding-cube .sk-cube2:before { + -webkit-animation-delay: 0.3s; + animation-delay: 0.3s; +} + +.sk-folding-cube .sk-cube3:before { + -webkit-animation-delay: 0.6s; + animation-delay: 0.6s; +} + +.sk-folding-cube .sk-cube4:before { + -webkit-animation-delay: 0.9s; + animation-delay: 0.9s; +} + +@-webkit-keyframes sk-foldCubeAngle { + 0%, + 10% { + -webkit-transform: perspective(140px) rotateX(-180deg); + transform: perspective(140px) rotateX(-180deg); + opacity: 0; + } + 25%, + 75% { + -webkit-transform: perspective(140px) rotateX(0deg); + transform: perspective(140px) rotateX(0deg); + opacity: 1; + } + 90%, + 100% { + -webkit-transform: perspective(140px) rotateY(180deg); + transform: perspective(140px) rotateY(180deg); + opacity: 0; + } +} + +@keyframes sk-foldCubeAngle { + 0%, + 10% { + -webkit-transform: perspective(140px) rotateX(-180deg); + transform: perspective(140px) rotateX(-180deg); + opacity: 0; + } + 25%, + 75% { + -webkit-transform: perspective(140px) rotateX(0deg); + transform: perspective(140px) rotateX(0deg); + opacity: 1; + } + 90%, + 100% { + -webkit-transform: perspective(140px) rotateY(180deg); + transform: perspective(140px) rotateY(180deg); + opacity: 0; + } +} + +/* LOADING ICON CSS ENDS*/ diff --git a/v1/src/styles/css/assets/layout-panel/down.svg b/v1/src/styles/css/assets/layout-panel/down.svg new file mode 100644 index 00000000..d8e8d105 --- /dev/null +++ b/v1/src/styles/css/assets/layout-panel/down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/styles/css/assets/layout-panel/left.svg b/v1/src/styles/css/assets/layout-panel/left.svg new file mode 100644 index 00000000..f73a40ff --- /dev/null +++ b/v1/src/styles/css/assets/layout-panel/left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/styles/css/assets/layout-panel/minus.svg b/v1/src/styles/css/assets/layout-panel/minus.svg new file mode 100644 index 00000000..b26d17f4 --- /dev/null +++ b/v1/src/styles/css/assets/layout-panel/minus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/styles/css/assets/layout-panel/plus.svg b/v1/src/styles/css/assets/layout-panel/plus.svg new file mode 100644 index 00000000..364e696d --- /dev/null +++ b/v1/src/styles/css/assets/layout-panel/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/styles/css/assets/layout-panel/right.svg b/v1/src/styles/css/assets/layout-panel/right.svg new file mode 100644 index 00000000..bef89def --- /dev/null +++ b/v1/src/styles/css/assets/layout-panel/right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/styles/css/assets/layout-panel/up.svg b/v1/src/styles/css/assets/layout-panel/up.svg new file mode 100644 index 00000000..7c014709 --- /dev/null +++ b/v1/src/styles/css/assets/layout-panel/up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/styles/css/assets/logo.svg b/v1/src/styles/css/assets/logo.svg new file mode 100644 index 00000000..ffae4558 --- /dev/null +++ b/v1/src/styles/css/assets/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/styles/css/assets/shorcuts/delete.svg b/v1/src/styles/css/assets/shorcuts/delete.svg new file mode 100644 index 00000000..3611bbac --- /dev/null +++ b/v1/src/styles/css/assets/shorcuts/delete.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/styles/css/assets/shorcuts/download.svg b/v1/src/styles/css/assets/shorcuts/download.svg new file mode 100644 index 00000000..9dc67f1e --- /dev/null +++ b/v1/src/styles/css/assets/shorcuts/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/styles/css/assets/shorcuts/dragDots.svg b/v1/src/styles/css/assets/shorcuts/dragDots.svg new file mode 100644 index 00000000..dacde439 --- /dev/null +++ b/v1/src/styles/css/assets/shorcuts/dragDots.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v1/src/styles/css/assets/shorcuts/fit.svg b/v1/src/styles/css/assets/shorcuts/fit.svg new file mode 100644 index 00000000..4cc765e2 --- /dev/null +++ b/v1/src/styles/css/assets/shorcuts/fit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/styles/css/assets/shorcuts/new.svg b/v1/src/styles/css/assets/shorcuts/new.svg new file mode 100644 index 00000000..bc1bb3bd --- /dev/null +++ b/v1/src/styles/css/assets/shorcuts/new.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/styles/css/assets/shorcuts/redo.svg b/v1/src/styles/css/assets/shorcuts/redo.svg new file mode 100644 index 00000000..30e00a4c --- /dev/null +++ b/v1/src/styles/css/assets/shorcuts/redo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/styles/css/assets/shorcuts/save-online.svg b/v1/src/styles/css/assets/shorcuts/save-online.svg new file mode 100644 index 00000000..bb414b9a --- /dev/null +++ b/v1/src/styles/css/assets/shorcuts/save-online.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/styles/css/assets/shorcuts/save.svg b/v1/src/styles/css/assets/shorcuts/save.svg new file mode 100644 index 00000000..9e3c8da5 --- /dev/null +++ b/v1/src/styles/css/assets/shorcuts/save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/styles/css/assets/shorcuts/undo.svg b/v1/src/styles/css/assets/shorcuts/undo.svg new file mode 100644 index 00000000..c82d8b64 --- /dev/null +++ b/v1/src/styles/css/assets/shorcuts/undo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/styles/css/assets/small-components/chevron-down.svg b/v1/src/styles/css/assets/small-components/chevron-down.svg new file mode 100644 index 00000000..e4c8404d --- /dev/null +++ b/v1/src/styles/css/assets/small-components/chevron-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/styles/css/assets/small-components/close.svg b/v1/src/styles/css/assets/small-components/close.svg new file mode 100644 index 00000000..8dc79fa4 --- /dev/null +++ b/v1/src/styles/css/assets/small-components/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v1/src/styles/css/custom_mailer.css b/v1/src/styles/css/custom_mailer.css new file mode 100644 index 00000000..3284a610 --- /dev/null +++ b/v1/src/styles/css/custom_mailer.css @@ -0,0 +1,6 @@ +.navbar, +.navbar-search-active, +.footer-empty-div, +.footer-container-fluid { + display: none; +} diff --git a/v1/src/styles/css/embed.css b/v1/src/styles/css/embed.css new file mode 100644 index 00000000..ed09eb73 --- /dev/null +++ b/v1/src/styles/css/embed.css @@ -0,0 +1,261 @@ +.switch { + position: relative; + display: inline-block; + width: 43px; + height: 17px; + margin-bottom: 0px; +} + +.switch input { + display: none; +} + +.slider { + position: absolute; + cursor: pointer; + top: 2; + left: 0; + right: 0; + bottom: -2; + background-color: #ccc; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.slider:before { + position: absolute; + content: ''; + height: 17px; + width: 17px; + left: 0px; + bottom: 0px; + background-color: white; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +#clockProperty { + padding: 10px; +} + +#clockPropertyHeader { + border-radius: 3px; +} +#clockProperty { + padding: 10px; + border-radius: 6px; + opacity: 0.1; + transition: 0.4s; + height: 109px; + display: flex; + flex-direction: column; + justify-content: space-between; +} +#clockProperty:hover { + opacity: 1; + -webkit-transition: 0.4s; + transition: 0.4s; +} +input:checked + .slider { + /* background-color: #2196F3; */ +} + +input:focus + .slider { + box-shadow: 0 0 1px #2196f3; +} + +input:checked + .slider:before { + -webkit-transform: translateX(26px); + -ms-transform: translateX(26px); + transform: translateX(26px); +} + +#tabsBar .circuits { + color: #000; + text-align: center; + padding-left: 0.5em; + padding-right: 0.5em; + border: 1px solid #111; + display: inline-block; +} +button:focus { + outline: 0; +} +#tabsBar .circuits:hover { + background-color: lightgray; + /*border: 1px solid #0099ff;*/ + transition-duration: 100ms; +} +#tabsBar .current { + transition-duration: 100ms; +} + +.noSelect { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + -o-user-select: none; +} +.pointerCursor { + cursor: pointer; +} +.defaultCursor { + cursor: default; +} +.simulation { + position: relative; + width: auto; + height: 100%; + overflow: hidden; + background-color: 'white'; +} + +#elementName { + position: absolute; + left: 6px; + bottom: 6px; + background-color: white; + z-index: 101; + color: black; + padding: 1px; + border: 0.5px solid black; + display: none; +} + +/* LOADING ICON CSS STARTS*/ +.sk-folding-cube { + margin: 20px auto; + width: 40px; + height: 40px; + position: relative; + -webkit-transform: rotateZ(45deg); + transform: rotateZ(45deg); +} + +.sk-folding-cube .sk-cube { + float: left; + width: 50%; + height: 50%; + position: relative; + -webkit-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} +.sk-folding-cube .sk-cube:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #09f; + -webkit-animation: sk-foldCubeAngle 2.4s infinite linear both; + animation: sk-foldCubeAngle 2.4s infinite linear both; + -webkit-transform-origin: 100% 100%; + -ms-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} +.sk-folding-cube .sk-cube2 { + -webkit-transform: scale(1.1) rotateZ(90deg); + transform: scale(1.1) rotateZ(90deg); +} +.sk-folding-cube .sk-cube3 { + -webkit-transform: scale(1.1) rotateZ(180deg); + transform: scale(1.1) rotateZ(180deg); +} +.sk-folding-cube .sk-cube4 { + -webkit-transform: scale(1.1) rotateZ(270deg); + transform: scale(1.1) rotateZ(270deg); +} +.sk-folding-cube .sk-cube2:before { + -webkit-animation-delay: 0.3s; + animation-delay: 0.3s; +} +.sk-folding-cube .sk-cube3:before { + -webkit-animation-delay: 0.6s; + animation-delay: 0.6s; +} +.sk-folding-cube .sk-cube4:before { + -webkit-animation-delay: 0.9s; + animation-delay: 0.9s; +} +@-webkit-keyframes sk-foldCubeAngle { + 0%, + 10% { + -webkit-transform: perspective(140px) rotateX(-180deg); + transform: perspective(140px) rotateX(-180deg); + opacity: 0; + } + 25%, + 75% { + -webkit-transform: perspective(140px) rotateX(0deg); + transform: perspective(140px) rotateX(0deg); + opacity: 1; + } + 90%, + 100% { + -webkit-transform: perspective(140px) rotateY(180deg); + transform: perspective(140px) rotateY(180deg); + opacity: 0; + } +} + +@keyframes sk-foldCubeAngle { + 0%, + 10% { + -webkit-transform: perspective(140px) rotateX(-180deg); + transform: perspective(140px) rotateX(-180deg); + opacity: 0; + } + 25%, + 75% { + -webkit-transform: perspective(140px) rotateX(0deg); + transform: perspective(140px) rotateX(0deg); + opacity: 1; + } + 90%, + 100% { + -webkit-transform: perspective(140px) rotateY(180deg); + transform: perspective(140px) rotateY(180deg); + opacity: 0; + } +} +/* LOADING ICON CSS ENDS*/ + +#restrictedElementsDiv { + position: absolute; + bottom: 10; + right: 2; + z-index: 100; + width: 215px; + font-size: 14px; + background-color: gainsboro; + border: 1px solid #0d3349; + opacity: 0.1; + padding: 3px 5px; +} + +#restrictedElementsDiv:hover { + opacity: 1; + transition: 0.4s; +} + +.zoom-wrapper { + position: absolute; + bottom: 1px; + right: 0px; + font-size: 10px; + z-index: 100; +} + +.zoom-wrapper button { + opacity: 0.3; +} +.zoom-wrapper button:hover { + opacity: 1; +} + +.embed-fullscreen-btn { + border-radius: 20px; +} diff --git a/v1/src/styles/css/error.css b/v1/src/styles/css/error.css new file mode 100644 index 00000000..cf03badb --- /dev/null +++ b/v1/src/styles/css/error.css @@ -0,0 +1,24 @@ +.error-code { + color: #42b983; + font-family: 'CircuitBoredNF'; + font-size: 142px; +} + +.help-text-main { + color: #1c1c1c; + font-family: 'Segoe UI'; + font-size: 22px; + font-weight: 400; + margin: 0; +} + +.return { + color: #42b983; + display: inline-block; + font-family: 'Segoe UI'; + font-weight: 700; +} + +.return:hover { + color: #42b983; +} diff --git a/v1/src/styles/css/main.stylesheet.css b/v1/src/styles/css/main.stylesheet.css new file mode 100644 index 00000000..b487179b --- /dev/null +++ b/v1/src/styles/css/main.stylesheet.css @@ -0,0 +1,1956 @@ +/* +************ +* This stylesheet is to be made modular later +************ +*/ + +@import './5-layout/simulator.scss'; +@import './2-basics/base.scss'; +@import './2-basics/reset.scss'; +@import './shortcut.panel.css'; +@import './embed.css'; +@import './plugin-stylesheets/checkBo.min.css'; +/** new UI ruleset starts here */ +/*! Adding color variables to root, required later for hokey binding */ + +/* typography */ +@font-face { + font-family: Raleway; + src: url('https://fonts.gstatic.com/s/raleway/v18/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCIPrcVIT9d0c8.woff'); +} + +/* typography */ +@font-face { + font-family: 'Nunito', sans-serif; + src: url('https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,200;1,200&display=swap'); +} + +/** Global Styles starts here */ + +body { + line-height: 1 !important; +} + +body, +html { + font-family: 'Nunito', sans-serif; + font-weight: 200; + width: 100%; + height: 100%; + margin: 0; + padding: 0; + overflow: hidden; + position: fixed; +} + +button:focus { + outline: 0; +} + +a { + color: var(--text-primary); +} + +a:hover { + color: white; + text-decoration: none; +} + +select > option { + color: black; + padding: 2px 4px; + margin-right: 5px; +} + +select:focus, +select > option:focus { + border: none; + outline: none; +} + +input[type='number']:focus { + background-color: transparent; + outline: none; + border: none; + color: white; +} + +table { + border-collapse: collapse; + -webkit-user-select: none; + /* Chrome/Safari */ + -moz-user-select: none; + /* Firefox */ + -ms-user-select: none; + /* IE10+ */ + /* Rules below not implemented in browsers yet */ + -o-user-select: none; + user-select: none; +} + +button { + background: none; + color: inherit; + border: none; + padding: 0; + font: inherit; + cursor: pointer; + outline: inherit; + box-shadow: none; +} + +button:not('.quick-btn button'):active { + background: transparent !important; +} + +button:active, +button:focus { + box-shadow: none !important; + border: none; + outline: none; + /* border-color: white !important; */ +} + +button:focus { + box-shadow: none; +} + +input[type='text']:focus { + background: transparent; + /* color: white; */ +} + +/*! Global styles ends here */ + +.noSelect { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + -o-user-select: none; +} + +.navbar-menu { + position: relative; + transition: all 0.2s ease-in-out; +} + +.navbar-menu > li > a { + border: 1px solid transparent; + border-radius: 1px; + padding: 2px 8px; + transition: all 0.2s ease-in-out; + margin-right: 10px; +} + +.navbar-menu > li > a span, +.acc-caret { + content: ''; + background: url(./assets/small-components/chevron-down.svg) center/cover + no-repeat; + display: inline-block; + height: 5px; + width: 5px; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-66%); + padding: 4px; + margin: 0 5px; + transition: all 0.2s ease-in-out; +} + +.acc-caret { + right: -17px; +} +.navbar-menu > li > a:hover { + border-bottom: 1px solid white; + text-decoration: none; +} + +.navbar-menu > li > a:hover span, +.acc-drop:hover .acc-caret { + background: none; +} + +.projectName { + position: relative; + left: 0.5rem; + font-size: 1em; + text-align: center; + display: inline-block; + width: 35vw; + overflow: hidden; + text-overflow: ellipsis; +} + +@media (max-width: 991px) { + .projectName { + visibility: hidden; + } +} + +.account-btn { + position: absolute; + right: 13px; + padding: 4px 10px; + border: 1px solid transparent; + border-radius: 1px; + transition: all 0.2s ease-in-out; +} + +.account-btn:hover { + border-bottom: 1px solid white; + text-decoration: none; +} + +.user-field { + display: inline-block; + max-width: 11rem; + white-space: nowrap; + text-overflow: ellipsis; + text-align: right; +} + +@media (max-width: 991px) { + .user-field { + visibility: hidden; + } +} + +.signIn-btn { + color: var(--text-primary); +} + +.cur-user, +.signIn-btn { + color: #fff; +} + +.signIn-btn:hover { + color: var(--text-primary); + text-decoration: none; +} + +.logo { + background: url(./assets/logo.svg) center/cover; + height: 30px; + width: 105px; + display: inline-block; + margin-right: 36px; +} + +/* dropdown-menu styles */ + +.dropdown > ul { + border-radius: 5px; + text-align: center; + position: absolute; + left: 50%; + transform: translate(-50%, 13px); +} + +.draggable-panel-css { + border-radius: 5px; + z-index: 70; + transition: background 0.5s ease-out; + position: fixed; +} + +@supports (backdrop-filter: blur()) { + .dropdown > ul { + backdrop-filter: blur(5px); + } +} + +.mw-override { + min-width: 110px; +} + +.dropdown > ul::before { + background-color: transparent; + content: ''; + width: 10px; + display: inline-block; + height: 10px; + position: absolute; + transform: translate(-50%, -13px) rotate(-45deg); +} + +.dropdown > ul::after { + content: ''; + width: 11.5px; + display: inline-block; + height: 10px; + position: absolute; + transform: translate(-50%, -15.5px); + top: 14.5px; +} + +.dropdown-menu > li > a { + padding: 7px 0; + width: 90%; + margin: auto; + transition: all 0.2s ease-in-out; + text-align: left; + padding-left: 10px; +} + +.dropdown-menu > li > a:hover { + border-radius: 7px; + opacity: 1; +} + +@media (max-width: 991px) { + .navbar-nav .dropdown-menu { + position: absolute !important; + float: none; + } +} + +#contextMenu { + width: 150px; + visibility: hidden; + position: fixed; + z-index: 1000; + opacity: 0; + top: 100; + left: 100; + cursor: pointer; + padding-bottom: 7px; + padding-top: 7px; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + border-radius: 5px; +} + +#contextMenu ul { + margin: 0; + padding: 0; +} + +#contextMenu ul li { + list-style: none; + padding: 8px; + padding-left: 20px; + width: 90%; + margin: auto; +} + +#contextMenu ul li:hover { + border-radius: 7px; + opacity: 1; +} + +@supports (backdrop-filter: blur()) { + #contextMenu { + backdrop-filter: blur(5px); + } + #contextMenu ul li:hover { + backdrop-filter: blur(50px); + -webkit-backdrop-filter: blur(50px); + } +} + +/** ce-panel styling starts */ + +.ce-panel { + font: inherit; + width: 240px; + top: 90px; + left: 10px; +} + +.accordion > :last-child { + margin-bottom: 15px; +} + +.draggable-panel-css .panel-header { + border-radius: 5px; + border-top-right-radius: 5px; + padding-top: 15px; + padding: 10px; + padding-top: 15px; + padding-left: 17px; + font-weight: bold; + font-size: 16px; + text-transform: uppercase; + text-align: left; + cursor: move; +} + +.draggable-panel-css .panel-header::before { + content: ''; + width: 34px; + border-radius: 2px; + position: absolute; + left: 50%; + transform: translateX(-50%); + top: 6px; +} + +.draggable-panel-css .panel-body { + padding-top: 10px; +} + +.draggable-panel-css .panel { + padding: 0em; + margin: 0; + border-radius: 0; + margin-bottom: 0em; + display: grid; + grid-template-columns: 1fr 1fr 1fr; + max-height: 185px; + border-radius: 2px; + overflow: auto; +} + +.ui-accordion-header { + background-color: transparent; + margin: 0em; + padding: 0em; + outline: none; +} + +.ui-accordion-header.ui-accordion-header-active.ui-state-active { + outline: none; +} + +.ui-accordion-header.ui-state-hover { + outline: none; +} + +.ui-accordion-header-icon.ui-icon { + display: none; +} + +.accordion { + width: 90%; + margin: auto; + position: relative; +} + +/* expansion panel styles - start */ +.v-expansion-panel { + background-color: transparent; + color: var(--text-panel); +} +.v-expansion-panel--active > .v-expansion-panel-title { + min-height: 48px; +} +.v-expansion-panel-title__overlay { + border-radius: 3px; + outline: none; + background-color: #ededed; + font-weight: 400; +} + +.v-expansion-panel__shadow { + box-shadow: none; +} + +.v-expansion-panel-title { + cursor: pointer; + position: relative; + margin: 2px 0 0; + padding: 0 0.5em 0 0.7em; + font-size: 100%; + font-weight: 400; + line-height: 1.3; +} + +.v-expansion-panel-text { + background-color: var(--text-panel); + color: black; +} +.v-expansion-panel-text__wrapper { + padding: 0; +} +/* expansion panel styles - ends */ + +.panelHeader { + border: none; + border-radius: 0; + transition: all 0.2s ease-in-out; +} + +.panelHeader:hover { + border-radius: 3px; +} + +.panelHeader:after, +.panelHeader:before { + content: ''; + height: 8px; + display: inline-block; + right: 15px; + position: absolute; + border-radius: 5px; + top: 50%; + transform: translateY(-50%) rotate(132deg); + transition: 0.2s ease-out; + background-color: white; +} + +.panelHeader:after { + transform: translate(260%, -50%) rotate(226deg); +} + +.ui-accordion-header-active:before { + transition: 0.2s ease-out; + transform-origin: left; + transform: translate(29%, -40%) rotate(50deg); + top: 46%; +} + +.ui-accordion-header-active:after { + transform-origin: bottom; + transform: translate(420%, -50%) rotate(310deg); + transition: 0.2s ease-out; + top: 46%; +} + +.ui-accordion-header-active:hover { + background-color: transparent; +} + +.ui-accordion .ui-accordion-content { + border: none; + padding: 0; +} + +.icon { + position: relative; + width: 50px; + margin: 5px; + display: inline-block; + text-align: center; + font-size: 8px; +} + +img { + display: none; +} + +div.icon img { + -webkit-user-drag: none; + -khtml-user-drag: none; + -moz-user-drag: none; + -o-user-drag: none; + width: 100%; + display: inline-block; +} + +.custom-tooltip-styling { + box-shadow: none; + border-radius: 3px; + font: inherit; + font-size: 14px; + font-weight: 100; +} + +.icon:hover { + border-radius: 3px; +} + +/*! ce-panel styling ends */ + +/** custom scroll styling starts here */ + +.search-results { + scrollbar-width: thin; /* for firefox */ +} + +.search-results::-webkit-scrollbar { + margin-right: 3px; + width: 6px; +} + +/*! custom scroll styling starts ends here */ + +/*! ce-panel styling ends */ + +/** tab bar styling starts */ + +#tabsBar { + width: 100%; + /* height: 23.5px; */ + display: block; + align-items: center; + z-index: 99; + /* position: absolute; + top: 47px; */ +} + +.embed-tabs { + background-color: transparent !important; +} + +#tabsBar .placeholder { + justify-content: space-between; + padding: 1px; + display: inline-block; + margin: 2px; + text-align: center; + /* min-width: 110px; */ + font-size: 14px; + transition: all 0.2s ease-in-out; +} + +.placeholder::before { + display: inline-block; + padding: 2px 5px; + content: '|'; +} + +#tabsBar .circuits { + justify-content: space-between; + border-radius: 3px; + padding: 1px; + display: inline-flex; + align-items: center; + margin: 2px; + text-align: center; + /* min-width: 110px; */ + font-size: 14px; + transition: all 0.2s ease-in-out; +} + +#tabsBar .circuits > span { + display: inline-block; + padding: 2px 5px; +} + +.circuitName { + cursor: pointer; +} + +#tabsBar button { + order: 99; /* could have better solution */ + width: 20px; + align-items: center; + display: inline; + font-size: 20px; + text-align: center; + padding-bottom: 5px; + text-decoration: none; + outline: none; + border-radius: 1px; + transition: all 0.1s ease-in-out; + border-radius: 4px; + margin-left: 1px; +} + +#tabsBar button:focus { + outline: none !important; + box-shadow: none !important; +} +#tabsBar button:active { + outline: none !important; + box-shadow: none !important; +} + +/*! tab bar styling ends */ +/** Module property styling starts here */ + +.moduleProperty { + font: inherit; + width: 250px; + top: 90px; + right: 10px; +} + +.layoutElementPanel { + width: 220px; + font: inherit; + display: none; + top: 90px; + left: 10px; +} + +.timing-diagram-panel { + border-radius: 5px; + z-index: 70; + transition: background 0.5s ease-out; + position: fixed; + cursor: pointer; + left: 300px; + top: 90px; +} + +.timing-diagram-panel .panel-header { + border-radius: 5px; + border-top-right-radius: 5px; + padding: 3px; + font-weight: bold; + font-size: 16px; + text-transform: uppercase; + text-align: left; + cursor: move; +} + +/* Testbench UI Styling begin */ + +.testbench-manual-panel { + border-radius: 5px; + z-index: 100; + transition: background 0.5s ease-out; + position: fixed; + cursor: pointer; + left: 10px; + top: 470px; +} + +.testbench-manual-panel .panel-header { + border-radius: 5px; + border-top-right-radius: 5px; + padding: 3px; + font-weight: bold; + font-size: 16px; + text-transform: uppercase; + text-align: left; + cursor: move; +} + +.tb-case-arrow { + border: solid var(--text-panel); + border-width: 0 3px 3px 0; + display: inline-block; + padding: 3px; +} + +.tb-case-arrow-right { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); +} + +.tb-case-arrow-left { + transform: rotate(135deg); + -webkit-transform: rotate(135deg); +} + +.testbench-manual-panel .panel-body { + width: 700px; +} + +.testbench-manual-panel b { + font-weight: bold; +} + +.tb-manual-test-data { + /*text-align: center;*/ + margin-top: 10px; + border-bottom: 1px solid var(--br-secondary); + padding-left: 8px; + padding-right: 8px; +} + +.tb-manual-test-data .tb-data { + margin-right: 10px; +} + +.tb-data span { + vertical-align: middle; + display: inline-block; + max-width: 200px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.tb-data#data-title { + float: left; +} + +.tb-data#data-type { + float: right; +} + +.tb-manual-table { + position: relative; + display: inline-block; + margin-top: 10px; + color: var(--text-panel); + max-width: 650px; + overflow-x: auto; + white-space: nowrap; +} + +.tb-manual-table td, +.tb-manual-table th { + padding-left: 15px; + padding-right: 15px; + padding-top: 12px; + padding-bottom: 12px; + text-align: center; + min-width: 80px; +} + +.tb-manual-table th { + background: var(--table-head-dark); + height: 50px; +} + +.testbench-manual-panel-buttons { + position: relative; + display: table-cell; + flex-wrap: wrap; + right: 0px; + text-align: left; + width: 200px; +} + +.testbench-runall-label { + display: none; +} + +.tb-dialog-button { + display: inline; + margin: 8px; + border-radius: 5px !important; + padding-left: 8px !important; + padding-right: 8px !important; + padding-top: 4px !important; + padding-bottom: 4px !important; +} + +.tb-manual-test-buttons { + display: flex; + margin-top: 20px; + margin-left: 30px; + margin-right: 30px; + height: 25px; + overflow: auto; +} + +.tb-manual-test-buttons .tb-case-button-left { + border-bottom-left-radius: 5px; + border-top-left-radius: 5px; + width: 24px; +} + +.tb-manual-test-buttons .tb-case-button-right { + border-bottom-right-radius: 5px; + border-top-right-radius: 5px; + width: 24px; +} + +.tb-manual-test-buttons .tb-test-label { + position: relative; + top: 0px; + line-height: 25px; + height: 25px; + margin: 0px; + padding-left: 2px; + padding-right: 2px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + background: #c4c4c4; + color: black; +} + +.tb-manual-test-buttons .tb-test-label.group-label { + text-align: center; + width: 100px; +} + +.tb-manual-test-buttons .tb-test-label.case-label { + text-align: center; + width: 40px; +} + +.tb-group-buttons { + float: left; +} + +.tb-case-buttons { + float: right; +} + +.tb-test-null { + width: 350px !important; +} + +.validation-ui-table td, +.validation-ui-table th { + padding-left: 15px; + padding-right: 15px; + padding-top: 12px; + padding-bottom: 12px; + text-align: center; + min-width: 80px; + color: white; +} + +/* Testbench UI styling end */ + +#plotArea { + padding: 3px; + width: 100%; +} + +#verilogEditorPanel { + width: 220px; + font: inherit; + display: none; + top: 90px; + right: 300px; +} + +#moduleProperty-toolTip { + padding: 10px; +} + +#moduleProperty-inner { + width: 85%; + margin: auto; +} + +#moduleProperty-header { + font-size: 1.1em; + text-transform: uppercase; + margin-bottom: 20px; + text-align: left; +} + +#moduleProperty-inner > p span { + display: inline-block; + font-weight: bold; +} + +#moduleProperty-inner > div span { + display: inline-block; + font-weight: bold; +} + +#moduleProperty-inner > p button { + border-radius: 2px; + margin: 3px; +} + +#moduleProperty-inner > div button { + border-radius: 2px; + margin: 3px; +} + +#moduleProperty-inner:last-child { + margin-bottom: 15px; +} + +.moduleProperty select { + background-color: transparent; + border: none; + margin-left: 2px; + outline: none; +} + +.moduleProperty input, +.moduleProperty textarea { + background-color: transparent; + margin-top: 7px; + outline: none; + padding: 5px 5px; + width: 100%; +} + +.moduleProperty textarea { + text-align: left; +} + +.moduleProperty select, +.moduleProperty input, +.moduleProperty textarea { + border-radius: 7px !important; +} + +.moduleProperty input:focus, +.moduleProperty select:focus, +.moduleProperty textarea { + outline-width: 0; + outline: none; + box-shadow: none; +} + +.input-group-prepend button { + margin-right: 5px; +} +.input-group-append button { + margin-left: 5px; +} + +.input-group-prepend button:hover { + border-radius: 3px !important; +} +.input-group-append button:hover { + border-radius: 3px !important; +} + +/* toogle */ + +.switch { + position: relative; + width: 43px; + height: 17px; + margin-bottom: 0px; + float: right; +} + +.switch input { + display: none; +} + +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + -webkit-transition: 0.2s all ease; + transition: 0.2s all ease; + border-radius: 25px; + width: 35px; +} + +.slider:before { + position: absolute; + content: ''; + height: 20px; + width: 20px; + left: -3px; + top: 50%; + transform: translateY(-51%); + -webkit-transition: 0.2s all ease-in-out; + transition: 0.2s all ease-in-out; + border-radius: 50%; +} + +input:checked + .slider:before { + transform: translate(21px, -51%); +} + +/** custom button styling */ + +.custom-btn--primary { + border-radius: 1px; +} + +.custom-btn--secondary { + background-color: transparent; + border-radius: 1px; + width: 90%; + display: inline-block; + line-height: inherit; +} + +.custom-btn--secondary:hover { + /* color: white; */ + transition: all 0.3s ease; +} + +.custom-btn--tertiary { + border-radius: 1px; +} +/* Used to force auto width on secondary button */ +.custom-btn--basic { + border-radius: 1px; + border: solid 1px; + background-color: transparent; + display: inline-block; + background: var(--table-head-dark); +} + +.custom-btn--basic:focus { + border: solid 1px; +} + +#HelpButton { + background-color: transparent; + border: 2px solid white; + width: 90%; + margin-bottom: 15px; + margin-top: 15px; + font-weight: bold; +} + +.btn-parent { + width: 100%; + display: flex; + justify-content: center; + margin: 0; +} + +/* custom spin button */ + +/*! Module property styling starts here */ + +/** selects styling starts here */ + +.moduleProperty select { + text-align: center; + width: 81px; + height: 20px; + float: right; + font-size: 17px; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +/*! selects styling end here */ + +/** layout dialog styling starts here */ + +.layout-body { + text-align: center; + padding: 10px; + padding-bottom: 17px; + font-weight: bold; +} + +#layoutDialog { + /* display: none; */ + right: 10px; + top: 90px; + width: 220px; +} + +.layout-title span { + display: block; + font-weight: bold; + margin: 8px; +} + +.layout-title--enable { + display: flex; + justify-content: space-between; + margin: 15px 0; + padding: 0 8px; +} + +.Layout-btn { + width: 48%; + height: 30px; + line-height: inherit; +} + +.zoomButton-up { + /* background: url(./assets/layout-panel/up.svg) center/cover no-repeat; */ + display: inline-block; + height: 35px; + width: 35px; +} +.zoomButton-down { + /* background: url(./assets/layout-panel/down.svg) center/cover no-repeat; */ + display: inline-block; + height: 35px; + width: 35px; +} +.zoomButton-left { + /* background: url(./assets/layout-panel/left.svg) center/cover no-repeat; */ + display: inline-block; + height: 35px; + width: 35px; +} +.zoomButton-right { + /* background: url(./assets/layout-panel/right.svg) center/cover no-repeat; */ + display: inline-block; + height: 35px; + width: 35px; +} + +/*! layout dialog styling ends here */ + +/** download dialog styling starts here */ + +.ui-dialog { + /*this also affects all dialog created using jquery UI, needs to be more universe */ + font: inherit; + border-radius: 5px; + width: 600px; + height: 320px; + padding: 10px 17px; + padding-bottom: 0; + /* border: none !important; */ +} + +@supports (backdrop-filter: blur()) { + .ui-dialog { + backdrop-filter: blur(5px); + } +} + +.ui-widget-header { + background: transparent; + border: none; + border-radius: 0; +} + +.option { + display: inline-flex; + border-radius: 7px; + align-items: center; + justify-content: space-around; + padding: 0 7px; + position: relative; + cursor: pointer; + margin: 2px 3px; +} + +.option input[type='radio'] { + visibility: hidden; +} + +.download-dialog-section-2 .btn { + color: var(--text-lite); +} +.download-dialog-section-2 .btn:hover { + color: var(--text-lite); +} + +.download-dialog-section-2 .option { + background: transparent; +} + +.custom-radio span { + height: 20px; + width: 20px; + border-radius: 50%; + display: block; + position: absolute; + left: 2px; + top: 50%; + transform: translateY(-50%); +} + +.custom-radio span:after { + content: ''; + height: 8px; + width: 8px; + border-radius: 50%; + display: block; + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%) scale(0); + transition: 300ms ease-in-out 0s; +} + +.custom-radio input[type='radio']:checked ~ span:after { + transform: translate(-50%, -50%) scale(1); +} + +#saveImageDialog { + border-radius: 2px; + padding: 13px; + margin: 0; + margin-top: 15px; + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + min-height: 188px !important; +} + +.download-dialog-section-2 .option { + padding: 0; +} + +.download-dialog-section-1 > label { + height: 30px; + width: 85px; +} + +.download-dialog-section-2 { + background: transparent; + width: 100%; + display: inline-flex; + justify-content: space-around; +} + +.btn-group-toggle { + background-color: transparent; + overflow: hidden; +} +.download-dialog-section-2 .active-btn { + box-shadow: none; +} + +.download-dialog-section-2 .btn input[type='radio']:disabled { + background: red !important; + color: red !important; +} + +.download-dialog-section-2_2 { + display: flex; + align-items: center; + justify-content: center; +} + +.download-dialog-section-3 { + border-radius: 2px; + display: flex; + justify-content: space-between; + align-items: center; + padding: 6px 10px; + width: 320px; + position: inherit; +} + +.download-dialog-section-3 > label { + width: 60px; + height: 25px; + margin-bottom: 0; +} + +.ui-dialog-buttonpane { + background: transparent; +} + +.ui-dialog .ui-dialog-titlebar { + padding: 0; + padding-bottom: 8px; + font: inherit; + line-height: inherit; + font-weight: bold; +} + +.ui-dialog-titlebar-close { + border: none; + color: white; + position: absolute; + top: 15px; + right: 15px; + visibility: hidden; +} + +.ui-dialog-titlebar-close::after { + content: ''; + display: block; + position: absolute; + background: url(./assets/small-components/close.svg) center/cover no-repeat; + height: 15px; + width: 15px; + visibility: visible; + right: 0; + top: 0; +} + +.ui-dialog-titlebar-close::hover { + border: none; +} + +.ui-dialog .ui-dialog-buttonpane { + border: none; + padding: 0; + margin: 0; + display: flex; + justify-content: center; + align-items: center; + margin: 12px; +} + +.ui-dialog .ui-dialog-buttonpane button { + background: transparent; + color: white; + line-height: inherit; + border-radius: 1px; + font: inherit; +} + +.ui-dialog .ui-dialog-buttonpane button:hover { + transition: all 0.3s ease; + border: 1px solid transparent; +} + +.render-btn { + height: 35px; + border-radius: 1px; +} +.navbar { + transition: background 0.5s ease-out; +} + +.navbar .nav.pull-right { + float: right; + margin-right: 10px; + min-width: 85px; +} + +@media (max-width: 991px) { + .navbar .nav.pull-right { + display: none; + } +} + +@media (max-width: 991px) { + .nav-dropdown { + text-align: center; + padding-top: 20px; + } +} + +/*! download dialog styling end here */ + +/** combinationalAnalysis dialog styling starts here */ + +.ui-dialog[aria-describedby='combinationalAnalysis'] { + width: 460px; + min-height: 210px; + border: none; +} + +#combinationalAnalysis { + margin-top: 10px; +} + +#combinationalAnalysis p input { + border: 1px solid white; + background: transparent; + font: inherit; + text-align: center; +} + +.ui-dialog input::placeholder { + /* Chrome, Firefox, Opera, Safari 10.1+ */ + color: white; + opacity: 0.7; /* Firefox */ +} + +#combinationalAnalysis table { + width: 460px; +} + +#booleanTable { + width: 200px; +} + +.content-table { + border-collapse: collapse; + font-size: 0.9em; + min-width: 400px; +} + +.content-table tr th { + font-weight: bold; +} + +.content-table th, +.content-table td { + padding: 5px 15px; + margin: 0 3px; + width: 20%; + border-radius: 2px; +} + +.content-table tbody tr { + text-align: center; + display: flex; + margin-bottom: 4px; +} + +.content-table tbody { + display: table-row-group; + overflow: auto !important; + margin-left: 52px; +} + +.output { + cursor: pointer; +} + +/*! combinationalAnalysis dialog styling end here */ + +#setTestbenchData input { + border: 1px solid white; + background: transparent; + text-align: center; + font: inherit; + color: white; +} + +#setTestbenchData p { + font: inherit; + color: white; +} + +/** openProjectDialog styling starts here */ + +#openProjectDialog { + display: grid; + /* grid-template-columns: 1fr 1fr 1fr; */ + /* grid-gap: 0 10px; */ + align-items: center; +} + +#openProjectDialog > label { + margin: 4px; + padding: 10px; + background: transparent; + border-radius: 1px; + width: 100%; +} + +/*! openProjectDialog styling ends here */ + +#insertSubcircuitDialog { + display: block; + padding-bottom: 0; + overflow: visible; +} + +#insertSubcircuitDialog > p { + margin-bottom: 0; +} + +#insertSubcircuitDialog > label { + height: 30px; + border-radius: 3px; + margin: 0 5px; + margin-bottom: 4px; + justify-content: center; + padding-left: 10px; +} + +#miniMap { + position: fixed; + z-index: 3; + bottom: 20px; + right: 40px; + overflow-y: scroll; + opacity: 0.5; + overflow: hidden; + border: none; +} + +.disable::after { + content: ''; + position: absolute; + height: 100%; + width: 100%; + cursor: not-allowed; + left: 0; +} + +.ui-dialog .ui-dialog-buttonpane button { + margin-left: 0.4em; +} + +.ui-dialog-titlebar-close:hover { + border: none; +} + +.radio-green { + background: #42b983; +} + +.search-input { + margin: 0 10px; + padding: 3px 10px; + width: 90%; + border-radius: 13px; + margin-bottom: 10px; + background: transparent !important; +} + +.search-input:focus { + outline: none !important; +} + +.search-close { + position: absolute; + right: 19px; + top: 6px; + cursor: pointer; +} + +.search-results { + padding: 15px; + transition: all 0.5s ease; + max-height: 340px; + overflow-y: scroll; + padding-right: 0; +} + +.search-results div { + border-radius: 3px; +} + +.draggable-panel-css .minimize { + position: absolute; + right: 15px; + cursor: pointer; +} + +.panel-button-icon { + cursor: pointer; +} + +.panel-button { + cursor: pointer; + padding: 2px; +} + +.draggable-panel-css .maximize { + position: absolute; + right: 15px; + cursor: pointer; + display: none; +} + +.ce-hidden, +.prop-hidden { + font-weight: bold; + padding: 10px; + font-size: 16px; + text-transform: uppercase; + border-radius: 5px; +} + +.largeButton.btn { + width: 100%; + margin-bottom: 5px; + margin-left: 0 !important; +} + +.objectPropertyAttributeChecked { + margin-left: 0 !important; +} + +#exitViewBtn { + position: fixed; + z-index: 1000000000; + right: 2%; + top: 3%; + box-shadow: 0px 0px 10Xpx #4545457f; + padding: 10px 15px; + border-radius: 5px; +} + +.ce-hidden, +.prop-hidden { + cursor: move; +} + +#canvasArea, +#backgroundArea, +#simulationArea, +canvas { + /* cursor: wait !important; */ +} + +/** Color them dialog styles starts here*/ + +.ui-dialog[aria-describedby='colorThemesDialog'] { + min-width: 760px; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.colorThemesDialog { + height: 390px !important; + display: grid; + grid-template-columns: 1fr 1fr 1fr; + overflow-y: auto; + margin-top: 10px; + border: 1px solid white !important; +} + +.colorThemesDialog input { + margin: 15px; +} + +.colorThemesDialog label { + margin-bottom: 0; +} + +.theme { + color: white; + width: 202.5px; + line-height: 30px; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + margin: 15px; + border-radius: 1.5px; + transition: all 0.1s ease-out; + position: relative; + overflow-x: hidden; + height: 154px; +} + +.themeNameBox { + display: block; + width: 100%; + cursor: pointer; +} + +.themeSel { + background: transparent; + display: block; + width: 100%; + height: 100%; + position: absolute; +} + +/*! Color them dialog styles ends here*/ + +/*! Custom Color theme dialog styles starts here*/ + +.ui-dialog[aria-describedby='CustomColorThemesDialog'] { + min-width: 760px; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +#CustomColorThemesDialog { + height: 400px !important; + background: none; + overflow: auto; +} + +#CustomColorThemesDialog label { + color: var(--text-panel); + width: 60%; + height: 30px; +} + +#CustomColorThemesDialog input { + cursor: pointer; + width: 30%; + height: 30px; +} + +/*! Custom Color theme dialog styles ends here*/ + +.code-window .CodeMirror { + height: calc(100vh - 78px); + overflow: scroll; +} + +.code-window-embed .CodeMirror { + height: 100%; + overflow: scroll; +} + +.code-window-embed { + position: absolute; + top: 28px; + height: 100%; + width: 100%; + overflow: scroll; + z-index: 3; + display: none; +} + +.code-window { + display: none; +} + +#verilogOutput { + font-size: 12px; +} + +.embed-fullscreen-btn { + border-radius: 3px; + width: auto; +} + +#plot { + width: 800px; +} + +.timing-diagram-toolbar { + padding-left: 4px; + padding: 2px; + cursor: default; +} + +.timing-diagram-toolbar input { + width: 80px; + background: transparent !important; +} + +#timing-diagram-log { + font-size: 12.5px; + padding: 3px; + margin-left: 5px; + /* margin-bottom: 5px; */ + border-radius: 3px; +} + +/* CustomColorInput Styles Starts Here */ +.customColorInput { + cursor: pointer; + width: 30%; + height: 30px; + overflow: visible; + position: relative; + top: 8px; + appearance: auto; + background-color: buttonface; + color: buttontext; + border-width: 1px; + border-style: solid; + border-color: buttonborder; + border-image: initial; + padding: 1px 2px; +} +.customColorLabel { + width: 60%; + height: 30px; +} + +/* Vue Dialog Box Styles STARTS */ + +.inputField { + width: 100%; + padding: 10px 10px; + margin: 8px 0; + box-sizing: border-box; + border-radius: 5px; + border: 1px solid #c5c5c5; + color: white; + outline: none; +} + +.cAinput { + width: 30%; + padding: 0 5px; + margin: 8px 0; + box-sizing: border-box; + border-radius: 5px; + border: 1px solid #c5c5c5; + color: white; + outline: none; +} + +.combinationalAnalysisInput:first-child { + padding-top: 20px; +} + +.combinationalAnalysisInput { + display: flex; + flex-direction: row; + justify-content: space-evenly; + align-items: baseline; +} + +.inputField:focus { + border: 2px solid #c5c5c5; +} + +.v-card-actions { + width: fit-content; + display: flex; + flex-direction: row; + justify-content: center; + margin: auto; +} + +.v-input__details { + margin-bottom: 0.5rem; +} + +/* +.ProseMirror ul { + list-style-type: disc; +} + +.ProseMirror ol { + list-style-type: decimal; +} */ + +.ProseMirror { + height: 12rem; + overflow-y: auto; + padding-left: 0.5em; + padding-right: 0.5em; + outline: none; +} + +.fullscreen .ProseMirror { + height: 75vh; +} + +/* .ProseMirror ul, +.ProseMirror ol, +.ProseMirror li { + margin: 0; + padding: 0; + list-style: inherit; +} */ + +.messageBoxContent { + height: auto; + width: 760px; + justify-content: center; + margin: auto; + backdrop-filter: blur(5px); + border-radius: 5px; + border: 0.5px solid var(--br-primary) !important; + background: var(--bg-primary-moz) !important; + background-color: var(--bg-primary-chr) !important; + color: white; +} + +/* media query for .messageBoxContent */ +@media screen and (max-width: 991px) { + .messageBoxContent { + width: 100%; + } +} + +.tabsbarInput { + align-items: center; +} + +.messageBtn { + width: fit-content; + min-width: 50px; + border: 1px solid #c5c5c5; + padding: 5px 5px; +} + +.messageBtn:hover { + background: #c5c5c5; + color: black; +} + +.dialogHeader { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + margin-bottom: 10px; +} +.dialogClose { + position: absolute; + top: 5px; + right: 5px; + color: white; + background: none; + font-size: x-small; + box-shadow: none; +} +.dialogClose:hover { + font-weight: bold; + background: white; + opacity: 0.5; + color: black; +} + +.dialogHeader { + font-weight: bold; + margin-bottom: 25px; +} + +.downloadCheckbox { + width: 5px; + height: 5px; +} +/* STYLE ENDS */ diff --git a/v1/src/styles/css/plugin-stylesheets/checkBo.min.css b/v1/src/styles/css/plugin-stylesheets/checkBo.min.css new file mode 100644 index 00000000..199f3c9b --- /dev/null +++ b/v1/src/styles/css/plugin-stylesheets/checkBo.min.css @@ -0,0 +1,386 @@ +/* + * checkBo lightweight jQuery plugin v0.1.4 by @ElmahdiMahmoud + * Licensed under the MIT license - https://github.com/elmahdim/checkbo/blob/master/LICENSE + * + * Custom checkbox and radio + * Author URL: elmahdim.com + */ + +.cb-checkbox .cb-inner, +.cb-checkbox i { + width: 18px; + height: 18px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +.cb-checkbox.cb-sm .cb-inner, +.cb-checkbox.cb-sm i { + width: 14px; + height: 14px; +} +.cb-checkbox.cb-md .cb-inner, +.cb-checkbox.cb-md i { + width: 24px; + height: 24px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; +} +.cb-checkbox.cb-lg .cb-inner, +.cb-checkbox.cb-lg i { + width: 30px; + height: 30px; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + border-radius: 6px; +} +.cb-radio .cb-inner { + width: 18px; + height: 18px; +} +.cb-radio.cb-sm .cb-inner { + width: 14px; + height: 14px; +} +.cb-radio.cb-md .cb-inner { + width: 24px; + height: 24px; +} +.cb-radio.cb-lg .cb-inner { + width: 30px; + height: 30px; +} +.cb-checkbox, +.cb-radio { + padding: 3px 0; + color: inherit; + cursor: pointer; + overflow: hidden; + font-size: inherit; + font-weight: 400; + display: inline-block; + line-height: 18px; +} +.cb-checkbox input[type='checkbox'], +.cb-radio input[type='radio'], +.cb-switcher input[type='checkbox'], +.cb-switcher input[type='radio'] { + /* display: none; */ +} +.cb-checkbox.disabled, +.cb-checkbox.disabled *, +.cb-radio.disabled, +.cb-radio.disabled *, +.cb-switcher.disabled, +.cb-switcher.disabled * { + cursor: default; +} +.cb-checkbox.disabled, +.cb-checkbox.disabled .cb-inner { + color: #ddd; +} +.cb-checkbox.disabled:hover .cb-inner { + border-color: #ddd; +} +.cb-checkbox.disabled.checked .cb-inner { + background-color: #ddd; + border-color: #ddd; +} +.cb-radio.disabled { + color: #ddd; +} +.cb-radio.disabled .cb-inner { + border-color: #ddd; +} +.cb-radio.disabled i { + background-color: transparent; +} +.cb-radio.disabled.checked .cb-inner { + border-color: #ddd; +} +.cb-radio.disabled.checked .cb-inner i { + background-color: #ddd; +} +.cb-radio.disabled:hover .cb-inner { + border-color: #ddd; +} +.cb-checkbox .cb-inner { + float: left; + overflow: hidden; + margin: 0 5px 0 0; + position: relative; + background: transparent; + display: inline-block; + border: 1px solid #d6d6d6; + /* -moz-transition: all 0.5s ease; + -o-transition: all 0.5s ease; + -webkit-transition: all 0.5s ease; + transition: all 0.5s ease; */ +} +.cb-checkbox i { + top: 1px; + left: 2px; + display: block; + position: absolute; +} +.cb-checkbox i:after, +.cb-checkbox i:before { + height: 0; + width: 2px; + content: ''; + display: block; + position: absolute; + background-color: #fff; + /* -moz-transition: all 0.2s ease; + -o-transition: all 0.2s ease; + -webkit-transition: all 0.2s ease; + transition: all 0.2s ease; */ +} +.cb-checkbox i:before { + top: 0; + left: 0; + -moz-transform: rotate(-45deg); + -ms-transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); +} +.cb-checkbox i:after { + left: 7px; + bottom: 5px; + /* -moz-transition-delay: 0.3s; + -o-transition-delay: 0.3s; + -webkit-transition-delay: 0.3s; + transition-delay: 0.3s; */ + -moz-transform: rotate(30deg); + -ms-transform: rotate(30deg); + -webkit-transform: rotate(30deg); + transform: rotate(30deg); +} +.cb-radio .cb-inner { + float: left; + overflow: hidden; + margin: 0 5px 0 0; + position: relative; + display: inline-block; + border: 1px solid #d7d7d7; + background-color: transparent; + -moz-border-radius: 100%; + -webkit-border-radius: 100%; + border-radius: 100%; + -moz-transition: all 0.1s ease; + -o-transition: all 0.1s ease; + -webkit-transition: all 0.1s ease; + transition: all 0.1s ease; +} +.cb-radio i { + top: 50%; + left: 50%; + width: 6px; + height: 6px; + margin-top: -3px; + margin-left: -3px; + position: absolute; + background-color: transparent; + -moz-border-radius: 100%; + -webkit-border-radius: 100%; + border-radius: 100%; + -moz-transform: scale(0.05, 5); + -ms-transform: scale(0.05, 5); + -webkit-transform: scale(0.05, 5); + transform: scale(0.05, 5); + -moz-transition: all 0.2s ease; + -o-transition: all 0.2s ease; + -webkit-transition: all 0.2s ease; + transition: all 0.2s ease; +} +.cb-checkbox.cb-sm, +.cb-radio.cb-sm { + line-height: 14px; +} +.cb-checkbox.cb-md, +.cb-radio.cb-md { + line-height: 24px; +} +.cb-checkbox.cb-lg, +.cb-radio.cb-lg { + line-height: 30px; +} +.cb-checkbox.cb-sm i:before { + top: 4px; + left: 1px; +} +.cb-checkbox.cb-sm i:after { + left: 5px; +} +.cb-checkbox.cb-md i:before { + top: 10px; + left: 5px; +} +.cb-checkbox.cb-md i:after { + bottom: 6px; + left: 11px; +} +.cb-checkbox.checked .cb-inner { + border-color: transparent; + background-color: transparent; +} +.cb-checkbox.checked.cb-sm i:before { + top: 4px; + left: 1px; +} +.cb-checkbox.checked.cb-sm i:after { + height: 9px; +} +.cb-checkbox.checked.cb-md i:before { + top: 10px; + left: 4px; + height: 8px; +} +.cb-checkbox.checked.cb-md i:after { + bottom: 6px; + left: 11px; + height: 16px; +} +.cb-checkbox.checked.cb-lg i:before { + top: 11px; + left: 6px; + height: 12px; +} +.cb-checkbox.checked.cb-lg i:after { + left: 14px; + bottom: 7px; + height: 20px; +} +.cb-checkbox.checked i:before { + top: 6px; + left: 2px; + height: 6px; +} +.cb-checkbox.checked i:after { + height: 12px; +} +.cb-radio.checked .cb-inner { + background: #fff; + box-shadow: 0 0 3px #efefef; +} +.cb-radio.checked i { + -moz-transform: scale(1.1, 1.1); + -ms-transform: scale(1.1, 1.1); + -webkit-transform: scale(1.1, 1.1); + transform: scale(1.1, 1.1); + background-color: transparent; +} +.cb-checkbox:hover .cb-inner, +.cb-radio:hover .cb-inner { + border-color: white; +} +.cb-switcher { + display: inline-block; + border: 1px solid #eee; + background-color: #fff; + width: 95px; + height: 35px; + position: relative; + -moz-border-radius: 20px; + -webkit-border-radius: 20px; + border-radius: 20px; + -moz-transition: background 0.4s ease; + -o-transition: background 0.4s ease; + -webkit-transition: background 0.4s ease; + transition: background 0.4s ease; +} +.cb-switcher, +.cb-switcher * { + cursor: pointer; +} +.cb-switcher ::-moz-selection { + background-color: transparent; +} +.cb-switcher ::selection { + background-color: transparent; +} +.cb-switcher .cb-state { + z-index: 1; + text-align: center; + font-size: 12px; +} +.cb-switcher .cb-state, +.cb-switcher:before { + width: 34px; + height: 34px; + line-height: 34px; + position: absolute; + left: 0; + top: -1px; + -moz-border-radius: 100%; + -webkit-border-radius: 100%; + border-radius: 100%; + -moz-transition: all 0.4s ease; + -o-transition: all 0.4s ease; + -webkit-transition: all 0.4s ease; + transition: all 0.4s ease; +} +.cb-switcher:before { + content: ''; + background-color: #eee; + -moz-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + -webkit-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); +} +.cb-switcher.checked { + background-color: transparent; +} +.cb-switcher.checked .cb-state, +.cb-switcher.checked:before { + left: 60px; + color: transparent; +} +.cb-switcher.checked:before { + background-color: #fff; + -moz-box-shadow: -1px 1px 1px rgba(0, 0, 0, 0.1); + -webkit-box-shadow: -1px 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: -1px 1px 1px rgba(0, 0, 0, 0.1); +} +.cb-switcher.checked .inner-switcher:before { + border-top-color: transparent; +} +.cb-switcher.checked .inner-switcher:after { + border-bottom-color: transparent; +} +.cb-switcher .inner-switcher:after, +.cb-switcher .inner-switcher:before { + content: ''; + position: absolute; + left: 50%; + width: 0; + height: 0; + z-index: 2; + margin-left: -20px; + border-left: 20px solid transparent; + border-right: 20px solid transparent; + -moz-transition: border 0.4s ease; + -o-transition: border 0.4s ease; + -webkit-transition: border 0.4s ease; + transition: border 0.4s ease; +} +.cb-switcher .inner-switcher:before { + border-top: 17px solid #fff; + top: 0; +} +.cb-switcher .inner-switcher:after { + border-bottom: 17px solid #fff; + bottom: 0; +} +.cb-state { + color: #ccc; + display: inline-block; +} +.cb-switcher-group .cb-state { + position: relative; + top: 7px; +} +.is-hidden { + display: none !important; + visibility: hidden !important; +} diff --git a/v1/src/styles/css/restrictedElements.css b/v1/src/styles/css/restrictedElements.css new file mode 100644 index 00000000..68c21493 --- /dev/null +++ b/v1/src/styles/css/restrictedElements.css @@ -0,0 +1,20 @@ +.display--none { + display: none; +} + +.circuit-element-category { + border-bottom: 1px solid #026e57; + font-weight: 500; + margin: 20px 0 5px; + padding-bottom: 5px; +} + +.restricted-elements-list { + margin: 10px 0 25px; +} + +.form-check-label { + font-size: 16px; + margin-bottom: 6px; + margin-top: 6px; +} diff --git a/v1/src/styles/css/shortcut.panel.css b/v1/src/styles/css/shortcut.panel.css new file mode 100644 index 00000000..a2be4f72 --- /dev/null +++ b/v1/src/styles/css/shortcut.panel.css @@ -0,0 +1,146 @@ +.ui-dialog[aria-describedby='customShortcutDialog'] { + min-width: 680px; +} + +#edit { + display: none; + position: absolute; + width: 490px; + height: 150px; + background: #2d302e; + border-radius: 5px; + z-index: 10000; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + animation: none; +} + +#edit > span { + margin-top: 10px; + position: absolute; + text-align: center; + width: 100%; +} + +#pressedKeys { + text-align: center; + position: absolute; + top: 50%; + width: 100%; +} + +#warning { + position: absolute; + bottom: 5px; + width: 100%; + text-align: center; + font-size: 14px; + color: #dc5656; +} + +#customShortcutDialog { + align-items: center; + color: white; + flex-direction: column; + max-height: 430px !important; + overflow: hidden !important; +} + +#closeDialog { + font-size: 25px; + color: white; + transform: rotate(45deg); + position: absolute; + top: 0%; + right: 2%; + cursor: pointer; + user-select: none; + -moz-user-select: none; +} + +#dialogTitle { + position: absolute; + top: 2%; + left: 3%; + user-select: none; + -moz-user-select: none; +} + +#heading { + display: flex; + justify-content: space-between; + align-items: center; + font-weight: bold; + width: 100%; + height: 35px; + user-select: none; + padding-bottom: 10px; +} + +#heading > span { + padding: 0 20px; +} + +#preference { + max-width: 600px; + height: 350px; + overflow-y: auto; +} + +#preference div { + display: inline-flex; + justify-content: space-between; + align-items: center; + height: 35px; + cursor: pointer; + user-select: none; + -moz-user-select: none; + width: 100%; + padding-left: 5px; + padding-right: 7px; +} + +/* #preference div:not('#edit-icon') > span { + padding: 0 30px; +} */ + +#preference > div:hover { + background-color: #7474743f; +} + +#preference > div:hover span { + visibility: visible; +} + +#edit-icon { + background: url(../../assets/img/edit_icon.png) no-repeat; + background-size: 15px 15px; + display: inline-block; + visibility: hidden; + width: 15px; + height: 15px; +} + +@keyframes shake { + 10%, + 90% { + transform: translate(-50.5%, -50%); + } + + 20%, + 80% { + transform: translate(-49.5%, -50%); + } + + 30%, + 50%, + 70% { + transform: translate(-50.5%, -50%); + } + + 40%, + 60% { + transform: translate(-49.5%, -50%); + } +} diff --git a/v1/src/styles/css/testCreator.css b/v1/src/styles/css/testCreator.css new file mode 100644 index 00000000..47877b3c --- /dev/null +++ b/v1/src/styles/css/testCreator.css @@ -0,0 +1,141 @@ +.tb-test-title { + text-align: center; + margin-top: 50px; +} + +.lower-button { + height: 40px; + width: auto; + min-width: 40px; + background-color: #ffffff; + border: 2px solid black; + color: black; + /*padding: 20px;*/ + text-align: center; + text-decoration: none; + display: inline-block; + /*font-size: 16px;*/ + margin: 4px 2px; + border-radius: 4px; +} + +.table-button { + height: 20px; + width: 20px; + background-color: #ffffff; + border: 2px solid black; + color: black; + text-decoration: none; + display: inline-block; + margin: 4px 4px; + padding: 0px; + border-radius: 5px; +} + +.plus-button { + font-size: 25px; +} + +.tb-minus { + color: red; +} + +.save-buton { + background-color: #42b983; + color: white; + border: 1px solid gray; + min-width: 70px; +} + +.latest-button { + float: left; +} + +.buttons-alignment { + display: flex; + flex-direction: row; + align-items: flex-start; +} + +.tablink { + background-color: #555; + color: white; + float: left; + border: 1px solid white; + border-radius: 5px; + outline: none; + cursor: pointer; + padding: 14px 16px; + font-size: 17px; + width: 50%; +} + +/* Change background color of buttons on hover */ +.tablink:hover.tablink-no-override { + background-color: #a5dfc5; +} + +.tablink-hover-override { +} + +.tablink.tab-selected { + background-color: #42b983; + color: #fff; + outline: none; +} + +.data-group { + margin-top: 2%; +} + +.tb-table { + table-layout: fixed; + width: 100%; + height: 20px; + border-spacing: 5px; +} + +.tb-table th, +td { + border: 2px solid black; + border-collapse: collapse; + padding: 15px; + text-align: center; + transition: transform 0.2s; +} + +.tb-table th { + text-align: center; +} + +.tb-table tr th:first-child, +tr td:first-child { + width: 250px; +} + +.label-table { + margin-top: 100px; +} + +.test-title { + display: flex; + width: 100%; + font-size: 25px; + margin-top: 20px; + margin-bottom: 10px; +} + +.test-title #test-title-label { + width: 80%; + border: 1px solid; + border-radius: 5px; +} + +.tb-handle { + padding: 0px !important; + border: 0px !important; +} + +body { + overflow: scroll; +} diff --git a/v1/src/styles/css/typeahead.min.css b/v1/src/styles/css/typeahead.min.css new file mode 100644 index 00000000..01891f6d --- /dev/null +++ b/v1/src/styles/css/typeahead.min.css @@ -0,0 +1,186 @@ +.has-warning .twitter-typeahead .tt-hint, +.has-warning .twitter-typeahead .tt-input { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .twitter-typeahead .tt-hint:focus, +.has-warning .twitter-typeahead .tt-input:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; +} +.has-error .twitter-typeahead .tt-hint, +.has-error .twitter-typeahead .tt-input { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .twitter-typeahead .tt-hint:focus, +.has-error .twitter-typeahead .tt-input:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} +.has-success .twitter-typeahead .tt-hint, +.has-success .twitter-typeahead .tt-input { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .twitter-typeahead .tt-hint:focus, +.has-success .twitter-typeahead .tt-input:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; +} +.input-group .twitter-typeahead:first-child .tt-hint, +.input-group .twitter-typeahead:first-child .tt-input { + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; + width: 100%; +} +.input-group .twitter-typeahead:last-child .tt-hint, +.input-group .twitter-typeahead:last-child .tt-input { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; + width: 100%; +} +.input-group.input-group-sm .twitter-typeahead .tt-hint, +.input-group.input-group-sm .twitter-typeahead .tt-input { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group.input-group-sm .twitter-typeahead .tt-hint, +select.input-group.input-group-sm .twitter-typeahead .tt-input { + height: 30px; + line-height: 30px; +} +select[multiple].input-group.input-group-sm .twitter-typeahead .tt-hint, +select[multiple].input-group.input-group-sm .twitter-typeahead .tt-input, +textarea.input-group.input-group-sm .twitter-typeahead .tt-hint, +textarea.input-group.input-group-sm .twitter-typeahead .tt-input { + height: auto; +} +.input-group.input-group-sm + .twitter-typeahead:not(:first-child):not(:last-child) + .tt-hint, +.input-group.input-group-sm + .twitter-typeahead:not(:first-child):not(:last-child) + .tt-input { + border-radius: 0; +} +.input-group.input-group-sm .twitter-typeahead:first-child .tt-hint, +.input-group.input-group-sm .twitter-typeahead:first-child .tt-input { + border-radius: 3px 0 0 3px; +} +.input-group.input-group-sm .twitter-typeahead:last-child .tt-hint, +.input-group.input-group-sm .twitter-typeahead:last-child .tt-input { + border-radius: 0 3px 3px 0; +} +.input-group.input-group-lg .twitter-typeahead .tt-hint, +.input-group.input-group-lg .twitter-typeahead .tt-input { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} +select.input-group.input-group-lg .twitter-typeahead .tt-hint, +select.input-group.input-group-lg .twitter-typeahead .tt-input { + height: 46px; + line-height: 46px; +} +select[multiple].input-group.input-group-lg .twitter-typeahead .tt-hint, +select[multiple].input-group.input-group-lg .twitter-typeahead .tt-input, +textarea.input-group.input-group-lg .twitter-typeahead .tt-hint, +textarea.input-group.input-group-lg .twitter-typeahead .tt-input { + height: auto; +} +.input-group.input-group-lg + .twitter-typeahead:not(:first-child):not(:last-child) + .tt-hint, +.input-group.input-group-lg + .twitter-typeahead:not(:first-child):not(:last-child) + .tt-input { + border-radius: 0; +} +.input-group.input-group-lg .twitter-typeahead:first-child .tt-hint, +.input-group.input-group-lg .twitter-typeahead:first-child .tt-input { + border-radius: 6px 0 0 6px; +} +.input-group.input-group-lg .twitter-typeahead:last-child .tt-hint, +.input-group.input-group-lg .twitter-typeahead:last-child .tt-input { + border-radius: 0 6px 6px 0; +} +.twitter-typeahead { + width: 100%; + float: left; +} +.input-group .twitter-typeahead { + display: table-cell !important; +} +.twitter-typeahead .tt-hint { + color: #999; +} +.twitter-typeahead .tt-input { + z-index: 2; +} +.twitter-typeahead .tt-input[disabled], +.twitter-typeahead .tt-input[readonly], +fieldset[disabled] .twitter-typeahead .tt-input { + cursor: not-allowed; + background-color: #eee !important; +} +.tt-dropdown-menu, +.tt-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + min-width: 160px; + width: 100%; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 14px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; +} +.tt-dropdown-menu .tt-suggestion, +.tt-menu .tt-suggestion { + display: block; + padding: 3px 20px; + clear: both; + font-weight: 400; + line-height: 1.42857143; + color: #333; +} +.tt-dropdown-menu .tt-suggestion.tt-cursor, +.tt-dropdown-menu .tt-suggestion:hover, +.tt-menu .tt-suggestion.tt-cursor, +.tt-menu .tt-suggestion:hover { + cursor: pointer; + text-decoration: none; + outline: 0; + background-color: #f5f5f5; + color: #262626; +} +.tt-dropdown-menu .tt-suggestion.tt-cursor a, +.tt-dropdown-menu .tt-suggestion:hover a, +.tt-menu .tt-suggestion.tt-cursor a, +.tt-menu .tt-suggestion:hover a { + color: #262626; +} +.tt-dropdown-menu .tt-suggestion p, +.tt-menu .tt-suggestion p { + margin: 0; +} diff --git a/v1/src/styles/simulator.scss b/v1/src/styles/simulator.scss new file mode 100644 index 00000000..af0fe667 --- /dev/null +++ b/v1/src/styles/simulator.scss @@ -0,0 +1,39 @@ +$fa-font-path: '../../node_modules/@fortawesome/fontawesome-free/webfonts'; +@import '../../node_modules/@fortawesome/fontawesome-free/scss/fontawesome.scss'; +@import '../../node_modules/@fortawesome/fontawesome-free/scss/solid.scss'; + +.subcircuitdialog { + display: none; + overflow-x: hidden; + overflow-y: auto; +} + +.side { + width: 330px; + max-width: 500px; + min-width: 200px; + overflow-x: hidden; + overflow-y: scroll; +} + +.report-sidebar a { + color: #fff; + font-size: 13px; + padding: 10px; + position: fixed; + right: -119px; + text-decoration: none; + bottom: 30px; + transition: 0.3s; + width: 160px; + z-index: 999; +} + +.report-sidebar span { + font-size: 1.2em; + padding-right: 20px; +} + +.report-sidebar a:hover { + right: 0; +} diff --git a/v1/src/styles/tutorials.scss b/v1/src/styles/tutorials.scss new file mode 100644 index 00000000..59c4db7b --- /dev/null +++ b/v1/src/styles/tutorials.scss @@ -0,0 +1,52 @@ +@import '/node_modules/driver.js/dist/driver.min.css'; + +#driver-highlighted-element-stage { + background-color: transparent !important; +} + +.driver-disabled { + border: 1.5px solid #ddd !important; +} + +.driver-btn-group button { + font-family: 'Nunito', sans-serif !important; + font-size: 14px !important; + border: 1.5px solid #42b983 !important; + text-shadow: none !important; + border-radius: 0px !important; +} + +.driver-btn-group button:hover { + font-family: 'Nunito', sans-serif !important; + background: #42b983 !important; + color: white !important; +} + +.driver-close-btn { + font-family: 'Nunito', sans-serif !important; + font-size: 14px !important; + border: none !important; + border-radius: 0px !important; + text-shadow: none !important; + background: #dc5656 !important; + color: white !important; + margin: auto 3px !important; +} + +.driver-popover-description, +.driver-popover-title { + font-family: 'Nunito', sans-serif !important; +} + +.bug-guide .right { + top: 114px !important; +} + +.tourHelpStep.driver-popover-title { + display: none !important; +} + +.driver-next-btn { + color: white !important; + background-color: #42b983 !important; +} From 66b27f3a537b076747452ec56927ff0a97733dff Mon Sep 17 00:00:00 2001 From: Aryann Dwivedi Date: Mon, 24 Jun 2024 00:20:25 +0530 Subject: [PATCH 2/2] fix: update paths for bootstrap and fontawesome imports --- v0/src/main.ts | 2 +- v0/src/styles/simulator.scss | 6 +++--- v1/src/main.ts | 2 +- v1/src/styles/simulator.scss | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/v0/src/main.ts b/v0/src/main.ts index 3f92ae32..616edaa2 100644 --- a/v0/src/main.ts +++ b/v0/src/main.ts @@ -12,7 +12,7 @@ import 'bootstrap' import './globalVariables' import './styles/css/main.stylesheet.css' -import '../node_modules/bootstrap/scss/bootstrap.scss' +import '../../node_modules/bootstrap/scss/bootstrap.scss' import './styles/color_theme.scss' import './styles/simulator.scss' import './styles/tutorials.scss' diff --git a/v0/src/styles/simulator.scss b/v0/src/styles/simulator.scss index af0fe667..f6460422 100644 --- a/v0/src/styles/simulator.scss +++ b/v0/src/styles/simulator.scss @@ -1,6 +1,6 @@ -$fa-font-path: '../../node_modules/@fortawesome/fontawesome-free/webfonts'; -@import '../../node_modules/@fortawesome/fontawesome-free/scss/fontawesome.scss'; -@import '../../node_modules/@fortawesome/fontawesome-free/scss/solid.scss'; +$fa-font-path: '../../../node_modules/@fortawesome/fontawesome-free/webfonts'; +@import '../../../node_modules/@fortawesome/fontawesome-free/scss/fontawesome.scss'; +@import '../../../node_modules/@fortawesome/fontawesome-free/scss/solid.scss'; .subcircuitdialog { display: none; diff --git a/v1/src/main.ts b/v1/src/main.ts index 3f92ae32..616edaa2 100644 --- a/v1/src/main.ts +++ b/v1/src/main.ts @@ -12,7 +12,7 @@ import 'bootstrap' import './globalVariables' import './styles/css/main.stylesheet.css' -import '../node_modules/bootstrap/scss/bootstrap.scss' +import '../../node_modules/bootstrap/scss/bootstrap.scss' import './styles/color_theme.scss' import './styles/simulator.scss' import './styles/tutorials.scss' diff --git a/v1/src/styles/simulator.scss b/v1/src/styles/simulator.scss index af0fe667..f6460422 100644 --- a/v1/src/styles/simulator.scss +++ b/v1/src/styles/simulator.scss @@ -1,6 +1,6 @@ -$fa-font-path: '../../node_modules/@fortawesome/fontawesome-free/webfonts'; -@import '../../node_modules/@fortawesome/fontawesome-free/scss/fontawesome.scss'; -@import '../../node_modules/@fortawesome/fontawesome-free/scss/solid.scss'; +$fa-font-path: '../../../node_modules/@fortawesome/fontawesome-free/webfonts'; +@import '../../../node_modules/@fortawesome/fontawesome-free/scss/fontawesome.scss'; +@import '../../../node_modules/@fortawesome/fontawesome-free/scss/solid.scss'; .subcircuitdialog { display: none;