From 6c066b47542cbdff7fc5082d780b1300c35d2c9a Mon Sep 17 00:00:00 2001 From: Aadi Desai <21363892+supleed2@users.noreply.github.com> Date: Thu, 10 Feb 2022 23:15:22 +0000 Subject: [PATCH] Initialize hlp22-project --- .env.development | 1 + .gitignore | 245 + CountLines.cmd | 5 + LICENSE | 674 + LICENSE.md | 674 + Nuget.Config | 11 + README.md | 221 + RELEASE_NOTES.md | 20 + Tests/CanvasStates.fs | 738 + Tests/CanvasStatesMemories.fs | 69 + Tests/CanvasStatesSync.fs | 233 + Tests/CanvasStatesWithBuses.fs | 278 + Tests/SimulatorMemoriesTests.fs | 101 + Tests/SimulatorSyncTests.fs | 214 + Tests/SimulatorTests.fs | 457 + Tests/TestLib.fs | 18 + Tests/Tests.fs | 84 + Tests/Tests.fsproj | 24 + Tests/WidthInfererTests.fs | 184 + Tests/logStateToFSharp.py | 59 + Tests/paket.references | 13 + build.cmd | 6 + build.fsx | 99 + build.fsx.lock | 5 + build.old.fsx | 785 + build.proj | 25 + build.sh | 17 + build/icon.png | Bin 0 -> 64568 bytes docs/Contact.html | 48 + docs/DeveloperInfo.html | 64 + docs/Download.html | 62 + docs/UserGuide.html | 85 + docs/blog.md | 2 + docs/community.html | 62 + docs/content/github-blue.png | Bin 0 -> 817 bytes docs/content/github.png | Bin 0 -> 806 bytes docs/content/img/circuit.png | Bin 0 -> 164514 bytes docs/content/img/circuit/RAMviewer.png | Bin 0 -> 142211 bytes docs/content/img/circuit/catalog.png | Bin 0 -> 67426 bytes docs/content/img/circuit/circuitcropped.png | Bin 0 -> 64390 bytes docs/content/img/circuit/dragindicator.png | Bin 0 -> 15329 bytes docs/content/img/circuit/initialcanvas.png | Bin 0 -> 206243 bytes docs/content/img/circuit/memoryeditor.png | Bin 0 -> 137538 bytes docs/content/img/circuit/propertiesram.png | Bin 0 -> 185753 bytes docs/content/img/circuit/propertiestab.png | Bin 0 -> 153832 bytes docs/content/img/circuit/randomcircuit.png | Bin 0 -> 29307 bytes docs/content/img/circuit/savebutton.png | Bin 0 -> 147274 bytes docs/content/img/circuit/simulation tab.png | Bin 0 -> 154677 bytes docs/content/img/circuit/stepsimulation.png | Bin 0 -> 43347 bytes .../img/circuit/waveformsimulation.png | Bin 0 -> 180908 bytes docs/content/img/circuit/wavesim.png | Bin 0 -> 200509 bytes docs/content/img/circuit/wavesimorder.png | Bin 0 -> 179539 bytes docs/content/img/circuit/wavesimramview.png | Bin 0 -> 183327 bytes docs/content/img/circuit/wireerror.png | Bin 0 -> 115898 bytes docs/content/img/github-blue.png | Bin 0 -> 817 bytes docs/content/img/github.png | Bin 0 -> 806 bytes docs/content/img/icon.ico | Bin 0 -> 32988 bytes docs/content/style.css | 394 + docs/content/style_light.css | 227 + docs/content/tips.js | 46 + docs/contributing.html | 116 + docs/img/communityAnnouncements.png | Bin 0 -> 193391 bytes docs/img/faceToolsActions.png | Bin 0 -> 65501 bytes docs/img/faceToolsProfiles.png | Bin 0 -> 52800 bytes docs/img/fake.png | Bin 0 -> 16817 bytes docs/img/logo-template.pdn | Bin 0 -> 15052 bytes docs/img/logo.png | Bin 0 -> 117086 bytes docs/img/modAvailable.png | Bin 0 -> 393316 bytes docs/img/modInstalled.png | Bin 0 -> 88516 bytes docs/img/modInstalling.png | Bin 0 -> 39308 bytes docs/img/mordhauConfig.png | Bin 0 -> 58347 bytes docs/img/settings.png | Bin 0 -> 72516 bytes docs/index.html | 198 + docs/marco-poster.pdf | Bin 0 -> 490578 bytes docs/marco-report.pdf | Bin 0 -> 1587478 bytes docs/reference/bustypes-componentid.html | 93 + docs/reference/bustypes-connectionid.html | 93 + docs/reference/bustypes-connectionswidth.html | 120 + docs/reference/bustypes-inputportid.html | 93 + docs/reference/bustypes-inputportnumber.html | 93 + docs/reference/bustypes-outputportid.html | 93 + docs/reference/bustypes-outputportnumber.html | 93 + docs/reference/bustypes-widthinfererror.html | 111 + docs/reference/commontypes-canvasstate.html | 105 + docs/reference/commontypes-component.html | 241 + docs/reference/commontypes-componenttype.html | 507 + docs/reference/commontypes-connection.html | 150 + .../commontypes-customcomponenttype.html | 134 + .../commontypes-loadedcomponent.html | 179 + docs/reference/commontypes-memory.html | 129 + docs/reference/commontypes-numberbase.html | 147 + docs/reference/commontypes-port.html | 158 + docs/reference/commontypes-porttype.html | 111 + docs/reference/commontypes-project.html | 134 + .../diagrammessagetype-jsdiagrammsg.html | 165 + ...iagrammessagetype-keyboardshortcutmsg.html | 165 + .../diagrammessagetype-memoryeditordata.html | 129 + docs/reference/diagrammessagetype-msg.html | 759 + .../diagrammessagetype-popupdialogdata.html | 167 + .../diagrammessagetype-righttab.html | 147 + .../reference/diagrammessagetype-topmenu.html | 129 + .../diagrammessagetype-wavesimmodel.html | 273 + docs/reference/diagrammodeltype-model.html | 417 + .../diagrammodeltype-notifications.html | 183 + .../draw2dwrapper-displaymodetype.html | 96 + docs/reference/filesio-jsonhelpers.html | 118 + docs/reference/global-bustypes.html | 143 + docs/reference/global-buswidthinferer.html | 116 + .../reference/global-canvasstateanalyser.html | 118 + docs/reference/global-commontypes.html | 268 + docs/reference/global-dependencymerger.html | 100 + docs/reference/global-diagrammessagetype.html | 285 + docs/reference/global-diagrammodeltype.html | 95 + docs/reference/global-draw2dwrapper.html | 90 + docs/reference/global-extractor.html | 134 + docs/reference/global-filemenuview.html | 573 + docs/reference/global-filesio.html | 354 + docs/reference/global-helpers.html | 198 + docs/reference/global-jstypes.html | 151 + docs/reference/global-main.html | 186 + docs/reference/global-numberhelpers.html | 309 + docs/reference/global-simulationbuilder.html | 114 + .../global-simulationgraphanalyser.html | 99 + docs/reference/global-simulationrunner.html | 244 + docs/reference/global-simulator.html | 176 + docs/reference/global-simulatortypes.html | 223 + docs/reference/global-synchronousutils.html | 281 + docs/reference/index.html | 239 + docs/reference/jstypes-jscanvas.html | 93 + docs/reference/jstypes-jscanvasstate.html | 103 + docs/reference/jstypes-jscomponent.html | 93 + docs/reference/jstypes-jscomponents.html | 93 + docs/reference/jstypes-jsconnection.html | 93 + docs/reference/jstypes-jsconnections.html | 93 + docs/reference/jstypes-jsport.html | 93 + docs/reference/jstypes-jsports.html | 93 + docs/reference/jstypes-jsvertices.html | 93 + docs/reference/simulatortypes-bit.html | 111 + .../reference/simulatortypes-componentid.html | 93 + .../simulatortypes-componentlabel.html | 93 + .../simulatortypes-connectionid.html | 93 + .../reference/simulatortypes-inputportid.html | 93 + .../simulatortypes-inputportnumber.html | 93 + .../reference/simulatortypes-isclocktick.html | 111 + .../simulatortypes-outputportid.html | 93 + .../simulatortypes-outputportnumber.html | 93 + .../simulatortypes-reducerinput.html | 129 + .../simulatortypes-reduceroutput.html | 129 + .../simulatortypes-simulationcomponent.html | 219 + ...mulatortypes-simulationcomponentstate.html | 147 + .../simulatortypes-simulationdata.html | 183 + .../simulatortypes-simulationerror.html | 147 + .../simulatortypes-simulationgraph.html | 120 + .../simulatortypes-simulationio.html | 117 + docs/reference/simulatortypes-wiredata.html | 173 + docs/release-notes.html | 78 + docsrc/content/community.fsx | 9 + docsrc/content/contributing.fsx | 60 + docsrc/content/index.fsx | 68 + docsrc/files/img/communityAnnouncements.png | Bin 0 -> 193391 bytes docsrc/files/img/faceToolsActions.png | Bin 0 -> 65501 bytes docsrc/files/img/faceToolsProfiles.png | Bin 0 -> 52800 bytes docsrc/files/img/fake.png | Bin 0 -> 16817 bytes docsrc/files/img/logo-template.pdn | Bin 0 -> 15052 bytes docsrc/files/img/logo.png | Bin 0 -> 117086 bytes docsrc/files/img/modAvailable.png | Bin 0 -> 393316 bytes docsrc/files/img/modInstalled.png | Bin 0 -> 88516 bytes docsrc/files/img/modInstalling.png | Bin 0 -> 39308 bytes docsrc/files/img/mordhauConfig.png | Bin 0 -> 58347 bytes docsrc/files/img/settings.png | Bin 0 -> 72516 bytes docsrc/files/marco-poster.pdf | Bin 0 -> 490578 bytes docsrc/files/marco-report.pdf | Bin 0 -> 1587478 bytes docsrc/tools/templates/template.cshtml | 55 + dotnet-tools.json | 25 + issie.sln | 50 + package-lock.json | 26901 ++++++++++++++++ package.json | 92 + paket.dependencies | 56 + paket.lock | 668 + paket.references | 1 + scc.exe | Bin 0 -> 5649920 bytes src/Main/AssemblyInfo.fs | 22 + src/Main/Main.fs | 220 + src/Main/Main.fsproj | 15 + src/Main/main.js | 1 + src/Main/paket.references | 13 + src/Renderer/AssemblyInfo.fs | 22 + src/Renderer/Common/CommonTypes.fs | 563 + src/Renderer/Common/DrawHelpers.fs | 290 + src/Renderer/Common/EEExtensions.fs | 334 + src/Renderer/Common/ElectronAPI.fs | 13714 ++++++++ src/Renderer/Common/Helpers.fs | 277 + src/Renderer/Common/TimeHelpers.fs | 356 + src/Renderer/Common/WidthInferer.fs | 650 + src/Renderer/DrawBlock/BusWire.fs | 1553 + src/Renderer/DrawBlock/Sheet.fs | 1288 + src/Renderer/DrawBlock/Symbol.fs | 1053 + src/Renderer/Interface/Extractor.fs | 82 + src/Renderer/Interface/FilesIO.fs | 635 + src/Renderer/Interface/JSHelpers.fs | 135 + src/Renderer/Interface/Version.fs | 18 + src/Renderer/Renderer.fs | 254 + src/Renderer/Renderer.fsproj | 71 + src/Renderer/Simulator/Builder.fs | 240 + src/Renderer/Simulator/CanvasStateAnalyser.fs | 477 + src/Renderer/Simulator/DependencyMerger.fs | 319 + src/Renderer/Simulator/FastCreate.fs | 544 + src/Renderer/Simulator/FastReduce.fs | 502 + src/Renderer/Simulator/FastRun.fs | 491 + src/Renderer/Simulator/NumberHelpers.fs | 216 + src/Renderer/Simulator/Runner.fs | 384 + .../Simulator/SimulationGraphAnalyser.fs | 226 + src/Renderer/Simulator/Simulator.fs | 98 + src/Renderer/Simulator/SimulatorTypes.fs | 805 + src/Renderer/Simulator/SynchronousUtils.fs | 290 + src/Renderer/Simulator/Verilog.fs | 603 + src/Renderer/UI/CatalogueView.fs | 420 + src/Renderer/UI/CustomCompPorts.fs | 578 + src/Renderer/UI/FileMenuView.fs | 1024 + src/Renderer/UI/MainView.fs | 299 + src/Renderer/UI/MemoryEditorView.fs | 373 + src/Renderer/UI/MessageType.fs | 284 + src/Renderer/UI/ModelType.fs | 657 + src/Renderer/UI/Notifications.fs | 78 + src/Renderer/UI/PopupView.fs | 774 + src/Renderer/UI/SelectedComponentView.fs | 416 + src/Renderer/UI/SimulationView.fs | 627 + src/Renderer/UI/Style.fs | 237 + src/Renderer/UI/Update.fs | 533 + src/Renderer/UI/WaveSimHelpers.fs | 1260 + src/Renderer/UI/WaveformSimulationView.fs | 891 + src/Renderer/main.js | 1 + src/Renderer/paket.references | 15 + src/Renderer/scss/main.css | 11437 +++++++ src/Renderer/scss/main.scss | 361 + static/icon-1.png | Bin 0 -> 64568 bytes static/icon2.png | Bin 0 -> 335 bytes static/index.html | 9 + webpack.additions.main.js | 14 + webpack.additions.renderer.js | 36 + 240 files changed, 94824 insertions(+) create mode 100644 .env.development create mode 100644 .gitignore create mode 100644 CountLines.cmd create mode 100644 LICENSE create mode 100644 LICENSE.md create mode 100644 Nuget.Config create mode 100644 README.md create mode 100644 RELEASE_NOTES.md create mode 100644 Tests/CanvasStates.fs create mode 100644 Tests/CanvasStatesMemories.fs create mode 100644 Tests/CanvasStatesSync.fs create mode 100644 Tests/CanvasStatesWithBuses.fs create mode 100644 Tests/SimulatorMemoriesTests.fs create mode 100644 Tests/SimulatorSyncTests.fs create mode 100644 Tests/SimulatorTests.fs create mode 100644 Tests/TestLib.fs create mode 100644 Tests/Tests.fs create mode 100644 Tests/Tests.fsproj create mode 100644 Tests/WidthInfererTests.fs create mode 100644 Tests/logStateToFSharp.py create mode 100644 Tests/paket.references create mode 100644 build.cmd create mode 100644 build.fsx create mode 100644 build.fsx.lock create mode 100644 build.old.fsx create mode 100644 build.proj create mode 100755 build.sh create mode 100644 build/icon.png create mode 100644 docs/Contact.html create mode 100644 docs/DeveloperInfo.html create mode 100644 docs/Download.html create mode 100644 docs/UserGuide.html create mode 100644 docs/blog.md create mode 100644 docs/community.html create mode 100644 docs/content/github-blue.png create mode 100644 docs/content/github.png create mode 100644 docs/content/img/circuit.png create mode 100644 docs/content/img/circuit/RAMviewer.png create mode 100644 docs/content/img/circuit/catalog.png create mode 100644 docs/content/img/circuit/circuitcropped.png create mode 100644 docs/content/img/circuit/dragindicator.png create mode 100644 docs/content/img/circuit/initialcanvas.png create mode 100644 docs/content/img/circuit/memoryeditor.png create mode 100644 docs/content/img/circuit/propertiesram.png create mode 100644 docs/content/img/circuit/propertiestab.png create mode 100644 docs/content/img/circuit/randomcircuit.png create mode 100644 docs/content/img/circuit/savebutton.png create mode 100644 docs/content/img/circuit/simulation tab.png create mode 100644 docs/content/img/circuit/stepsimulation.png create mode 100644 docs/content/img/circuit/waveformsimulation.png create mode 100644 docs/content/img/circuit/wavesim.png create mode 100644 docs/content/img/circuit/wavesimorder.png create mode 100644 docs/content/img/circuit/wavesimramview.png create mode 100644 docs/content/img/circuit/wireerror.png create mode 100644 docs/content/img/github-blue.png create mode 100644 docs/content/img/github.png create mode 100644 docs/content/img/icon.ico create mode 100644 docs/content/style.css create mode 100644 docs/content/style_light.css create mode 100644 docs/content/tips.js create mode 100644 docs/contributing.html create mode 100644 docs/img/communityAnnouncements.png create mode 100644 docs/img/faceToolsActions.png create mode 100644 docs/img/faceToolsProfiles.png create mode 100644 docs/img/fake.png create mode 100644 docs/img/logo-template.pdn create mode 100644 docs/img/logo.png create mode 100644 docs/img/modAvailable.png create mode 100644 docs/img/modInstalled.png create mode 100644 docs/img/modInstalling.png create mode 100644 docs/img/mordhauConfig.png create mode 100644 docs/img/settings.png create mode 100644 docs/index.html create mode 100644 docs/marco-poster.pdf create mode 100644 docs/marco-report.pdf create mode 100644 docs/reference/bustypes-componentid.html create mode 100644 docs/reference/bustypes-connectionid.html create mode 100644 docs/reference/bustypes-connectionswidth.html create mode 100644 docs/reference/bustypes-inputportid.html create mode 100644 docs/reference/bustypes-inputportnumber.html create mode 100644 docs/reference/bustypes-outputportid.html create mode 100644 docs/reference/bustypes-outputportnumber.html create mode 100644 docs/reference/bustypes-widthinfererror.html create mode 100644 docs/reference/commontypes-canvasstate.html create mode 100644 docs/reference/commontypes-component.html create mode 100644 docs/reference/commontypes-componenttype.html create mode 100644 docs/reference/commontypes-connection.html create mode 100644 docs/reference/commontypes-customcomponenttype.html create mode 100644 docs/reference/commontypes-loadedcomponent.html create mode 100644 docs/reference/commontypes-memory.html create mode 100644 docs/reference/commontypes-numberbase.html create mode 100644 docs/reference/commontypes-port.html create mode 100644 docs/reference/commontypes-porttype.html create mode 100644 docs/reference/commontypes-project.html create mode 100644 docs/reference/diagrammessagetype-jsdiagrammsg.html create mode 100644 docs/reference/diagrammessagetype-keyboardshortcutmsg.html create mode 100644 docs/reference/diagrammessagetype-memoryeditordata.html create mode 100644 docs/reference/diagrammessagetype-msg.html create mode 100644 docs/reference/diagrammessagetype-popupdialogdata.html create mode 100644 docs/reference/diagrammessagetype-righttab.html create mode 100644 docs/reference/diagrammessagetype-topmenu.html create mode 100644 docs/reference/diagrammessagetype-wavesimmodel.html create mode 100644 docs/reference/diagrammodeltype-model.html create mode 100644 docs/reference/diagrammodeltype-notifications.html create mode 100644 docs/reference/draw2dwrapper-displaymodetype.html create mode 100644 docs/reference/filesio-jsonhelpers.html create mode 100644 docs/reference/global-bustypes.html create mode 100644 docs/reference/global-buswidthinferer.html create mode 100644 docs/reference/global-canvasstateanalyser.html create mode 100644 docs/reference/global-commontypes.html create mode 100644 docs/reference/global-dependencymerger.html create mode 100644 docs/reference/global-diagrammessagetype.html create mode 100644 docs/reference/global-diagrammodeltype.html create mode 100644 docs/reference/global-draw2dwrapper.html create mode 100644 docs/reference/global-extractor.html create mode 100644 docs/reference/global-filemenuview.html create mode 100644 docs/reference/global-filesio.html create mode 100644 docs/reference/global-helpers.html create mode 100644 docs/reference/global-jstypes.html create mode 100644 docs/reference/global-main.html create mode 100644 docs/reference/global-numberhelpers.html create mode 100644 docs/reference/global-simulationbuilder.html create mode 100644 docs/reference/global-simulationgraphanalyser.html create mode 100644 docs/reference/global-simulationrunner.html create mode 100644 docs/reference/global-simulator.html create mode 100644 docs/reference/global-simulatortypes.html create mode 100644 docs/reference/global-synchronousutils.html create mode 100644 docs/reference/index.html create mode 100644 docs/reference/jstypes-jscanvas.html create mode 100644 docs/reference/jstypes-jscanvasstate.html create mode 100644 docs/reference/jstypes-jscomponent.html create mode 100644 docs/reference/jstypes-jscomponents.html create mode 100644 docs/reference/jstypes-jsconnection.html create mode 100644 docs/reference/jstypes-jsconnections.html create mode 100644 docs/reference/jstypes-jsport.html create mode 100644 docs/reference/jstypes-jsports.html create mode 100644 docs/reference/jstypes-jsvertices.html create mode 100644 docs/reference/simulatortypes-bit.html create mode 100644 docs/reference/simulatortypes-componentid.html create mode 100644 docs/reference/simulatortypes-componentlabel.html create mode 100644 docs/reference/simulatortypes-connectionid.html create mode 100644 docs/reference/simulatortypes-inputportid.html create mode 100644 docs/reference/simulatortypes-inputportnumber.html create mode 100644 docs/reference/simulatortypes-isclocktick.html create mode 100644 docs/reference/simulatortypes-outputportid.html create mode 100644 docs/reference/simulatortypes-outputportnumber.html create mode 100644 docs/reference/simulatortypes-reducerinput.html create mode 100644 docs/reference/simulatortypes-reduceroutput.html create mode 100644 docs/reference/simulatortypes-simulationcomponent.html create mode 100644 docs/reference/simulatortypes-simulationcomponentstate.html create mode 100644 docs/reference/simulatortypes-simulationdata.html create mode 100644 docs/reference/simulatortypes-simulationerror.html create mode 100644 docs/reference/simulatortypes-simulationgraph.html create mode 100644 docs/reference/simulatortypes-simulationio.html create mode 100644 docs/reference/simulatortypes-wiredata.html create mode 100644 docs/release-notes.html create mode 100644 docsrc/content/community.fsx create mode 100644 docsrc/content/contributing.fsx create mode 100644 docsrc/content/index.fsx create mode 100644 docsrc/files/img/communityAnnouncements.png create mode 100644 docsrc/files/img/faceToolsActions.png create mode 100644 docsrc/files/img/faceToolsProfiles.png create mode 100644 docsrc/files/img/fake.png create mode 100644 docsrc/files/img/logo-template.pdn create mode 100644 docsrc/files/img/logo.png create mode 100644 docsrc/files/img/modAvailable.png create mode 100644 docsrc/files/img/modInstalled.png create mode 100644 docsrc/files/img/modInstalling.png create mode 100644 docsrc/files/img/mordhauConfig.png create mode 100644 docsrc/files/img/settings.png create mode 100644 docsrc/files/marco-poster.pdf create mode 100644 docsrc/files/marco-report.pdf create mode 100644 docsrc/tools/templates/template.cshtml create mode 100644 dotnet-tools.json create mode 100644 issie.sln create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 paket.dependencies create mode 100644 paket.lock create mode 100644 paket.references create mode 100644 scc.exe create mode 100644 src/Main/AssemblyInfo.fs create mode 100644 src/Main/Main.fs create mode 100644 src/Main/Main.fsproj create mode 100644 src/Main/main.js create mode 100644 src/Main/paket.references create mode 100644 src/Renderer/AssemblyInfo.fs create mode 100644 src/Renderer/Common/CommonTypes.fs create mode 100644 src/Renderer/Common/DrawHelpers.fs create mode 100644 src/Renderer/Common/EEExtensions.fs create mode 100644 src/Renderer/Common/ElectronAPI.fs create mode 100644 src/Renderer/Common/Helpers.fs create mode 100644 src/Renderer/Common/TimeHelpers.fs create mode 100644 src/Renderer/Common/WidthInferer.fs create mode 100644 src/Renderer/DrawBlock/BusWire.fs create mode 100644 src/Renderer/DrawBlock/Sheet.fs create mode 100644 src/Renderer/DrawBlock/Symbol.fs create mode 100644 src/Renderer/Interface/Extractor.fs create mode 100644 src/Renderer/Interface/FilesIO.fs create mode 100644 src/Renderer/Interface/JSHelpers.fs create mode 100644 src/Renderer/Interface/Version.fs create mode 100644 src/Renderer/Renderer.fs create mode 100644 src/Renderer/Renderer.fsproj create mode 100644 src/Renderer/Simulator/Builder.fs create mode 100644 src/Renderer/Simulator/CanvasStateAnalyser.fs create mode 100644 src/Renderer/Simulator/DependencyMerger.fs create mode 100644 src/Renderer/Simulator/FastCreate.fs create mode 100644 src/Renderer/Simulator/FastReduce.fs create mode 100644 src/Renderer/Simulator/FastRun.fs create mode 100644 src/Renderer/Simulator/NumberHelpers.fs create mode 100644 src/Renderer/Simulator/Runner.fs create mode 100644 src/Renderer/Simulator/SimulationGraphAnalyser.fs create mode 100644 src/Renderer/Simulator/Simulator.fs create mode 100644 src/Renderer/Simulator/SimulatorTypes.fs create mode 100644 src/Renderer/Simulator/SynchronousUtils.fs create mode 100644 src/Renderer/Simulator/Verilog.fs create mode 100644 src/Renderer/UI/CatalogueView.fs create mode 100644 src/Renderer/UI/CustomCompPorts.fs create mode 100644 src/Renderer/UI/FileMenuView.fs create mode 100644 src/Renderer/UI/MainView.fs create mode 100644 src/Renderer/UI/MemoryEditorView.fs create mode 100644 src/Renderer/UI/MessageType.fs create mode 100644 src/Renderer/UI/ModelType.fs create mode 100644 src/Renderer/UI/Notifications.fs create mode 100644 src/Renderer/UI/PopupView.fs create mode 100644 src/Renderer/UI/SelectedComponentView.fs create mode 100644 src/Renderer/UI/SimulationView.fs create mode 100644 src/Renderer/UI/Style.fs create mode 100644 src/Renderer/UI/Update.fs create mode 100644 src/Renderer/UI/WaveSimHelpers.fs create mode 100644 src/Renderer/UI/WaveformSimulationView.fs create mode 100644 src/Renderer/main.js create mode 100644 src/Renderer/paket.references create mode 100644 src/Renderer/scss/main.css create mode 100644 src/Renderer/scss/main.scss create mode 100644 static/icon-1.png create mode 100644 static/icon2.png create mode 100644 static/index.html create mode 100644 webpack.additions.main.js create mode 100644 webpack.additions.renderer.js diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.env.development @@ -0,0 +1 @@ + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6de5b8c --- /dev/null +++ b/.gitignore @@ -0,0 +1,245 @@ +# Output folder +app/*.eot +app/*.svg +app/*.woff +app/*.woff2 +app/*.ttf +app/main.js* +app/renderer.js* + + +public/bundle.js* +electron/Content/app/main.js* +electron/Content/app/renderer.js* + +# Distribution. +dist/ + +# Diagrams +*.dprj + +# Node +node_modules/ + +# Ionide +.ionide + +# Paket +/.paket/ +/paket-files/* + +.config/ +.vscode/ + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Xamarin Studio / monodevelop user-specific +*.userprefs +*.dll.mdb +*.exe.mdb + +# Build results + +[Dd]ebug/ +[Rr]elease/ +x64/ +[Bb]in/ +[Oo]bj/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.log +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Other Visual Studio data +.vs/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +#[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml + +# Enable nuget.exe in the .nuget folder (though normally executables are not tracked) +!.nuget/NuGet.exe + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml +*.pfx +*.publishsettings + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +App_Data/*.mdf +App_Data/*.ldf + + +#LightSwitch generated files +GeneratedArtifacts/ +_Pvt_Extensions/ +ModelManifest.xml + +# ========================= +# Windows detritus +# ========================= + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Mac desktop service store files +.DS_Store + +# =================================================== +# Exclude F# project specific directories and files +# =================================================== + +# NuGet Packages Directory +packages/ + +# Generated documentation folder +docs/output/ + +# Temp folder used for publishing docs +temp*/ + +# Test results produced by build +TestResults.xml +TestResult.xml + +# Nuget outputs +*.nupkg +release.cmd +release.sh +localpackages/ + +*.orig +docs/content/license.md +docs/content/release-notes.md +docs/tools/FSharp.Formatting.svclog + +.ionide.debug +*.bak +project.lock.json + +# Exclude doc generation and logs +docsrc/content/license.md +docsrc/content/release-notes.md +docsrc/tools/FSharp.Formatting.svclog + + + +# FAKE build cache +.fake/ + +/bin/ +/dist/ +!/docsrc/tools +!/docsrc/tools/templates +!/docsrc/tools/templates/* + +# Fable 3 Output +*.fs.js +*.fs.js.map + diff --git a/CountLines.cmd b/CountLines.cmd new file mode 100644 index 0000000..4227415 --- /dev/null +++ b/CountLines.cmd @@ -0,0 +1,5 @@ +@echo on +cls +scc --by-file --large-line-count=2000 --no-large -w --include-ext fs src\renderer\common src\renderer\drawblock src\renderer\ui src\renderer\interface src\renderer\simulator + + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e72bfdd --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..e72bfdd --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/Nuget.Config b/Nuget.Config new file mode 100644 index 0000000..8ef9d53 --- /dev/null +++ b/Nuget.Config @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..d7fedcc --- /dev/null +++ b/README.md @@ -0,0 +1,221 @@ +# Issie - an Interactive Schematic Simulator with Integrated Editor + +Issie (Interactive Schematic Simulator with Integrated Editor) is an application for digital circuit design and simulation. It is targeted at students and hobbyists that want to get a grasp of Digital Electronics concepts in a simple and fun way. Issie is designed to be beginner-friendly and guide the users toward their goals via clear error messages and visual clues. Issie is developed and actively used in teaching at Imperial College London. + +* If you are just interested in using the application, jump to the [Getting Started](#getting-started) section. +* If you want user documentation and news go to the [web pages](https://tomcl.github.io/issie/). + +For more technical info about the project, read on. This documentation is partly based on the excellent [VisUAL2](https://github.com/ImperialCollegeLondon/Visual2) documentation, given the similarity in the technology stack used. + +## Introduction + +For the Issie website go [here](https://tomcl.github.io/issie/). + +The application is mostly written in F#, which gets transpiled to JavaScript via the [Fable](https://fable.io/) compiler. [Electron](https://www.electronjs.org/) is then used to convert the developed web-app to a cross-platform application. [Electron](electronjs.org) provides access to platform-level APIs (such as access to the file system) which would not be available to vanilla browser web-apps. + +[Webpack 4](https://webpack.js.org/) is the module bundler responsible for the JavaScript concatenation and automated building process: the electron-webpack build +is automated with the all-in-one electron-webpack package. + +The drawing capabilities are provided (now) by a custom schemetic editor library implemented in F# and specialised for digital components. + +The choice of F# as main programming language for the app has been dictated by a few factors: + +* The success of the [VisUAL2](https://github.com/ImperialCollegeLondon/Visual2), which uses a similar technology stack; +* Strongly typed functional code tends to be easy to maintain and test, as the type-checker massively helps you; +* Imperial College EEE/EIE students learn such language in the 3rd year High-Level-Programming course, hence can maintain the app in the future; +* F# can be used with the powerful [Elmish](https://elmish.github.io/elmish/) framework to develop User Interfaces in a [Functional Reactive Programming](https://en.wikipedia.org/wiki/Functional_reactive_programming) fashion. + +## Project Structure + +Electron bundles Chromium (View) and node.js (Engine), therefore as in every node.js project, the `package.json` file specifies the (Node) module dependencies. + +* dependencies: node libraries that the executable code (and development code) needs +* dev-dependencies: node libraries only needed by development tools + +Additionally, the section `"scripts"`: +``` + "scripts": { + "compile": "dotnet fable src/main && dotnet fable src/renderer", + "dev": "cd src/main && dotnet fable watch . --run npm run devrenderer", + "devmain": "cd src/main && dotnet fable watch . --run npm run webpackdev", + "devrenderer": "cd src/renderer && dotnet fable watch . --run npm run webpackdev", + "webpackdev": "electron-webpack dev", + "webpack": "electron-webpack", + "dist": "npm run compile && npm run webpack && electron-builder", + } +``` +Defines the in-project shortcut commands as a set of ` : ` it is equivalent to calling ``. +For example, in the root of the project, running in the terminal `npm run dev` is equivalent to the command line: + +``` +cd src/main && dotnet fable watch . --run npm run devrenderer +``` + +This runs fable 3 to transpile the main process, then (`--run` is an option of fable to run another command) runs script `devrenderer` to transpile to javascript and watch the F# files in the renderer process. After the renderer transpilation is finished +`electron-webpack dev` will be run. This invokes `webpack` to pack and lauch the javascript code, under electron, and also watches for changes in the javascript code, and *hot loads* these on the running application + +As result of this, at any time saving an edited F# renderer project file causes (nearly) immediate: + +* fable transpile to from F# to javascript file (dependent F# files may also be transpiled) +* webpack hot load of any changed javascript files to the running electron application + +The build system depends on a `Fake` file `build.fsx`. Fake is a DSL written in F# that is specialised to automate build tasks. Build.fsx has targets representing build tasks, and normally these are run via `build.cmd` or `build.sh`, instead of using `dotnet fake` directly: + +* `build ` ==> `dotnet fake build -t ` + +## Code Structure + +The source code consists of two distinct sections transpiled separately to Javascript to make a complete Electron application. + +* The electron main process runs the Electron parent process under the desktop native OS, it starts the app process and provides desktop access services to it. +* The electron client (app) process runs under Chromium in a simulated browser environment (isolated from the native OS). + +Electron thus allows code written for a browser (HTML + CSS + JavaScript) to be run as a desktop app with the additional capability of desktop filesystem access via communication between the two processes. + +Both processes run Javascript under Node. + +The `src/Main/Main.fs` source configures electron start-up and is boilerplate. It is transpiled to the root project directory so it can be automatically picked up by Electron. + +The remaining app code is arranged in four different sections, each being a separate F# project. This separation allows all the non-web-based code (which can equally be run and tested under .Net) to be run and tested under F# directly in addition to being transpiled and run under Electron. + +The project relies on the draw2d JavaScript (node) library, which is extended to support digital electronics components. The extensions are in the `draw2d` sub-folder of the renderer project source files. + +The code that turns the F# project source into `renderer.js` is the FABLE compiler followed by the Node Webpack bundler that combines multiple Javascript files into a single `renderer.js`. + +The compile process is controlled by the `.fsproj` files (defining the F# source) and `webpack.additions.main.js`, `webpack.additions.renderer.js` +which define how Webpack combines F# outputs for both electron main and electron app processes and where the executable code is put. +This is boilerplate which you do not need to change; normally the F# project files are all that needs to be modified. + +## File Structure + +### `src` folder + +| Subfolder | Description | +|:------------:|:--------------------------------------------------------------------------------------------------:| +| `main/` | Code for the main electron process that sets everything up - not normally changed | +| `Common/` | Provides some common types and utilities used by all other sections, including the WidthInferer | +| `Simulator/` | Contains the logic to analyse and simulate a diagram. | +| `Renderer/` | Contains the UI logic, the wrapper to the JavaScript drawing library and a set of utility function to write/read/parse diagram files. This amd `main` are the only projects that cannot run under .Net, as they contain JavaScript related functionalities. | + +### `Tests` folder + +Contains numerous tests for the WidthInferer and Simulator. Based on F# Expecto testing library. + + +### `Static` folder + +Contains static files used in the application. + +### `Docs` folder + +Contains source information copied (or compiled) into the `docs` directory that controls the project +[Github Pages](https://pages.github.com/) website, with url [https://tomcl.github.io/issie/](https://tomcl.github.io/issie/). + +## Project versus File in the Issie application + +Issie allows the users to create projects and files within those projects. A Issie project is simply a folder named `` that contains an empty file named `.dprj` (dprj stands for diagram project). The project folder any non-zero number of design files, each named `.dgm` (dgm stands for diagram). each deisgn file represents one design sheet of a hierarchical hardware design, sheets can contain, as components, other sheets. + +When opening a project, Issie will initially search the given repository for `.dgm` files, parse and load their content, and allow the user to open them in Issie or use them as components in other designs. + +## Build Magic + +This project uses modern F# / dotnet cross-platform build. The build process does not normally concern a developer, but here is an overview for if it needs to be adjusted. + +* Before anything can be built Dotnet & Node.js are manually be (globally) installed. Dotnet includes the `paket` tool which will manage other dotnet-related dependencies. Node.js includes `npm` which will do the same for Node-related dependencies. NB - there are other popular packet managers for Node, e.g. Yarn. They do not mix with npm, so make sure you do not use them. Confusingly, they will sort-of work, but cause install incompatibilities. + * Dotnet dependencies are executable programs or libraries that run under dotnet and are written in C#'. F#, etc. + * Node dependencies are (always) Javascript modules which run under node. +* Initially (the first time `build.cmd` is run) the build tools categorised in `dotnet-tools.json` are installed by `dotnet tool restore`. + * fake (with the F# compiler) + * fable +* Next all the project Dotnet dependencies (`paket.dependencies` for the whole project, selected from by the `paket.references` in each project directory, are loaded by the `paket` packet manager. +* Finally fake runs `build.fsx` (this is platform-independent) which uses `npm` to install all the node (Javascript) dependencies listed in `package.json`. That includes tools like webpack and electron, which run under node, as well as the node libraries that will be used by needed by the running electron app, including electron itself. These are all loaded by the `npm` packet manager. + +## Getting Started + +If you just want to run the app go to the [releases page](https://github.com/tomcl/issie/releases) and +download and run the latest prebuilt binary for your platform (Windows or Macos). Issie will require in total about 200M of disk space. + +* Windows: unzip \*.zip anywhere and double-click the top-level `Issie.exe` application in the unzipped files. +* Macos: Double click the dmg file and run the application inside the folder, or drag and drop this to install. + * The binaries are not signed. You will need to [perform a one-off security bypass](https://www.wikihow.com/Install-Software-from-Unsigned-Developers-on-a-Mac). + +### + +Issie installs and runs without making system changes - all of its code is inside the directory you download. You can delete this and replace it by a later version of Issie. Each design sheet is stored in a similarly named file under the porject directory. The subdirectory `backup` there contains a large numbers of backup snapshots for design recovery. These are not needed for Issie operation so you can delete them - or even the whole `backup` directory, if you wish. + +## Getting Started as Developer + +If you want to get started as a developer, follow these steps. + +### Development Install Prerequisites + +Download and install (if you already have these tools installed just check the version constraints). + + +* [.Net 6 SDK](https://dotnet.microsoft.com/download/dotnet/5.0). Version >= 6.0 +* [Node.js v14](https://nodejs.org/dist/latest-v14.x/). **Version 12 or (preferably) v14 - NOT latest 16** + * Node.js includes the `npm` package manager, so this does not need to be installed separately. + * The lastest LTS version of Node is now v16. That will currently NOT work. + * If you are using a different version of Node for developmnet on oytehr projects, global install + (the default) may interfere with this. You will need to do a more complex local node install. +* (recommended) Visual Studio 2022 which includes F# 6.0 +* (recommended) install [hyper.js](https://hyper.is/) to have a good command line interface - anything else you like will do. + +### Issie Development + +1. Download & unzip the [Issie repo](https://github.com/tomcl/ISSIE), or if contributing clone it locally, or fork it on github and then clone it locally. Make sure you are contributing to the Issie repo - not the Issie parent repo, if cloning (Github desktop gives you this option when you clone). + +3. Navigate to the project root directory (which contains this README) in a command-line interpreter. For Windows usage make sure if possible for convenience +that you have a _tabbed_ command-line interpreter that can be started direct from file explorer within a specific directory (by right-clicking on the explorer directory view). +That makes things a lot more pleasant. The new [Windows Terminal](https://github.com/microsoft/terminal) works well. + +4. Run `build.cmd` under Windows or `build.sh` under linux or macos. This will download and install all dependencies then launch the application with HMR. + + * HMR: the application will automatically recompile and update while running if you save updated source files + * To initialise and reload: `File -> reload page` + * To exit: after you exit the application the auto-compile script will terminate after about 15s + * To recompile the application `npm run dev` or `npm run devfast` (devfast switches off some debugging to make simulation run a lot faster). + * To generate distributable binaries for dev host system `npm run dist`. + * If you have changed node modules use `build dev`. Note that this project uses npm, not yarn. If npm gets stuck use `build cleannode` and try again. + * From time to time run `build killzombies` to terminate orphan node and dotnet processes which accumulate using this dev chain. (Not sure if this is still needed) + +#### Development on Macos + +In theory the build should work equally well on macos. Practically that is now (10/2021) the case. Having installed the normal prerequisites, and Visual Studio for Mac, which itself has the F# compiler, the one-off setup can be done manually from the various build steps needed: + +* git clone to local project directory as normal (with github desktop or command line git - one off) +* dotnet tool restore (build tools - one off) +* dotnet paket install (install dotnet packages one off) +* npm install (install node packages - one off) +* npm run dev (run the dev envt) + + +One unresolved issue that can occur on Macs is file permission problems. Best practice is for all installation and dev to run under the current (non-admin) user. If any part of the necessary downloaded development files gets written as root then subsequent development commands that modify it will need to be executed using sudo. + +``` +sudo npm run devfast +``` + +If possible, try to avoid this, but if necessary it can be done. Probably the better solution is to investigate properly which install steps introduce these root owner files, change the file ownership back to current user with `chown -R `. Please document any progress made with mac builds (detailing which mac OS) on an issue. + + +## Reinstalling Compiler and Libraries + +To reinstall the build environment (without changing project code) rerun `build.cmd` (Windows) or `build.sh` (Linux and MacOS). You may need first to +run `build killzombies` to remove orphan processes that lock build files. + +## Creating binaries + +`npm run dist` will generate the correct binaries for your system under `/dist`. + +* There is a very rare bug in the code that downloads electron binaries that is sensitive to fast internet access: +going through a VPN makes it go away. It is one-off since the binaries are cached once downloaded. If this hits you +the workaround is to run the build script again using Imperial College VPN. Having downloaded the binaries once +the porblem will go away. + +## TODO + + +* Should Node be upgraded to v14? +* Clean up Paket dependencies + diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md new file mode 100644 index 0000000..5a79631 --- /dev/null +++ b/RELEASE_NOTES.md @@ -0,0 +1,20 @@ +### v0.5.0 - Issie 1st release + +* Change name to Issie - Interative Simulation and Schematic Integrated Editor. +* Mend build system - now HMR works. +* Breaking change - alter size of NOT gates => any old sheet with the NOT gates will crash the software on load. + +### v0.4.0 - DECAD 1st release + +* Major update to build system. +* Upgrade all packages to latest. +* Mend bug in loading of exact wire and bus positions. +* Change name to DECAD. + +### 0.2 - March, 2020 + +* End of FYP Release + +### v0.1-beta + +* User feedback release diff --git a/Tests/CanvasStates.fs b/Tests/CanvasStates.fs new file mode 100644 index 0000000..accabc8 --- /dev/null +++ b/Tests/CanvasStates.fs @@ -0,0 +1,738 @@ +module CanvasStates + +open CommonTypes + +// Guidelines to create states: +// - draw the diagram you want to test in the actual application, then log its +// state state. Use logStateToFSharp.py to transform the log output into +// a (almost) valid FSharp data structure. +// - write it from scratch. Remember: +// --> each component Id must be unique +// --> each connection Id must be unique +// --> each port Id must be unique + +let makeCustomComponent (dep:LoadedComponent) = { + Name = dep.Name + InputLabels = dep.InputLabels + OutputLabels = dep.OutputLabels +} + +/// Just a single input node. No conections. +let state1 : CanvasState = + [ + { + Id = "input-node0"; + Type = Input 1; + Label = "input-node0-label"; + InputPorts = []; + OutputPorts = [{ + Id = "out-port0"; + PortNumber = Some 0; + PortType = PortType.Output; + HostId = "input-node0" + }]; + X = 169; + Y = 175 + H=50; + W=40; + } + ], + [] + +/// State1 loaded as a dependency. +let state1Dependency : LoadedComponent = { + Name = "broken-one-input" + TimeStamp = System.DateTime.MinValue + WaveInfo = None + FilePath = "" + CanvasState = state1 + InputLabels = ["input-node0", 1] + OutputLabels = [] +} + +/// State1 custom component. +let state1CustomComponent : CustomComponentType = + makeCustomComponent state1Dependency + +/// Two unconnected input nodes. No conections. +let state2 : CanvasState = + [ + { H=50; W=40; Id = "input-node0"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "input-node0-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node0"}]; X = 169; Y = 175} + { H=50; W=40; Id = "input-node1"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "input-node1-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node1"}]; X = 169; Y = 175} + ], + [] + +/// Simple circuit with one input connected to one output. +let state3 : CanvasState = + [ + { H=50; W=40; Id = "input-node0"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node0"}]; X = 169; Y = 175} + { H=50; W=40; Id = "output-node0"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output-node0"}]; OutputPorts = []; X = 364; Y = 175} + ], + [ + { Id = "conn0"; Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node0"}; Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node0"}; Vertices = []} + ] + +/// State3 loaded as a dependency. +let state3Dependency : LoadedComponent = { + Name = "input-output" + TimeStamp = System.DateTime.MinValue + WaveInfo = None + FilePath = "" + CanvasState = state3 + InputLabels = ["input-node0-label", 1] + OutputLabels = ["output-node0-label", 1] +} + +/// State3 custom component. +let state3CustomComponent : CustomComponentType = + makeCustomComponent state3Dependency + +/// Simple circuit with one input connected to two outputs. +let state4 : CanvasState = + [ + { H=50; W=40; Id = "input-node0"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node0"}]; X = 169; Y = 175} + { H=50; W=40; Id = "output-node0"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-node0-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output-node0"}]; OutputPorts = []; X = 364; Y = 175} + { H=50; W=40; Id = "output-node1"; Type = Output 1; Label = "output-node1-label"; InputPorts = [{Id = "output-node1-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output-node1"}]; OutputPorts = []; X = 364; Y = 175} + ], + [ + { Id = "conn0"; Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node0"}; Target = {Id = "output-node0-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node0"}; Vertices = []} + { Id = "conn1"; Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node0"}; Target = {Id = "output-node1-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node1"}; Vertices = []} + ] + +/// Two inputs connected to the same output. +let state5 : CanvasState = + [ + { H=50; W=40; Id = "input-node0"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "input-node0-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node0"}]; X = 169; Y = 175} + { H=50; W=40; Id = "input-node1"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "input-node1-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node1"}]; X = 169; Y = 175} + { H=50; W=40; Id = "output-node0"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output-node0"}]; OutputPorts = []; X = 364; Y = 175} + ], + [ + { Id = "conn0"; Source = {Id = "input-node0-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node0"}; Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node0"}; Vertices = []} + { Id = "conn1"; Source = {Id = "input-node1-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node1"}; Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node0"}; Vertices = []} + ] + +/// Two inputs; one And; one output. +let state6 : CanvasState = + [ + { H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440} + { H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492} + { H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459} + { H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469} + ], + [ + {Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []} + {Id = "conn1"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "and-in1"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []} + {Id = "conn2"; Source = {Id = "and-out0"; PortNumber = None; PortType = PortType.Output; HostId = "and"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []} + ] + +/// Two inputs; one And; one output; with extra connection input to output. +let state7 : CanvasState = + [ + { H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440} + { H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492} + { H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459} + { H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469} + ], + [ + {Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []} + {Id = "conn1"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "and-in1"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []} + {Id = "conn2"; Source = {Id = "and-out0"; PortNumber = None; PortType = PortType.Output; HostId = "and"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []} + {Id = "conn3"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []} + ] + +/// Two inputs; one And; one output; with extra connections inputs to and. +let state8 : CanvasState = + [ + { H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440} + { H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492} + { H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459} + { H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469} + ], + [ + {Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []} + {Id = "conn1"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "and-in1"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []} + {Id = "conn2"; Source = {Id = "and-out0"; PortNumber = None; PortType = PortType.Output; HostId = "and"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []} + {Id = "conn3"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in1"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []} + {Id = "conn4"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []} + ] + +/// Mux2 with only two connected ports. +let state9 : CanvasState = + [ + { H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440} + { H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492} + { H=50; W=40; Id = "mux"; Type = Mux2; Label = ""; InputPorts = [{Id = "mux-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "mux"}; {Id = "mux-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "mux"}; {Id = "mux-in2"; PortNumber = Some 2; PortType = PortType.Input; HostId = "mux"};]; OutputPorts = [{Id = "mux-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "mux"}]; X = 428; Y = 459} + { H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469} + ], + [ + {Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "mux-in0"; PortNumber = None; PortType = PortType.Input; HostId = "mux"}; Vertices = []} + {Id = "conn1"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "mux-in1"; PortNumber = None; PortType = PortType.Input; HostId = "mux"}; Vertices = []} + {Id = "conn2"; Source = {Id = "mux-out0"; PortNumber = None; PortType = PortType.Output; HostId = "mux"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []} + ] + +/// Complex diagram with 3 Ands; one input; one output and 2 cycles (yet all +/// ports are connected prpoerly). +let state10 : CanvasState = + [ + { H=50; W=40; Id = "and0"; Type = And; Label = ""; InputPorts = [{Id = "8e8b684e-664f-5758-15c9-79c84c8fc81a"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and0"}; {Id = "d9b40581-2587-506d-1868-8201d3802913"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and0"}]; OutputPorts = [{Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and0"}]; X = 392; Y = 79} + { H=50; W=40; Id = "and1"; Type = And; Label = ""; InputPorts = [{Id = "23f32198-bf52-0456-6be2-1fbe92b36bbf"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and1"}; {Id = "9697ec8d-b6d3-9f2a-aaaf-0907fd087e05"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and1"}]; OutputPorts = [{Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and1"}]; X = 593; Y = 86} + { H=50; W=40; Id = "output"; Type = Output 1; Label = "output"; InputPorts = [{Id = "25886b76-feee-6892-6637-cc2378fe6094"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 770; Y = 187} + { H=50; W=40; Id = "input"; Type = Input 1; Label = "input"; InputPorts = []; OutputPorts = [{Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input"}]; X = 492; Y = 245} + { H=50; W=40; Id = "and2"; Type = And; Label = ""; InputPorts = [{Id = "aefefef8-61ea-a3cf-49f9-11b858342504"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and2"}; {Id = "5c4d25e1-c067-79d3-adc7-7e141f5a7905"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and2"}]; OutputPorts = [{Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and2"}]; X = 268; Y = 261} + ], + [ + {Id = "conn0"; Source = {Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = None; PortType = PortType.Output; HostId = "and1"}; Target = {Id = "25886b76-feee-6892-6637-cc2378fe6094"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []} + {Id = "conn1"; Source = {Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = None; PortType = PortType.Output; HostId = "and1"}; Target = {Id = "5c4d25e1-c067-79d3-adc7-7e141f5a7905"; PortNumber = None; PortType = PortType.Input; HostId = "and2"}; Vertices = []} + {Id = "conn2"; Source = {Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = None; PortType = PortType.Output; HostId = "input"}; Target = {Id = "9697ec8d-b6d3-9f2a-aaaf-0907fd087e05"; PortNumber = None; PortType = PortType.Input; HostId = "and1"}; Vertices = []} + {Id = "conn3"; Source = {Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = None; PortType = PortType.Output; HostId = "and0"}; Target = {Id = "23f32198-bf52-0456-6be2-1fbe92b36bbf"; PortNumber = None; PortType = PortType.Input; HostId = "and1"}; Vertices = []} + {Id = "conn4"; Source = {Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = None; PortType = PortType.Output; HostId = "and0"}; Target = {Id = "aefefef8-61ea-a3cf-49f9-11b858342504"; PortNumber = None; PortType = PortType.Input; HostId = "and2"}; Vertices = []} + {Id = "conn5"; Source = {Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = None; PortType = PortType.Output; HostId = "and2"}; Target = {Id = "8e8b684e-664f-5758-15c9-79c84c8fc81a"; PortNumber = None; PortType = PortType.Input; HostId = "and0"}; Vertices = []} + {Id = "conn6"; Source = {Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = None; PortType = PortType.Output; HostId = "and2"}; Target = {Id = "d9b40581-2587-506d-1868-8201d3802913"; PortNumber = None; PortType = PortType.Input; HostId = "and0"}; Vertices = []} + ] + +/// Complex diagram with 3 Ands; one input; one output and 1 cycles with three +/// components (yet all ports are connected prpoerly). +let state11 : CanvasState = + [ + { H=50; W=40; Id = "and0"; Type = And; Label = ""; InputPorts = [{Id = "8e8b684e-664f-5758-15c9-79c84c8fc81a"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and0"}; {Id = "d9b40581-2587-506d-1868-8201d3802913"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and0"}]; OutputPorts = [{Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and0"}]; X = 392; Y = 79} + { H=50; W=40; Id = "and1"; Type = And; Label = ""; InputPorts = [{Id = "23f32198-bf52-0456-6be2-1fbe92b36bbf"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and1"}; {Id = "9697ec8d-b6d3-9f2a-aaaf-0907fd087e05"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and1"}]; OutputPorts = [{Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and1"}]; X = 593; Y = 86} + { H=50; W=40; Id = "output"; Type = Output 1; Label = "output"; InputPorts = [{Id = "25886b76-feee-6892-6637-cc2378fe6094"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 770; Y = 187} + { H=50; W=40; Id = "input"; Type = Input 1; Label = "input"; InputPorts = []; OutputPorts = [{Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input"}]; X = 492; Y = 245} + { H=50; W=40; Id = "and2"; Type = And; Label = ""; InputPorts = [{Id = "aefefef8-61ea-a3cf-49f9-11b858342504"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and2"}; {Id = "5c4d25e1-c067-79d3-adc7-7e141f5a7905"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and2"}]; OutputPorts = [{Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and2"}]; X = 268; Y = 261} + ], + [ + {Id = "conn0"; Source = {Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = None; PortType = PortType.Output; HostId = "and1"}; Target = {Id = "25886b76-feee-6892-6637-cc2378fe6094"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []} + {Id = "conn1"; Source = {Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = None; PortType = PortType.Output; HostId = "and1"}; Target = {Id = "5c4d25e1-c067-79d3-adc7-7e141f5a7905"; PortNumber = None; PortType = PortType.Input; HostId = "and2"}; Vertices = []} + {Id = "conn2"; Source = {Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = None; PortType = PortType.Output; HostId = "input"}; Target = {Id = "9697ec8d-b6d3-9f2a-aaaf-0907fd087e05"; PortNumber = None; PortType = PortType.Input; HostId = "and1"}; Vertices = []} + {Id = "conn3"; Source = {Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = None; PortType = PortType.Output; HostId = "and0"}; Target = {Id = "23f32198-bf52-0456-6be2-1fbe92b36bbf"; PortNumber = None; PortType = PortType.Input; HostId = "and1"}; Vertices = []} + {Id = "conn4"; Source = {Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = None; PortType = PortType.Output; HostId = "and1"}; Target = {Id = "aefefef8-61ea-a3cf-49f9-11b858342504"; PortNumber = None; PortType = PortType.Input; HostId = "and2"}; Vertices = []} + {Id = "conn5"; Source = {Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = None; PortType = PortType.Output; HostId = "and2"}; Target = {Id = "8e8b684e-664f-5758-15c9-79c84c8fc81a"; PortNumber = None; PortType = PortType.Input; HostId = "and0"}; Vertices = []} + {Id = "conn6"; Source = {Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = None; PortType = PortType.Output; HostId = "and2"}; Target = {Id = "d9b40581-2587-506d-1868-8201d3802913"; PortNumber = None; PortType = PortType.Input; HostId = "and0"}; Vertices = []} + ] + +/// Complex diagram with 3 Ands; one input; one output and no cycles. +let state12 : CanvasState = + [ + { H=50; W=40; Id = "and0"; Type = And; Label = ""; InputPorts = [{Id = "8e8b684e-664f-5758-15c9-79c84c8fc81a"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and0"}; {Id = "d9b40581-2587-506d-1868-8201d3802913"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and0"}]; OutputPorts = [{Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and0"}]; X = 392; Y = 79} + { H=50; W=40; Id = "and1"; Type = And; Label = ""; InputPorts = [{Id = "23f32198-bf52-0456-6be2-1fbe92b36bbf"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and1"}; {Id = "9697ec8d-b6d3-9f2a-aaaf-0907fd087e05"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and1"}]; OutputPorts = [{Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and1"}]; X = 593; Y = 86} + { H=50; W=40; Id = "output"; Type = Output 1; Label = "output"; InputPorts = [{Id = "25886b76-feee-6892-6637-cc2378fe6094"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 770; Y = 187} + { H=50; W=40; Id = "input"; Type = Input 1; Label = "input"; InputPorts = []; OutputPorts = [{Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input"}]; X = 492; Y = 245} + { H=50; W=40; Id = "and2"; Type = And; Label = ""; InputPorts = [{Id = "aefefef8-61ea-a3cf-49f9-11b858342504"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and2"}; {Id = "5c4d25e1-c067-79d3-adc7-7e141f5a7905"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and2"}]; OutputPorts = [{Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and2"}]; X = 268; Y = 261} + ], + [ + {Id = "conn0"; Source = {Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = None; PortType = PortType.Output; HostId = "and1"}; Target = {Id = "25886b76-feee-6892-6637-cc2378fe6094"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []} + {Id = "conn1"; Source = {Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = None; PortType = PortType.Output; HostId = "input"}; Target = {Id = "5c4d25e1-c067-79d3-adc7-7e141f5a7905"; PortNumber = None; PortType = PortType.Input; HostId = "and2"}; Vertices = []} + {Id = "conn2"; Source = {Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = None; PortType = PortType.Output; HostId = "input"}; Target = {Id = "9697ec8d-b6d3-9f2a-aaaf-0907fd087e05"; PortNumber = None; PortType = PortType.Input; HostId = "and1"}; Vertices = []} + {Id = "conn3"; Source = {Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = None; PortType = PortType.Output; HostId = "and0"}; Target = {Id = "23f32198-bf52-0456-6be2-1fbe92b36bbf"; PortNumber = None; PortType = PortType.Input; HostId = "and1"}; Vertices = []} + {Id = "conn4"; Source = {Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = None; PortType = PortType.Output; HostId = "input"}; Target = {Id = "aefefef8-61ea-a3cf-49f9-11b858342504"; PortNumber = None; PortType = PortType.Input; HostId = "and2"}; Vertices = []} + {Id = "conn5"; Source = {Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = None; PortType = PortType.Output; HostId = "and2"}; Target = {Id = "8e8b684e-664f-5758-15c9-79c84c8fc81a"; PortNumber = None; PortType = PortType.Input; HostId = "and0"}; Vertices = []} + {Id = "conn6"; Source = {Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = None; PortType = PortType.Output; HostId = "and2"}; Target = {Id = "d9b40581-2587-506d-1868-8201d3802913"; PortNumber = None; PortType = PortType.Input; HostId = "and0"}; Vertices = []} + ] + +/// One bit adder. +let state13 : CanvasState = + [ + { H=50; W=40; Id="2953603d-44e4-5c1f-3fb1-698f7863b6b5";Type=Input 1;Label="A";InputPorts=[];OutputPorts=[{Id="336aab97-a7bd-9a37-9062-56753b57c268";PortNumber= Some 0;PortType=PortType.Output;HostId="2953603d-44e4-5c1f-3fb1-698f7863b6b5"}];X=97;Y=111} + { H=50; W=40; Id="170e69f4-b3d7-d9e0-9f1d-6a564ba62062";Type=Input 1;Label="B";InputPorts=[];OutputPorts=[{Id="1ee439f3-8d23-c049-ff9e-cd8f1b4d3d9d";PortNumber= Some 0;PortType=PortType.Output;HostId="170e69f4-b3d7-d9e0-9f1d-6a564ba62062"}];X=54;Y=203} + { H=50; W=40; Id="253e21f0-b062-4858-c315-5a5315cadf45";Type=And;Label="";InputPorts=[{Id="1b2c73d1-b38e-64e6-5b19-e4e7f690a692";PortNumber= Some 0;PortType=PortType.Input;HostId="253e21f0-b062-4858-c315-5a5315cadf45"}; {Id="9fdb22f6-f8eb-829f-68b3-87b9c8577299";PortNumber= Some 1;PortType=PortType.Input;HostId="253e21f0-b062-4858-c315-5a5315cadf45"}];OutputPorts=[{Id="95a03834-e494-92b2-b8d4-a148e3c0763b";PortNumber= Some 0;PortType=PortType.Output;HostId="253e21f0-b062-4858-c315-5a5315cadf45"}];X=498;Y=208} + { H=50; W=40; Id="6b7bac71-eec5-4979-834a-c1bfe40d77b9";Type=Xor;Label="";InputPorts=[{Id="6a468f2c-4db4-d3ae-402f-a617885884e7";PortNumber= Some 0;PortType=PortType.Input;HostId="6b7bac71-eec5-4979-834a-c1bfe40d77b9"}; {Id="9826a9b5-cd62-51ec-6368-93c4967745f9";PortNumber= Some 1;PortType=PortType.Input;HostId="6b7bac71-eec5-4979-834a-c1bfe40d77b9"}];OutputPorts=[{Id="7cb01ee2-49d4-00b5-7523-14e4de3c5489";PortNumber= Some 0;PortType=PortType.Output;HostId="6b7bac71-eec5-4979-834a-c1bfe40d77b9"}];X=501;Y=108} + { H=50; W=40; Id="9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9";Type=Output 1;Label="Sum";InputPorts=[{Id="14b23a60-21ae-374f-d083-41aa2510eeab";PortNumber= Some 0;PortType=PortType.Input;HostId="9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9"}];OutputPorts=[];X=691;Y=122} + { H=50; W=40; Id="94da6dd7-a263-a3ec-ec76-bfa07b0b0f34";Type=Output 1;Label="Carry";InputPorts=[{Id="b9d457f7-dcef-89a1-aa76-b9ba7f9ca3f4";PortNumber= Some 0;PortType=PortType.Input;HostId="94da6dd7-a263-a3ec-ec76-bfa07b0b0f34"}];OutputPorts=[];X=692;Y=223} + ], + [ + {Id="79df6e40-7ad2-b1d2-cb98-ea5d649ef1cc";Source={Id="7cb01ee2-49d4-00b5-7523-14e4de3c5489";PortNumber=None;PortType=PortType.Output;HostId="6b7bac71-eec5-4979-834a-c1bfe40d77b9"};Target={Id="14b23a60-21ae-374f-d083-41aa2510eeab";PortNumber=None;PortType=PortType.Input;HostId="9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9"}; Vertices = []} + {Id="6b066c26-750b-6eb3-2516-bc122899f846";Source={Id="1ee439f3-8d23-c049-ff9e-cd8f1b4d3d9d";PortNumber=None;PortType=PortType.Output;HostId="170e69f4-b3d7-d9e0-9f1d-6a564ba62062"};Target={Id="9fdb22f6-f8eb-829f-68b3-87b9c8577299";PortNumber=None;PortType=PortType.Input;HostId="253e21f0-b062-4858-c315-5a5315cadf45"}; Vertices = []} + {Id="5f7c6896-8fbd-bfaf-ee0f-a677f7804283";Source={Id="1ee439f3-8d23-c049-ff9e-cd8f1b4d3d9d";PortNumber=None;PortType=PortType.Output;HostId="170e69f4-b3d7-d9e0-9f1d-6a564ba62062"};Target={Id="9826a9b5-cd62-51ec-6368-93c4967745f9";PortNumber=None;PortType=PortType.Input;HostId="6b7bac71-eec5-4979-834a-c1bfe40d77b9"}; Vertices = []} + {Id="8ed22d89-b542-a182-fef9-1a67170da60e";Source={Id="336aab97-a7bd-9a37-9062-56753b57c268";PortNumber=None;PortType=PortType.Output;HostId="2953603d-44e4-5c1f-3fb1-698f7863b6b5"};Target={Id="1b2c73d1-b38e-64e6-5b19-e4e7f690a692";PortNumber=None;PortType=PortType.Input;HostId="253e21f0-b062-4858-c315-5a5315cadf45"}; Vertices = []} + {Id="0cd3f109-22ee-3543-7247-db2b4ffe5fc8";Source={Id="336aab97-a7bd-9a37-9062-56753b57c268";PortNumber=None;PortType=PortType.Output;HostId="2953603d-44e4-5c1f-3fb1-698f7863b6b5"};Target={Id="6a468f2c-4db4-d3ae-402f-a617885884e7";PortNumber=None;PortType=PortType.Input;HostId="6b7bac71-eec5-4979-834a-c1bfe40d77b9"}; Vertices = []} + {Id="3230b338-cdd4-7632-e441-9d2f50df013a";Source={Id="95a03834-e494-92b2-b8d4-a148e3c0763b";PortNumber=None;PortType=PortType.Output;HostId="253e21f0-b062-4858-c315-5a5315cadf45"};Target={Id="b9d457f7-dcef-89a1-aa76-b9ba7f9ca3f4";PortNumber=None;PortType=PortType.Input;HostId="94da6dd7-a263-a3ec-ec76-bfa07b0b0f34"}; Vertices = []} + ] + +/// Similar to state4, but output nodes have the same label. +let state14 : CanvasState = + [ + { H=50; W=40; Id = "input-node0"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node0"}]; X = 169; Y = 175} + { H=50; W=40; Id = "output-node0"; Type = Output 1; Label = "output-duplicate-label"; InputPorts = [{Id = "output-node0-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output-node0"}]; OutputPorts = []; X = 364; Y = 175} + { H=50; W=40; Id = "output-node1"; Type = Output 1; Label = "output-duplicate-label"; InputPorts = [{Id = "output-node1-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output-node1"}]; OutputPorts = []; X = 364; Y = 175} + ], + [ + {Id = "conn0"; Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node0"}; Target = {Id = "output-node0-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node0"}; Vertices = []} + {Id = "conn1"; Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node0"}; Target = {Id = "output-node1-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node1"}; Vertices = []} + ] + +/// Similar to state6, but input nodes have the same label. +let state15 : CanvasState = + [ + { H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-duplicate-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440} + { H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-duplicate-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492} + { H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459} + { H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469} + ], + [ + {Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []} + {Id = "conn1"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "and-in1"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []} + {Id = "conn2"; Source = {Id = "and-out0"; PortNumber = None; PortType = PortType.Output; HostId = "and"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []} + ] + +/// One input and one output, connected to the state3CustomComponent. +let state16 : CanvasState = + [ + { H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "outer-input-node0-label"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175} + { H=50; W=40; Id = "outer-output-node0"; Type = Output 1; Label = "outer-output-node0-label"; InputPorts = [{Id = "outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175} + { + H=50; W=40; Id = "inp-out-component"; Type = Custom state3CustomComponent; Label = "inp-out-component-label"; + InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "inp-out-component"}]; + OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "inp-out-component"}]; + X = 169; Y = 175 + } + ], + [ + { + Id = "conn0"; + Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"}; + Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "inp-out-component"}; + Vertices = [] + } + { + Id = "conn1"; + Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "inp-out-component"}; + Target = {Id = "outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-output-node0"}; + Vertices = [] + } + ] + +/// State16 loaded as a dependency. +let state16Dependency : LoadedComponent = { + Name = "nested-input-output" + TimeStamp = System.DateTime.MinValue + WaveInfo = None + FilePath = "" + CanvasState = state16 + InputLabels = ["outer-input-node0-label", 1] + OutputLabels = ["outer-output-node0-label", 1] +} + +/// State16 custom component. +let state16CustomComponent : CustomComponentType = + makeCustomComponent state16Dependency + +/// One input and one output, connected to the state16CustomComponent, which +/// contains the state3CustomComponent. +let state17 : CanvasState = + [ + { H=50; W=40; Id = "outer-outer-input-node0"; Type = Input 1; Label = "outer-outer-input-node0-label"; InputPorts = []; OutputPorts = [{Id = "outer-outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-outer-input-node0"}]; X = 169; Y = 175} + { H=50; W=40; Id = "outer-outer-output-node0"; Type = Output 1; Label = "outer-outer-output-node0-label"; InputPorts = [{Id = "outer-outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175} + { + H=50; W=40; Id = "wrapped-inp-out-component"; Type = Custom state3CustomComponent; Label = "wrapped-inp-out-component-label"; + InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "wrapped-inp-out-component"}]; + OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "wrapped-inp-out-component"}]; + X = 169; Y = 175 + } + ], + [ + { + Id = "conn0"; + Source = {Id = "outer-outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-outer-input-node0"}; + Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "wrapped-inp-out-component"}; + Vertices = [] + } + { + Id = "conn1"; + Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "wrapped-inp-out-component"}; + Target = {Id = "outer-outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-outer-output-node0"}; + Vertices = [] + } + ] + +/// State17 loaded as a dependency. +let state17Dependency : LoadedComponent = { + Name = "doubly-nested-input-output" + TimeStamp = System.DateTime.MinValue + WaveInfo = None + FilePath = "" + CanvasState = state17 + InputLabels = ["outer-outer-input-node0-label", 1] + OutputLabels = ["outer-outer-output-node0-label", 1] +} + +/// State17 custom component. +let state17CustomComponent : CustomComponentType = + makeCustomComponent state17Dependency + +/// One input and one output, connected to the state17CustomComponent, which +/// contains state16CustomComponent, which contains the state3CustomComponent. +let state18 : CanvasState = + [ + { H=50; W=40; Id = "outer-outer-outer-input-node0"; Type = Input 1; Label = "outer-outer-outer-input-node0-label"; InputPorts = []; OutputPorts = [{Id = "outer-outer-outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-outer-outer-input-node0"}]; X = 169; Y = 175} + { H=50; W=40; Id = "outer-outer-outer-output-node0"; Type = Output 1; Label = "outer-outer-outer-output-node0-label"; InputPorts = [{Id = "outer-outer-outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-outer-outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175} + { + H=50; W=40; Id = "doubly-wrapped-inp-out-component"; Type = Custom state3CustomComponent; Label = "doubly-wrapped-inp-out-component-label"; + InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "doubly-wrapped-inp-out-component"}]; + OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "doubly-wrapped-inp-out-component"}]; + X = 169; Y = 175 + } + ], + [ + { + Id = "conn0"; + Source = {Id = "outer-outer-outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-outer-outer-input-node0"}; + Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "doubly-wrapped-inp-out-component"}; + Vertices = [] + } + { + Id = "conn1"; + Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "doubly-wrapped-inp-out-component"}; + Target = {Id = "outer-outer-outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-outer-outer-output-node0"}; + Vertices = [] + } + ] + +/// One input connected to a broken dependency. +let state19 : CanvasState = + [ + { H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "outer-input-node0-label"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175} + { H=50; W=40; Id = "broken-input"; Type = Custom state1CustomComponent; Label = "broken-input-label"; InputPorts = [{Id = "broken-input-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "broken-input"}]; OutputPorts = []; X = 169; Y = 175} + ], + [ + { + Id = "conn0" + Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"} + Target = {Id = "broken-input-port0"; PortNumber = None; PortType = PortType.Input; HostId = "broken-input"} + Vertices = [] + } + ] + +/// Similar to state16, but uses state16CustomComponent instead of +/// state3CustomComponent to create a cycle. +let state20 : CanvasState = + [ + { H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "outer-input-node0-label"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175} + { H=50; W=40; Id = "outer-output-node0"; Type = Output 1; Label = "outer-output-node0-label"; InputPorts = [{Id = "outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175} + { + H=50; W=40; Id = "inp-out-component"; Type = Custom state16CustomComponent; Label = "inp-out-component-label"; + InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "inp-out-component"}]; + OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "inp-out-component"}]; + X = 169; Y = 175 + } + ], + [ + { + Id = "conn0"; + Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"}; + Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "inp-out-component"}; + Vertices = [] + } + { + Id = "conn1"; + Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "inp-out-component"}; + Target = {Id = "outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-output-node0"}; + Vertices = [] + } + ] + +// Test a long dependecy cycle. +// state21 --> state22 --> state23 --> state21 + +let state21CustomComponent : CustomComponentType = { + Name = "21-custom-component" + InputLabels = ["21-inp", 1] + OutputLabels = ["21-out", 1] +} + +let state22CustomComponent : CustomComponentType = { + Name = "22-custom-component" + InputLabels = ["22-inp", 1] + OutputLabels = ["22-out", 1] +} + +let state23CustomComponent : CustomComponentType = { + Name = "23-custom-component" + InputLabels = ["23-inp", 1] + OutputLabels = ["23-out", 1] +} + +/// Simple input-output component that uses state22. +let state21 : CanvasState = + [ + { H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "21-inp"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175} + { H=50; W=40; Id = "outer-output-node0"; Type = Output 1; Label = "21-out"; InputPorts = [{Id = "outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175} + { + H=50; W=40; Id = "inp-out-component"; Type = Custom state22CustomComponent; Label = "inp-out-component-label"; + InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "inp-out-component"}]; + OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "inp-out-component"}]; + X = 169; Y = 175 + } + ], + [ + { + Id = "conn0"; + Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"}; + Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "inp-out-component"}; + Vertices = [] + } + { + Id = "conn1"; + Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "inp-out-component"}; + Target = {Id = "outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-output-node0"}; + Vertices = [] + } + ] + +/// Simple input-output component that uses state23. +let state22 : CanvasState = + [ + { H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "22-inp"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175} + { H=50; W=40; Id = "outer-output-node0"; Type = Output 1; Label = "22-out"; InputPorts = [{Id = "outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175} + { + H=50; W=40; Id = "inp-out-component"; Type = Custom state23CustomComponent; Label = "inp-out-component-label"; + InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "inp-out-component"}]; + OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "inp-out-component"}]; + X = 169; Y = 175 + } + ], + [ + { + Id = "conn0"; + Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"}; + Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "inp-out-component"}; + Vertices = [] + } + { + Id = "conn1"; + Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "inp-out-component"}; + Target = {Id = "outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-output-node0"}; + Vertices = [] + } + ] + +/// Simple input-output component that uses state21. +let state23 : CanvasState = + [ + { H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "23-inp"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175} + { H=50; W=40; Id = "outer-output-node0"; Type = Output 1; Label = "23-out"; InputPorts = [{Id = "outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175} + { + H=50; W=40; Id = "inp-out-component"; Type = Custom state21CustomComponent; Label = "inp-out-component-label"; + InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "inp-out-component"}]; + OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "inp-out-component"}]; + X = 169; Y = 175 + } + ], + [ + { + Id = "conn0"; + Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"}; + Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "inp-out-component"}; + Vertices = [] + } + { + Id = "conn1"; + Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "inp-out-component"}; + Target = {Id = "outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-output-node0"}; + Vertices = [] + } + ] + +let state21Dependency : LoadedComponent = { + Name = "21-custom-component" + TimeStamp = System.DateTime.MinValue + WaveInfo = None + FilePath = "" + CanvasState = state21 + InputLabels = ["21-inp", 1] + OutputLabels = ["21-out", 1] +} + +let state22Dependency : LoadedComponent = { + Name = "22-custom-component" + TimeStamp = System.DateTime.MinValue + WaveInfo = None + FilePath = "" + CanvasState = state22 + InputLabels = ["22-inp", 1] + OutputLabels = ["22-out", 1] +} + +let state23Dependency : LoadedComponent = { + Name = "23-custom-component" + TimeStamp = System.DateTime.MinValue + WaveInfo = None + FilePath = "" + CanvasState = state23 + InputLabels = ["23-inp", 1] + OutputLabels = ["23-out", 1] +} + +/// Simple input-output component that uses state23. +let state24 : CanvasState = + [ + { H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "24-inp"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175} + { H=50; W=40; Id = "outer-output-node0"; Type = Output 1; Label = "24-out"; InputPorts = [{Id = "outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175} + { + H=50; W=40; Id = "inp-out-component"; Type = Custom state23CustomComponent; Label = "inp-out-component-label"; + InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "inp-out-component"}]; + OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "inp-out-component"}]; + X = 169; Y = 175 + } + ], + [ + { + Id = "conn0"; + Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"}; + Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "inp-out-component"}; + Vertices = [] + } + { + Id = "conn1"; + Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "inp-out-component"}; + Target = {Id = "outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-output-node0"}; + Vertices = [] + } + ] + +/// Similar to state6, but with a missing connection from bottom input to and. +let state25 : CanvasState = + [ + {H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440} + {H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492} + {H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459} + {H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469} + ], + [ + {Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []} + {Id = "conn2"; Source = {Id = "and-out0"; PortNumber = None; PortType = PortType.Output; HostId = "and"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []} + ] + +/// Similar to state6, but with a missing connection from and to output. +let state26 : CanvasState = + [ + {H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440} + {H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492} + {H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459} + {H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469} + ], + [ + {Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []} + {Id = "conn1"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "and-in1"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []} + ] + +/// Similar to state6, but with both inputs unconnected. +let state27 : CanvasState = + [ + {H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440} + {H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492} + {H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459} + {H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469} + ], + [ + {Id = "conn2"; Source = {Id = "and-out0"; PortNumber = None; PortType = PortType.Output; HostId = "and"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []} + ] + +// Half adder. + +let halfAdderState : CanvasState = + [ + { H=50; W=40; Id = "50151b16-a5e1-76ca-93d2-c4446a6a6c60"; Type = Input 1; Label = "B"; InputPorts = []; OutputPorts = [{Id = "0ca8918f-28b0-0892-4335-3a375c35ef15"; PortNumber = Some 0; PortType = PortType.Output; HostId = "50151b16-a5e1-76ca-93d2-c4446a6a6c60"}]; X = 100; Y = 195} + { H=50; W=40; Id = "36c5c713-b731-21d0-c2f9-9e9bf4c79048"; Type = Input 1; Label = "A"; InputPorts = []; OutputPorts = [{Id = "23fcb523-bd9d-0ca1-cb84-6a37779f2dce"; PortNumber = Some 0; PortType = PortType.Output; HostId = "36c5c713-b731-21d0-c2f9-9e9bf4c79048"}]; X = 100; Y = 100} + { H=50; W=40; Id = "7227d00f-d329-af58-b769-0bf42ee6f2ef"; Type = And; Label = ""; InputPorts = [{Id = "49c3e9ab-4ad5-0c6c-cda9-987a820ad1c5"; PortNumber = Some 0; PortType = PortType.Input; HostId = "7227d00f-d329-af58-b769-0bf42ee6f2ef"}; {Id = "7d121026-401b-72e5-2051-3497b65d99b3"; PortNumber = Some 1; PortType = PortType.Input; HostId = "7227d00f-d329-af58-b769-0bf42ee6f2ef"}]; OutputPorts = [{Id = "45d7d345-38f8-0933-a86c-16159674e4a0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "7227d00f-d329-af58-b769-0bf42ee6f2ef"}]; X = 267; Y = 179} + { H=50; W=40; Id = "5ea2bff6-ee86-e729-5c14-a52b302af517"; Type = Xor; Label = ""; InputPorts = [{Id = "1e8be0a9-1c87-e877-3e7b-a6335f5ddad4"; PortNumber = Some 0; PortType = PortType.Input; HostId = "5ea2bff6-ee86-e729-5c14-a52b302af517"}; {Id = "77dfc4b4-6616-6768-7c35-8c3c1c26acbd"; PortNumber = Some 1; PortType = PortType.Input; HostId = "5ea2bff6-ee86-e729-5c14-a52b302af517"}]; OutputPorts = [{Id = "27537cac-d2b0-dd3d-e0ee-a6f27d2e793e"; PortNumber = Some 0; PortType = PortType.Output; HostId = "5ea2bff6-ee86-e729-5c14-a52b302af517"}]; X = 267; Y = 97} + { H=50; W=40; Id = "0be5c1d8-c5a8-5fad-6e4b-e74e873ce728"; Type = Output 1; Label = "Sum"; InputPorts = [{Id = "26723054-cb13-f8b2-3a5d-ae8224d532e1"; PortNumber = Some 0; PortType = PortType.Input; HostId = "0be5c1d8-c5a8-5fad-6e4b-e74e873ce728"}]; OutputPorts = []; X = 420; Y = 107} + { H=50; W=40; Id = "56dd9000-1a54-8040-3e90-33e44ce390b9"; Type = Output 1; Label = "Cout"; InputPorts = [{Id = "617c8ca8-d4b3-182f-b8d1-ce7f4b6a5359"; PortNumber = Some 0; PortType = PortType.Input; HostId = "56dd9000-1a54-8040-3e90-33e44ce390b9"}]; OutputPorts = []; X = 420; Y = 189} + ], + [ + {Id = "5751a3dc-26e0-2df2-d797-af37b357f7bd"; Source = {Id = "27537cac-d2b0-dd3d-e0ee-a6f27d2e793e"; PortNumber = None; PortType = PortType.Output; HostId = "5ea2bff6-ee86-e729-5c14-a52b302af517"}; Target = {Id = "26723054-cb13-f8b2-3a5d-ae8224d532e1"; PortNumber = None; PortType = PortType.Input; HostId = "0be5c1d8-c5a8-5fad-6e4b-e74e873ce728"}; Vertices = [307.0,117.0; 420.0,117.0]} + {Id = "4d823d53-2991-68a4-a72b-7c3aec1e6b75"; Source = {Id = "0ca8918f-28b0-0892-4335-3a375c35ef15"; PortNumber = None; PortType = PortType.Output; HostId = "50151b16-a5e1-76ca-93d2-c4446a6a6c60"}; Target = {Id = "7d121026-401b-72e5-2051-3497b65d99b3"; PortNumber = None; PortType = PortType.Input; HostId = "7227d00f-d329-af58-b769-0bf42ee6f2ef"}; Vertices = [130.0,205.0; 198.5,205.0; 198.5,205.66666666666666; 267.0,205.66666666666666]} + {Id = "3491b238-ea58-d04a-8d55-78b630507094"; Source = {Id = "23fcb523-bd9d-0ca1-cb84-6a37779f2dce"; PortNumber = None; PortType = PortType.Output; HostId = "36c5c713-b731-21d0-c2f9-9e9bf4c79048"}; Target = {Id = "49c3e9ab-4ad5-0c6c-cda9-987a820ad1c5"; PortNumber = None; PortType = PortType.Input; HostId = "7227d00f-d329-af58-b769-0bf42ee6f2ef"}; Vertices = [130.0,110.0; 170.5,110.0; 170.5,192.33333333333334; 267.0,192.33333333333334]} + {Id = "9c7f868c-0411-eeaf-eefe-9923ae6a66bd"; Source = {Id = "23fcb523-bd9d-0ca1-cb84-6a37779f2dce"; PortNumber = None; PortType = PortType.Output; HostId = "36c5c713-b731-21d0-c2f9-9e9bf4c79048"}; Target = {Id = "1e8be0a9-1c87-e877-3e7b-a6335f5ddad4"; PortNumber = None; PortType = PortType.Input; HostId = "5ea2bff6-ee86-e729-5c14-a52b302af517"}; Vertices = [130.0,110.0; 198.5,110.0; 198.5,110.33333333333333; 267.0,110.33333333333333]} + {Id = "c5c8d60b-712d-b182-aaf1-b902c1eb4b7b"; Source = {Id = "0ca8918f-28b0-0892-4335-3a375c35ef15"; PortNumber = None; PortType = PortType.Output; HostId = "50151b16-a5e1-76ca-93d2-c4446a6a6c60"}; Target = {Id = "77dfc4b4-6616-6768-7c35-8c3c1c26acbd"; PortNumber = None; PortType = PortType.Input; HostId = "5ea2bff6-ee86-e729-5c14-a52b302af517"}; Vertices = [130.0,205.0; 198.5,205.0; 198.5,123.66666666666667; 267.0,123.66666666666667]} + {Id = "712471ca-270a-0410-a9e5-a7894a6c2df4"; Source = {Id = "45d7d345-38f8-0933-a86c-16159674e4a0"; PortNumber = None; PortType = PortType.Output; HostId = "7227d00f-d329-af58-b769-0bf42ee6f2ef"}; Target = {Id = "617c8ca8-d4b3-182f-b8d1-ce7f4b6a5359"; PortNumber = None; PortType = PortType.Input; HostId = "56dd9000-1a54-8040-3e90-33e44ce390b9"}; Vertices = [307.0,199.0; 420.0,199.0]} + ] + +let halfAdderDependency : LoadedComponent = { + Name = "half-adder" + TimeStamp = System.DateTime.MinValue + WaveInfo = None + FilePath = "" + CanvasState = halfAdderState + InputLabels = ["A", 1; "B", 1] + OutputLabels = ["Cout", 1; "Sum", 1] +} + +let halfAdderCustom : CustomComponentType = + makeCustomComponent halfAdderDependency + +// Full adder: uses half adder. + +let fullAdderState : CanvasState = + [ + { H=50; W=40; Id = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"; Type = Custom {Name = "half-adder"; InputLabels = ["A", 1; "B", 1]; OutputLabels = ["Cout", 1; "Sum", 1]}; Label = "half-adder"; InputPorts = [{Id = "bab6da29-c4fe-adae-c94b-ada53dc9b948"; PortNumber = Some 0; PortType = PortType.Input; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}; {Id = "6ff179d8-a703-eed2-c948-a214c0aff3a9"; PortNumber = Some 1; PortType = PortType.Input; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}]; OutputPorts = [{Id = "0b68efeb-91be-da25-c7c5-dfa1b76b105b"; PortNumber = Some 0; PortType = PortType.Output; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}; {Id = "60b550b8-37d9-a0b8-c55c-cfc0044ef147"; PortNumber = Some 1; PortType = PortType.Output; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}]; X = 187; Y = 200} + { H=50; W=40; Id = "2c610c78-72b7-2816-fec5-a53d2fa54742"; Type = Input 1; Label = "A"; InputPorts = []; OutputPorts = [{Id = "51e83d48-e73b-0961-3ebe-f488e7f89326"; PortNumber = Some 0; PortType = PortType.Output; HostId = "2c610c78-72b7-2816-fec5-a53d2fa54742"}]; X = 95; Y = 171} + { H=50; W=40; Id = "7e461ed2-53f6-c225-e184-91d24532ef33"; Type = Input 1; Label = "B"; InputPorts = []; OutputPorts = [{Id = "1eaa9bb4-0fa1-4fb3-0792-fe36b5d94886"; PortNumber = Some 0; PortType = PortType.Output; HostId = "7e461ed2-53f6-c225-e184-91d24532ef33"}]; X = 95; Y = 265} + { H=50; W=40; Id = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"; Type = Custom {Name = "half-adder"; InputLabels = ["A", 1; "B", 1]; OutputLabels = ["Cout", 1; "Sum", 1]}; Label = "half-adder"; InputPorts = [{Id = "15575f10-2ec6-6033-cd3a-3ddabda8dbf3"; PortNumber = Some 0; PortType = PortType.Input; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}; {Id = "7cdb3ebb-cfa1-6892-9d35-de8f15cb87ac"; PortNumber = Some 1; PortType = PortType.Input; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}]; OutputPorts = [{Id = "093b66de-366d-40fc-a3b5-2c2d396d7fb5"; PortNumber = Some 0; PortType = PortType.Output; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}; {Id = "8cbfb956-5d53-aa0f-2546-ff32426901d1"; PortNumber = Some 1; PortType = PortType.Output; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}]; X = 323; Y = 108} + { H=50; W=40; Id = "eddfd0f6-f06d-5190-3af9-540371a13391"; Type = Input 1; Label = "Cin"; InputPorts = []; OutputPorts = [{Id = "042a92cb-f8d7-3cca-7519-a0bae85fdb6b"; PortNumber = Some 0; PortType = PortType.Output; HostId = "eddfd0f6-f06d-5190-3af9-540371a13391"}]; X = 100; Y = 70} + { H=50; W=40; Id = "d8087733-5924-4af4-e67a-2c9630173608"; Type = Or; Label = ""; InputPorts = [{Id = "f812e552-daab-73d0-cfa0-de0190279c8d"; PortNumber = Some 0; PortType = PortType.Input; HostId = "d8087733-5924-4af4-e67a-2c9630173608"}; {Id = "d25307aa-412f-d108-0f70-335b4e331f52"; PortNumber = Some 1; PortType = PortType.Input; HostId = "d8087733-5924-4af4-e67a-2c9630173608"}]; OutputPorts = [{Id = "93f988ff-3b92-1904-2dcb-17ec5e88178f"; PortNumber = Some 0; PortType = PortType.Output; HostId = "d8087733-5924-4af4-e67a-2c9630173608"}]; X = 481; Y = 196} + { H=50; W=40; Id = "9bf01350-53a9-bb16-1f02-0df29cb60b0f"; Type = Output 1; Label = "Cout"; InputPorts = [{Id = "17f9e9e2-3040-65ba-9578-b4ea6a8f8b28"; PortNumber = Some 0; PortType = PortType.Input; HostId = "9bf01350-53a9-bb16-1f02-0df29cb60b0f"}]; OutputPorts = []; X = 567; Y = 206} + { H=50; W=40; Id = "434a7ce9-942f-0939-94eb-8dd7162ad916"; Type = Output 1; Label = "Sum"; InputPorts = [{Id = "f7ed4610-faf3-e0cb-d985-86f6da5fa148"; PortNumber = Some 0; PortType = PortType.Input; HostId = "434a7ce9-942f-0939-94eb-8dd7162ad916"}]; OutputPorts = []; X = 567; Y = 138} + ], + [ + {Id = "67479e2e-468f-ebe6-7fa8-fe4e7e25efac"; Source = {Id = "51e83d48-e73b-0961-3ebe-f488e7f89326"; PortNumber = None; PortType = PortType.Output; HostId = "2c610c78-72b7-2816-fec5-a53d2fa54742"}; Target = {Id = "bab6da29-c4fe-adae-c94b-ada53dc9b948"; PortNumber = None; PortType = PortType.Input; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}; Vertices = [125.0,181.0; 156.0,181.0; 156.0,220.0; 187.0,220.0]} + {Id = "b658d7c4-7b6a-4c9d-7cbc-19f6b25d3631"; Source = {Id = "1eaa9bb4-0fa1-4fb3-0792-fe36b5d94886"; PortNumber = None; PortType = PortType.Output; HostId = "7e461ed2-53f6-c225-e184-91d24532ef33"}; Target = {Id = "6ff179d8-a703-eed2-c948-a214c0aff3a9"; PortNumber = None; PortType = PortType.Input; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}; Vertices = [125.0,275.0; 156.0,275.0; 156.0,240.0; 187.0,240.0]} + {Id = "c7cf8ab2-7521-b09c-e4f8-4d09f0913d4f"; Source = {Id = "0b68efeb-91be-da25-c7c5-dfa1b76b105b"; PortNumber = None; PortType = PortType.Output; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}; Target = {Id = "d25307aa-412f-d108-0f70-335b4e331f52"; PortNumber = None; PortType = PortType.Input; HostId = "d8087733-5924-4af4-e67a-2c9630173608"}; Vertices = [247.0,220.0; 364.0,220.0; 364.0,222.66666666666666; 481.0,222.66666666666666]} + {Id = "3330546c-fe28-33c1-5f7a-fb71ba73249b"; Source = {Id = "093b66de-366d-40fc-a3b5-2c2d396d7fb5"; PortNumber = None; PortType = PortType.Output; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}; Target = {Id = "f812e552-daab-73d0-cfa0-de0190279c8d"; PortNumber = None; PortType = PortType.Input; HostId = "d8087733-5924-4af4-e67a-2c9630173608"}; Vertices = [383.0,128.0; 432.0,128.0; 432.0,209.33333333333334; 481.0,209.33333333333334]} + {Id = "18bf5873-fe65-59d4-9c42-4b578bac5dc6"; Source = {Id = "8cbfb956-5d53-aa0f-2546-ff32426901d1"; PortNumber = None; PortType = PortType.Output; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}; Target = {Id = "f7ed4610-faf3-e0cb-d985-86f6da5fa148"; PortNumber = None; PortType = PortType.Input; HostId = "434a7ce9-942f-0939-94eb-8dd7162ad916"}; Vertices = [383.0,148.0; 567.0,148.0]} + {Id = "026d76ef-92b3-91ae-6873-e2cc505ccb8d"; Source = {Id = "60b550b8-37d9-a0b8-c55c-cfc0044ef147"; PortNumber = None; PortType = PortType.Output; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}; Target = {Id = "7cdb3ebb-cfa1-6892-9d35-de8f15cb87ac"; PortNumber = None; PortType = PortType.Input; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}; Vertices = [247.0,240.0; 285.0,240.0; 285.0,148.0; 323.0,148.0]} + {Id = "3c37db26-e552-d5fb-10f5-57227c4ec6f5"; Source = {Id = "93f988ff-3b92-1904-2dcb-17ec5e88178f"; PortNumber = None; PortType = PortType.Output; HostId = "d8087733-5924-4af4-e67a-2c9630173608"}; Target = {Id = "17f9e9e2-3040-65ba-9578-b4ea6a8f8b28"; PortNumber = None; PortType = PortType.Input; HostId = "9bf01350-53a9-bb16-1f02-0df29cb60b0f"}; Vertices = [521.0,216.0; 567.0,216.0]} + {Id = "e1f27e7e-d0ae-e207-db0e-59c9a872255d"; Source = {Id = "042a92cb-f8d7-3cca-7519-a0bae85fdb6b"; PortNumber = None; PortType = PortType.Output; HostId = "eddfd0f6-f06d-5190-3af9-540371a13391"}; Target = {Id = "15575f10-2ec6-6033-cd3a-3ddabda8dbf3"; PortNumber = None; PortType = PortType.Input; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}; Vertices = [130.0,80.0; 226.5,80.0; 226.5,128.0; 323.0,128.0]} + ] + +let fullAdderDependency : LoadedComponent = { + Name = "full-adder" + TimeStamp = System.DateTime.MinValue + WaveInfo = None + FilePath = "" + CanvasState = fullAdderState + InputLabels = ["Cin", 1; "B", 1; "A", 1] + OutputLabels = ["Sum", 1; "Cout", 1] +} + +let fullAdderCustom : CustomComponentType = + makeCustomComponent fullAdderDependency + +// 2 bit adder: uses full adder. + +let twoBitAdderState : CanvasState = + [ + { H=50; W=40; Id = "57604fee-25b0-9498-06f1-3a065d046515"; Type = Custom {Name = "full-adder"; InputLabels = ["Cin", 1; "B", 1; "A", 1]; OutputLabels = ["Sum", 1; "Cout", 1]}; Label = "full-adder"; InputPorts = [{Id = "6a5725f2-f181-d678-371f-7add822462ea"; PortNumber = Some 0; PortType = PortType.Input; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; {Id = "13f98ff8-2e41-2aef-cbc8-1ed636c8c8c7"; PortNumber = Some 1; PortType = PortType.Input; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; {Id = "025e36fe-41f2-7f7c-08e2-7b1bb047b798"; PortNumber = Some 2; PortType = PortType.Input; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}]; OutputPorts = [{Id = "c14929a9-b56c-2414-38e6-6fab3127203f"; PortNumber = Some 0; PortType = PortType.Output; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; {Id = "0cb60845-f6b7-4e88-53bc-18e6c06364ca"; PortNumber = Some 1; PortType = PortType.Output; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}]; X = 298; Y = 129} + { H=50; W=40; Id = "b2842635-e4ec-3113-9130-d827d48e2875"; Type = Custom {Name = "full-adder"; InputLabels = ["Cin", 1; "B", 1; "A", 1]; OutputLabels = ["Sum", 1; "Cout", 1]}; Label = "full-adder"; InputPorts = [{Id = "ce42647b-a5db-5fa1-9a94-baaeec7416cd"; PortNumber = Some 0; PortType = PortType.Input; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; {Id = "3496a30f-e2bf-2b12-576d-cf28201850ff"; PortNumber = Some 1; PortType = PortType.Input; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; {Id = "9c0d3115-bf93-6c1c-b5bb-784cd7ca7896"; PortNumber = Some 2; PortType = PortType.Input; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}]; OutputPorts = [{Id = "f6da6a43-076e-1171-53de-6bef710bcaf8"; PortNumber = Some 0; PortType = PortType.Output; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; {Id = "04744361-bbe8-ac74-8643-fae2126ed686"; PortNumber = Some 1; PortType = PortType.Output; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}]; X = 298; Y = 298} + { H=50; W=40; Id = "78795182-35c4-1c50-2190-6fc944a2adea"; Type = Input 1; Label = "Zero"; InputPorts = []; OutputPorts = [{Id = "8b0b16ed-3a4e-2ade-6e4b-6285b0d7d2c8"; PortNumber = Some 0; PortType = PortType.Output; HostId = "78795182-35c4-1c50-2190-6fc944a2adea"}]; X = 155; Y = 72} + { H=50; W=40; Id = "69a6ad2a-af19-369f-0483-0e09e6841da3"; Type = Input 1; Label = "B0"; InputPorts = []; OutputPorts = [{Id = "0b74f567-0740-9667-a7e9-3042aeb7ef8f"; PortNumber = Some 0; PortType = PortType.Output; HostId = "69a6ad2a-af19-369f-0483-0e09e6841da3"}]; X = 83; Y = 150} + { H=50; W=40; Id = "82a03f0b-ae31-b487-ed1b-335e235adeb7"; Type = Input 1; Label = "A1"; InputPorts = []; OutputPorts = [{Id = "e3b566b6-abf4-1446-7267-37d2ad1deed7"; PortNumber = Some 0; PortType = PortType.Output; HostId = "82a03f0b-ae31-b487-ed1b-335e235adeb7"}]; X = 84; Y = 389} + { H=50; W=40; Id = "a63fe5a2-9f4d-e70f-131b-ed35d3f3a9e1"; Type = Input 1; Label = "B1"; InputPorts = []; OutputPorts = [{Id = "d59e003b-088b-cf84-0f93-83c2235b5942"; PortNumber = Some 0; PortType = PortType.Output; HostId = "a63fe5a2-9f4d-e70f-131b-ed35d3f3a9e1"}]; X = 84; Y = 324} + { H=50; W=40; Id = "86372781-c2f4-09f2-406f-f385ee7a47a9"; Type = Input 1; Label = "A0"; InputPorts = []; OutputPorts = [{Id = "0d00e79c-1a98-3744-be2f-b9eb78a1cf5b"; PortNumber = Some 0; PortType = PortType.Output; HostId = "86372781-c2f4-09f2-406f-f385ee7a47a9"}]; X = 83; Y = 200} + { H=50; W=40; Id = "dbb1f55a-edf3-bde2-4c69-43a02560e17d"; Type = Output 1; Label = "Sum1"; InputPorts = [{Id = "8dcbc0d6-ab44-c2e2-9e26-90ee31fa2e35"; PortNumber = Some 0; PortType = PortType.Input; HostId = "dbb1f55a-edf3-bde2-4c69-43a02560e17d"}]; OutputPorts = []; X = 514; Y = 321} + { H=50; W=40; Id = "8f5bded5-f46d-722d-6108-03dda4236c01"; Type = Output 1; Label = "Sum0"; InputPorts = [{Id = "3a537f37-4c6d-3c85-48a7-040d6263bebe"; PortNumber = Some 0; PortType = PortType.Input; HostId = "8f5bded5-f46d-722d-6108-03dda4236c01"}]; OutputPorts = []; X = 514; Y = 150} + { H=50; W=40; Id = "7d948312-376d-1d4b-cf02-90872026be16"; Type = Output 1; Label = "Cout"; InputPorts = [{Id = "bb868347-969a-38d2-2389-2d4ae7b63ce8"; PortNumber = Some 0; PortType = PortType.Input; HostId = "7d948312-376d-1d4b-cf02-90872026be16"}]; OutputPorts = []; X = 514; Y = 389} + ], + [ + {Id = "9a089fef-870a-53d8-00a0-e954963ac8e1"; Source = {Id = "0cb60845-f6b7-4e88-53bc-18e6c06364ca"; PortNumber = None; PortType = PortType.Output; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; Target = {Id = "ce42647b-a5db-5fa1-9a94-baaeec7416cd"; PortNumber = None; PortType = PortType.Input; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; Vertices = [370.0,189.0; 399.0,189.0; 399.0,255.75; 278.0,255.75; 278.0,320.5; 298.0,320.5]} + {Id = "77ab7f29-5375-44b2-d66f-b7c21d412c7f"; Source = {Id = "0b74f567-0740-9667-a7e9-3042aeb7ef8f"; PortNumber = None; PortType = PortType.Output; HostId = "69a6ad2a-af19-369f-0483-0e09e6841da3"}; Target = {Id = "13f98ff8-2e41-2aef-cbc8-1ed636c8c8c7"; PortNumber = None; PortType = PortType.Input; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; Vertices = [113.0,160.0; 214.5,160.0; 214.5,174.0; 298.0,174.0]} + {Id = "dba98b52-cddf-04d3-648a-fa7b915d4f87"; Source = {Id = "d59e003b-088b-cf84-0f93-83c2235b5942"; PortNumber = None; PortType = PortType.Output; HostId = "a63fe5a2-9f4d-e70f-131b-ed35d3f3a9e1"}; Target = {Id = "3496a30f-e2bf-2b12-576d-cf28201850ff"; PortNumber = None; PortType = PortType.Input; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; Vertices = [114.0,334.0; 215.0,334.0; 215.0,343.0; 298.0,343.0]} + {Id = "c7ce0fcc-c122-4ce6-3779-0f548cbfab38"; Source = {Id = "f6da6a43-076e-1171-53de-6bef710bcaf8"; PortNumber = None; PortType = PortType.Output; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; Target = {Id = "8dcbc0d6-ab44-c2e2-9e26-90ee31fa2e35"; PortNumber = None; PortType = PortType.Input; HostId = "dbb1f55a-edf3-bde2-4c69-43a02560e17d"}; Vertices = [370.0,328.0; 446.5,328.0; 446.5,331.0; 514.0,331.0]} + {Id = "abc884ae-3a1a-5a35-6f6f-5695d4898759"; Source = {Id = "04744361-bbe8-ac74-8643-fae2126ed686"; PortNumber = None; PortType = PortType.Output; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; Target = {Id = "bb868347-969a-38d2-2389-2d4ae7b63ce8"; PortNumber = None; PortType = PortType.Input; HostId = "7d948312-376d-1d4b-cf02-90872026be16"}; Vertices = [370.0,358.0; 446.5,358.0; 446.5,399.0; 514.0,399.0]} + {Id = "3c7b523c-71d3-9378-176c-7c45cfc516cf"; Source = {Id = "c14929a9-b56c-2414-38e6-6fab3127203f"; PortNumber = None; PortType = PortType.Output; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; Target = {Id = "3a537f37-4c6d-3c85-48a7-040d6263bebe"; PortNumber = None; PortType = PortType.Input; HostId = "8f5bded5-f46d-722d-6108-03dda4236c01"}; Vertices = [370.0,159.0; 446.5,159.0; 446.5,160.0; 514.0,160.0]} + {Id = "ccb35ae8-54b6-4072-6680-3cc05bb00f95"; Source = {Id = "0d00e79c-1a98-3744-be2f-b9eb78a1cf5b"; PortNumber = None; PortType = PortType.Output; HostId = "86372781-c2f4-09f2-406f-f385ee7a47a9"}; Target = {Id = "025e36fe-41f2-7f7c-08e2-7b1bb047b798"; PortNumber = None; PortType = PortType.Input; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; Vertices = [113.0,210.0; 214.5,210.0; 214.5,196.5; 298.0,196.5]} + {Id = "11759cef-e928-32c1-e6ec-b44b198d1a2e"; Source = {Id = "e3b566b6-abf4-1446-7267-37d2ad1deed7"; PortNumber = None; PortType = PortType.Output; HostId = "82a03f0b-ae31-b487-ed1b-335e235adeb7"}; Target = {Id = "9c0d3115-bf93-6c1c-b5bb-784cd7ca7896"; PortNumber = None; PortType = PortType.Input; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; Vertices = [114.0,399.0; 215.0,399.0; 215.0,365.5; 298.0,365.5]} + {Id = "2ae1f296-5dfb-986e-2c4c-3e3435d750b9"; Source = {Id = "8b0b16ed-3a4e-2ade-6e4b-6285b0d7d2c8"; PortNumber = None; PortType = PortType.Output; HostId = "78795182-35c4-1c50-2190-6fc944a2adea"}; Target = {Id = "6a5725f2-f181-d678-371f-7add822462ea"; PortNumber = None; PortType = PortType.Input; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; Vertices = [185.0,82.0; 250.5,82.0; 250.5,151.5; 298.0,151.5]} + ] + +let twoBitAdderDependency : LoadedComponent = { + Name = "2-bit-adder" + FilePath = "" + TimeStamp = System.DateTime.MinValue + WaveInfo = None + CanvasState = twoBitAdderState + InputLabels = ["A0", 1; "B1", 1; "A1", 1; "B0", 1; "Zero", 1] + OutputLabels = ["Cout", 1; "Sum0", 1; "Sum1", 1] +} + +let twoBitAdderCustom : CustomComponentType = + makeCustomComponent twoBitAdderDependency diff --git a/Tests/CanvasStatesMemories.fs b/Tests/CanvasStatesMemories.fs new file mode 100644 index 0000000..0d9ba39 --- /dev/null +++ b/Tests/CanvasStatesMemories.fs @@ -0,0 +1,69 @@ +module CanvasStatesMemories + +open CommonTypes +open Helpers + +let makeData (lst: int list) = + lst + |> List.indexed + |> List.map (fun (a,d) -> int64 a, int64 d) + |> Map + +let mem1 = { + AddressWidth = 2 + WordWidth = 4 + Data = [0; 1; 4; 15] |> makeData +} + +/// Synchronous ROM connected to address and output. +let stateMem1 : CanvasState = + [ + {H=50;W=40; Id = "322715aa-a1d4-b314-91c7-670d33bca00a";Type = ROM mem1;Label = "";InputPorts = [{Id = "3ff66cbf-7662-f666-2823-6459005239f2";PortNumber = Some 0;PortType = PortType.Input;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"}];OutputPorts = [{Id = "81f27eec-4619-cb35-ce9a-ac7149a52da8";PortNumber = Some 0;PortType = PortType.Output;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"}];X = 252;Y = 240}; + {H=50;W=40; Id = "4f65afe9-f03c-2b97-fde9-c657ca32f246";Type = Input 2;Label = "addr";InputPorts = [];OutputPorts = [{Id = "453dbdf9-8a50-792d-c6a9-27396ef5b036";PortNumber = Some 0;PortType = PortType.Output;HostId = "4f65afe9-f03c-2b97-fde9-c657ca32f246"}];X = 88;Y = 280}; + {H=50;W=40; Id = "fbb5aa79-a471-ac24-4201-56ae39d537c6";Type = Output 4;Label = "data";InputPorts = [{Id = "d3339319-afbc-c196-6a23-475704cff3ae";PortNumber = Some 0;PortType = PortType.Input;HostId = "fbb5aa79-a471-ac24-4201-56ae39d537c6"}];OutputPorts = [];X = 467;Y = 280} + ], + [ + {Id = "b5675376-6921-1909-5838-b43891f88fee";Source = {Id = "453dbdf9-8a50-792d-c6a9-27396ef5b036";PortNumber = None;PortType = PortType.Output;HostId = "4f65afe9-f03c-2b97-fde9-c657ca32f246"};Target = {Id = "3ff66cbf-7662-f666-2823-6459005239f2";PortNumber = None;PortType = PortType.Input;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"};Vertices = [118.0,290.0; 252.0,290.0]}; + {Id = "4720848e-5a2e-7203-d4ac-22f9d9d74af3";Source = {Id = "81f27eec-4619-cb35-ce9a-ac7149a52da8";PortNumber = None;PortType = PortType.Output;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"};Target = {Id = "d3339319-afbc-c196-6a23-475704cff3ae";PortNumber = None;PortType = PortType.Input;HostId = "fbb5aa79-a471-ac24-4201-56ae39d537c6"};Vertices = [332.0,290.0; 467.0,290.0]} + ] + +/// Numbers from 0 to 255. +let mem2 = { + AddressWidth = 8 + WordWidth = 8 + Data = [0..pow2(8)-1] |> makeData +} + +/// Synchronous ROM connected to address and output. ROM is big. +let stateMem2 : CanvasState = + [ + {H=50;W=40; Id = "322715aa-a1d4-b314-91c7-670d33bca00a";Type = ROM mem2;Label = "";InputPorts = [{Id = "3ff66cbf-7662-f666-2823-6459005239f2";PortNumber = Some 0;PortType = PortType.Input;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"}];OutputPorts = [{Id = "81f27eec-4619-cb35-ce9a-ac7149a52da8";PortNumber = Some 0;PortType = PortType.Output;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"}];X = 252;Y = 240}; + {H=50;W=40; Id = "4f65afe9-f03c-2b97-fde9-c657ca32f246";Type = Input 8;Label = "addr";InputPorts = [];OutputPorts = [{Id = "453dbdf9-8a50-792d-c6a9-27396ef5b036";PortNumber = Some 0;PortType = PortType.Output;HostId = "4f65afe9-f03c-2b97-fde9-c657ca32f246"}];X = 88;Y = 280}; + {H=50;W=40; Id = "fbb5aa79-a471-ac24-4201-56ae39d537c6";Type = Output 8;Label = "data";InputPorts = [{Id = "d3339319-afbc-c196-6a23-475704cff3ae";PortNumber = Some 0;PortType = PortType.Input;HostId = "fbb5aa79-a471-ac24-4201-56ae39d537c6"}];OutputPorts = [];X = 467;Y = 280} + ], + [ + {Id = "b5675376-6921-1909-5838-b43891f88fee";Source = {Id = "453dbdf9-8a50-792d-c6a9-27396ef5b036";PortNumber = None;PortType = PortType.Output;HostId = "4f65afe9-f03c-2b97-fde9-c657ca32f246"};Target = {Id = "3ff66cbf-7662-f666-2823-6459005239f2";PortNumber = None;PortType = PortType.Input;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"};Vertices = [118.0,290.0; 252.0,290.0]}; + {Id = "4720848e-5a2e-7203-d4ac-22f9d9d74af3";Source = {Id = "81f27eec-4619-cb35-ce9a-ac7149a52da8";PortNumber = None;PortType = PortType.Output;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"};Target = {Id = "d3339319-afbc-c196-6a23-475704cff3ae";PortNumber = None;PortType = PortType.Input;HostId = "fbb5aa79-a471-ac24-4201-56ae39d537c6"};Vertices = [332.0,290.0; 467.0,290.0]} + ] + +let mem3 = { + AddressWidth = 3 + WordWidth = 4 + Data = [0; 0; 0; 0; 0; 0; 0; 0] |> makeData +} + +/// Fully connected RAM. +let stateMem3 : CanvasState = + [ + {H=50;W=40; Id = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60";Type = RAM mem3;Label = "";InputPorts = [{Id = "83ff4d8a-a28e-ebc8-8311-77def91ca935";PortNumber = Some 0;PortType = PortType.Input;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"}; {Id = "0c116a9b-78cd-79a5-c080-dfdc1445334d";PortNumber = Some 1;PortType = PortType.Input;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"}; {Id = "86e5f7cf-657c-9383-54b3-65c156fdf867";PortNumber = Some 2;PortType = PortType.Input;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"}];OutputPorts = [{Id = "c9e983ab-b832-156a-36fd-9ce1d03810d7";PortNumber = Some 0;PortType = PortType.Output;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"}];X = 318;Y = 190}; + {H=50;W=40; Id = "1f9704f9-88fc-124c-3ff8-21c36cfb7328";Type = Output 4;Label = "data-out";InputPorts = [{Id = "0af79035-101f-b683-f39c-68a36a7dc33f";PortNumber = Some 0;PortType = PortType.Input;HostId = "1f9704f9-88fc-124c-3ff8-21c36cfb7328"}];OutputPorts = [];X = 647;Y = 230}; + {H=50;W=40; Id = "266d8763-6fbf-37c2-6825-d3487153053b";Type = Input 4;Label = "data-in";InputPorts = [];OutputPorts = [{Id = "b155889c-3d6d-8ebf-2b3b-771f1ada3578";PortNumber = Some 0;PortType = PortType.Output;HostId = "266d8763-6fbf-37c2-6825-d3487153053b"}];X = 116;Y = 230}; + {H=50;W=40; Id = "81030fc6-2471-a568-160f-922709edeb2e";Type = Input 3;Label = "addr";InputPorts = [];OutputPorts = [{Id = "ceb4382f-d670-912f-87c2-755315a89c87";PortNumber = Some 0;PortType = PortType.Output;HostId = "81030fc6-2471-a568-160f-922709edeb2e"}];X = 116;Y = 138}; + {H=50;W=40; Id = "f0769200-24e3-5c7b-3591-c5c3711d9336";Type = Input 1;Label = "write";InputPorts = [];OutputPorts = [{Id = "b8286beb-9cc1-1128-cc1e-813388ca16fc";PortNumber = Some 0;PortType = PortType.Output;HostId = "f0769200-24e3-5c7b-3591-c5c3711d9336"}];X = 116;Y = 322} + ], + [ + {Id = "04957b14-81b7-83c0-7669-c9c6fc363e00";Source = {Id = "b155889c-3d6d-8ebf-2b3b-771f1ada3578";PortNumber = None;PortType = PortType.Output;HostId = "266d8763-6fbf-37c2-6825-d3487153053b"};Target = {Id = "0c116a9b-78cd-79a5-c080-dfdc1445334d";PortNumber = None;PortType = PortType.Input;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"};Vertices = [146.0,240.0; 318.0,240.0]}; + {Id = "d24c03fd-7b01-e68f-0d6f-8ff153791809";Source = {Id = "c9e983ab-b832-156a-36fd-9ce1d03810d7";PortNumber = None;PortType = PortType.Output;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"};Target = {Id = "0af79035-101f-b683-f39c-68a36a7dc33f";PortNumber = None;PortType = PortType.Input;HostId = "1f9704f9-88fc-124c-3ff8-21c36cfb7328"};Vertices = [448.0,240.0; 647.0,240.0]}; + {Id = "63851c98-6945-0718-29c9-94f738246fd3";Source = {Id = "b8286beb-9cc1-1128-cc1e-813388ca16fc";PortNumber = None;PortType = PortType.Output;HostId = "f0769200-24e3-5c7b-3591-c5c3711d9336"};Target = {Id = "86e5f7cf-657c-9383-54b3-65c156fdf867";PortNumber = None;PortType = PortType.Input;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"};Vertices = [146.0,332.0; 232.0,332.0; 232.0,265.0; 318.0,265.0]}; + {Id = "69b302c0-11e5-bb4d-291c-077318321d91";Source = {Id = "ceb4382f-d670-912f-87c2-755315a89c87";PortNumber = None;PortType = PortType.Output;HostId = "81030fc6-2471-a568-160f-922709edeb2e"};Target = {Id = "83ff4d8a-a28e-ebc8-8311-77def91ca935";PortNumber = None;PortType = PortType.Input;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"};Vertices = [146.0,148.0; 232.0,148.0; 232.0,215.0; 318.0,215.0]} + ] diff --git a/Tests/CanvasStatesSync.fs b/Tests/CanvasStatesSync.fs new file mode 100644 index 0000000..f816758 --- /dev/null +++ b/Tests/CanvasStatesSync.fs @@ -0,0 +1,233 @@ +module CanvasStatesSync + +open CommonTypes + +/// Simple DFF connected to an input and an output. +let stateSync1 : CanvasState = + [ + {H=50; W=40;Id = "067434c0-3bf4-f4c4-551b-1001d73b024f";Type = DFF;Label = "";InputPorts = [{Id = "b595ca8e-027e-0024-2855-1169330c53f4";PortNumber = Some 0;PortType = PortType.Input;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"}];OutputPorts = [{Id = "547be6ee-118d-5bd6-2b3c-37ed3250302f";PortNumber = Some 0;PortType = PortType.Output;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"}];X = 409;Y = 232}; + {H=50; W=40;Id = "6e7a2000-439c-108e-df6d-93cff7a41266";Type = Input 1;Label = "in";InputPorts = [];OutputPorts = [{Id = "62496e2e-fa0d-3e2b-46f2-9ee99a141de6";PortNumber = Some 0;PortType = PortType.Output;HostId = "6e7a2000-439c-108e-df6d-93cff7a41266"}];X = 171;Y = 247}; + {H=50; W=40;Id = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd";Type = Output 1;Label = "out";InputPorts = [{Id = "5fd06e1a-90ba-64e8-24bf-d69f190a6b2f";PortNumber = Some 0;PortType = PortType.Input;HostId = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd"}];OutputPorts = [];X = 671;Y = 247} + ], + [ + {Id = "fe93a564-b9be-2ce5-61a0-89a57d1f4c30";Source = {Id = "547be6ee-118d-5bd6-2b3c-37ed3250302f";PortNumber = None;PortType = PortType.Output;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"};Target = {Id = "5fd06e1a-90ba-64e8-24bf-d69f190a6b2f";PortNumber = None;PortType = PortType.Input;HostId = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd"};Vertices = [459.0,257.0; 671.0,257.0]}; + {Id = "e1da6926-1493-ffb0-c85b-c58b00506cd6";Source = {Id = "62496e2e-fa0d-3e2b-46f2-9ee99a141de6";PortNumber = None;PortType = PortType.Output;HostId = "6e7a2000-439c-108e-df6d-93cff7a41266"};Target = {Id = "b595ca8e-027e-0024-2855-1169330c53f4";PortNumber = None;PortType = PortType.Input;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"};Vertices = [201.0,257.0; 409.0,257.0]} + ] + +/// stateSync1 loaded as a dependency. +let stateSync1Dependency : LoadedComponent = { + Name = "single-dff" + TimeStamp = System.DateTime.MinValue + WaveInfo = None + FilePath = "" + CanvasState = stateSync1 + InputLabels = ["in", 1] + OutputLabels = ["out", 1] +} + +/// stateSync1 custom component. +let stateSync1CustomComponent : CustomComponentType = + CanvasStates.makeCustomComponent stateSync1Dependency + +/// Two DFF connected in series. +let stateSync2 : CanvasState = + [ + {H=50; W=40;Id = "067434c0-3bf4-f4c4-551b-1001d73b024f";Type = DFF;Label = "";InputPorts = [{Id = "b595ca8e-027e-0024-2855-1169330c53f4";PortNumber = Some 0;PortType = PortType.Input;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"}];OutputPorts = [{Id = "547be6ee-118d-5bd6-2b3c-37ed3250302f";PortNumber = Some 0;PortType = PortType.Output;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"}];X = 351;Y = 185}; + {H=50; W=40;Id = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd";Type = Output 1;Label = "out";InputPorts = [{Id = "5fd06e1a-90ba-64e8-24bf-d69f190a6b2f";PortNumber = Some 0;PortType = PortType.Input;HostId = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd"}];OutputPorts = [];X = 752;Y = 200}; + {H=50; W=40;Id = "3739e54a-fd21-bf60-8fc2-a3d10108c947";Type = Input 1;Label = "in";InputPorts = [];OutputPorts = [{Id = "5c467246-0f2a-0da7-6e92-9f041d1a9fd8";PortNumber = Some 0;PortType = PortType.Output;HostId = "3739e54a-fd21-bf60-8fc2-a3d10108c947"}];X = 200;Y = 200}; + {H=50; W=40;Id = "edda6ee1-8b6f-8f37-8177-4c073299a362";Type = DFF;Label = "";InputPorts = [{Id = "7888376e-2242-39ac-9299-aef7e30f4465";PortNumber = Some 0;PortType = PortType.Input;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"}];OutputPorts = [{Id = "272e61d9-786c-f609-274c-9990997892cf";PortNumber = Some 0;PortType = PortType.Output;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"}];X = 574;Y = 185} + ], + [ + {Id = "9e2ded72-08fd-c5d2-5bd7-f191c02f0d4d";Source = {Id = "272e61d9-786c-f609-274c-9990997892cf";PortNumber = None;PortType = PortType.Output;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"};Target = {Id = "5fd06e1a-90ba-64e8-24bf-d69f190a6b2f";PortNumber = None;PortType = PortType.Input;HostId = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd"};Vertices = [624.0,210.0; 752.0,210.0]}; + {Id = "bc1e6ca7-6f71-697d-c81e-53598fcd5b4e";Source = {Id = "547be6ee-118d-5bd6-2b3c-37ed3250302f";PortNumber = None;PortType = PortType.Output;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"};Target = {Id = "7888376e-2242-39ac-9299-aef7e30f4465";PortNumber = None;PortType = PortType.Input;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"};Vertices = [401.0,210.0; 574.0,210.0]}; + {Id = "9b5af8de-2de5-3a95-7347-316c3f9cfa8d";Source = {Id = "5c467246-0f2a-0da7-6e92-9f041d1a9fd8";PortNumber = None;PortType = PortType.Output;HostId = "3739e54a-fd21-bf60-8fc2-a3d10108c947"};Target = {Id = "b595ca8e-027e-0024-2855-1169330c53f4";PortNumber = None;PortType = PortType.Input;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"};Vertices = [230.0,210.0; 351.0,210.0]} + ] + +/// Three DFF connected in series. +let stateSync3 : CanvasState = + [ + {H=50; W=40;Id = "067434c0-3bf4-f4c4-551b-1001d73b024f";Type = DFF;Label = "";InputPorts = [{Id = "b595ca8e-027e-0024-2855-1169330c53f4";PortNumber = Some 0;PortType = PortType.Input;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"}];OutputPorts = [{Id = "547be6ee-118d-5bd6-2b3c-37ed3250302f";PortNumber = Some 0;PortType = PortType.Output;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"}];X = 351;Y = 185}; + {H=50; W=40;Id = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd";Type = Output 1;Label = "out";InputPorts = [{Id = "5fd06e1a-90ba-64e8-24bf-d69f190a6b2f";PortNumber = Some 0;PortType = PortType.Input;HostId = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd"}];OutputPorts = [];X = 752;Y = 200}; + {H=50; W=40;Id = "3739e54a-fd21-bf60-8fc2-a3d10108c947";Type = Input 1;Label = "in";InputPorts = [];OutputPorts = [{Id = "5c467246-0f2a-0da7-6e92-9f041d1a9fd8";PortNumber = Some 0;PortType = PortType.Output;HostId = "3739e54a-fd21-bf60-8fc2-a3d10108c947"}];X = 200;Y = 200}; + {H=50; W=40;Id = "edda6ee1-8b6f-8f37-8177-4c073299a362";Type = DFF;Label = "";InputPorts = [{Id = "7888376e-2242-39ac-9299-aef7e30f4465";PortNumber = Some 0;PortType = PortType.Input;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"}];OutputPorts = [{Id = "272e61d9-786c-f609-274c-9990997892cf";PortNumber = Some 0;PortType = PortType.Output;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"}];X = 489;Y = 185}; + {H=50; W=40;Id = "36fd5a8f-ca4c-eb7e-e0f4-3b89109ad650";Type = DFF;Label = "";InputPorts = [{Id = "2e1f0297-f4c6-c266-7dbb-d56fc63e386a";PortNumber = Some 0;PortType = PortType.Input;HostId = "36fd5a8f-ca4c-eb7e-e0f4-3b89109ad650"}];OutputPorts = [{Id = "e0df158f-e186-c205-8693-9fa92c62d154";PortNumber = Some 0;PortType = PortType.Output;HostId = "36fd5a8f-ca4c-eb7e-e0f4-3b89109ad650"}];X = 613;Y = 185} + ], + [ + {Id = "9e2ded72-08fd-c5d2-5bd7-f191c02f0d4d";Source = {Id = "272e61d9-786c-f609-274c-9990997892cf";PortNumber = None;PortType = PortType.Output;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"};Target = {Id = "2e1f0297-f4c6-c266-7dbb-d56fc63e386a";PortNumber = None;PortType = PortType.Input;HostId = "36fd5a8f-ca4c-eb7e-e0f4-3b89109ad650"};Vertices = [539.0,210.0; 613.0,210.0]}; + {Id = "9b5af8de-2de5-3a95-7347-316c3f9cfa8d";Source = {Id = "5c467246-0f2a-0da7-6e92-9f041d1a9fd8";PortNumber = None;PortType = PortType.Output;HostId = "3739e54a-fd21-bf60-8fc2-a3d10108c947"};Target = {Id = "b595ca8e-027e-0024-2855-1169330c53f4";PortNumber = None;PortType = PortType.Input;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"};Vertices = [230.0,210.0; 351.0,210.0]}; + {Id = "bc1e6ca7-6f71-697d-c81e-53598fcd5b4e";Source = {Id = "547be6ee-118d-5bd6-2b3c-37ed3250302f";PortNumber = None;PortType = PortType.Output;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"};Target = {Id = "7888376e-2242-39ac-9299-aef7e30f4465";PortNumber = None;PortType = PortType.Input;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"};Vertices = [401.0,210.0; 489.0,210.0]}; + {Id = "56b29fa5-a6e0-45d1-d2c0-4d3f4d82d94c";Source = {Id = "e0df158f-e186-c205-8693-9fa92c62d154";PortNumber = None;PortType = PortType.Output;HostId = "36fd5a8f-ca4c-eb7e-e0f4-3b89109ad650"};Target = {Id = "5fd06e1a-90ba-64e8-24bf-d69f190a6b2f";PortNumber = None;PortType = PortType.Input;HostId = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd"};Vertices = [663.0,210.0; 752.0,210.0]} + ] + +/// StateSync1 custom component followed by a DFF. +let stateSync4 : CanvasState = + [ + {H=50; W=40;Id = "03e4c81a-4703-d9f5-dfaf-301de006610f";Type = Input 1;Label = "a";InputPorts = [];OutputPorts = [{Id = "0caf419c-354b-78b8-a12b-e5fa450d4fc0";PortNumber = Some 0;PortType = PortType.Output;HostId = "03e4c81a-4703-d9f5-dfaf-301de006610f"}];X = 100;Y = 100}; + {H=50; W=40;Id = "781e7d9d-b18c-d614-dbc0-23bac9e617b7";Type = Output 1;Label = "b";InputPorts = [{Id = "a8e8da74-7bd2-f3a8-9ee5-9e8caa1ee0e5";PortNumber = Some 0;PortType = PortType.Input;HostId = "781e7d9d-b18c-d614-dbc0-23bac9e617b7"}];OutputPorts = [];X = 749;Y = 100}; + {H=50; W=40;Id = "547051c6-38f6-27ec-7c33-9c3bbee47e6e";Type = DFF;Label = "";InputPorts = [{Id = "7ec9e434-b066-daf3-3308-0a13a97c8880";PortNumber = Some 0;PortType = PortType.Input;HostId = "547051c6-38f6-27ec-7c33-9c3bbee47e6e"}];OutputPorts = [{Id = "252c237c-1323-a291-eccb-f94392a37743";PortNumber = Some 0;PortType = PortType.Output;HostId = "547051c6-38f6-27ec-7c33-9c3bbee47e6e"}];X = 500;Y = 85}; + {H=50; W=40;Id = "423bb75b-e791-14f9-ecc2-1ac1c73fc55b";Type = Custom stateSync1CustomComponent;Label = "main";InputPorts = [{Id = "4c5a5a1a-e7e3-f53b-8059-0dfd34d796b1";PortNumber = Some 0;PortType = PortType.Input;HostId = "423bb75b-e791-14f9-ecc2-1ac1c73fc55b"}];OutputPorts = [{Id = "05578981-7a96-a101-b726-df761e234abb";PortNumber = Some 0;PortType = PortType.Output;HostId = "423bb75b-e791-14f9-ecc2-1ac1c73fc55b"}];X = 285;Y = 95} + ], + [ + {Id = "75474538-c7cb-de96-9fd2-5f55af7af631";Source = {Id = "0caf419c-354b-78b8-a12b-e5fa450d4fc0";PortNumber = None;PortType = PortType.Output;HostId = "03e4c81a-4703-d9f5-dfaf-301de006610f"};Target = {Id = "4c5a5a1a-e7e3-f53b-8059-0dfd34d796b1";PortNumber = None;PortType = PortType.Input;HostId = "423bb75b-e791-14f9-ecc2-1ac1c73fc55b"};Vertices = [130.0,110.0; 285.0,110.0]}; + {Id = "4c146e97-db61-4848-5073-01c3785d2571";Source = {Id = "252c237c-1323-a291-eccb-f94392a37743";PortNumber = None;PortType = PortType.Output;HostId = "547051c6-38f6-27ec-7c33-9c3bbee47e6e"};Target = {Id = "a8e8da74-7bd2-f3a8-9ee5-9e8caa1ee0e5";PortNumber = None;PortType = PortType.Input;HostId = "781e7d9d-b18c-d614-dbc0-23bac9e617b7"};Vertices = [550.0,110.0; 749.0,110.0]}; + {Id = "50982a96-2ea6-7db7-2eda-6c38456697c4";Source = {Id = "05578981-7a96-a101-b726-df761e234abb";PortNumber = None;PortType = PortType.Output;HostId = "423bb75b-e791-14f9-ecc2-1ac1c73fc55b"};Target = {Id = "7ec9e434-b066-daf3-3308-0a13a97c8880";PortNumber = None;PortType = PortType.Input;HostId = "547051c6-38f6-27ec-7c33-9c3bbee47e6e"};Vertices = [345.0,110.0; 500.0,110.0]} + ] + +/// A DFF looping to itself via a Not gate. Two output nodes to probe the wires +/// before and after the Not gate. No inputs. +let stateSync5 : CanvasState = + [ + {H=50; W=40;Id = "62a3108e-1198-502b-e338-e677815aead3";Type = Output 1;Label = "out1";InputPorts = [{Id = "3a7fdd4d-59d0-60cf-9eaf-cd2c7fd16264";PortNumber = Some 0;PortType = PortType.Input;HostId = "62a3108e-1198-502b-e338-e677815aead3"}];OutputPorts = [];X = 417;Y = 117}; + {H=50; W=40;Id = "fc72c05a-5174-0334-aa74-be3ce27c3657";Type = Not;Label = "";InputPorts = [{Id = "add99bad-5b00-ab97-4f13-2903a14b2f4e";PortNumber = Some 0;PortType = PortType.Input;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"}];OutputPorts = [{Id = "63ca8512-31ee-88e6-9d25-8fdc727d2418";PortNumber = Some 0;PortType = PortType.Output;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"}];X = 169;Y = 184}; + {H=50; W=40;Id = "023094a0-9787-47ce-26af-03086cdc4b15";Type = Output 1;Label = "out2";InputPorts = [{Id = "0ed71ded-67ad-cd1b-0ff0-a1e167900051";PortNumber = Some 0;PortType = PortType.Input;HostId = "023094a0-9787-47ce-26af-03086cdc4b15"}];OutputPorts = [];X = 229;Y = 138}; + {H=50; W=40;Id = "1a772449-853d-2171-1e47-fb9783b99556";Type = DFF;Label = "";InputPorts = [{Id = "8b78d961-4203-c0ae-3229-c3a02c42065a";PortNumber = Some 0;PortType = PortType.Input;HostId = "1a772449-853d-2171-1e47-fb9783b99556"}];OutputPorts = [{Id = "abd2d9ec-a752-cb9d-b97e-afd7e2eea26d";PortNumber = Some 0;PortType = PortType.Output;HostId = "1a772449-853d-2171-1e47-fb9783b99556"}];X = 273;Y = 343} + ], + [ + {Id = "5f42f1e8-0ccd-24e1-04a2-635d957c991b";Source = {Id = "63ca8512-31ee-88e6-9d25-8fdc727d2418";PortNumber = None;PortType = PortType.Output;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"};Target = {Id = "0ed71ded-67ad-cd1b-0ff0-a1e167900051";PortNumber = None;PortType = PortType.Input;HostId = "023094a0-9787-47ce-26af-03086cdc4b15"};Vertices = [199.0,199.0; 214.0,199.0; 214.0,148.0; 229.0,148.0]}; + {Id = "dc4cbb8e-e7a8-a008-97a8-0200f8720a81";Source = {Id = "63ca8512-31ee-88e6-9d25-8fdc727d2418";PortNumber = None;PortType = PortType.Output;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"};Target = {Id = "8b78d961-4203-c0ae-3229-c3a02c42065a";PortNumber = None;PortType = PortType.Input;HostId = "1a772449-853d-2171-1e47-fb9783b99556"};Vertices = [199.0,199.0; 236.0,199.0; 236.0,368.0; 273.0,368.0]}; + {Id = "4810ec6b-a9f9-a562-58cf-82f9071755ad";Source = {Id = "abd2d9ec-a752-cb9d-b97e-afd7e2eea26d";PortNumber = None;PortType = PortType.Output;HostId = "1a772449-853d-2171-1e47-fb9783b99556"};Target = {Id = "add99bad-5b00-ab97-4f13-2903a14b2f4e";PortNumber = None;PortType = PortType.Input;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"};Vertices = [323.0,368.0; 343.0,368.0; 343.0,283.5; 149.0,283.5; 149.0,199.0; 169.0,199.0]}; + {Id = "3831ffa7-549f-da3b-ab73-20c72e69b5b8";Source = {Id = "abd2d9ec-a752-cb9d-b97e-afd7e2eea26d";PortNumber = None;PortType = PortType.Output;HostId = "1a772449-853d-2171-1e47-fb9783b99556"};Target = {Id = "3a7fdd4d-59d0-60cf-9eaf-cd2c7fd16264";PortNumber = None;PortType = PortType.Input;HostId = "62a3108e-1198-502b-e338-e677815aead3"};Vertices = [323.0,368.0; 370.0,368.0; 370.0,127.0; 417.0,127.0]} + ] + + +/// Similar to stateSync5, but with a stateSync1 custom component instead of a +/// DFF. Loop with a synchronous custom component. +let stateSync6 : CanvasState = + [ + {H=50; W=40;Id = "62a3108e-1198-502b-e338-e677815aead3";Type = Output 1;Label = "out1";InputPorts = [{Id = "3a7fdd4d-59d0-60cf-9eaf-cd2c7fd16264";PortNumber = Some 0;PortType = PortType.Input;HostId = "62a3108e-1198-502b-e338-e677815aead3"}];OutputPorts = [];X = 417;Y = 117}; + {H=50; W=40;Id = "fc72c05a-5174-0334-aa74-be3ce27c3657";Type = Not;Label = "";InputPorts = [{Id = "add99bad-5b00-ab97-4f13-2903a14b2f4e";PortNumber = Some 0;PortType = PortType.Input;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"}];OutputPorts = [{Id = "63ca8512-31ee-88e6-9d25-8fdc727d2418";PortNumber = Some 0;PortType = PortType.Output;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"}];X = 169;Y = 184}; + {H=50; W=40;Id = "023094a0-9787-47ce-26af-03086cdc4b15";Type = Output 1;Label = "out2";InputPorts = [{Id = "0ed71ded-67ad-cd1b-0ff0-a1e167900051";PortNumber = Some 0;PortType = PortType.Input;HostId = "023094a0-9787-47ce-26af-03086cdc4b15"}];OutputPorts = [];X = 229;Y = 138}; + {H=50; W=40;Id = "1a772449-853d-2171-1e47-fb9783b99556";Type = Custom stateSync1CustomComponent;Label = "";InputPorts = [{Id = "8b78d961-4203-c0ae-3229-c3a02c42065a";PortNumber = Some 0;PortType = PortType.Input;HostId = "1a772449-853d-2171-1e47-fb9783b99556"}];OutputPorts = [{Id = "abd2d9ec-a752-cb9d-b97e-afd7e2eea26d";PortNumber = Some 0;PortType = PortType.Output;HostId = "1a772449-853d-2171-1e47-fb9783b99556"}];X = 273;Y = 343} + ], + [ + {Id = "5f42f1e8-0ccd-24e1-04a2-635d957c991b";Source = {Id = "63ca8512-31ee-88e6-9d25-8fdc727d2418";PortNumber = None;PortType = PortType.Output;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"};Target = {Id = "0ed71ded-67ad-cd1b-0ff0-a1e167900051";PortNumber = None;PortType = PortType.Input;HostId = "023094a0-9787-47ce-26af-03086cdc4b15"};Vertices = [199.0,199.0; 214.0,199.0; 214.0,148.0; 229.0,148.0]}; + {Id = "dc4cbb8e-e7a8-a008-97a8-0200f8720a81";Source = {Id = "63ca8512-31ee-88e6-9d25-8fdc727d2418";PortNumber = None;PortType = PortType.Output;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"};Target = {Id = "8b78d961-4203-c0ae-3229-c3a02c42065a";PortNumber = None;PortType = PortType.Input;HostId = "1a772449-853d-2171-1e47-fb9783b99556"};Vertices = [199.0,199.0; 236.0,199.0; 236.0,368.0; 273.0,368.0]}; + {Id = "4810ec6b-a9f9-a562-58cf-82f9071755ad";Source = {Id = "abd2d9ec-a752-cb9d-b97e-afd7e2eea26d";PortNumber = None;PortType = PortType.Output;HostId = "1a772449-853d-2171-1e47-fb9783b99556"};Target = {Id = "add99bad-5b00-ab97-4f13-2903a14b2f4e";PortNumber = None;PortType = PortType.Input;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"};Vertices = [323.0,368.0; 343.0,368.0; 343.0,283.5; 149.0,283.5; 149.0,199.0; 169.0,199.0]}; + {Id = "3831ffa7-549f-da3b-ab73-20c72e69b5b8";Source = {Id = "abd2d9ec-a752-cb9d-b97e-afd7e2eea26d";PortNumber = None;PortType = PortType.Output;HostId = "1a772449-853d-2171-1e47-fb9783b99556"};Target = {Id = "3a7fdd4d-59d0-60cf-9eaf-cd2c7fd16264";PortNumber = None;PortType = PortType.Input;HostId = "62a3108e-1198-502b-e338-e677815aead3"};Vertices = [323.0,368.0; 370.0,368.0; 370.0,127.0; 417.0,127.0]} + ] + +/// Input connected to two outputs. One of the two paths has a DFF in between. +/// Therefore, A to B-Comb is combinatorial path. A to B-Sync is a synchronous +/// path. +let stateSync7 : CanvasState = + [ + {H=50; W=40;Id = "ff10125a-601f-e1d5-e379-7eb7c65eb91f";Type = Input 1;Label = "A";InputPorts = [];OutputPorts = [{Id = "32b40ca6-c21f-5b84-ca05-38d88b35b567";PortNumber = Some 0;PortType = PortType.Output;HostId = "ff10125a-601f-e1d5-e379-7eb7c65eb91f"}];X = 150;Y = 150}; + {H=50; W=40;Id = "2947473e-2eef-864c-217a-dd5c1daaae44";Type = DFF;Label = "";InputPorts = [{Id = "45a6e6f6-ed52-8de9-2fed-9f7a0bbb86dc";PortNumber = Some 0;PortType = PortType.Input;HostId = "2947473e-2eef-864c-217a-dd5c1daaae44"}];OutputPorts = [{Id = "25dc0c5b-e047-090b-5c2a-7ac216d80122";PortNumber = Some 0;PortType = PortType.Output;HostId = "2947473e-2eef-864c-217a-dd5c1daaae44"}];X = 230;Y = 210}; + {H=50; W=40;Id = "794d5154-6969-3f4e-9c8b-4bc17927c28f";Type = Output 1;Label = "B-Comb";InputPorts = [{Id = "dbdd44c2-14e4-449c-4d69-6dd78af61e2c";PortNumber = Some 0;PortType = PortType.Input;HostId = "794d5154-6969-3f4e-9c8b-4bc17927c28f"}];OutputPorts = [];X = 328;Y = 150}; + {H=50; W=40;Id = "95452292-b507-ab43-f082-85152d3e4cf2";Type = Output 1;Label = "B-Sync";InputPorts = [{Id = "05a19e53-570c-f02f-0af2-7ba35c4a4b71";PortNumber = Some 0;PortType = PortType.Input;HostId = "95452292-b507-ab43-f082-85152d3e4cf2"}];OutputPorts = [];X = 328;Y = 225} + ], + [ + {Id = "79418b3f-7ee3-997a-a433-32a9fbb49f18";Source = {Id = "32b40ca6-c21f-5b84-ca05-38d88b35b567";PortNumber = None;PortType = PortType.Output;HostId = "ff10125a-601f-e1d5-e379-7eb7c65eb91f"};Target = {Id = "dbdd44c2-14e4-449c-4d69-6dd78af61e2c";PortNumber = None;PortType = PortType.Input;HostId = "794d5154-6969-3f4e-9c8b-4bc17927c28f"};Vertices = [180.0,160.0; 328.0,160.0]}; + {Id = "51efab13-f633-205b-8cd4-c3c858ae25d8";Source = {Id = "32b40ca6-c21f-5b84-ca05-38d88b35b567";PortNumber = None;PortType = PortType.Output;HostId = "ff10125a-601f-e1d5-e379-7eb7c65eb91f"};Target = {Id = "45a6e6f6-ed52-8de9-2fed-9f7a0bbb86dc";PortNumber = None;PortType = PortType.Input;HostId = "2947473e-2eef-864c-217a-dd5c1daaae44"};Vertices = [180.0,160.0; 205.0,160.0; 205.0,235.0; 230.0,235.0]}; + {Id = "10c6a066-34dd-e0e2-d53d-32c34fcddde6";Source = {Id = "25dc0c5b-e047-090b-5c2a-7ac216d80122";PortNumber = None;PortType = PortType.Output;HostId = "2947473e-2eef-864c-217a-dd5c1daaae44"};Target = {Id = "05a19e53-570c-f02f-0af2-7ba35c4a4b71";PortNumber = None;PortType = PortType.Input;HostId = "95452292-b507-ab43-f082-85152d3e4cf2"};Vertices = [280.0,235.0; 328.0,235.0]} + ] + +/// stateSync7 loaded as a dependency. +let stateSync7Dependency : LoadedComponent = { + Name = "combinatorial-sync" + TimeStamp = System.DateTime.MinValue + WaveInfo = None + FilePath = "" + CanvasState = stateSync7 + InputLabels = ["A", 1] + OutputLabels = ["B-Comb", 1; "B-Sync", 1] +} + +/// stateSync7 custom component. +let stateSync7CustomComponent : CustomComponentType = + CanvasStates.makeCustomComponent stateSync7Dependency + +/// stateSync7 Not-ed self looped in the synchronous branch. This is a +/// legitimate synchronous circuit and should pass. It is the same showed in +/// the report for the examples about combinatorial loops detection. +let stateSync8 : CanvasState = + [ + {H=50; W=40;Id = "eb5353fd-fac6-3b2a-4de8-8949046671d2";Type = Custom stateSync7CustomComponent;Label = "";InputPorts = [{Id = "04f9c8fe-06c2-b485-e181-73aa36617622";PortNumber = Some 0;PortType = PortType.Input;HostId = "eb5353fd-fac6-3b2a-4de8-8949046671d2"}];OutputPorts = [{Id = "b9f547be-e285-cb90-1803-b8d3a4c0d351";PortNumber = Some 0;PortType = PortType.Output;HostId = "eb5353fd-fac6-3b2a-4de8-8949046671d2"}; {Id = "9935af7b-9671-60a2-a76a-f00d3a372d6c";PortNumber = Some 1;PortType = PortType.Output;HostId = "eb5353fd-fac6-3b2a-4de8-8949046671d2"}];X = 302;Y = 256}; + {H=50; W=40;Id = "66030e1a-4a97-244a-f0bb-d9e5fd25627f";Type = Output 1;Label = "B";InputPorts = [{Id = "8bfcfe42-be19-e2fa-42ae-25e929cab003";PortNumber = Some 0;PortType = PortType.Input;HostId = "66030e1a-4a97-244a-f0bb-d9e5fd25627f"}];OutputPorts = [];X = 488;Y = 266}; + {H=50; W=40;Id = "825b172a-9355-8bf1-10fc-b18f06d4e76b";Type = Not;Label = "";InputPorts = [{Id = "69688e66-1a74-e959-f58a-6085a5ae5c57";PortNumber = Some 0;PortType = PortType.Input;HostId = "825b172a-9355-8bf1-10fc-b18f06d4e76b"}];OutputPorts = [{Id = "7f763373-0473-16b8-75da-f80541b220ec";PortNumber = Some 0;PortType = PortType.Output;HostId = "825b172a-9355-8bf1-10fc-b18f06d4e76b"}];X = 536;Y = 281} + ], + [ + {Id = "c1ba620c-e715-5f47-d05b-1a6937750f13";Source = {Id = "7f763373-0473-16b8-75da-f80541b220ec";PortNumber = None;PortType = PortType.Output;HostId = "825b172a-9355-8bf1-10fc-b18f06d4e76b"};Target = {Id = "04f9c8fe-06c2-b485-e181-73aa36617622";PortNumber = None;PortType = PortType.Input;HostId = "eb5353fd-fac6-3b2a-4de8-8949046671d2"};Vertices = [566.0,296.0; 586.0,296.0; 586.0,395.0; 282.0,395.0; 282.0,286.0; 302.0,286.0]}; + {Id = "b1a62f29-11d6-957d-da22-f780a247ad24";Source = {Id = "9935af7b-9671-60a2-a76a-f00d3a372d6c";PortNumber = None;PortType = PortType.Output;HostId = "eb5353fd-fac6-3b2a-4de8-8949046671d2"};Target = {Id = "69688e66-1a74-e959-f58a-6085a5ae5c57";PortNumber = None;PortType = PortType.Input;HostId = "825b172a-9355-8bf1-10fc-b18f06d4e76b"};Vertices = [374.0,296.0; 536.0,296.0]}; + {Id = "ee6ffc42-4a79-edff-3eb2-7008eec7a649";Source = {Id = "b9f547be-e285-cb90-1803-b8d3a4c0d351";PortNumber = None;PortType = PortType.Output;HostId = "eb5353fd-fac6-3b2a-4de8-8949046671d2"};Target = {Id = "8bfcfe42-be19-e2fa-42ae-25e929cab003";PortNumber = None;PortType = PortType.Input;HostId = "66030e1a-4a97-244a-f0bb-d9e5fd25627f"};Vertices = [374.0,276.0; 488.0,276.0]} + ] + +/// stateSync8 loaded as a dependency. +let stateSync8Dependency : LoadedComponent = { + Name = "fake-combinatorial-loop" + TimeStamp = System.DateTime.MinValue + WaveInfo = None + FilePath = "" + CanvasState = stateSync8 + InputLabels = [] + OutputLabels = ["B", 1;] +} + +/// stateSync8 custom component. +let stateSync8CustomComponent : CustomComponentType = + CanvasStates.makeCustomComponent stateSync8Dependency + +/// StateSync8 connected to an output. Legitmate ciruit that behaves precisely +/// like stateSync8. +let stateSync9 : CanvasState = + [ + {H=50; W=40;Id = "16e7b03d-6504-a148-e207-ce99634ee5c5";Type = Custom stateSync8CustomComponent;Label = "loop2";InputPorts = [];OutputPorts = [{Id = "1db2fde2-c823-9ac8-1b7f-5187166934e9";PortNumber = Some 0;PortType = PortType.Output;HostId = "16e7b03d-6504-a148-e207-ce99634ee5c5"}];X = 568;Y = 310}; + {H=50; W=40;Id = "a100bada-b27f-15ca-accb-153e717a31f1";Type = Output 1;Label = "B";InputPorts = [{Id = "b2c8d4ef-bb50-3b2b-259b-e6381ca798a4";PortNumber = Some 0;PortType = PortType.Input;HostId = "a100bada-b27f-15ca-accb-153e717a31f1"}];OutputPorts = [];X = 715;Y = 315} + ], + [ + {Id = "2b617de7-dfcc-0287-1d9e-0f6a3b40de5b";Source = {Id = "1db2fde2-c823-9ac8-1b7f-5187166934e9";PortNumber = None;PortType = PortType.Output;HostId = "16e7b03d-6504-a148-e207-ce99634ee5c5"};Target = {Id = "b2c8d4ef-bb50-3b2b-259b-e6381ca798a4";PortNumber = None;PortType = PortType.Input;HostId = "a100bada-b27f-15ca-accb-153e717a31f1"};Vertices = [618.0,325.0; 715.0,325.0]} + ] + +/// A fully connected DFFE. +let stateSync10 : CanvasState = + [ + {H=50; W=40;Id = "5916f1cf-408e-4186-a839-c80926bfddf0";Type = Input 1;Label = "in";InputPorts = [];OutputPorts = [{Id = "e894fb40-804a-36d1-b2e8-6033afb61dfa";PortNumber = Some 0;PortType = PortType.Output;HostId = "5916f1cf-408e-4186-a839-c80926bfddf0"}];X = 109;Y = 95}; + {H=50; W=40;Id = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf";Type = DFFE;Label = "";InputPorts = [{Id = "c766cb8d-a762-04b9-f021-4a9175fdbc01";PortNumber = Some 0;PortType = PortType.Input;HostId = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf"}; {Id = "2b80cebe-c0af-4905-d443-fd99796ec8df";PortNumber = Some 1;PortType = PortType.Input;HostId = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf"}];OutputPorts = [{Id = "ecee9ad7-925f-c0b9-26d5-4cf8b96a9be1";PortNumber = Some 0;PortType = PortType.Output;HostId = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf"}];X = 273;Y = 80}; + {H=50; W=40;Id = "cab54371-5e07-9586-eb9b-be8cc417e610";Type = Input 1;Label = "en";InputPorts = [];OutputPorts = [{Id = "4c83ef6d-7267-2732-d828-c508fff7f889";PortNumber = Some 0;PortType = PortType.Output;HostId = "cab54371-5e07-9586-eb9b-be8cc417e610"}];X = 109;Y = 270}; + {H=50; W=40;Id = "a2c874bb-eaeb-d62d-8a72-5eeae48db694";Type = Output 1;Label = "out";InputPorts = [{Id = "df5f625f-43c4-28bb-c931-eae047edaa14";PortNumber = Some 0;PortType = PortType.Input;HostId = "a2c874bb-eaeb-d62d-8a72-5eeae48db694"}];OutputPorts = [];X = 495;Y = 95} + ], + [ + {Id = "7ab86f0a-1b2c-7901-0a12-cbe447f1f06d";Source = {Id = "e894fb40-804a-36d1-b2e8-6033afb61dfa";PortNumber = None;PortType = PortType.Output;HostId = "5916f1cf-408e-4186-a839-c80926bfddf0"};Target = {Id = "c766cb8d-a762-04b9-f021-4a9175fdbc01";PortNumber = None;PortType = PortType.Input;HostId = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf"};Vertices = [139.0,105.0; 273.0,105.0]}; + {Id = "04bb7d64-1899-a4f3-6c50-f53ccd84cd49";Source = {Id = "ecee9ad7-925f-c0b9-26d5-4cf8b96a9be1";PortNumber = None;PortType = PortType.Output;HostId = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf"};Target = {Id = "df5f625f-43c4-28bb-c931-eae047edaa14";PortNumber = None;PortType = PortType.Input;HostId = "a2c874bb-eaeb-d62d-8a72-5eeae48db694"};Vertices = [353.0,105.0; 495.0,105.0]}; + {Id = "de4f03d1-580c-eabb-7439-38b664b89aba";Source = {Id = "4c83ef6d-7267-2732-d828-c508fff7f889";PortNumber = None;PortType = PortType.Output;HostId = "cab54371-5e07-9586-eb9b-be8cc417e610"};Target = {Id = "2b80cebe-c0af-4905-d443-fd99796ec8df";PortNumber = None;PortType = PortType.Input;HostId = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf"};Vertices = [139.0,280.938; 313.0,280.938; 313.0,130.0]} + ] + +/// stateSync7 Not-ed self looped in the combinatorial branch. This is NOT a +/// legitimate circuit, has combinatorial cycle. Similar to stateSync8 but loops +/// with the other output of the custom component. +let stateSync11 : CanvasState = + [ + {H=50; W=40;Id = "c9d9659a-4476-de3a-a838-eeab15496c99";Type = Custom stateSync7CustomComponent;Label = "loop1";InputPorts = [{Id = "c52782db-1ac3-f0d5-28ca-02c8410eb78d";PortNumber = Some 0;PortType = PortType.Input;HostId = "c9d9659a-4476-de3a-a838-eeab15496c99"}];OutputPorts = [{Id = "eda8e4f2-f21b-12fc-b209-ad315b99a851";PortNumber = Some 0;PortType = PortType.Output;HostId = "c9d9659a-4476-de3a-a838-eeab15496c99"}; {Id = "627b5ddf-e4ef-5629-70d4-af674cf37b96";PortNumber = Some 1;PortType = PortType.Output;HostId = "c9d9659a-4476-de3a-a838-eeab15496c99"}];X = 508;Y = 245}; + {H=50; W=40;Id = "5c24921a-88e9-7bc2-ee89-97fefb694902";Type = Not;Label = "";InputPorts = [{Id = "e16cf7e3-d01f-29e5-8d0d-921194f2f909";PortNumber = Some 0;PortType = PortType.Input;HostId = "5c24921a-88e9-7bc2-ee89-97fefb694902"}];OutputPorts = [{Id = "50f7aed7-49de-5472-defa-cbf07c2c4f56";PortNumber = Some 0;PortType = PortType.Output;HostId = "5c24921a-88e9-7bc2-ee89-97fefb694902"}];X = 664;Y = 245}; + {H=50; W=40;Id = "68bfdbd5-b91f-9f34-0a32-2f8730856d49";Type = Output 1;Label = "B-Sync";InputPorts = [{Id = "ce17f39f-f79e-d9c5-78dd-379d4be0d3a4";PortNumber = Some 0;PortType = PortType.Input;HostId = "68bfdbd5-b91f-9f34-0a32-2f8730856d49"}];OutputPorts = [];X = 701;Y = 273} + ], + [ + {Id = "24e0a9c6-5a3a-e5e9-5034-0f831dcbe0f9";Source = {Id = "627b5ddf-e4ef-5629-70d4-af674cf37b96";PortNumber = None;PortType = PortType.Output;HostId = "c9d9659a-4476-de3a-a838-eeab15496c99"};Target = {Id = "ce17f39f-f79e-d9c5-78dd-379d4be0d3a4";PortNumber = None;PortType = PortType.Input;HostId = "68bfdbd5-b91f-9f34-0a32-2f8730856d49"};Vertices = [580.0,285.0; 640.5,285.0; 640.5,283.0; 701.0,283.0]}; + {Id = "bc1f9a51-5ca8-1aa0-b4bd-b86bc9646c20";Source = {Id = "eda8e4f2-f21b-12fc-b209-ad315b99a851";PortNumber = None;PortType = PortType.Output;HostId = "c9d9659a-4476-de3a-a838-eeab15496c99"};Target = {Id = "e16cf7e3-d01f-29e5-8d0d-921194f2f909";PortNumber = None;PortType = PortType.Input;HostId = "5c24921a-88e9-7bc2-ee89-97fefb694902"};Vertices = [580.0,265.0; 622.0,265.0; 622.0,260.0; 664.0,260.0]}; + {Id = "cc7a9da2-f78a-f3e1-1c2f-7323f2b43d15";Source = {Id = "50f7aed7-49de-5472-defa-cbf07c2c4f56";PortNumber = None;PortType = PortType.Output;HostId = "5c24921a-88e9-7bc2-ee89-97fefb694902"};Target = {Id = "c52782db-1ac3-f0d5-28ca-02c8410eb78d";PortNumber = None;PortType = PortType.Input;HostId = "c9d9659a-4476-de3a-a838-eeab15496c99"};Vertices = [694.0,260.0; 714.0,260.0; 714.0,195.5; 488.0,195.5; 488.0,275.0; 508.0,275.0]} + ] + +/// stateSync11 loaded as a dependency. +let stateSync11Dependency : LoadedComponent = { + Name = "combinatorial-loop" + TimeStamp = System.DateTime.MinValue + WaveInfo = None + FilePath = "" + CanvasState = stateSync11 + InputLabels = [] + OutputLabels = ["B-Sync", 1;] +} + +/// stateSync11 custom component. +let stateSync11CustomComponent : CustomComponentType = + CanvasStates.makeCustomComponent stateSync11Dependency + +/// StateSync11 connected to an output. Should spot cycle in the dependency. +let stateSync12 : CanvasState = + [ + {H=50; W=40;Id = "eab95b08-cf95-15b7-ad8f-4eaffcefff6f";Type = Custom stateSync11CustomComponent;Label = "loop2-comb";InputPorts = [];OutputPorts = [{Id = "685a78e3-c891-d0c3-f973-1814b01edd28";PortNumber = Some 0;PortType = PortType.Output;HostId = "eab95b08-cf95-15b7-ad8f-4eaffcefff6f"}];X = 354;Y = 215}; + {H=50; W=40;Id = "638304a8-99e8-fe4f-4503-b50c64f45756";Type = Output 1;Label = "B-Comb";InputPorts = [{Id = "3b0171fa-dffe-f4c5-5f8c-e365112bae2f";PortNumber = Some 0;PortType = PortType.Input;HostId = "638304a8-99e8-fe4f-4503-b50c64f45756"}];OutputPorts = [];X = 532;Y = 220} + ], + [ + {Id = "f7c55a63-955e-6edd-0db6-fe320dc02c02";Source = {Id = "685a78e3-c891-d0c3-f973-1814b01edd28";PortNumber = None;PortType = PortType.Output;HostId = "eab95b08-cf95-15b7-ad8f-4eaffcefff6f"};Target = {Id = "3b0171fa-dffe-f4c5-5f8c-e365112bae2f";PortNumber = None;PortType = PortType.Input;HostId = "638304a8-99e8-fe4f-4503-b50c64f45756"};Vertices = [420.0,230.0; 532.0,230.0]} + ] diff --git a/Tests/CanvasStatesWithBuses.fs b/Tests/CanvasStatesWithBuses.fs new file mode 100644 index 0000000..8afa48a --- /dev/null +++ b/Tests/CanvasStatesWithBuses.fs @@ -0,0 +1,278 @@ +module CanvasStatesWithBuses + +open CommonTypes +open CanvasStates + +/// Two inputs connected to a MergeWires component. No other connections. +let stateBus1 : CanvasState = + [ + {H=50;W=40; Id = "08de9671-756c-44e0-905c-cde5b9a98aa9";Type = Input 1;Label = "a";InputPorts = [];OutputPorts = [{Id = "528c3ccc-9554-6a5b-129f-c88e55478ae2";PortNumber = Some 0;PortType = PortType.Output;HostId = "08de9671-756c-44e0-905c-cde5b9a98aa9"}];X = 100;Y = 100}; + {H=50;W=40; Id = "0b7b0ae5-dcca-f0af-3ba6-68231fdf80fc";Type = Input 1;Label = "b";InputPorts = [];OutputPorts = [{Id = "9de10edf-96be-beb0-2926-45f98b5dccb2";PortNumber = Some 0;PortType = PortType.Output;HostId = "0b7b0ae5-dcca-f0af-3ba6-68231fdf80fc"}];X = 100;Y = 169}; + {H=50;W=40; Id = "8caa65e2-97eb-ed9c-cd34-220b1fde3add";Type = MergeWires;Label = "";InputPorts = [{Id = "6d525499-76f1-001b-3cca-726c4aa9b2ee";PortNumber = Some 0;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}; {Id = "0d6f9b2f-d511-c08b-3b72-4c23975adeda";PortNumber = Some 1;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];OutputPorts = [{Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = Some 0;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];X = 230;Y = 138} + ], + [ + {Id = "conn0";Source = {Id = "528c3ccc-9554-6a5b-129f-c88e55478ae2";PortNumber = None;PortType = PortType.Output;HostId = "08de9671-756c-44e0-905c-cde5b9a98aa9"};Target = {Id = "6d525499-76f1-001b-3cca-726c4aa9b2ee";PortNumber = None;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Vertices = [130.0,110.0; 180.0,110.0; 180.0,138.0; 230.0,138.0]}; + {Id = "conn1";Source = {Id = "9de10edf-96be-beb0-2926-45f98b5dccb2";PortNumber = None;PortType = PortType.Output;HostId = "0b7b0ae5-dcca-f0af-3ba6-68231fdf80fc"};Target = {Id = "0d6f9b2f-d511-c08b-3b72-4c23975adeda";PortNumber = None;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Vertices = [130.0,179.0; 180.0,179.0; 180.0,158.0; 230.0,158.0]} + ] + +/// A MergeWires connected to a SplitWire 1. +let stateBus2 : CanvasState = + [ + {H=50;W=40; Id = "8caa65e2-97eb-ed9c-cd34-220b1fde3add";Type = MergeWires;Label = "";InputPorts = [{Id = "6d525499-76f1-001b-3cca-726c4aa9b2ee";PortNumber = Some 0;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}; {Id = "0d6f9b2f-d511-c08b-3b72-4c23975adeda";PortNumber = Some 1;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];OutputPorts = [{Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = Some 0;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];X = 230;Y = 138}; + {H=50;W=40; Id = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2";Type = SplitWire 1;Label = "";InputPorts = [{Id = "ba539631-cbee-1c40-e2ad-755e3c4893ab";PortNumber = Some 0;PortType = PortType.Input;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}];OutputPorts = [{Id = "9f93cb8f-ad50-a556-57fb-3f1ec4cbdaba";PortNumber = Some 0;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}; {Id = "58dc5768-a64d-e6d6-36cc-fecdd57b57d7";PortNumber = Some 1;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}];X = 336;Y = 138} + ], + [ + {Id = "conn0";Source = {Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = None;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Target = {Id = "ba539631-cbee-1c40-e2ad-755e3c4893ab";PortNumber = None;PortType = PortType.Input;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"};Vertices = [270.0,148.0; 336.0,148.0]} + ] + +/// A MergeWires connected to a SplitWire 1 and a single-bit output node. +let stateBus3 : CanvasState = + [ + {H=50;W=40; Id = "8caa65e2-97eb-ed9c-cd34-220b1fde3add";Type = MergeWires;Label = "";InputPorts = [{Id = "6d525499-76f1-001b-3cca-726c4aa9b2ee";PortNumber = Some 0;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}; {Id = "0d6f9b2f-d511-c08b-3b72-4c23975adeda";PortNumber = Some 1;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];OutputPorts = [{Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = Some 0;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];X = 230;Y = 138}; + {H=50;W=40; Id = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2";Type = SplitWire 1;Label = "";InputPorts = [{Id = "ba539631-cbee-1c40-e2ad-755e3c4893ab";PortNumber = Some 0;PortType = PortType.Input;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}];OutputPorts = [{Id = "9f93cb8f-ad50-a556-57fb-3f1ec4cbdaba";PortNumber = Some 0;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}; {Id = "58dc5768-a64d-e6d6-36cc-fecdd57b57d7";PortNumber = Some 1;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}];X = 336;Y = 138} + {H=50;W=40; Id = "7af6a475-990d-015f-e9e0-4a680cc84173";Type = Output 1;Label = "a";InputPorts = [{Id = "cefbb411-481e-d04d-c5a0-02f3921e423f";PortNumber = Some 0;PortType = PortType.Input;HostId = "7af6a475-990d-015f-e9e0-4a680cc84173"}];OutputPorts = [];X = 346;Y = 63} + ], + [ + {Id = "conn0";Source = {Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = None;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Target = {Id = "ba539631-cbee-1c40-e2ad-755e3c4893ab";PortNumber = None;PortType = PortType.Input;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"};Vertices = [270.0,148.0; 336.0,148.0]} + {Id = "conn1";Source = {Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = None;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Target = {Id = "cefbb411-481e-d04d-c5a0-02f3921e423f";PortNumber = None;PortType = PortType.Input;HostId = "7af6a475-990d-015f-e9e0-4a680cc84173"};Vertices = [270.0,148.0; 308.0,148.0; 308.0,73.0; 346.0,73.0]} + ] + +/// Like stateBus2 but with a loop. +let stateBus4 : CanvasState = + [ + {H=50;W=40; Id = "8caa65e2-97eb-ed9c-cd34-220b1fde3add";Type = MergeWires;Label = "";InputPorts = [{Id = "6d525499-76f1-001b-3cca-726c4aa9b2ee";PortNumber = Some 0;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}; {Id = "0d6f9b2f-d511-c08b-3b72-4c23975adeda";PortNumber = Some 1;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];OutputPorts = [{Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = Some 0;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];X = 230;Y = 138}; + {H=50;W=40; Id = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2";Type = SplitWire 1;Label = "";InputPorts = [{Id = "ba539631-cbee-1c40-e2ad-755e3c4893ab";PortNumber = Some 0;PortType = PortType.Input;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}];OutputPorts = [{Id = "9f93cb8f-ad50-a556-57fb-3f1ec4cbdaba";PortNumber = Some 0;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}; {Id = "58dc5768-a64d-e6d6-36cc-fecdd57b57d7";PortNumber = Some 1;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}];X = 336;Y = 138} + ], + [ + {Id = "conn0";Source = {Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = None;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Target = {Id = "ba539631-cbee-1c40-e2ad-755e3c4893ab";PortNumber = None;PortType = PortType.Input;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"};Vertices = [270.0,148.0; 336.0,148.0]} + {Id = "conn1";Source = {Id = "9f93cb8f-ad50-a556-57fb-3f1ec4cbdaba";PortNumber = None;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"};Target = {Id = "6d525499-76f1-001b-3cca-726c4aa9b2ee";PortNumber = None;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Vertices = [376.0,138.0; 396.0,138.0; 396.0,138.0; 210.0,138.0; 210.0,138.0; 230.0,138.0]} + ] + +/// All the bus components in series, properly connected. No other components. +let stateBus6 : CanvasState = + [ + {H=50;W=40; Id = "52a4b421-c919-6177-c66c-ec2a77379373";Type = SplitWire 1;Label = "";InputPorts = [{Id = "07e65ee3-58a7-a5e0-724a-0f56f2e528c5";PortNumber = Some 0;PortType = PortType.Input;HostId = "52a4b421-c919-6177-c66c-ec2a77379373"}];OutputPorts = [{Id = "8e27936c-75e6-5ad1-777e-6aa111b2d584";PortNumber = Some 0;PortType = PortType.Output;HostId = "52a4b421-c919-6177-c66c-ec2a77379373"}; {Id = "1385e5ca-c8e7-b209-402f-b85c42023bdb";PortNumber = Some 1;PortType = PortType.Output;HostId = "52a4b421-c919-6177-c66c-ec2a77379373"}];X = 614;Y = 258}; + {H=50;W=40; Id = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d";Type = MergeWires;Label = "";InputPorts = [{Id = "94d62be4-60ae-4e5f-add7-3715341617aa";PortNumber = Some 0;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}; {Id = "c8e1b3ee-d1c7-e576-6e8e-eca93bb33fce";PortNumber = Some 1;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}];OutputPorts = [{Id = "cabe29d9-74ea-06b9-8421-8547090727f9";PortNumber = Some 0;PortType = PortType.Output;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}];X = 241;Y = 248}; + {H=50;W=40; Id = "66dd284a-9199-fda1-867b-4e6b837a7ae5";Type = MergeWires;Label = "";InputPorts = [{Id = "2ee75313-e4e3-4ab8-9e36-a5089e49278d";PortNumber = Some 0;PortType = PortType.Input;HostId = "66dd284a-9199-fda1-867b-4e6b837a7ae5"}; {Id = "a5d69516-6a23-a363-e86f-2fe2a062e722";PortNumber = Some 1;PortType = PortType.Input;HostId = "66dd284a-9199-fda1-867b-4e6b837a7ae5"}];OutputPorts = [{Id = "caf8086a-b657-bc0a-5684-a25556b95845";PortNumber = Some 0;PortType = PortType.Output;HostId = "66dd284a-9199-fda1-867b-4e6b837a7ae5"}];X = 153;Y = 258}; + {H=50;W=40; Id = "02e33421-bea8-657b-1e17-6e0df31696d5";Type = SplitWire 2;Label = "";InputPorts = [{Id = "ed9727f2-373b-9f23-9293-dacea5a5476b";PortNumber = Some 0;PortType = PortType.Input;HostId = "02e33421-bea8-657b-1e17-6e0df31696d5"}];OutputPorts = [{Id = "7beda885-b4f4-f5be-ada5-476643c2cec3";PortNumber = Some 0;PortType = PortType.Output;HostId = "02e33421-bea8-657b-1e17-6e0df31696d5"}; {Id = "853f0e05-b301-db44-d437-d50abef0065b";PortNumber = Some 1;PortType = PortType.Output;HostId = "02e33421-bea8-657b-1e17-6e0df31696d5"}];X = 531;Y = 248}; + {H=50;W=40; Id = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67";Type = MergeWires;Label = "";InputPorts = [{Id = "b87776d8-4588-4dc1-3251-342683ee4ba8";PortNumber = Some 0;PortType = PortType.Input;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"}; {Id = "b26122bb-0ce1-8e3e-1021-a9aec7c4c0ca";PortNumber = Some 1;PortType = PortType.Input;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"}];OutputPorts = [{Id = "211fd204-86fe-e959-b4fa-129d1b4accb4";PortNumber = Some 0;PortType = PortType.Output;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"}];X = 329;Y = 258}; + {H=50;W=40; Id = "a7db69d3-5a34-e5d2-46d1-19fe8879b625";Type = SplitWire 1;Label = "";InputPorts = [{Id = "075ab754-bff4-ce21-0384-1f46f1ae986a";PortNumber = Some 0;PortType = PortType.Input;HostId = "a7db69d3-5a34-e5d2-46d1-19fe8879b625"}];OutputPorts = [{Id = "673c4ac0-9c68-6f3c-dfd4-6b129b956357";PortNumber = Some 0;PortType = PortType.Output;HostId = "a7db69d3-5a34-e5d2-46d1-19fe8879b625"}; {Id = "3a314510-a373-0c2c-50c1-ac3ce9d5f4f7";PortNumber = Some 1;PortType = PortType.Output;HostId = "a7db69d3-5a34-e5d2-46d1-19fe8879b625"}];X = 438;Y = 258} + ], + [ + {Id = "conn0";Source = {Id = "caf8086a-b657-bc0a-5684-a25556b95845";PortNumber = None;PortType = PortType.Output;HostId = "66dd284a-9199-fda1-867b-4e6b837a7ae5"};Target = {Id = "c8e1b3ee-d1c7-e576-6e8e-eca93bb33fce";PortNumber = None;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"};Vertices = [193.0,268.0; 230.0,268.0; 230.0,268.0; 241.0,268.0]}; + {Id = "conn1";Source = {Id = "cabe29d9-74ea-06b9-8421-8547090727f9";PortNumber = None;PortType = PortType.Output;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"};Target = {Id = "b87776d8-4588-4dc1-3251-342683ee4ba8";PortNumber = None;PortType = PortType.Input;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"};Vertices = [281.0,258.0; 329.0,258.0]} + {Id = "conn2";Source = {Id = "211fd204-86fe-e959-b4fa-129d1b4accb4";PortNumber = None;PortType = PortType.Output;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"};Target = {Id = "075ab754-bff4-ce21-0384-1f46f1ae986a";PortNumber = None;PortType = PortType.Input;HostId = "a7db69d3-5a34-e5d2-46d1-19fe8879b625"};Vertices = [369.0,268.0; 438.0,268.0]}; + {Id = "conn3";Source = {Id = "673c4ac0-9c68-6f3c-dfd4-6b129b956357";PortNumber = None;PortType = PortType.Output;HostId = "a7db69d3-5a34-e5d2-46d1-19fe8879b625"};Target = {Id = "ed9727f2-373b-9f23-9293-dacea5a5476b";PortNumber = None;PortType = PortType.Input;HostId = "02e33421-bea8-657b-1e17-6e0df31696d5"};Vertices = [478.0,258.0; 531.0,258.0]}; + {Id = "conn4";Source = {Id = "853f0e05-b301-db44-d437-d50abef0065b";PortNumber = None;PortType = PortType.Output;HostId = "02e33421-bea8-657b-1e17-6e0df31696d5"};Target = {Id = "07e65ee3-58a7-a5e0-724a-0f56f2e528c5";PortNumber = None;PortType = PortType.Input;HostId = "52a4b421-c919-6177-c66c-ec2a77379373"};Vertices = [571.0,268.0; 614.0,268.0]}; + ] + +/// Non-inferrable loop: MergeWires connected to MergeWires and loop back. +let stateBus7 : CanvasState = + [ + {H=50;W=40; Id = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d";Type = MergeWires;Label = "";InputPorts = [{Id = "94d62be4-60ae-4e5f-add7-3715341617aa";PortNumber = Some 0;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}; {Id = "c8e1b3ee-d1c7-e576-6e8e-eca93bb33fce";PortNumber = Some 1;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}];OutputPorts = [{Id = "cabe29d9-74ea-06b9-8421-8547090727f9";PortNumber = Some 0;PortType = PortType.Output;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}];X = 241;Y = 248}; + {H=50;W=40; Id = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67";Type = MergeWires;Label = "";InputPorts = [{Id = "b87776d8-4588-4dc1-3251-342683ee4ba8";PortNumber = Some 0;PortType = PortType.Input;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"}; {Id = "b26122bb-0ce1-8e3e-1021-a9aec7c4c0ca";PortNumber = Some 1;PortType = PortType.Input;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"}];OutputPorts = [{Id = "211fd204-86fe-e959-b4fa-129d1b4accb4";PortNumber = Some 0;PortType = PortType.Output;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"}];X = 325;Y = 258} + ], + [ + {Id = "conn0";Source = {Id = "211fd204-86fe-e959-b4fa-129d1b4accb4";PortNumber = None;PortType = PortType.Output;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"};Target = {Id = "c8e1b3ee-d1c7-e576-6e8e-eca93bb33fce";PortNumber = None;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"};Vertices = [365.0,268.0; 385.0,268.0; 385.0,307.0; 221.0,307.0; 221.0,268.0; 241.0,268.0]}; + {Id = "conn1";Source = {Id = "cabe29d9-74ea-06b9-8421-8547090727f9";PortNumber = None;PortType = PortType.Output;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"};Target = {Id = "b87776d8-4588-4dc1-3251-342683ee4ba8";PortNumber = None;PortType = PortType.Input;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"};Vertices = [281.0,258.0; 325.0,258.0]} + ] + +/// Mux connected to two PushBusFirst. Width not inferrable. +let stateBus8 : CanvasState = + [ + {H=50;W=40; Id = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d";Type = MergeWires;Label = "";InputPorts = [{Id = "94d62be4-60ae-4e5f-add7-3715341617aa";PortNumber = Some 0;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}; {Id = "c8e1b3ee-d1c7-e576-6e8e-eca93bb33fce";PortNumber = Some 1;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}];OutputPorts = [{Id = "cabe29d9-74ea-06b9-8421-8547090727f9";PortNumber = Some 0;PortType = PortType.Output;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}];X = 241;Y = 248}; + {H=50;W=40; Id = "3875f58b-8744-291d-1f4f-bca5b1a1eda5";Type = Mux2;Label = "mux2";InputPorts = [{Id = "6758d0e5-2618-afe4-473b-43c5002abf74";PortNumber = Some 0;PortType = PortType.Input;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}; {Id = "401a0856-683d-6ed2-c193-53d1761ad7a4";PortNumber = Some 1;PortType = PortType.Input;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}; {Id = "cf514335-b50d-eb19-c6f5-18303cda0b13";PortNumber = Some 2;PortType = PortType.Input;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}];OutputPorts = [{Id = "6bf59da3-ea8a-30c3-163d-37dbefd821bc";PortNumber = Some 0;PortType = PortType.Output;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}];X = 145;Y = 190}; + {H=50;W=40; Id = "536f5ede-5b98-ce3f-db3e-e96de247a89b";Type = MergeWires;Label = "";InputPorts = [{Id = "b871e19d-2bec-0cc1-8c71-0fbee278bf51";PortNumber = Some 0;PortType = PortType.Input;HostId = "536f5ede-5b98-ce3f-db3e-e96de247a89b"}; {Id = "69b5caec-1da0-9ecb-d7fc-fbd9af66fc23";PortNumber = Some 1;PortType = PortType.Input;HostId = "536f5ede-5b98-ce3f-db3e-e96de247a89b"}];OutputPorts = [{Id = "6b2d64d3-7697-a97f-ed51-f0991d77b6b9";PortNumber = Some 0;PortType = PortType.Output;HostId = "536f5ede-5b98-ce3f-db3e-e96de247a89b"}];X = 336;Y = 237} + ], + [ + {Id = "conn0";Source = {Id = "6bf59da3-ea8a-30c3-163d-37dbefd821bc";PortNumber = None;PortType = PortType.Output;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"};Target = {Id = "94d62be4-60ae-4e5f-add7-3715341617aa";PortNumber = None;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"};Vertices = [175.0,215.0; 208.0,215.0; 208.0,248.0; 241.0,248.0]}; + {Id = "conn1";Source = {Id = "cabe29d9-74ea-06b9-8421-8547090727f9";PortNumber = None;PortType = PortType.Output;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"};Target = {Id = "69b5caec-1da0-9ecb-d7fc-fbd9af66fc23";PortNumber = None;PortType = PortType.Input;HostId = "536f5ede-5b98-ce3f-db3e-e96de247a89b"};Vertices = [281.0,258.0; 308.5,258.0; 308.5,257.0; 336.0,257.0]} + ] + +/// And connected to a SplitWire 1. +let stateBus9 : CanvasState = + [ + {H=50;W=40; Id = "3875f58b-8744-291d-1f4f-bca5b1a1eda5";Type = And;Label = "and";InputPorts = [{Id = "6758d0e5-2618-afe4-473b-43c5002abf74";PortNumber = Some 0;PortType = PortType.Input;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}; {Id = "401a0856-683d-6ed2-c193-53d1761ad7a4";PortNumber = Some 1;PortType = PortType.Input;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}];OutputPorts = [{Id = "6bf59da3-ea8a-30c3-163d-37dbefd821bc";PortNumber = Some 0;PortType = PortType.Output;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}];X = 145;Y = 190}; + {H=50;W=40; Id = "772307ab-2941-3343-28a2-faacaa0efc96";Type = SplitWire 1;Label = "";InputPorts = [{Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = Some 0;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];OutputPorts = [{Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = Some 0;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}; {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = Some 1;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];X = 262;Y = 205} + ], + [ + {Id = "conn0";Source = {Id = "6bf59da3-ea8a-30c3-163d-37dbefd821bc";PortNumber = None;PortType = PortType.Output;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"};Target = {Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = None;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Vertices = [175.0,215.0; 262.0,215.0]} + ] + +/// Two inputs, packed into a bus, unpacked into two outputs. +let stateBus10 : CanvasState = + [ + {H=50;W=40; Id = "772307ab-2941-3343-28a2-faacaa0efc96";Type = SplitWire 1;Label = "";InputPorts = [{Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = Some 0;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];OutputPorts = [{Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = Some 0;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}; {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = Some 1;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];X = 336;Y = 205}; + {H=50;W=40; Id = "74dcc790-927f-ae61-fd63-577c3387de0e";Type = MergeWires;Label = "";InputPorts = [{Id = "f4b2f416-0af3-8345-185a-d01b69fdda46";PortNumber = Some 0;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}; {Id = "edd76daa-336d-7c68-8d94-7bbe30539724";PortNumber = Some 1;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}];OutputPorts = [{Id = "6e7f6dfb-770b-1451-a569-1d20cc0785b6";PortNumber = Some 0;PortType = PortType.Output;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}];X = 235;Y = 205}; + {H=50;W=40; Id = "a91be585-2d3b-d872-be0f-b416c8eb03d2";Type = Input 1;Label = "a";InputPorts = [];OutputPorts = [{Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = Some 0;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"}];X = 110;Y = 175}; + {H=50;W=40; Id = "9985ebc6-1cd5-8863-1341-1d543d236d38";Type = Input 1;Label = "b";InputPorts = [];OutputPorts = [{Id = "3d87edd9-9572-df33-f8f8-9b77fbdd6bc5";PortNumber = Some 0;PortType = PortType.Output;HostId = "9985ebc6-1cd5-8863-1341-1d543d236d38"}];X = 110;Y = 245}; + {H=50;W=40; Id = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a";Type = Output 1;Label = "a-out";InputPorts = [{Id = "ee1bc94e-a726-8868-f25a-25b5fc44b60a";PortNumber = Some 0;PortType = PortType.Input;HostId = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a"}];OutputPorts = [];X = 449;Y = 178}; + {H=50;W=40; Id = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"; Type = Output 1; Label = "b-out"; InputPorts = [{Id = "a0194620-020c-8897-0207-9d7e9ee2a538"; PortNumber = Some 0; PortType = PortType.Input; HostId = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"}]; OutputPorts = []; X = 443; Y = 234} + ], + [ + {Id = "cfaa960d-99c2-0f40-4ac7-335f6a238e2b";Source = {Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = None;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"};Target = {Id = "f4b2f416-0af3-8345-185a-d01b69fdda46";PortNumber = None;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Vertices = [140.0,185.0; 187.5,185.0; 187.5,205.0; 235.0,205.0]}; + {Id = "78ceafbf-cfb8-4442-a6bb-62ed6a1893cd";Source = {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = None;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Target = {Id = "a0194620-020c-8897-0207-9d7e9ee2a538";PortNumber = None;PortType = PortType.Input;HostId = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"};Vertices = [376.0,225.0; 409.5,225.0; 409.5,244.0; 443.0,244.0]}; + {Id = "221f1ae2-9beb-5099-bc4c-a3f6c86214d4";Source = {Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = None;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Target = {Id = "ee1bc94e-a726-8868-f25a-25b5fc44b60a";PortNumber = None;PortType = PortType.Input;HostId = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a"};Vertices = [376.0,205.0; 412.5,205.0; 412.5,188.0; 449.0,188.0]}; + {Id = "1287faef-e07d-cca5-83c7-3aa3b1265cd8";Source = {Id = "3d87edd9-9572-df33-f8f8-9b77fbdd6bc5";PortNumber = None;PortType = PortType.Output;HostId = "9985ebc6-1cd5-8863-1341-1d543d236d38"};Target = {Id = "edd76daa-336d-7c68-8d94-7bbe30539724";PortNumber = None;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Vertices = [140.0,255.0; 187.5,255.0; 187.5,225.0; 235.0,225.0]}; + {Id = "35d2c879-dda4-f719-836f-f6daf9803c85";Source = {Id = "6e7f6dfb-770b-1451-a569-1d20cc0785b6";PortNumber = None;PortType = PortType.Output;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Target = {Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = None;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Vertices = [275.0,215.0; 336.0,215.0]} + ] + +/// Two inputs make a bus2, then Push input a to bus, then try to split into 2 single bits (fail). +let stateBus11 : CanvasState = + [ + {H=50;W=40; Id = "772307ab-2941-3343-28a2-faacaa0efc96";Type = SplitWire 1;Label = "";InputPorts = [{Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = Some 0;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];OutputPorts = [{Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = Some 0;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}; {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = Some 1;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];X = 410;Y = 200}; + {H=50;W=40; Id = "74dcc790-927f-ae61-fd63-577c3387de0e";Type = MergeWires;Label = "";InputPorts = [{Id = "f4b2f416-0af3-8345-185a-d01b69fdda46";PortNumber = Some 0;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}; {Id = "edd76daa-336d-7c68-8d94-7bbe30539724";PortNumber = Some 1;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}];OutputPorts = [{Id = "6e7f6dfb-770b-1451-a569-1d20cc0785b6";PortNumber = Some 0;PortType = PortType.Output;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}];X = 235;Y = 205}; + {H=50;W=40; Id = "a91be585-2d3b-d872-be0f-b416c8eb03d2";Type = Input 1;Label = "a";InputPorts = [];OutputPorts = [{Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = Some 0;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"}];X = 110;Y = 175}; + {H=50;W=40; Id = "9985ebc6-1cd5-8863-1341-1d543d236d38";Type = Input 1;Label = "b";InputPorts = [];OutputPorts = [{Id = "3d87edd9-9572-df33-f8f8-9b77fbdd6bc5";PortNumber = Some 0;PortType = PortType.Output;HostId = "9985ebc6-1cd5-8863-1341-1d543d236d38"}];X = 110;Y = 245}; + {H=50;W=40; Id = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a";Type = Output 1;Label = "a-out";InputPorts = [{Id = "ee1bc94e-a726-8868-f25a-25b5fc44b60a";PortNumber = Some 0;PortType = PortType.Input;HostId = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a"}];OutputPorts = [];X = 523;Y = 173}; + {H=50;W=40; Id = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b";Type = Output 1;Label = "b-out";InputPorts = [{Id = "a0194620-020c-8897-0207-9d7e9ee2a538";PortNumber = Some 0;PortType = PortType.Input;HostId = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"}];OutputPorts = [];X = 517;Y = 229}; + {H=50;W=40; Id = "94efe8d3-413b-9390-b627-be7bc91ae2d1";Type = MergeWires;Label = "";InputPorts = [{Id = "4a1da488-0834-1835-9649-6f4d5c172579";PortNumber = Some 0;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"}; {Id = "4f58042b-383e-7557-fa72-8b149ba177a2";PortNumber = Some 1;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"}];OutputPorts = [{Id = "3fbb97a2-aab1-b94d-c4cf-d52f8421f3b8";PortNumber = Some 0;PortType = PortType.Output;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"}];X = 317;Y = 196} + ], + [ + {Id = "conn";Source = {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = None;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Target = {Id = "a0194620-020c-8897-0207-9d7e9ee2a538";PortNumber = None;PortType = PortType.Input;HostId = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"};Vertices = [450.0,220.0; 483.5,220.0; 483.5,239.0; 517.0,239.0]}; + {Id = "221f1ae2-9beb-5099-bc4c-a3f6c86214d4";Source = {Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = None;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Target = {Id = "ee1bc94e-a726-8868-f25a-25b5fc44b60a";PortNumber = None;PortType = PortType.Input;HostId = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a"};Vertices = [450.0,200.0; 503.0,200.0; 503.0,183.0; 523.0,183.0]}; + {Id = "conn1";Source = {Id = "3fbb97a2-aab1-b94d-c4cf-d52f8421f3b8";PortNumber = None;PortType = PortType.Output;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"};Target = {Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = None;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Vertices = [357.0,206.0; 383.5,206.0; 383.5,210.0; 410.0,210.0]}; + {Id = "1287faef-e07d-cca5-83c7-3aa3b1265cd8";Source = {Id = "3d87edd9-9572-df33-f8f8-9b77fbdd6bc5";PortNumber = None;PortType = PortType.Output;HostId = "9985ebc6-1cd5-8863-1341-1d543d236d38"};Target = {Id = "edd76daa-336d-7c68-8d94-7bbe30539724";PortNumber = None;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Vertices = [140.0,255.0; 187.5,255.0; 187.5,225.0; 235.0,225.0]}; + {Id = "3fd09a23-18c1-0edd-b7cb-a70a4b8d42ef";Source = {Id = "6e7f6dfb-770b-1451-a569-1d20cc0785b6";PortNumber = None;PortType = PortType.Output;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Target = {Id = "4f58042b-383e-7557-fa72-8b149ba177a2";PortNumber = None;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"};Vertices = [275.0,215.0; 296.0,215.0; 296.0,216.0; 317.0,216.0]}; + {Id = "d429c2f2-d60c-0dc9-2279-7022dc127783";Source = {Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = None;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"};Target = {Id = "4a1da488-0834-1835-9649-6f4d5c172579";PortNumber = None;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"};Vertices = [140.0,185.0; 187.5,185.0; 187.5,196.0; 317.0,196.0]}; + {Id = "cfaa960d-99c2-0f40-4ac7-335f6a238e2b";Source = {Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = None;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"};Target = {Id = "f4b2f416-0af3-8345-185a-d01b69fdda46";PortNumber = None;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Vertices = [140.0,185.0; 187.5,185.0; 187.5,205.0; 235.0,205.0]} + ] + +/// Pack 4 bits into a bus, then extract them. +let stateBus12 : CanvasState = + [ + {H=50;W=40; Id = "772307ab-2941-3343-28a2-faacaa0efc96";Type = SplitWire 1;Label = "";InputPorts = [{Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = Some 0;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];OutputPorts = [{Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = Some 0;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}; {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = Some 1;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];X = 627;Y = 205}; + {H=50;W=40; Id = "74dcc790-927f-ae61-fd63-577c3387de0e";Type = MergeWires;Label = "";InputPorts = [{Id = "f4b2f416-0af3-8345-185a-d01b69fdda46";PortNumber = Some 0;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}; {Id = "edd76daa-336d-7c68-8d94-7bbe30539724";PortNumber = Some 1;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}];OutputPorts = [{Id = "6e7f6dfb-770b-1451-a569-1d20cc0785b6";PortNumber = Some 0;PortType = PortType.Output;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}];X = 235;Y = 205}; + {H=50;W=40; Id = "94efe8d3-413b-9390-b627-be7bc91ae2d1";Type = MergeWires;Label = "";InputPorts = [{Id = "4a1da488-0834-1835-9649-6f4d5c172579";PortNumber = Some 0;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"}; {Id = "4f58042b-383e-7557-fa72-8b149ba177a2";PortNumber = Some 1;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"}];OutputPorts = [{Id = "3fbb97a2-aab1-b94d-c4cf-d52f8421f3b8";PortNumber = Some 0;PortType = PortType.Output;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"}];X = 299;Y = 195}; + {H=50;W=40; Id = "76de964a-124b-5c16-6de1-6158626344ac";Type = Input 1;Label = "a";InputPorts = [];OutputPorts = [{Id = "9dc8cfaa-c989-276a-6703-11196c5c7974";PortNumber = Some 0;PortType = PortType.Output;HostId = "76de964a-124b-5c16-6de1-6158626344ac"}];X = 110;Y = 111}; + {H=50;W=40; Id = "a91be585-2d3b-d872-be0f-b416c8eb03d2";Type = Input 1;Label = "b";InputPorts = [];OutputPorts = [{Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = Some 0;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"}];X = 110;Y = 175}; + {H=50;W=40; Id = "9985ebc6-1cd5-8863-1341-1d543d236d38";Type = Input 1;Label = "c";InputPorts = [];OutputPorts = [{Id = "3d87edd9-9572-df33-f8f8-9b77fbdd6bc5";PortNumber = Some 0;PortType = PortType.Output;HostId = "9985ebc6-1cd5-8863-1341-1d543d236d38"}];X = 110;Y = 245}; + {H=50;W=40; Id = "9824ceb8-e999-8e48-9a56-7a4349e495b1";Type = Input 1;Label = "d";InputPorts = [];OutputPorts = [{Id = "712999dd-e970-51b3-f38f-aee70ff42d2d";PortNumber = Some 0;PortType = PortType.Output;HostId = "9824ceb8-e999-8e48-9a56-7a4349e495b1"}];X = 110;Y = 326}; + {H=50;W=40; Id = "c16668ed-ec17-3a14-8a4b-dec6c40335b5";Type = MergeWires;Label = "";InputPorts = [{Id = "38d99b30-a219-c37e-df55-04b7240a599e";PortNumber = Some 0;PortType = PortType.Input;HostId = "c16668ed-ec17-3a14-8a4b-dec6c40335b5"}; {Id = "2f0c6067-124f-233b-1077-db88900c31cc";PortNumber = Some 1;PortType = PortType.Input;HostId = "c16668ed-ec17-3a14-8a4b-dec6c40335b5"}];OutputPorts = [{Id = "6c5a63af-db72-1ece-495d-7a04c88fd1f0";PortNumber = Some 0;PortType = PortType.Output;HostId = "c16668ed-ec17-3a14-8a4b-dec6c40335b5"}];X = 364;Y = 205}; + {H=50;W=40; Id = "59b45f9c-192c-98ce-da25-a94db45a5790";Type = Output 1;Label = "a-out";InputPorts = [{Id = "e62e040a-bcd2-58f6-39d5-24548811b784";PortNumber = Some 0;PortType = PortType.Input;HostId = "59b45f9c-192c-98ce-da25-a94db45a5790"}];OutputPorts = [];X = 746;Y = 111}; + {H=50;W=40; Id = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a";Type = Output 1;Label = "b-out";InputPorts = [{Id = "ee1bc94e-a726-8868-f25a-25b5fc44b60a";PortNumber = Some 0;PortType = PortType.Input;HostId = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a"}];OutputPorts = [];X = 743;Y = 174}; + {H=50;W=40; Id = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b";Type = Output 1;Label = "c-out";InputPorts = [{Id = "a0194620-020c-8897-0207-9d7e9ee2a538";PortNumber = Some 0;PortType = PortType.Input;HostId = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"}];OutputPorts = [];X = 743;Y = 230}; + {H=50;W=40; Id = "214620f0-51f6-59fe-1558-ed47fd2c680a";Type = Output 1;Label = "d-out";InputPorts = [{Id = "b6e25648-a9a1-9c9c-935d-5f50a26c6c2b";PortNumber = Some 0;PortType = PortType.Input;HostId = "214620f0-51f6-59fe-1558-ed47fd2c680a"}];OutputPorts = [];X = 743;Y = 315}; + {H=50;W=40; Id = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf";Type = SplitWire 1;Label = "";InputPorts = [{Id = "2a6d1069-81da-f185-ad82-3c524819f56a";PortNumber = Some 0;PortType = PortType.Input;HostId = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf"}];OutputPorts = [{Id = "f72513fe-f696-dbae-133b-6c864c7075a2";PortNumber = Some 0;PortType = PortType.Output;HostId = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf"}; {Id = "8333c9b0-911e-aab3-b7fd-026d97b4a412";PortNumber = Some 1;PortType = PortType.Output;HostId = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf"}];X = 546;Y = 195}; + {H=50;W=40; Id = "156b43f1-5e54-b058-c716-c5623c5f6e37";Type = SplitWire 3;Label = "";InputPorts = [{Id = "67424fbf-f200-6690-a8e6-450e951d9411";PortNumber = Some 0;PortType = PortType.Input;HostId = "156b43f1-5e54-b058-c716-c5623c5f6e37"}];OutputPorts = [{Id = "58405846-6427-732c-c901-f72f1162b36e";PortNumber = Some 0;PortType = PortType.Output;HostId = "156b43f1-5e54-b058-c716-c5623c5f6e37"}; {Id = "d40a1df5-6b29-5b4d-486f-925a2d16a615";PortNumber = Some 1;PortType = PortType.Output;HostId = "156b43f1-5e54-b058-c716-c5623c5f6e37"}];X = 442;Y = 205} + ], + [ + {Id = "5a9d111c-acec-3973-01ea-d0590e547b89";Source = {Id = "d40a1df5-6b29-5b4d-486f-925a2d16a615";PortNumber = None;PortType = PortType.Output;HostId = "156b43f1-5e54-b058-c716-c5623c5f6e37"};Target = {Id = "b6e25648-a9a1-9c9c-935d-5f50a26c6c2b";PortNumber = None;PortType = PortType.Input;HostId = "214620f0-51f6-59fe-1558-ed47fd2c680a"};Vertices = [482.0,225.0; 510.5,225.0; 510.5,325.0; 743.0,325.0]}; + {Id = "8f3205ca-5911-5a36-68da-4e8ca384c4a2";Source = {Id = "f72513fe-f696-dbae-133b-6c864c7075a2";PortNumber = None;PortType = PortType.Output;HostId = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf"};Target = {Id = "e62e040a-bcd2-58f6-39d5-24548811b784";PortNumber = None;PortType = PortType.Input;HostId = "59b45f9c-192c-98ce-da25-a94db45a5790"};Vertices = [586.0,195.0; 666.0,195.0; 666.0,121.0; 746.0,121.0]}; + {Id = "1287faef-e07d-cca5-83c7-3aa3b1265cd8";Source = {Id = "3d87edd9-9572-df33-f8f8-9b77fbdd6bc5";PortNumber = None;PortType = PortType.Output;HostId = "9985ebc6-1cd5-8863-1341-1d543d236d38"};Target = {Id = "edd76daa-336d-7c68-8d94-7bbe30539724";PortNumber = None;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Vertices = [140.0,255.0; 187.5,255.0; 187.5,225.0; 235.0,225.0]}; + {Id = "cfaa960d-99c2-0f40-4ac7-335f6a238e2b";Source = {Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = None;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"};Target = {Id = "f4b2f416-0af3-8345-185a-d01b69fdda46";PortNumber = None;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Vertices = [140.0,185.0; 187.5,185.0; 187.5,205.0; 235.0,205.0]}; + {Id = "56e8c89b-bcbf-e674-a49d-72d06c20a563";Source = {Id = "712999dd-e970-51b3-f38f-aee70ff42d2d";PortNumber = None;PortType = PortType.Output;HostId = "9824ceb8-e999-8e48-9a56-7a4349e495b1"};Target = {Id = "2f0c6067-124f-233b-1077-db88900c31cc";PortNumber = None;PortType = PortType.Input;HostId = "c16668ed-ec17-3a14-8a4b-dec6c40335b5"};Vertices = [140.0,336.0; 344.0,336.0; 344.0,225.0; 364.0,225.0]}; + {Id = "221f1ae2-9beb-5099-bc4c-a3f6c86214d4";Source = {Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = None;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Target = {Id = "ee1bc94e-a726-8868-f25a-25b5fc44b60a";PortNumber = None;PortType = PortType.Input;HostId = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a"};Vertices = [667.0,205.0; 723.0,205.0; 723.0,184.0; 743.0,184.0]}; + {Id = "78ceafbf-cfb8-4442-a6bb-62ed6a1893cd";Source = {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = None;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Target = {Id = "a0194620-020c-8897-0207-9d7e9ee2a538";PortNumber = None;PortType = PortType.Input;HostId = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"};Vertices = [667.0,225.0; 703.5,225.0; 703.5,240.0; 743.0,240.0]}; + {Id = "edc53e8b-8c1e-340f-aaec-7eecf337a9a8";Source = {Id = "9dc8cfaa-c989-276a-6703-11196c5c7974";PortNumber = None;PortType = PortType.Output;HostId = "76de964a-124b-5c16-6de1-6158626344ac"};Target = {Id = "4a1da488-0834-1835-9649-6f4d5c172579";PortNumber = None;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"};Vertices = [140.0,121.0; 279.5,121.0; 279.5,195.0; 299.5,195.0]}; + {Id = "3fd09a23-18c1-0edd-b7cb-a70a4b8d42ef";Source = {Id = "6e7f6dfb-770b-1451-a569-1d20cc0785b6";PortNumber = None;PortType = PortType.Output;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Target = {Id = "4f58042b-383e-7557-fa72-8b149ba177a2";PortNumber = None;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"};Vertices = [275.0,215.0; 299.5,215.0]}; + {Id = "7aaafe2c-9648-bb9d-95cb-7ed8c8309150";Source = {Id = "3fbb97a2-aab1-b94d-c4cf-d52f8421f3b8";PortNumber = None;PortType = PortType.Output;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"};Target = {Id = "38d99b30-a219-c37e-df55-04b7240a599e";PortNumber = None;PortType = PortType.Input;HostId = "c16668ed-ec17-3a14-8a4b-dec6c40335b5"};Vertices = [339.5,205.0; 364.0,205.0]}; + {Id = "4852ec1c-5960-6696-b8c1-650b9517cb56";Source = {Id = "8333c9b0-911e-aab3-b7fd-026d97b4a412";PortNumber = None;PortType = PortType.Output;HostId = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf"};Target = {Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = None;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Vertices = [586.0,215.0; 627.0,215.0]}; + {Id = "960e38bd-dd14-5109-ac25-8c701249f48b";Source = {Id = "6c5a63af-db72-1ece-495d-7a04c88fd1f0";PortNumber = None;PortType = PortType.Output;HostId = "c16668ed-ec17-3a14-8a4b-dec6c40335b5"};Target = {Id = "67424fbf-f200-6690-a8e6-450e951d9411";PortNumber = None;PortType = PortType.Input;HostId = "156b43f1-5e54-b058-c716-c5623c5f6e37"};Vertices = [404.0,215.0; 442.0,215.0]}; + {Id = "6d0843df-f606-4fb5-0349-ae90260e6c28";Source = {Id = "58405846-6427-732c-c901-f72f1162b36e";PortNumber = None;PortType = PortType.Output;HostId = "156b43f1-5e54-b058-c716-c5623c5f6e37"};Target = {Id = "2a6d1069-81da-f185-ad82-3c524819f56a";PortNumber = None;PortType = PortType.Input;HostId = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf"};Vertices = [482.0,205.0; 546.0,205.0]} + ] + +/// A 4 bit input connected to a 4 bit output. +let stateBus13 : CanvasState = + [ + {H=50;W=40; Id = "9bcba47e-deae-0b3f-2079-a1b124526b00";Type = Input 4;Label = "a";InputPorts = [];OutputPorts = [{Id = "f9f6284f-1663-ec81-5c5c-0a6660d1d524";PortNumber = Some 0;PortType = PortType.Output;HostId = "9bcba47e-deae-0b3f-2079-a1b124526b00"}];X = 100;Y = 100}; + {H=50;W=40; Id = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97";Type = Output 4;Label = "b";InputPorts = [{Id = "ba682a02-30db-a03f-db83-8f3ab1afc6e0";PortNumber = Some 0;PortType = PortType.Input;HostId = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97"}];OutputPorts = [];X = 193;Y = 100} + ], + [ + {Id = "conn";Source = {Id = "f9f6284f-1663-ec81-5c5c-0a6660d1d524";PortNumber = None;PortType = PortType.Output;HostId = "9bcba47e-deae-0b3f-2079-a1b124526b00"};Target = {Id = "ba682a02-30db-a03f-db83-8f3ab1afc6e0";PortNumber = None;PortType = PortType.Input;HostId = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97"};Vertices = [130.0,110.0; 193.0,110.0]} + ] + +/// A 4 bit input connected to a 3 bit output. +let stateBus14 : CanvasState = + [ + {H=50;W=40; Id = "9bcba47e-deae-0b3f-2079-a1b124526b00";Type = Input 4;Label = "a";InputPorts = [];OutputPorts = [{Id = "f9f6284f-1663-ec81-5c5c-0a6660d1d524";PortNumber = Some 0;PortType = PortType.Output;HostId = "9bcba47e-deae-0b3f-2079-a1b124526b00"}];X = 100;Y = 100}; + {H=50;W=40; Id = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97";Type = Output 3;Label = "b";InputPorts = [{Id = "ba682a02-30db-a03f-db83-8f3ab1afc6e0";PortNumber = Some 0;PortType = PortType.Input;HostId = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97"}];OutputPorts = [];X = 193;Y = 100} + ], + [ + {Id = "conn";Source = {Id = "f9f6284f-1663-ec81-5c5c-0a6660d1d524";PortNumber = None;PortType = PortType.Output;HostId = "9bcba47e-deae-0b3f-2079-a1b124526b00"};Target = {Id = "ba682a02-30db-a03f-db83-8f3ab1afc6e0";PortNumber = None;PortType = PortType.Input;HostId = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97"};Vertices = [130.0,110.0; 193.0,110.0]} + ] + +/// A 3 bit input connected to a 4 bit output. +let stateBus15 : CanvasState = + [ + {H=50;W=40; Id = "9bcba47e-deae-0b3f-2079-a1b124526b00";Type = Input 3;Label = "a";InputPorts = [];OutputPorts = [{Id = "f9f6284f-1663-ec81-5c5c-0a6660d1d524";PortNumber = Some 0;PortType = PortType.Output;HostId = "9bcba47e-deae-0b3f-2079-a1b124526b00"}];X = 100;Y = 100}; + {H=50;W=40; Id = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97";Type = Output 4;Label = "b";InputPorts = [{Id = "ba682a02-30db-a03f-db83-8f3ab1afc6e0";PortNumber = Some 0;PortType = PortType.Input;HostId = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97"}];OutputPorts = [];X = 193;Y = 100} + ], + [ + {Id = "conn";Source = {Id = "f9f6284f-1663-ec81-5c5c-0a6660d1d524";PortNumber = None;PortType = PortType.Output;HostId = "9bcba47e-deae-0b3f-2079-a1b124526b00"};Target = {Id = "ba682a02-30db-a03f-db83-8f3ab1afc6e0";PortNumber = None;PortType = PortType.Input;HostId = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97"};Vertices = [130.0,110.0; 193.0,110.0]} + ] + +/// A 2 bit input split into 2 single bit outputs. +let stateBus16 : CanvasState = + [ + {H=50;W=40; Id = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5";Type = SplitWire 1;Label = "";InputPorts = [{Id = "a5977d59-b944-6651-bf91-3f3700bca60b";PortNumber = Some 0;PortType = PortType.Input;HostId = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5"}];OutputPorts = [{Id = "de1e9d70-4ce1-c6d9-cb87-30f632c9e1d1";PortNumber = Some 0;PortType = PortType.Output;HostId = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5"}; {Id = "dc05cdf8-5ef7-c605-6c5b-bb8842c49089";PortNumber = Some 1;PortType = PortType.Output;HostId = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5"}];X = 202;Y = 112}; + {H=50;W=40; Id = "c6f000db-310f-d8ad-ff5e-938d7c2aaa7c";Type = Input 2;Label = "a";InputPorts = [];OutputPorts = [{Id = "28047c34-2af2-867e-9130-6eb128769eef";PortNumber = Some 0;PortType = PortType.Output;HostId = "c6f000db-310f-d8ad-ff5e-938d7c2aaa7c"}];X = 102;Y = 112}; + {H=50;W=40; Id = "60e2df66-bb8c-53f1-832d-e154c30cf9dd";Type = Output 1;Label = "b";InputPorts = [{Id = "24e75289-91d1-30e7-0ec5-409eb73f9ad3";PortNumber = Some 0;PortType = PortType.Input;HostId = "60e2df66-bb8c-53f1-832d-e154c30cf9dd"}];OutputPorts = [];X = 324;Y = 88}; + {H=50;W=40; Id = "85e19389-c087-8b30-6c0a-02f7cc753695";Type = Output 1;Label = "c";InputPorts = [{Id = "99c1d8ae-5e85-fbbf-892d-48acb0fdff82";PortNumber = Some 0;PortType = PortType.Input;HostId = "85e19389-c087-8b30-6c0a-02f7cc753695"}];OutputPorts = [];X = 324;Y = 152} + ], + [ + {Id = "conn0";Source = {Id = "28047c34-2af2-867e-9130-6eb128769eef";PortNumber = None;PortType = PortType.Output;HostId = "c6f000db-310f-d8ad-ff5e-938d7c2aaa7c"};Target = {Id = "a5977d59-b944-6651-bf91-3f3700bca60b";PortNumber = None;PortType = PortType.Input;HostId = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5"};Vertices = [132.0,122.0; 202.0,122.0]}; + {Id = "conn1";Source = {Id = "dc05cdf8-5ef7-c605-6c5b-bb8842c49089";PortNumber = None;PortType = PortType.Output;HostId = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5"};Target = {Id = "99c1d8ae-5e85-fbbf-892d-48acb0fdff82";PortNumber = None;PortType = PortType.Input;HostId = "85e19389-c087-8b30-6c0a-02f7cc753695"};Vertices = [242.0,132.0; 283.0,132.0; 283.0,162.0; 324.0,162.0]}; + {Id = "conn2";Source = {Id = "de1e9d70-4ce1-c6d9-cb87-30f632c9e1d1";PortNumber = None;PortType = PortType.Output;HostId = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5"};Target = {Id = "24e75289-91d1-30e7-0ec5-409eb73f9ad3";PortNumber = None;PortType = PortType.Input;HostId = "60e2df66-bb8c-53f1-832d-e154c30cf9dd"};Vertices = [242.0,112.0; 283.0,112.0; 283.0,98.0; 324.0,98.0]} + ] + +/// 3 bit input merged with 4 bit input, then split in the same way. +let stateBus17 : CanvasState = + [ + {H=50;W=40; Id = "6bcdc74a-9d71-3304-537d-1a17f02924eb";Type = Input 3;Label = "in3";InputPorts = [];OutputPorts = [{Id = "9e8b16ba-d450-c228-e64c-d5323cd4ca0a";PortNumber = Some 0;PortType = PortType.Output;HostId = "6bcdc74a-9d71-3304-537d-1a17f02924eb"}];X = 100;Y = 100}; + {H=50;W=40; Id = "97c4b56d-4f8c-2b00-fb61-a08cdd01dd76";Type = Input 4;Label = "in4";InputPorts = [];OutputPorts = [{Id = "2cf62d71-2b34-ab11-9007-19409fe13b77";PortNumber = Some 0;PortType = PortType.Output;HostId = "97c4b56d-4f8c-2b00-fb61-a08cdd01dd76"}];X = 100;Y = 183}; + {H=50;W=40; Id = "71d66801-50d5-4316-eb79-9e99a43cdfe4";Type = MergeWires;Label = "";InputPorts = [{Id = "6714352e-6a15-a388-3f3f-27c7cb0e6fc7";PortNumber = Some 0;PortType = PortType.Input;HostId = "71d66801-50d5-4316-eb79-9e99a43cdfe4"}; {Id = "32c34b03-b0f0-16f5-345a-fca3626f16c3";PortNumber = Some 1;PortType = PortType.Input;HostId = "71d66801-50d5-4316-eb79-9e99a43cdfe4"}];OutputPorts = [{Id = "85cc42dd-5ea8-0f62-a421-74d844f4de83";PortNumber = Some 0;PortType = PortType.Output;HostId = "71d66801-50d5-4316-eb79-9e99a43cdfe4"}];X = 190;Y = 138}; + {H=50;W=40; Id = "1a6e1bb4-cfe0-77f9-a207-f409168ef210";Type = Output 3;Label = "out3";InputPorts = [{Id = "ca111545-dbcd-e812-b81d-af6e51769f0e";PortNumber = Some 0;PortType = PortType.Input;HostId = "1a6e1bb4-cfe0-77f9-a207-f409168ef210"}];OutputPorts = [];X = 375;Y = 89}; + {H=50;W=40; Id = "d2676492-2302-24d9-52eb-6e69e7971339";Type = Output 4;Label = "out4";InputPorts = [{Id = "819cf4ff-57a7-4743-075b-0c07a983a866";PortNumber = Some 0;PortType = PortType.Input;HostId = "d2676492-2302-24d9-52eb-6e69e7971339"}];OutputPorts = [];X = 369;Y = 216}; + {H=50;W=40; Id = "bb51f8c6-2c82-5206-eb25-492e15849e81";Type = SplitWire 3;Label = "";InputPorts = [{Id = "4a440c75-75c5-1a5c-93d9-97ca3993683f";PortNumber = Some 0;PortType = PortType.Input;HostId = "bb51f8c6-2c82-5206-eb25-492e15849e81"}];OutputPorts = [{Id = "68ca1398-18c8-cea1-c6c2-61393fb33e08";PortNumber = Some 0;PortType = PortType.Output;HostId = "bb51f8c6-2c82-5206-eb25-492e15849e81"}; {Id = "be6c9827-eba7-6c19-ca75-7fcb1ac30dc9";PortNumber = Some 1;PortType = PortType.Output;HostId = "bb51f8c6-2c82-5206-eb25-492e15849e81"}];X = 254;Y = 138} + ], + [ + {Id = "9df32195-00b4-9795-3dc1-78fb70d453f2";Source = {Id = "68ca1398-18c8-cea1-c6c2-61393fb33e08";PortNumber = None;PortType = PortType.Output;HostId = "bb51f8c6-2c82-5206-eb25-492e15849e81"};Target = {Id = "ca111545-dbcd-e812-b81d-af6e51769f0e";PortNumber = None;PortType = PortType.Input;HostId = "1a6e1bb4-cfe0-77f9-a207-f409168ef210"};Vertices = [294.0,138.0; 334.5,138.0; 334.5,99.0; 375.0,99.0]}; + {Id = "82cc4ce9-7b15-40ac-0226-98a7f8e2fb9a";Source = {Id = "be6c9827-eba7-6c19-ca75-7fcb1ac30dc9";PortNumber = None;PortType = PortType.Output;HostId = "bb51f8c6-2c82-5206-eb25-492e15849e81"};Target = {Id = "819cf4ff-57a7-4743-075b-0c07a983a866";PortNumber = None;PortType = PortType.Input;HostId = "d2676492-2302-24d9-52eb-6e69e7971339"};Vertices = [294.0,158.0; 331.5,158.0; 331.5,226.0; 369.0,226.0]}; + {Id = "cd13c70f-6037-0cf4-1295-5795e92d745c";Source = {Id = "9e8b16ba-d450-c228-e64c-d5323cd4ca0a";PortNumber = None;PortType = PortType.Output;HostId = "6bcdc74a-9d71-3304-537d-1a17f02924eb"};Target = {Id = "6714352e-6a15-a388-3f3f-27c7cb0e6fc7";PortNumber = None;PortType = PortType.Input;HostId = "71d66801-50d5-4316-eb79-9e99a43cdfe4"};Vertices = [130.0,110.0; 160.0,110.0; 160.0,138.0; 190.0,138.0]}; + {Id = "7438de0c-bbaf-c1f6-0307-42ece66c6c00";Source = {Id = "2cf62d71-2b34-ab11-9007-19409fe13b77";PortNumber = None;PortType = PortType.Output;HostId = "97c4b56d-4f8c-2b00-fb61-a08cdd01dd76"};Target = {Id = "32c34b03-b0f0-16f5-345a-fca3626f16c3";PortNumber = None;PortType = PortType.Input;HostId = "71d66801-50d5-4316-eb79-9e99a43cdfe4"};Vertices = [130.0,193.0; 160.0,193.0; 160.0,158.0; 190.0,158.0]}; + {Id = "678ffa07-0ed7-7b6f-ba9b-b14839c08a71";Source = {Id = "85cc42dd-5ea8-0f62-a421-74d844f4de83";PortNumber = None;PortType = PortType.Output;HostId = "71d66801-50d5-4316-eb79-9e99a43cdfe4"};Target = {Id = "4a440c75-75c5-1a5c-93d9-97ca3993683f";PortNumber = None;PortType = PortType.Input;HostId = "bb51f8c6-2c82-5206-eb25-492e15849e81"};Vertices = [230.0,148.0; 254.0,148.0]} +] + +/// Partially connected Mux2. Top input (2 bits), select (1 bit) anc connection +/// to output (2 bits). +let stateBus18 : CanvasState = + [ + {H=50;W=40; Id = "8078a917-236f-5a40-18a6-8e2d6a1458f5";Type = Input 2;Label = "a";InputPorts = [];OutputPorts = [{Id = "cc7c6510-d49b-28d9-e0bc-d5350a2c76a8";PortNumber = Some 0;PortType = PortType.Output;HostId = "8078a917-236f-5a40-18a6-8e2d6a1458f5"}];X = 122;Y = 125}; + {H=50;W=40; Id = "ed12b5d8-556b-515a-cc9d-873960690380";Type = Input 1;Label = "b";InputPorts = [];OutputPorts = [{Id = "a6010bcb-ba2b-e57f-ca50-39f3d094e3b8";PortNumber = Some 0;PortType = PortType.Output;HostId = "ed12b5d8-556b-515a-cc9d-873960690380"}];X = 122;Y = 204}; + {H=50;W=40; Id = "d7028a8f-83be-0d81-6f0f-19b384caddae";Type = Mux2;Label = "";InputPorts = [{Id = "108ea909-b27f-24ba-22ea-2faeb061a926";PortNumber = Some 0;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}; {Id = "38c8c934-d55e-2aff-e61b-5fbf7d7eed91";PortNumber = Some 1;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}; {Id = "f283db84-a1f0-d006-be39-f17be6f8490c";PortNumber = Some 2;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}];OutputPorts = [{Id = "5b651087-9b95-3a80-4f99-014f85f0dfdd";PortNumber = Some 0;PortType = PortType.Output;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}];X = 244;Y = 156}; + {H=50;W=40; Id = "00661085-7d05-4185-09ef-4138ac918ad2";Type = Output 2;Label = "aa";InputPorts = [{Id = "7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45";PortNumber = Some 0;PortType = PortType.Input;HostId = "00661085-7d05-4185-09ef-4138ac918ad2"}];OutputPorts = [];X = 373;Y = 171} + ], + [ + {Id = "conn-sel";Source = {Id = "a6010bcb-ba2b-e57f-ca50-39f3d094e3b8";PortNumber = None;PortType = PortType.Output;HostId = "ed12b5d8-556b-515a-cc9d-873960690380"};Target = {Id = "f283db84-a1f0-d006-be39-f17be6f8490c";PortNumber = None;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"};Vertices = [152.0,214.0; 259.0,214.0; 259.0,201.0]}; + {Id = "conn-top-input";Source = {Id = "cc7c6510-d49b-28d9-e0bc-d5350a2c76a8";PortNumber = None;PortType = PortType.Output;HostId = "8078a917-236f-5a40-18a6-8e2d6a1458f5"};Target = {Id = "108ea909-b27f-24ba-22ea-2faeb061a926";PortNumber = None;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"};Vertices = [152.0,135.0; 198.0,135.0; 198.0,172.0; 244.0,172.6]}; + {Id = "conn-to-output";Source = {Id = "5b651087-9b95-3a80-4f99-014f85f0dfdd";PortNumber = None;PortType = PortType.Output;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"};Target = {Id = "7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45";PortNumber = None;PortType = PortType.Input;HostId = "00661085-7d05-4185-09ef-4138ac918ad2"};Vertices = [274.0,181.0; 373.0,181.0]} + ] + +/// Fully connected Mux, but two inputs have different widths. Similar to +/// stateBus18. +let stateBus19 : CanvasState = + [ + {H=50;W=40; Id = "8078a917-236f-5a40-18a6-8e2d6a1458f5";Type = Input 2;Label = "a";InputPorts = [];OutputPorts = [{Id = "cc7c6510-d49b-28d9-e0bc-d5350a2c76a8";PortNumber = Some 0;PortType = PortType.Output;HostId = "8078a917-236f-5a40-18a6-8e2d6a1458f5"}];X = 122;Y = 125}; + {H=50;W=40; Id = "ed12b5d8-556b-515a-cc9d-873960690380";Type = Input 1;Label = "b";InputPorts = [];OutputPorts = [{Id = "a6010bcb-ba2b-e57f-ca50-39f3d094e3b8";PortNumber = Some 0;PortType = PortType.Output;HostId = "ed12b5d8-556b-515a-cc9d-873960690380"}];X = 122;Y = 204}; + {H=50;W=40; Id = "d7028a8f-83be-0d81-6f0f-19b384caddae";Type = Mux2;Label = "";InputPorts = [{Id = "108ea909-b27f-24ba-22ea-2faeb061a926";PortNumber = Some 0;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}; {Id = "38c8c934-d55e-2aff-e61b-5fbf7d7eed91";PortNumber = Some 1;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}; {Id = "f283db84-a1f0-d006-be39-f17be6f8490c";PortNumber = Some 2;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}];OutputPorts = [{Id = "5b651087-9b95-3a80-4f99-014f85f0dfdd";PortNumber = Some 0;PortType = PortType.Output;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}];X = 244;Y = 156}; + {H=50;W=40; Id = "00661085-7d05-4185-09ef-4138ac918ad2";Type = Output 2;Label = "aa";InputPorts = [{Id = "7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45";PortNumber = Some 0;PortType = PortType.Input;HostId = "00661085-7d05-4185-09ef-4138ac918ad2"}];OutputPorts = [];X = 373;Y = 171} + ], + [ + {Id = "conn-sel";Source = {Id = "a6010bcb-ba2b-e57f-ca50-39f3d094e3b8";PortNumber = None;PortType = PortType.Output;HostId = "ed12b5d8-556b-515a-cc9d-873960690380"};Target = {Id = "f283db84-a1f0-d006-be39-f17be6f8490c";PortNumber = None;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"};Vertices = [152.0,214.0; 259.0,214.0; 259.0,201.0]}; + {Id = "conn-top-input";Source = {Id = "cc7c6510-d49b-28d9-e0bc-d5350a2c76a8";PortNumber = None;PortType = PortType.Output;HostId = "8078a917-236f-5a40-18a6-8e2d6a1458f5"};Target = {Id = "108ea909-b27f-24ba-22ea-2faeb061a926";PortNumber = None;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"};Vertices = [152.0,135.0; 198.0,135.0; 198.0,172.0; 244.0,172.6]}; + {Id = "conn-to-output";Source = {Id = "5b651087-9b95-3a80-4f99-014f85f0dfdd";PortNumber = None;PortType = PortType.Output;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"};Target = {Id = "7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45";PortNumber = None;PortType = PortType.Input;HostId = "00661085-7d05-4185-09ef-4138ac918ad2"};Vertices = [274.0,181.0; 373.0,181.0]} + {Id = "conn-bottom-input"; Source = {Id = "a6010bcb-ba2b-e57f-ca50-39f3d094e3b8"; PortNumber = None; PortType = PortType.Output; HostId = "ed12b5d8-556b-515a-cc9d-873960690380"}; Target = {Id = "38c8c934-d55e-2aff-e61b-5fbf7d7eed91"; PortNumber = None; PortType = PortType.Input; HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}; Vertices = [152.0,258.0; 198.0,258.0; 198.0,189.33333333333334; 244.0,189.33333333333334]} + ] + +/// Partially connected Demux. A 2-bit input, Mux, a 2-bit output. +let stateBus20 : CanvasState = + [ + {H=50;W=40; Id = "8078a917-236f-5a40-18a6-8e2d6a1458f5";Type = Input 2;Label = "a";InputPorts = [];OutputPorts = [{Id = "cc7c6510-d49b-28d9-e0bc-d5350a2c76a8";PortNumber = Some 0;PortType = PortType.Output;HostId = "8078a917-236f-5a40-18a6-8e2d6a1458f5"}];X = 122;Y = 125}; + {H=50;W=40; Id = "fbfb4202-9816-f214-0401-da18caddeb0f";Type = Demux2;Label = "";InputPorts = [{Id = "2b224026-609a-5eae-6885-ff9820dbae5f";PortNumber = Some 0;PortType = PortType.Input;HostId = "fbfb4202-9816-f214-0401-da18caddeb0f"}; {Id = "68043f9b-47e7-793f-fed2-943a7d7336dc";PortNumber = Some 1;PortType = PortType.Input;HostId = "fbfb4202-9816-f214-0401-da18caddeb0f"}];OutputPorts = [{Id = "57070484-347e-4701-8c36-f510c2ef150c";PortNumber = Some 0;PortType = PortType.Output;HostId = "fbfb4202-9816-f214-0401-da18caddeb0f"}; {Id = "123463bf-7868-9a87-6fb1-36627a3c9bad";PortNumber = Some 1;PortType = PortType.Output;HostId = "fbfb4202-9816-f214-0401-da18caddeb0f"}];X = 254;Y = 110}; + {H=50;W=40; Id = "00661085-7d05-4185-09ef-4138ac918ad2";Type = Output 2;Label = "aa";InputPorts = [{Id = "7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45";PortNumber = Some 0;PortType = PortType.Input;HostId = "00661085-7d05-4185-09ef-4138ac918ad2"}];OutputPorts = [];X = 401;Y = 117} + ], + [ + {Id = "conn-to-output";Source = {Id = "57070484-347e-4701-8c36-f510c2ef150c";PortNumber = None;PortType = PortType.Output;HostId = "fbfb4202-9816-f214-0401-da18caddeb0f"};Target = {Id = "7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45";PortNumber = None;PortType = PortType.Input;HostId = "00661085-7d05-4185-09ef-4138ac918ad2"};Vertices = [284.0,126.66666666666667; 343.5,126.66666666666667; 343.5,127.0; 401.0,127.0]}; + {Id = "conn-to-input";Source = {Id = "cc7c6510-d49b-28d9-e0bc-d5350a2c76a8";PortNumber = None;PortType = PortType.Output;HostId = "8078a917-236f-5a40-18a6-8e2d6a1458f5"};Target = {Id = "2b224026-609a-5eae-6885-ff9820dbae5f";PortNumber = None;PortType = PortType.Input;HostId = "fbfb4202-9816-f214-0401-da18caddeb0f"};Vertices = [152.0,135.0; 254.0,135.0]} + ] diff --git a/Tests/SimulatorMemoriesTests.fs b/Tests/SimulatorMemoriesTests.fs new file mode 100644 index 0000000..5183b17 --- /dev/null +++ b/Tests/SimulatorMemoriesTests.fs @@ -0,0 +1,101 @@ +module SimulatorMemoriesTests + +open CommonTypes +open SimulatorTypes +open CanvasStatesMemories +open NumberHelpers +open Helpers + +/// Tuple with: (diagramName, state, loadedComponents, number of clock ticks, inputss). +/// Note that the inputss is a list of inputs. I.e. inputss provides an inputs +/// for every time step. The first set of inputs will be fed before the first +/// clock tick, then second after the second clock tick and so on. If no inputs +/// are provided for a certain iteration, none will fed. +type private TestCaseInput = string * CanvasState * LoadedComponent list * int * ((ComponentId * WireData) list) list +type private IterationOutput = (SimulationIO * WireData) list // Output after every clock tick. +type private TestCaseOutput = Result +type private TestCase = string * TestCaseInput * TestCaseOutput + +let private toWD num w = convertIntToWireData w (int64 num) + +let private makeStateMem3Input addr dataIn write = + [ (ComponentId "81030fc6-2471-a568-160f-922709edeb2e", toWD addr 3) + (ComponentId "266d8763-6fbf-37c2-6825-d3487153053b", toWD dataIn 4) + (ComponentId "f0769200-24e3-5c7b-3591-c5c3711d9336", toWD write 1) ] + +let private makeStateMem3Output dataOut = + [ (ComponentId "1f9704f9-88fc-124c-3ff8-21c36cfb7328", ComponentLabel "data-out", 4), toWD dataOut 4 ] + +let testCasesSimulatorMemories : TestCase list = [ + "Synchronous ROM connected to address and output", + ("main", stateMem1, [], 6, [ + [ (ComponentId "4f65afe9-f03c-2b97-fde9-c657ca32f246", toWD 0 2) ] + [ (ComponentId "4f65afe9-f03c-2b97-fde9-c657ca32f246", toWD 1 2) ] + [ (ComponentId "4f65afe9-f03c-2b97-fde9-c657ca32f246", toWD 2 2) ] + [ (ComponentId "4f65afe9-f03c-2b97-fde9-c657ca32f246", toWD 3 2) ] + ]), + Ok [ + [ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 4), toWD 0 4 ] // Mem[0] + [ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 4), toWD 0 4 ] // Mem[0] + [ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 4), toWD 1 4 ] // Mem[1] + [ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 4), toWD 4 4 ] // Mem[2] + [ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 4), toWD 15 4 ] // Mem[3] + [ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 4), toWD 15 4 ] // Mem[3] + ] + + "Synchronous ROM connected to address and output. ROM is big.", + ("main", stateMem2, [], pow2(8)+1, ( + [0..pow2(8)-1] |> List.map (fun i -> + [ (ComponentId "4f65afe9-f03c-2b97-fde9-c657ca32f246", toWD i 8) ] + ) + )), + Ok ( + [ [ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 8), toWD 0 8 ] ] // Mem[0] + @ + ( + [0..pow2(8)-1] |> List.map (fun i -> + [ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 8), toWD i 8 ] + ) + ) + ) + + "RAM only writes if write flag is set", + ("main", stateMem3, [], 10, [ + makeStateMem3Input 0 1 0 + makeStateMem3Input 0 1 0 + makeStateMem3Input 0 1 1 // Turn on write flag. Set to one. + makeStateMem3Input 0 0 1 // Set to zero. + makeStateMem3Input 0 1 1 // Set to one. + makeStateMem3Input 0 0 0 // Turn off write flag. Stays at one. + makeStateMem3Input 0 0 0 + makeStateMem3Input 0 0 0 + makeStateMem3Input 0 0 0 + makeStateMem3Input 0 0 0 + ]), + Ok [ + makeStateMem3Output 0 // Mem[0], unchanged + makeStateMem3Output 0 // Mem[0], unchanged + makeStateMem3Output 0 // Mem[0], unchanged + makeStateMem3Output 1 // Mem[0], set to 1 + makeStateMem3Output 0 // Mem[0], set to 0 + makeStateMem3Output 1 // Mem[0], set to 1 + makeStateMem3Output 1 // Mem[0], stays 1 + makeStateMem3Output 1 // Mem[0], stays 1 + makeStateMem3Output 1 // Mem[0], stays 1 + makeStateMem3Output 1 // Mem[0], stays 1 + ] + + "RAM writes and reads all locations.", + ("main", stateMem3, [], 17, + ( [0..pow2(3)-1] |> List.map(fun i -> makeStateMem3Input i (i+1) 1) ) // Write all locations. + @ + ( [0..pow2(3)-1] |> List.map(fun i -> makeStateMem3Input i 0 0) ) // Read all locations. + ), + Ok ( + [ makeStateMem3Output 0 ] + @ + ( [0..pow2(3)-1] |> List.map(fun i -> makeStateMem3Output <| i+1) ) + @ + ( [0..pow2(3)-1] |> List.map(fun i -> makeStateMem3Output <| i+1) ) + ) +] diff --git a/Tests/SimulatorSyncTests.fs b/Tests/SimulatorSyncTests.fs new file mode 100644 index 0000000..df2e429 --- /dev/null +++ b/Tests/SimulatorSyncTests.fs @@ -0,0 +1,214 @@ +module SimulatorSyncTests + +open CommonTypes +open SimulatorTypes +open CanvasStatesSync + +/// Tuple with: (diagramName, state, loadedComponents, number of clock ticks, inputss). +/// Note that the inputss is a list of inputs. I.e. inputss provides an inputs +/// for every time step. The first set of inputs will be fed before the first +/// clock tick, then second after the second clock tick and so on. If no inputs +/// are provided for a certain iteration, none will fed. +type private TestCaseInput = string * CanvasState * LoadedComponent list * int * ((ComponentId * WireData) list) list +type private IterationOutput = (SimulationIO * WireData) list // Output after every clock tick. +type private TestCaseOutput = Result +type private TestCase = string * TestCaseInput * TestCaseOutput + +let testCasesSimulatorSync : TestCase list = [ + "Simple D-flip-flop, one input, one output (zero)", + ("main", stateSync1, [], 5, [ + [ (ComponentId "6e7a2000-439c-108e-df6d-93cff7a41266", [Zero]) ] + ]), + Ok ( + // Check it is zero for 5 ticks. + [(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [Zero]] + |> List.replicate 5 + ) + + "Simple D-flip-flop, one input, one output (one)", + ("main", stateSync1, [], 5, [ + [ (ComponentId "6e7a2000-439c-108e-df6d-93cff7a41266", [One]) ] + ]), + Ok ( + // Tick 0, out is zero. + [[(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [Zero]]] + @ + // Then out is 1 four times. + ([(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [One]] + |> List.replicate 4) + ) + + "Two D-flip-flop connected in series, one input, one output (one)", + ("main", stateSync2, [], 5, [ + [ (ComponentId "3739e54a-fd21-bf60-8fc2-a3d10108c947", [One]) ] + ]), + Ok ( + // Tick 0 and 1, out is zero. + ([(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [Zero]] + |> List.replicate 2) + @ + // Then out is 1 three times. + ([(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [One]] + |> List.replicate 3) + ) + + "Three D-flip-flop connected in series, one input, one output (one)", + ("main", stateSync3, [], 5, [ + [ (ComponentId "3739e54a-fd21-bf60-8fc2-a3d10108c947", [One]) ] + ]), + Ok ( + // Tick 0,1 and 2, out is zero. + ([(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [Zero]] + |> List.replicate 3) + @ + // Then out is 1 two times. + ([(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [One]] + |> List.replicate 2) + ) + + "StateSync1 custom component followed by a DFF (one)", + ("main", stateSync4, [stateSync1Dependency], 5, [ + [ (ComponentId "03e4c81a-4703-d9f5-dfaf-301de006610f", [One]) ] + ]), + Ok ( + // Tick 0 and 1, out is zero. + ([(ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [Zero]] + |> List.replicate 2) + @ + // Then out is 1 three times. + ([(ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One]] + |> List.replicate 3) + ) + + "StateSync1 custom component followed by a DFF, time varying inputs", + ("main", stateSync4, [stateSync1Dependency], 10, [ + [ (ComponentId "03e4c81a-4703-d9f5-dfaf-301de006610f", [One]) ] + [ (ComponentId "03e4c81a-4703-d9f5-dfaf-301de006610f", [Zero]) ] + [ (ComponentId "03e4c81a-4703-d9f5-dfaf-301de006610f", [One]) ] + ]), + Ok [ + [ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [Zero] ] + [ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [Zero] ] + [ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ] // After 2 timesteps, the One arrives. + [ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [Zero] ] // Back to Zero. + [ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ] // Back to One. + [ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ] // And statys one... + [ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ] + [ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ] + [ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ] + [ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ] + ] + + "A DFF looping to itself via a Not gate. Two output nodes to probe the wires before and after the Not gate.", + ("main", stateSync5, [], 4, []), + Ok [ + [ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [Zero] + (ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [One] ] + + [ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [One] + (ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [Zero] ] + + [ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [Zero] + (ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [One] ] + + [ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [One] + (ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [Zero] ] + ] + + "Similar to stateSync5, but with a stateSync1 custom component instead of a DFF.", + ("main", stateSync6, [stateSync1Dependency], 4, []), + Ok [ + [ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [Zero] + (ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [One] ] + + [ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [One] + (ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [Zero] ] + + [ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [Zero] + (ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [One] ] + + [ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [One] + (ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [Zero] ] + ] + + "A connected to output via both sync and comb paths.", + ("main", stateSync7, [], 4, [ + [(ComponentId "ff10125a-601f-e1d5-e379-7eb7c65eb91f", [One])] + [(ComponentId "ff10125a-601f-e1d5-e379-7eb7c65eb91f", [Zero])] + ]), + Ok [ + [ (ComponentId "794d5154-6969-3f4e-9c8b-4bc17927c28f", ComponentLabel "B-Comb", 1), [One] + (ComponentId "95452292-b507-ab43-f082-85152d3e4cf2", ComponentLabel "B-Sync", 1), [Zero] ] + + [ (ComponentId "794d5154-6969-3f4e-9c8b-4bc17927c28f", ComponentLabel "B-Comb", 1), [Zero] + (ComponentId "95452292-b507-ab43-f082-85152d3e4cf2", ComponentLabel "B-Sync", 1), [One] ] + + [ (ComponentId "794d5154-6969-3f4e-9c8b-4bc17927c28f", ComponentLabel "B-Comb", 1), [Zero] + (ComponentId "95452292-b507-ab43-f082-85152d3e4cf2", ComponentLabel "B-Sync", 1), [Zero] ] + + [ (ComponentId "794d5154-6969-3f4e-9c8b-4bc17927c28f", ComponentLabel "B-Comb", 1), [Zero] + (ComponentId "95452292-b507-ab43-f082-85152d3e4cf2", ComponentLabel "B-Sync", 1), [Zero] ] + ] + + "stateSync7 Not-ed self looped in the synchronous branch.", + ("main", stateSync8, [stateSync7Dependency], 4, []), + Ok [ + [ (ComponentId "66030e1a-4a97-244a-f0bb-d9e5fd25627f", ComponentLabel "B", 1), [One] ] + [ (ComponentId "66030e1a-4a97-244a-f0bb-d9e5fd25627f", ComponentLabel "B", 1), [Zero] ] + [ (ComponentId "66030e1a-4a97-244a-f0bb-d9e5fd25627f", ComponentLabel "B", 1), [One] ] + [ (ComponentId "66030e1a-4a97-244a-f0bb-d9e5fd25627f", ComponentLabel "B", 1), [Zero] ] + ] + + "stateSync8 wrapped", + ("main", stateSync9, [stateSync8Dependency; stateSync7Dependency], 4, []), + Ok [ + [ (ComponentId "a100bada-b27f-15ca-accb-153e717a31f1", ComponentLabel "B", 1), [One] ] + [ (ComponentId "a100bada-b27f-15ca-accb-153e717a31f1", ComponentLabel "B", 1), [Zero] ] + [ (ComponentId "a100bada-b27f-15ca-accb-153e717a31f1", ComponentLabel "B", 1), [One] ] + [ (ComponentId "a100bada-b27f-15ca-accb-153e717a31f1", ComponentLabel "B", 1), [Zero] ] + ] + + "A fully connected DFFE.", + ("main", stateSync10, [], 8, [ + [ (ComponentId "5916f1cf-408e-4186-a839-c80926bfddf0", [Zero]) // in + (ComponentId "cab54371-5e07-9586-eb9b-be8cc417e610", [Zero]) ] // enable + [ (ComponentId "5916f1cf-408e-4186-a839-c80926bfddf0", [Zero]) + (ComponentId "cab54371-5e07-9586-eb9b-be8cc417e610", [One]) ] // turn on enable + [ (ComponentId "5916f1cf-408e-4186-a839-c80926bfddf0", [One]) + (ComponentId "cab54371-5e07-9586-eb9b-be8cc417e610", [One]) ] // turn on enable + [ (ComponentId "5916f1cf-408e-4186-a839-c80926bfddf0", [Zero]) + (ComponentId "cab54371-5e07-9586-eb9b-be8cc417e610", [Zero]) ] // turn off enable + [ (ComponentId "5916f1cf-408e-4186-a839-c80926bfddf0", [One]) + (ComponentId "cab54371-5e07-9586-eb9b-be8cc417e610", [One]) ] // turn on enable again + [ (ComponentId "5916f1cf-408e-4186-a839-c80926bfddf0", [Zero]) + (ComponentId "cab54371-5e07-9586-eb9b-be8cc417e610", [One]) ] // set to zero + ]), + Ok [ + [ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [Zero] ] + [ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [Zero] ] + [ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [Zero] ] // enabled but zero + [ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [One] ] // set to one + [ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [One] ] // enable is off + [ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [One] ] // enable is on again + [ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [Zero] ] // set to zero + [ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [Zero] ] // set to zero + ] + + "StateSync7 Not-ed self looped in the combinatorial branch.", + ("main", stateSync11, [stateSync7Dependency], 4, []), + Error { + Msg = "Cycle detected in combinatorial logic." + InDependency = None + ComponentsAffected = ["c9d9659a-4476-de3a-a838-eeab15496c99"; "5c24921a-88e9-7bc2-ee89-97fefb694902"] |> List.map ComponentId + ConnectionsAffected = ["bc1f9a51-5ca8-1aa0-b4bd-b86bc9646c20"; "cc7a9da2-f78a-f3e1-1c2f-7323f2b43d15"] |> List.map ConnectionId + } + + "StateSync11 connected to an output. Should spot cycle in the dependency.", + ("main", stateSync12, [stateSync11Dependency; stateSync7Dependency], 4, []), + Error { + Msg = "Cycle detected in combinatorial logic." + InDependency = Some "combinatorial-loop" + ComponentsAffected = ["c9d9659a-4476-de3a-a838-eeab15496c99"; "5c24921a-88e9-7bc2-ee89-97fefb694902"] |> List.map ComponentId + ConnectionsAffected = [] // Connections are not inferred in dependencies. + } +] diff --git a/Tests/SimulatorTests.fs b/Tests/SimulatorTests.fs new file mode 100644 index 0000000..e404433 --- /dev/null +++ b/Tests/SimulatorTests.fs @@ -0,0 +1,457 @@ +module SimulatorTests + +open CommonTypes +open SimulatorTypes +open CanvasStates +open CanvasStatesWithBuses +open Simulator + +/// Tuple with: (diagramName, state, loadedComponents, inputs). +type private SimulatorTestCaseInput = string * CanvasState * LoadedComponent list * (ComponentId * WireData) list +type private SimulatorTestCaseOutput = Result<(SimulationIO * WireData) list, SimulationError> +type private SimulatorTestCase = string * SimulatorTestCaseInput * SimulatorTestCaseOutput + +let private makeError msg deps comps conns = + Error { + Msg = msg + InDependency = deps + ComponentsAffected = comps |> List.map ComponentId + ConnectionsAffected = conns |> List.map ConnectionId + } + +/// Given a list of N generic elements, associate each element with a bit and +/// return 2^N lists with all the possible bit combinations. +/// A bit is simply a bus with width 1. +let makeAllBitCombinations (lst : 'a list) : (('a * WireData) list) list = + let rec allCombinations lst result stack = + match lst with + | [] -> List.rev stack :: result + | el :: lst' -> + let result = allCombinations lst' result ((el,[Zero]) :: stack) + allCombinations lst' result ((el,[One]) :: stack) + List.rev <| allCombinations lst [] [] + +/// Auto generate all the testcases for a CanvasState (i.e. a full thruth +/// table). The thruth table considers ALL inputs to be single bit inputs, +/// please do not use this function if not all inputs are like that. +let private createAllTestCases + (title : string) + (diagramName : string) + (state : CanvasState) + (dependencies : LoadedComponent list) + (inputLabels : ComponentId list) + (expectedResults : ((SimulationIO * WireData) list) list) + : SimulatorTestCase list = + let allInputCombinations = makeAllBitCombinations inputLabels + assert(List.length allInputCombinations = List.length expectedResults) + (allInputCombinations, expectedResults) + ||> List.map2 (fun inputs outputs -> + sprintf "%s: %A" title inputs, + (diagramName, state, dependencies, inputs), + Ok outputs + ) + +// The input to a test case is formed by: +// - a CanvasState, +// - a list of loaded dependencies, +// - a list of input values that will be applied to the simulation graph. + +// The dependency list and the inputs do not matter since the test has to fail +// in the earlier checks. +let private testCasesSimulatorPortError : SimulatorTestCase list = [ + "Unconnected input node", + ("", state1, [], []), + makeError + "All ports must have at least one connection." + None + ["input-node0"] + [] + + "Two unconnected input nodes", + ("", state2, [], []), + makeError + "All ports must have at least one connection." + None + ["input-node0"] + [] + + "Two inputs and one output", + ("", state5, [], []), + makeError + "A wire must have precisely one driving component, but 2 were found. If you want to merge wires together use a MergeWires component." + None + ["output-node0"] + [] + + "Two inputs, one And, one output, with extra connection input to output", + ("", state7, [], []), + makeError + "A wire must have precisely one driving component, but 2 were found. If you want to merge wires together use a MergeWires component." + None + ["output"] + [] + + "Two inputs, one And, one output, with extra connections inputs to and", + ("", state8, [], []), + makeError + "A wire must have precisely one driving component, but 2 were found. If you want to merge wires together use a MergeWires component." + None + ["and"] + [] + + "Mux2 with only two connected ports", + ("", state9, [], []), + makeError + "All ports must have at least one connection." + None + ["mux"] + [] +] + +let private testCasesSimulatorDuplicatIOError : SimulatorTestCase list = [ + "Simple circuit with duplicated output label", + ("", state14, [], []), + makeError + "Two Output components cannot have the same label: output-duplicate-label." + None + ["output-node0"; "output-node1"] + [] + + "Simple And circuit with duplicated input label", + ("", state15, [], []), + makeError + "Two Input components cannot have the same label: input-duplicate-label." + None + ["top-input"; "bottom-input"] + [] +] + +let private testCasesSimulatorCycleError : SimulatorTestCase list = [ + "Complex diagram with three Ands and two cycles", + ("", state10, [], []), + makeError + "Cycle detected in combinatorial logic." + None + ["and2"; "and0"] + ["conn5"; "conn4"] + + "Complex diagram with three Ands and one long cycle", + ("", state11, [], []), + makeError + "Cycle detected in combinatorial logic." + None + ["and1"; "and2"; "and0"] + ["conn1"; "conn5"; "conn3"] +] + +// In the next tests, we have no dependencies. +// The inputs are set since the simulation graph should be fine. +let private testCasesSimulatorOkNoDependencies : SimulatorTestCase list = + createAllTestCases + "Simple circuit with one input and one output" + "main" state3 [] [ComponentId "input-node0"] + [ + [(ComponentId "output-node0", ComponentLabel "output-node0-label", 1), [Zero]] + [(ComponentId "output-node0", ComponentLabel "output-node0-label", 1), [One]] + ] + @ + createAllTestCases + "Simple circuit with one input connected to two outputs" + "main" state4 [] [ComponentId "input-node0"] + [ + [ + (ComponentId "output-node0", ComponentLabel "output-node0-label", 1), [Zero] + (ComponentId "output-node1", ComponentLabel "output-node1-label", 1), [Zero] + ] + [ + (ComponentId "output-node0", ComponentLabel "output-node0-label", 1), [One] + (ComponentId "output-node1", ComponentLabel "output-node1-label", 1), [One] + ] + ] + @ + createAllTestCases + "Two inputs; one And; one output" + "main" state6 [] [ComponentId "top-input"; ComponentId "bottom-input"] + [ + [(ComponentId "output", ComponentLabel "output-node0-label", 1), [Zero]] + [(ComponentId "output", ComponentLabel "output-node0-label", 1), [Zero]] + [(ComponentId "output", ComponentLabel "output-node0-label", 1), [Zero]] + [(ComponentId "output", ComponentLabel "output-node0-label", 1), [One]] + ] + @ + createAllTestCases + "Weird diagram with a series of and gates" + "main" state12 [] [ComponentId "input"] + [ + [(ComponentId "output", ComponentLabel "output", 1), [Zero]] + [(ComponentId "output", ComponentLabel "output", 1), [One]] + ] + @ + createAllTestCases + "One bit adder (Zero, Zero)" + "main" state13 [] [ + ComponentId "2953603d-44e4-5c1f-3fb1-698f7863b6b5" + ComponentId "170e69f4-b3d7-d9e0-9f1d-6a564ba62062" + ] + [ + [ + (ComponentId "9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9", ComponentLabel "Sum", 1), [Zero] + (ComponentId "94da6dd7-a263-a3ec-ec76-bfa07b0b0f34", ComponentLabel "Carry", 1), [Zero] + ] + [ + (ComponentId "9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9", ComponentLabel "Sum", 1), [One] + (ComponentId "94da6dd7-a263-a3ec-ec76-bfa07b0b0f34", ComponentLabel "Carry", 1), [Zero] + ] + [ + (ComponentId "9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9", ComponentLabel "Sum", 1), [One] + (ComponentId "94da6dd7-a263-a3ec-ec76-bfa07b0b0f34", ComponentLabel "Carry", 1), [Zero] + ] + [ + (ComponentId "9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9", ComponentLabel "Sum", 1), [Zero] + (ComponentId "94da6dd7-a263-a3ec-ec76-bfa07b0b0f34", ComponentLabel "Carry", 1), [One] + ] + ] + +let testCasesSimulatorDependencyError : SimulatorTestCase list = + createAllTestCases + "Broken unused dependency." // Since the dependency is unused the test should pass. + "main" state3 [state1Dependency] [ComponentId "input-node0"] + [ + [(ComponentId "output-node0", ComponentLabel "output-node0-label", 1), [Zero]] + [(ComponentId "output-node0", ComponentLabel "output-node0-label", 1), [One]] + ] + @ + [ + // Broken dependencies. + + "Input connected to broken depdendency.", + ("main", state19, [state1Dependency], []), + makeError + "All ports must have at least one connection." + (Some "broken-one-input") [] [] + + // Dependency cycle. + + "Component using itself.", + (state16Dependency.Name, state20, [state16Dependency], []), + makeError + (sprintf "Found a cycle in dependencies: \"%s\" --> \"%s\"." state16Dependency.Name state16Dependency.Name) + None [] [] + + "Long cycle starting at root.", + (state23Dependency.Name, state23, [state21Dependency; state22Dependency], []), + makeError + (sprintf "Found a cycle in dependencies: \"%s\" --> \"%s\" --> \"%s\" --> \"%s\"." state23Dependency.Name state21Dependency.Name state22Dependency.Name state23Dependency.Name) + None [] [] + + "Long cycle.", + ("main", state24, [state21Dependency; state22Dependency; state23Dependency], []), + makeError + (sprintf "Found a cycle in dependencies: \"%s\" --> \"%s\" --> \"%s\" --> \"%s\"." state23Dependency.Name state21Dependency.Name state22Dependency.Name state23Dependency.Name) + None [] [] + + // Missing dependencies. + + "2 bit full adder missing dependencies", + ("2-bit-adder", twoBitAdderState, [], []), + makeError + "Could not resolve dependency: \"full-adder\". Make sure a dependency with such name exists in the current project." + (Some "2-bit-adder") [] [] + + "2 bit full adder missing half adder dependency", + ("2-bit-adder", twoBitAdderState, [fullAdderDependency], []), + makeError + "Could not resolve dependency: \"half-adder\". Make sure a dependency with such name exists in the current project." + (Some "full-adder") [] [] + + "2 bit full adder missing full adder dependency", + ("2-bit-adder", twoBitAdderState, [halfAdderDependency], []), + makeError + "Could not resolve dependency: \"full-adder\". Make sure a dependency with such name exists in the current project." + (Some "2-bit-adder") [] [] + ] + +// Outputs fot the 2bit adder test. + +let private zero = [ + (ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [Zero] + (ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [Zero] + (ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [Zero] + ] +let private one = [ + (ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [Zero] + (ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [One] + (ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [Zero] + ] +let private two = [ + (ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [One] + (ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [Zero] + (ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [Zero] + ] +let private three = [ + (ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [One] + (ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [One] + (ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [Zero] + ] +let private four = [ + (ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [Zero] + (ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [Zero] + (ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [One] + ] +let private five = [ + (ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [Zero] + (ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [One] + (ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [One] + ] +let private six = [ + (ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [One] + (ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [Zero] + (ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [One] + ] +let private seven = [ + (ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [One] + (ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [One] + (ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [One] + ] + +let testCasesSimulatorOkWithDependencies : SimulatorTestCase list = + createAllTestCases + "Simple input-output dependency" "main" + state16 [state3Dependency] [ComponentId "outer-input-node0"] + [ + [(ComponentId "outer-output-node0", ComponentLabel "outer-output-node0-label", 1), [Zero]] + [(ComponentId "outer-output-node0", ComponentLabel "outer-output-node0-label", 1), [One]] + ] + @ + createAllTestCases + "Nested input-output dependency" "main" + state17 [state16Dependency; state3Dependency] [ComponentId "outer-outer-input-node0"] + [ + [(ComponentId "outer-outer-output-node0", ComponentLabel "outer-outer-output-node0-label", 1), [Zero]] + [(ComponentId "outer-outer-output-node0", ComponentLabel "outer-outer-output-node0-label", 1), [One]] + ] + @ + createAllTestCases + "Doubly nested input-output dependency" "main" + state18 [state17Dependency; state16Dependency; state3Dependency] [ComponentId "outer-outer-outer-input-node0"] + [ + [(ComponentId "outer-outer-outer-output-node0", ComponentLabel "outer-outer-outer-output-node0-label", 1), [Zero]] + [(ComponentId "outer-outer-outer-output-node0", ComponentLabel "outer-outer-outer-output-node0-label", 1), [One]] + ] + @ + createAllTestCases + "2 bit adder" "2-bit-adder" + twoBitAdderState [fullAdderDependency; halfAdderDependency] [ + ComponentId "78795182-35c4-1c50-2190-6fc944a2adea" // Cin + ComponentId "a63fe5a2-9f4d-e70f-131b-ed35d3f3a9e1" // B1 + ComponentId "69a6ad2a-af19-369f-0483-0e09e6841da3" // B0 + ComponentId "82a03f0b-ae31-b487-ed1b-335e235adeb7" // A1 + ComponentId "86372781-c2f4-09f2-406f-f385ee7a47a9" // A0 + ] + [ + zero;one;two;three; + one;two;three;four; + two;three;four;five; + three;four;five;six; + one;two;three;four; + two;three;four;five; + three;four;five;six; + four;five;six;seven + ] + +let private testCasesSimulatorBusesError : SimulatorTestCase list = [ + "Two inputs make a bus2, then Push input a to bus, then try to split into 2 single bits (fail)", + ("main", stateBus11, [], []), + makeError "Wrong wire width. Target port expects a 1 bit(s) signal, but source port produces a 2 bit(s) signal." None [] ["conn"] + + "A 4 bit input connected to a 3 bit output", + ("main", stateBus14, [], []), + makeError "Wrong wire width. Target port expects a 3 bit(s) signal, but source port produces a 4 bit(s) signal." None [] ["conn"] + + "A 3 bit input connected to a 4 bit output", + ("main", stateBus15, [], []), + makeError "Wrong wire width. Target port expects a 4 bit(s) signal, but source port produces a 3 bit(s) signal." None [] ["conn"] +] + +let private testCasesSimulatorOkWithBuses : SimulatorTestCase list = + createAllTestCases + "Two inputs, packed into a bus, unpacked into two outputs" "main" + stateBus10 [] [ + ComponentId "a91be585-2d3b-d872-be0f-b416c8eb03d2" // a + ComponentId "9985ebc6-1cd5-8863-1341-1d543d236d38" // b + ] + (makeAllBitCombinations [ + (ComponentId "8a9392fc-493b-7e96-72ec-b6f5f11ded8a", ComponentLabel "a-out", 1) + (ComponentId "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b", ComponentLabel "b-out", 1) + ]) + @ + createAllTestCases + "Four inputs, packed into a bus, unpacked into four outputs" "main" + stateBus12 [] [ + ComponentId "76de964a-124b-5c16-6de1-6158626344ac" // a + ComponentId "a91be585-2d3b-d872-be0f-b416c8eb03d2" // b + ComponentId "9985ebc6-1cd5-8863-1341-1d543d236d38" // c + ComponentId "9824ceb8-e999-8e48-9a56-7a4349e495b1" // d + ] + (makeAllBitCombinations [ + (ComponentId "59b45f9c-192c-98ce-da25-a94db45a5790", ComponentLabel "a-out", 1) + (ComponentId "8a9392fc-493b-7e96-72ec-b6f5f11ded8a", ComponentLabel "b-out", 1) + (ComponentId "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b", ComponentLabel "c-out", 1) + (ComponentId "214620f0-51f6-59fe-1558-ed47fd2c680a", ComponentLabel "d-out", 1) + ]) + @ + [ + "A 4 bit input connected to a four bit output (1)", + ("main", stateBus13, [], [ + ComponentId "9bcba47e-deae-0b3f-2079-a1b124526b00", [One; One; One; One] + ]), + [ + (ComponentId "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97", ComponentLabel "b", 4), [One; One; One; One] + ] |> Ok + + "A 4 bit input connected to a four bit output (2)", + ("main", stateBus13, [], [ + ComponentId "9bcba47e-deae-0b3f-2079-a1b124526b00", [Zero; One; Zero; One] + ]), + [ + (ComponentId "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97", ComponentLabel "b", 4), [Zero; One; Zero; One] + ] |> Ok + + "A 2 bit input split into 2 single bit outputs (1)", + ("main", stateBus16, [], [ + ComponentId "c6f000db-310f-d8ad-ff5e-938d7c2aaa7c", [One; Zero] + ]), + [ + (ComponentId "60e2df66-bb8c-53f1-832d-e154c30cf9dd", ComponentLabel "b", 1), [One] + (ComponentId "85e19389-c087-8b30-6c0a-02f7cc753695", ComponentLabel "c", 1), [Zero] + ] |> Ok + + "A 2 bit input split into 2 single bit outputs (2)", + ("main", stateBus16, [], [ + ComponentId "c6f000db-310f-d8ad-ff5e-938d7c2aaa7c", [Zero; One] + ]), + [ + (ComponentId "60e2df66-bb8c-53f1-832d-e154c30cf9dd", ComponentLabel "b", 1), [Zero] + (ComponentId "85e19389-c087-8b30-6c0a-02f7cc753695", ComponentLabel "c", 1), [One] + ] |> Ok + + "3 bit input merged with 4 bit input, then split in the same way", + ("main", stateBus17, [], [ + ComponentId "6bcdc74a-9d71-3304-537d-1a17f02924eb", [One; Zero; One] // 3 bits. + ComponentId "97c4b56d-4f8c-2b00-fb61-a08cdd01dd76", [Zero; One; Zero; One] // 4 bits. + ]), + [ + (ComponentId "1a6e1bb4-cfe0-77f9-a207-f409168ef210", ComponentLabel "out3", 3), [One; Zero; One] + (ComponentId "d2676492-2302-24d9-52eb-6e69e7971339", ComponentLabel "out4", 4), [Zero; One; Zero; One] + ] |> Ok + ] + +let testCasesSimulator = + testCasesSimulatorPortError @ + testCasesSimulatorCycleError @ + testCasesSimulatorDuplicatIOError @ + testCasesSimulatorOkNoDependencies @ + testCasesSimulatorDependencyError @ + testCasesSimulatorOkWithDependencies @ + testCasesSimulatorBusesError @ + testCasesSimulatorOkWithBuses diff --git a/Tests/TestLib.fs b/Tests/TestLib.fs new file mode 100644 index 0000000..542edbe --- /dev/null +++ b/Tests/TestLib.fs @@ -0,0 +1,18 @@ +module TestLib + +open Expecto + +/// Create a testcase for unit testing a function. +let testFunction f testData = + let descr, inp, expectedOut = testData + testCase descr <| fun () -> + let actual = f inp + Expect.equal actual expectedOut "" + +/// Create an expecto testList from a list of testCases. +let createTestList descr f testCases = + testList descr <| List.map (testFunction f) testCases + +/// Run all the previously defined tests. +let runTests () = + runTestsInAssembly defaultConfig [||] |> ignore diff --git a/Tests/Tests.fs b/Tests/Tests.fs new file mode 100644 index 0000000..aff5f21 --- /dev/null +++ b/Tests/Tests.fs @@ -0,0 +1,84 @@ +open TestLib +open Expecto +open Simulator +open BusWidthInferer +open SimulatorTests +open SimulatorSyncTests +open SimulatorMemoriesTests +open WidthInfererTests +open EEExtensions + +let runSimulatorTest (diagramName, state, loadedComponents, inputs) = + // Build simulation graph. + match prepareSimulation diagramName state loadedComponents with + | Error e -> Error e + | Ok simData -> + // Feed all the inputs and extract the outputs. + (simData.Graph, inputs) + ||> List.fold (fun graph (inputId, bit) -> feedSimulationInput graph inputId bit) + |> extractSimulationIOs simData.Outputs + |> Ok + +let safeListItem lst idx = + if idx >= List.length lst then [] else List.item idx lst + +let runSimulatorSyncTest (diagramName, state, loadedComponents, ticks, inputss) = + // Build simulation graph. + match prepareSimulation diagramName state loadedComponents with + | Error e -> Error e + | Ok simData -> + let results, graph = + (simData.Graph, [0..ticks-1]) + ||> List.mapFold (fun graph i -> + // Feed the inputs for this time iteration before the clock + // tick. + let inputs = safeListItem inputss i + let graph = + (graph, inputs) + ||> List.fold (fun graph (inputId, bit) -> + feedSimulationInput graph inputId bit) + // Extract output, then feed a new clock tick. + extractSimulationIOs simData.Outputs graph, feedClockTick graph + ) + Ok results + +[] +let simulatorTests = + createTestList "simulator" runSimulatorTest testCasesSimulator +[] +let simulatorSyncTests = + createTestList "simulatorSync" runSimulatorSyncTest testCasesSimulatorSync +[] +let simulatorMemoriesTests = + createTestList "simulatorMemories" runSimulatorSyncTest testCasesSimulatorMemories +[] +let widthInfererTests = + createTestList "widthInferer" inferConnectionsWidth testCasesWidthInferer + +let mutable Watches: Map = Map.empty + + +/// dotnet core timer function +let stopTimer s = + let timer = Map.tryFind s Watches + match timer with + | None -> failwithf "error: Timer '%s' has been stopped before it was started. timers: %A" s (Map.keys Watches) + | Some stopWatch -> + stopWatch.Stop() + printfn "%s: %.4fms" s stopWatch.Elapsed.TotalMilliseconds + +/// dotnet core timer function +let startTimer s = + Watches <- Map.add s (System.Diagnostics.Stopwatch.StartNew()) Watches + +/// measure various dotnet core performance stats +/// m = structure size. +/// n = number of iterations. +let displayPerformance m n = Helpers.checkPerformance m n startTimer stopTimer + + +[] +let main argv = + displayPerformance 100 1000000 + //TestLib.runTests () + 0 diff --git a/Tests/Tests.fsproj b/Tests/Tests.fsproj new file mode 100644 index 0000000..d8fc510 --- /dev/null +++ b/Tests/Tests.fsproj @@ -0,0 +1,24 @@ + + + + Exe + netcoreapp3.1 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Tests/WidthInfererTests.fs b/Tests/WidthInfererTests.fs new file mode 100644 index 0000000..be93df0 --- /dev/null +++ b/Tests/WidthInfererTests.fs @@ -0,0 +1,184 @@ +module WidthInfererTests + +open CommonTypes +open CanvasStates +open CanvasStatesWithBuses + +type private WidthInfererTestCaseInput = CanvasState +type private WidthInfererTestCaseOutput = Result +type private WidhtInfererTestCase = string * WidthInfererTestCaseInput * WidthInfererTestCaseOutput + +let private testCasesWidthInfererSimple : WidhtInfererTestCase list = [ + "Two unconnected input nodes. No conections", state2, + Ok Map.empty + + "Simple circuit with one input connected to one output", state3, + [ + ConnectionId "conn0", Some 1 + ] |> Map.ofList |> Ok + + "Simple circuit with one input connected to two outputs", state4, + [ + ConnectionId "conn0", Some 1 + ConnectionId "conn1", Some 1 + ] |> Map.ofList |> Ok + + "Two inputs; one And; one output", state6, + [ + ConnectionId "conn0", Some 1 + ConnectionId "conn1", Some 1 + ConnectionId "conn2", Some 1 + ] |> Map.ofList |> Ok + + "Partially connected and: missing bottom connections", state25, + [ + ConnectionId "conn0", Some 1 + ConnectionId "conn2", Some 1 + ] |> Map.ofList |> Ok + + "Partially connected and: missing connection to output", state26, + [ + ConnectionId "conn0", Some 1 + ConnectionId "conn1", Some 1 + ] |> Map.ofList |> Ok + + "Partially connected and: missing both input connections", state27, + [ + ConnectionId "conn2", Some 1 + ] |> Map.ofList |> Ok + + "One input and one output, connected to the state3CustomComponent", state16, + [ + ConnectionId "conn0", Some 1 + ConnectionId "conn1", Some 1 + ] |> Map.ofList |> Ok + + "Nested custom components", state18, + [ + ConnectionId "conn0", Some 1 + ConnectionId "conn1", Some 1 + ] |> Map.ofList |> Ok +] + +let private testCasesWidthInfererBuses : WidhtInfererTestCase list = [ + "Two inputs connected to a MergeWires component. No other connections", stateBus1, + [ + ConnectionId "conn0", Some 1 + ConnectionId "conn1", Some 1 + ] |> Map.ofList |> Ok + + "A MergeWires connected to a SplitWire 1.", stateBus2, + [ + ConnectionId "conn0", None + ] |> Map.ofList |> Ok + + "A MergeWires connected to a SplitWire 1 and a single-bit output node", stateBus3, + [ + ConnectionId "conn0", None + ConnectionId "conn1", None + ] |> Map.ofList |> Ok + + "A MergeWires connected to a SplitWire 1, with loop", stateBus4, + [ + ConnectionId "conn0", None + ConnectionId "conn1", None + ] |> Map.ofList |> Ok + + "All the bus components in series, properly connected. No other components", stateBus6, + [ + ConnectionId "conn0", None + ConnectionId "conn1", None + ConnectionId "conn2", None + ConnectionId "conn3", None + ConnectionId "conn4", None + ] |> Map.ofList |> Ok + + "Non-inferrable loop", stateBus7, + [ + ConnectionId "conn0", None + ConnectionId "conn1", None + ] |> Map.ofList |> Ok + + "Mux connected to two MergeWires. Width not inferrable", stateBus8, + [ + ConnectionId "conn0", None + ConnectionId "conn1", None + ] |> Map.ofList |> Ok + + "A 4 bit input connected to a four bit output", stateBus13, + [ + ConnectionId "conn", Some 4 + ] |> Map.ofList |> Ok + + "A 2 bit input split into 2 single bit outputs", stateBus16, + [ + ConnectionId "conn0", Some 2 + ConnectionId "conn1", Some 1 + ConnectionId "conn2", Some 1 + ] |> Map.ofList |> Ok + + "3 bit input merged with 4 bit input, then split in the same way", stateBus17, + [ + ConnectionId "678ffa07-0ed7-7b6f-ba9b-b14839c08a71", Some 7 + ConnectionId "7438de0c-bbaf-c1f6-0307-42ece66c6c00", Some 4 + ConnectionId "82cc4ce9-7b15-40ac-0226-98a7f8e2fb9a", Some 4 + ConnectionId "9df32195-00b4-9795-3dc1-78fb70d453f2", Some 3 + ConnectionId "cd13c70f-6037-0cf4-1295-5795e92d745c", Some 3 + ] |> Map.ofList |> Ok + + "Partially connected Mux2", stateBus18, + [ + ConnectionId "conn-sel", Some 1 + ConnectionId "conn-top-input", Some 2 + ConnectionId "conn-to-output", Some 2 + ] |> Map.ofList |> Ok + + "Partially connected Demux2", stateBus20, + [ + ConnectionId "conn-to-input", Some 2 + ConnectionId "conn-to-output", Some 2 + ] |> Map.ofList |> Ok +] + +let private testCasesWidthInfererError : WidhtInfererTestCase list = [ + "Two inputs connected to the same output", state5, + Error { + Msg = "A wire must have precisely one driving component. If you want to merge two wires together, use a MergeWires component." + ConnectionsAffected = ["conn1"; "conn0"] |> List.map ConnectionId + } + + "Two inputs; one And; one output; with extra connection input to output", state7, + Error { + Msg = "A wire must have precisely one driving component. If you want to merge two wires together, use a MergeWires component." + ConnectionsAffected = ["conn3"; "conn2"] |> List.map ConnectionId + } + + "And connected to a SplitWire 1", stateBus9, + Error { + Msg = "Wrong wire width. Target port expects a signal with at least 2 bits, but source port produces a 1 bit(s) signal." + ConnectionsAffected = ["conn0"] |> List.map ConnectionId + } + + "A 4 bit input connected to a 3 bit output", stateBus14, + Error { + Msg = "Wrong wire width. Target port expects a 3 bit(s) signal, but source port produces a 4 bit(s) signal." + ConnectionsAffected = ["conn"] |> List.map ConnectionId + } + + "A 3 bit input connected to a 4 bit output", stateBus15, + Error { + Msg = "Wrong wire width. Target port expects a 4 bit(s) signal, but source port produces a 3 bit(s) signal." + ConnectionsAffected = ["conn"] |> List.map ConnectionId + } + + "Fully connected Mux, but two inputs have different widths", stateBus19, + Error { + Msg = "Wrong wire width. The two inputs to a multiplexer are expected to have the same width, but top input has 2 bits and bottom input has 1 bits." + ConnectionsAffected = ["conn-top-input"; "conn-bottom-input"] |> List.map ConnectionId + } +] + +let testCasesWidthInferer : WidhtInfererTestCase list = + testCasesWidthInfererSimple @ + testCasesWidthInfererBuses @ + testCasesWidthInfererError diff --git a/Tests/logStateToFSharp.py b/Tests/logStateToFSharp.py new file mode 100644 index 0000000..c5a0180 --- /dev/null +++ b/Tests/logStateToFSharp.py @@ -0,0 +1,59 @@ +# Python script that helps transforming the result of logging a file back into +# an f# data structure. +# Useful when writing the CanvasStates for the tests. + +import re + +state = """ +[ + {Id = 8078a917-236f-5a40-18a6-8e2d6a1458f5;Type = Input 2;Label = a;InputPorts = [];OutputPorts = [{Id = cc7c6510-d49b-28d9-e0bc-d5350a2c76a8;PortNumber = 0;PortType = Output;HostId = 8078a917-236f-5a40-18a6-8e2d6a1458f5}];X = 122;Y = 125}; + {Id = fbfb4202-9816-f214-0401-da18caddeb0f;Type = Demux2;Label = ;InputPorts = [{Id = 2b224026-609a-5eae-6885-ff9820dbae5f;PortNumber = 0;PortType = Input;HostId = fbfb4202-9816-f214-0401-da18caddeb0f}; {Id = 68043f9b-47e7-793f-fed2-943a7d7336dc;PortNumber = 1;PortType = Input;HostId = fbfb4202-9816-f214-0401-da18caddeb0f}];OutputPorts = [{Id = 57070484-347e-4701-8c36-f510c2ef150c;PortNumber = 0;PortType = Output;HostId = fbfb4202-9816-f214-0401-da18caddeb0f}; {Id = 123463bf-7868-9a87-6fb1-36627a3c9bad;PortNumber = 1;PortType = Output;HostId = fbfb4202-9816-f214-0401-da18caddeb0f}];X = 254;Y = 110}; + {Id = 00661085-7d05-4185-09ef-4138ac918ad2;Type = Output 2;Label = aa;InputPorts = [{Id = 7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45;PortNumber = 0;PortType = Input;HostId = 00661085-7d05-4185-09ef-4138ac918ad2}];OutputPorts = [];X = 401;Y = 117} +], +[ + {Id = 1ef71074-fa16-a068-84a0-18d324e3ada6;Source = {Id = 57070484-347e-4701-8c36-f510c2ef150c;PortNumber = null;PortType = Output;HostId = fbfb4202-9816-f214-0401-da18caddeb0f};Target = {Id = 7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45;PortNumber = null;PortType = Input;HostId = 00661085-7d05-4185-09ef-4138ac918ad2};Vertices = [284,126.66666666666667; 343.5,126.66666666666667; 343.5,127; 401,127]}; + {Id = f326a7a3-79d5-4ace-f0cf-606657fc2c42;Source = {Id = cc7c6510-d49b-28d9-e0bc-d5350a2c76a8;PortNumber = null;PortType = Output;HostId = 8078a917-236f-5a40-18a6-8e2d6a1458f5};Target = {Id = 2b224026-609a-5eae-6885-ff9820dbae5f;PortNumber = null;PortType = Input;HostId = fbfb4202-9816-f214-0401-da18caddeb0f};Vertices = [152,135; 254,135]} +] +""" + +def applyAll(functions, init): + res = init + for f in functions: + res = f(res) + return res + +def addQuotesId(str): + return re.sub(r'Id = ([0-9a-z\-]*)', r'Id = "\1"', str) + +def addQuotesLabel(str): + return re.sub(r'Label = ([0-9a-zA-Z\-]*)', r'Label = "\1"', str) + +def addPortTypeDot(str): + return re.sub(r'PortType = (Input|Output)', r'PortType = PortType.\1', str) + +def replaceNull(str): + return re.sub(r'PortNumber = null;', r'PortNumber = None;', str) + +def replacePortNumberSome(str): + return re.sub(r'PortNumber = (\d);', r'PortNumber = Some \1;', str) + +def replaceCustomName(str): + return re.sub(r'Name = ([0-9a-zA-Z\-]*)', r'Name = "\1"', str) + +def replaceLabels(str): + return re.sub(r'InputLabels = [([0-9a-zA-Z\-]*); ]', r'Label = "\1"', str) + +def replaceFloat(str): + return re.sub(r'(\d\d+)(,|;|])', r'\1.0\2', str) + +functions = [ + addQuotesId, + addQuotesLabel, + addPortTypeDot, + replaceNull, + replacePortNumberSome, + replaceCustomName, + replaceFloat, +] + +print(applyAll(functions, state)) diff --git a/Tests/paket.references b/Tests/paket.references new file mode 100644 index 0000000..5709242 --- /dev/null +++ b/Tests/paket.references @@ -0,0 +1,13 @@ +group Electron + Fable.Core + Fable.Browser.Dom + Fable.Electron + Fable.Elmish + Fable.Elmish.React + Fable.Elmish.Debugger + Fable.Elmish.HMR + Fable.Node + Fable.Promise + Fable.React + Fulma + Fable.SimpleJson diff --git a/build.cmd b/build.cmd new file mode 100644 index 0000000..0927384 --- /dev/null +++ b/build.cmd @@ -0,0 +1,6 @@ +@echo off +cls +dotnet tool restore +dotnet paket install +:: dotnet restore build.proj +dotnet fake build -t %* \ No newline at end of file diff --git a/build.fsx b/build.fsx new file mode 100644 index 0000000..f9eaf0e --- /dev/null +++ b/build.fsx @@ -0,0 +1,99 @@ +#r "paket: groupref FakeBuild //" +#load ".fake/build.fsx/intellisense.fsx" + +#if !FAKE +#r "netstandard" +#r "Facades/netstandard" // https://github.com/ionide/ionide-vscode-fsharp/issues/839#issuecomment-396296095 +#endif + +open System +open Fake.Core +open Fake.Core.TargetOperators +open Fake.DotNet +open Fake.IO +open Fake.IO.Globbing.Operators +open Fake.IO.FileSystemOperators +open Fake.JavaScript + +Target.create "CleanDev" (fun _ -> + !! "src/**/bin" + ++ "src/**/obj" + ++ "dist" + ++ ".fable" + |> Shell.cleanDirs +) + +Target.create "Clean" (fun _ -> + !! "src/**/bin" + ++ "src/**/obj" + ++ "dist" + ++ ".fable" + |> Shell.cleanDirs + Target.run 1 "KillZombies" [] +) + +Target.create "CleanFableJS" <| fun _ -> + !! (__SOURCE_DIRECTORY__ @@ "src/**/*.fs.js") + ++ (__SOURCE_DIRECTORY__ @@ "src/**/*.map") + |> Seq.toList + |> File.deleteAll + +Target.create "CleanNode" <| fun _ -> + Shell.cleanDir (__SOURCE_DIRECTORY__ @@ "node_modules") + File.delete (__SOURCE_DIRECTORY__ @@ "package-lock.json") + +Target.create "DotnetRestore" (fun _ -> + Shell.Exec("dotnet","restore issie.sln") |> ignore) + +Target.create "NpmInstall" (fun _ -> + Npm.install id +) + +Target.create "Build" (fun _ -> + Npm.run "compile" id +) + +Target.create "Dev" (fun _ -> + Npm.run "dev" id +) + +Target.create "Dist" (fun _ -> + Npm.run "dist" id +) + +Target.create "DistDir" (fun _ -> + Npm.run "dist:dir" id +) + +Target.create "KillZombies" <| fun _ -> + Fake.Core.Process.killAllByName "issie.exe" + Fake.Core.Process.killAllByName "node" + Fake.Core.Process.killAllByName "dotnet" + +// Build order + +"CleanFableJS" + ==> "Clean" + +"CleanFableJS" + ==> "CleanDev" + +"CleanDev" + ==> "DotnetRestore" + ==> "NpmInstall" + ==> "Build" + +"NpmInstall" + ==> "Dev" + +"NpmInstall" + ==> "Dist" + +"NpmInstall" + ==> "DistDir" + +"CleanFableJS" + ==> "dev" + +// start build +Target.runOrDefaultWithArguments "Dev" diff --git a/build.fsx.lock b/build.fsx.lock new file mode 100644 index 0000000..42d6cd2 --- /dev/null +++ b/build.fsx.lock @@ -0,0 +1,5 @@ +STORAGE: NONE +RESTRICTION: || (== net6.0) (== netstandard2.0) +NUGET + remote: https://api.nuget.org/v3/index.json + FSharp.Core (6.0.1) diff --git a/build.old.fsx b/build.old.fsx new file mode 100644 index 0000000..ff593de --- /dev/null +++ b/build.old.fsx @@ -0,0 +1,785 @@ +// -------------------------------------------------------------------------------------- +// FAKE build script +// -------------------------------------------------------------------------------------- +#nowarn "0213" +#r "paket: groupref FakeBuild //" +#load "./tools/FSharpLint.fs" +#load "./tools/ElectronTools.fs" +#load "./tools/Updating.fs" +#load "./.fake/build.fsx/intellisense.fsx" + +open BlackFox.CommandLine +open Fake.Core +open Fake.Core.TargetOperators +open Fake.DotNet +open Fake.JavaScript +open Fake.IO +open Fake.IO.FileSystemOperators +open Fake.IO.Globbing.Operators +open Fake.Net.Http +open Fake.Tools +open Fantomas.FakeHelpers +open Fantomas.FormatConfig +open Tools.Electron +open Tools.Linting +open Tools.Updating +open System +open System.IO + +// The name of the project +// (used by attributes in AssemblyInfo, name of a NuGet package and directory in 'src') +let project = "issie" + +// Short summary of the project +// (used as description in AssemblyInfo and as a short summary for NuGet package) +let summary = "Schematic editor and Simulator" + +// Author(s) of the project +let author = "tomcl" + +// File system information +let solutionFile = "issie.sln" + +// Build docs website root +let website = "https://tomcl.github.io/issie/docs" + +// Github repository +let repo = @"https://github.com/tomcl/issie" + +// Web or JS related fs projects +// Projects that have bindings to other languages where name linting needs to be more relaxed. +let relaxedNameLinting = + [ (__SOURCE_DIRECTORY__ @@ "src/Electron/**/*.fs") ] + +let netCoreVersions = [ "netcoreapp3.1" ] + +// OS runtime targets +let runTimes = ["win-x64";"linux-x64"] + +// Read additional information from the release notes document +let release = ReleaseNotes.load (__SOURCE_DIRECTORY__ @@ "RELEASE_NOTES.md") + +// Helper active pattern for project types +let (|Fsproj|Csproj|Vbproj|Shproj|) (projFileName:string) = + match projFileName with + | f when f.EndsWith("fsproj") -> Fsproj + | f when f.EndsWith("csproj") -> Csproj + | f when f.EndsWith("vbproj") -> Vbproj + | f when f.EndsWith("shproj") -> Shproj + | _ -> failwith (sprintf "Project file %s not supported. Unknown project type." projFileName) + +let tools = __SOURCE_DIRECTORY__ @@ "tools" +let srcGlob = __SOURCE_DIRECTORY__ @@ "src/**/*.??proj" +let fsSrcGlob = __SOURCE_DIRECTORY__ @@ "src/**/*.fs" +let fsTestGlob = __SOURCE_DIRECTORY__ @@ "tests/**/*.fs" +let bin = __SOURCE_DIRECTORY__ @@ "bin" +let temp = __SOURCE_DIRECTORY__ @@ "temp" +let objFolder = __SOURCE_DIRECTORY__ @@ "obj" +let dist = __SOURCE_DIRECTORY__ @@ "dist" +let fable = __SOURCE_DIRECTORY__ @@ ".fable" +let fsProjGlob = + !! (__SOURCE_DIRECTORY__ @@ "src/**/*.fsproj") + ++ (__SOURCE_DIRECTORY__ @@ "tests/**/*.fsproj") + +let foldExcludeGlobs (g: IGlobbingPattern) (d: string) = g -- d +let foldIncludeGlobs (g: IGlobbingPattern) (d: string) = g ++ d + +let fsSrcAndTest = + !! fsSrcGlob + ++ fsTestGlob + -- (__SOURCE_DIRECTORY__ @@ "src/**/obj/**") + -- (__SOURCE_DIRECTORY__ @@ "tests/**/obj/**") + -- (__SOURCE_DIRECTORY__ @@ "src/**/AssemblyInfo.*") + -- (__SOURCE_DIRECTORY__ @@ "src/**/**/AssemblyInfo.*") + +let fsRelaxedNameLinting = + let baseGlob s = + !! s + -- (__SOURCE_DIRECTORY__ @@ "src/**/AssemblyInfo.*") + -- (__SOURCE_DIRECTORY__ @@ "src/**/obj/**") + -- (__SOURCE_DIRECTORY__ @@ "tests/**/obj/**") + match relaxedNameLinting with + | [h] when relaxedNameLinting.Length = 1 -> baseGlob h |> Some + | h::t -> List.fold foldIncludeGlobs (baseGlob h) t |> Some + | _ -> None + +let failOnBadExitAndPrint (p : ProcessResult) = + if p.ExitCode <> 0 then + p.Errors |> Seq.iter Trace.traceError + failwithf "failed with exitcode %d" p.ExitCode + +module dotnet = + let tool optionConfig command args = + DotNet.exec (fun p -> { p with WorkingDirectory = tools} |> optionConfig ) (sprintf "%s" command) args + |> failOnBadExitAndPrint + + let femto optionConfig args = + tool optionConfig (!!(__SOURCE_DIRECTORY__ @@ "packages/tooling/Femto/tools/**/**/Femto.dll") |> Seq.head) args + +let setCmd f args = + match Environment.isWindows with + | true -> Command.RawCommand(f, Arguments.OfArgs args) + | false -> Command.RawCommand("mono", Arguments.OfArgs (f::args)) + +let configuration() = + FakeVar.getOrDefault "configuration" "Release" + +let getEnvFromAllOrNone (s: string) = + let envOpt (envVar: string) = + if String.isNullOrEmpty envVar then None + else Some(envVar) + + let procVar = Environment.GetEnvironmentVariable(s) |> envOpt + let userVar = Environment.GetEnvironmentVariable(s, EnvironmentVariableTarget.User) |> envOpt + let machVar = Environment.GetEnvironmentVariable(s, EnvironmentVariableTarget.Machine) |> envOpt + + match procVar,userVar,machVar with + | Some(v), _, _ + | _, Some(v), _ + | _, _, Some(v) + -> Some(v) + | _ -> None + + +// -------------------------------------------------------------------------------------- +// Initialisation and fixup actions + +Target.create "Init" <| fun _ -> + Fake.IO.File.delete (__SOURCE_DIRECTORY__ @@ ".paket/Paket.Restore.Targets") + Fake.IO.Directory.delete (__SOURCE_DIRECTORY__ @@ "packet_files") + +Target.create "KillCreated" <| fun _ -> + Fake.Core.Process.killAllCreatedProcesses() + +Target.create "KillZombies" <| fun _ -> + Fake.Core.Process.killAllByName "issie.exe" + Fake.Core.Process.killAllByName "node" + Fake.Core.Process.killAllByName "dotnet" + + + +// -------------------------------------------------------------------------------------- +// Set configuration mode based on target + +Target.create "ConfigDebug" <| fun _ -> + FakeVar.set "configuration" "Debug" + +Target.create "ConfigRelease" <| fun _ -> + FakeVar.set "configuration" "Release" + +// -------------------------------------------------------------------------------------- +// Generate assembly info files with the right version & up-to-date information + +Target.create "AssemblyInfo" <| fun _ -> + let getAssemblyInfoAttributes projectName = + [ AssemblyInfo.Title (projectName) + AssemblyInfo.Product project + AssemblyInfo.Description summary + AssemblyInfo.Version release.AssemblyVersion + AssemblyInfo.FileVersion release.AssemblyVersion + AssemblyInfo.Configuration <| configuration() + AssemblyInfo.InternalsVisibleTo (sprintf "%s.Tests" projectName) ] + + let getProjectDetails projectPath = + let projectName = Path.GetFileNameWithoutExtension(projectPath) + ( projectPath, + projectName, + Path.GetDirectoryName(projectPath), + (getAssemblyInfoAttributes projectName) + ) + + !! srcGlob + |> Seq.map getProjectDetails + |> Seq.iter (fun (projFileName, _, folderName, attributes) -> + match projFileName with + | Fsproj -> AssemblyInfoFile.createFSharp (folderName "AssemblyInfo.fs") attributes + | Csproj -> AssemblyInfoFile.createCSharp ((folderName "Properties") "AssemblyInfo.cs") attributes + | Vbproj -> AssemblyInfoFile.createVisualBasic ((folderName "My Project") "AssemblyInfo.vb") attributes + | Shproj -> () ) + +// -------------------------------------------------------------------------------------- +// Update package.json version & name + +Target.create "PackageJson" <| fun _ -> + let setValues (current: Json.JsonPackage) = + { current with + Name = Str.toKebabCase project |> Some + Description = summary |> Some + Version = release.NugetVersion |> Some + Repository = + match current.Repository with + | Some(r) -> + { r with + Json.RepositoryValue.Type = "git" |> Some + Json.RepositoryValue.Url = repo + ".git" |> Some } + | _ -> + { Json.RepositoryValue.Type = "git" |> Some + Json.RepositoryValue.Url = repo + ".git" |> Some + Json.RepositoryValue.Directory = None } + |> Some + Author = author |> Some + License = (File.readLine(__SOURCE_DIRECTORY__ @@ "LICENSE.md").Split(' ')) |> Array.head |> Some + Bugs = { Json.BugsValue.Url = (repo + "/issues" |> Some) } |> Some + Homepage = repo |> Some } + + Json.setJsonPkg setValues + +// -------------------------------------------------------------------------------------- +// Copies binaries from default VS location to expected bin folder +// But keeps a subdirectory structure for each project in the +// src folder to support multiple project outputs + +Target.create "CopyBinaries" <| fun _ -> + !! srcGlob + -- (__SOURCE_DIRECTORY__ @@ "src/**/*.shproj") + -- (__SOURCE_DIRECTORY__ @@ "src/**/Electron.Fable.fsproj") + |> Seq.map (fun f -> ((Path.getDirectory f) @@ "bin" @@ configuration(), "bin" @@ (Path.GetFileNameWithoutExtension f))) + |> Seq.iter (fun (fromDir, toDir) -> Shell.copyDir toDir fromDir (fun _ -> true)) + +// -------------------------------------------------------------------------------------- +// Clean tasks + +Target.create "Clean" <| fun _ -> + let clean() = + !! (__SOURCE_DIRECTORY__ @@ "tests/**/bin") + ++ (__SOURCE_DIRECTORY__ @@ "tests/**/obj") + ++ (__SOURCE_DIRECTORY__ @@ "tools/bin") + ++ (__SOURCE_DIRECTORY__ @@ "tools/obj") + ++ (__SOURCE_DIRECTORY__ @@ "src/**/bin") + ++ (__SOURCE_DIRECTORY__ @@ "src/**/obj") + |> Seq.toList + |> List.append [bin; temp; objFolder; dist; fable] + |> Shell.cleanDirs + TaskRunner.runWithRetries clean 99 + +Target.create "CleanDocs" <| fun _ -> + let clean() = + Shell.cleanDirs ["docs"] + TaskRunner.runWithRetries clean 99 + +Target.create "PostBuildClean" <| fun _ -> + let clean() = + !! srcGlob + -- (__SOURCE_DIRECTORY__ @@ "src/**/*.shproj") + |> Seq.map ( + (fun f -> (Path.getDirectory f) @@ "bin" @@ configuration()) + >> (fun f -> Directory.EnumerateDirectories(f) |> Seq.toList ) + >> (fun fL -> fL |> List.map (fun f -> Directory.EnumerateDirectories(f) |> Seq.toList))) + |> (Seq.concat >> Seq.concat) + |> Seq.iter Directory.delete + TaskRunner.runWithRetries clean 99 + +Target.create "PostPublishClean" <| fun _ -> + let clean() = + !! (__SOURCE_DIRECTORY__ @@ "src/**/bin" @@ configuration() @@ "/**/publish") + |> Seq.iter Directory.delete + TaskRunner.runWithRetries clean 99 + +Target.create "CleanElectronBin" <| fun _ -> + let netCores = + netCoreVersions + |> List.map (fun s -> __SOURCE_DIRECTORY__ @@ "bin/Core" @@ s) + + let clean() = + !! (__SOURCE_DIRECTORY__ @@ "bin/Main") + ++ (__SOURCE_DIRECTORY__ @@ "bin/Renderer") + ++ (__SOURCE_DIRECTORY__ @@ "bin/Common") + ++ (__SOURCE_DIRECTORY__ @@ "bin/Simulator") + ++ (__SOURCE_DIRECTORY__ @@ "bin/WidthInferer") + |> List.ofSeq + |> Shell.deleteDirs + + let runtimeDirs = + runTimes + |> List.map (fun s -> + netCores + |> List.map (fun coreVer -> coreVer @@ s @@ "**")) + |> List.concat + + match netCores |> List.tryHead with + | Some(h) -> + !! (h @@ "**") + |> (fun src -> List.fold foldIncludeGlobs src netCores.Tail) + |> (fun src -> List.fold foldExcludeGlobs src runtimeDirs) + |> Seq.iter Shell.rm + | _ -> () + TaskRunner.runWithRetries clean 99 + +// -------------------------------------------------------------------------------------- +// Restore tasks + +let restoreSolution () = + solutionFile + |> DotNet.restore id + +Target.create "Restore" <| fun _ -> + TaskRunner.runWithRetries restoreSolution 5 + +// Add task to make Node.js cli ready +Target.create "YarnInstall" <| fun _ -> + let setParams (defaults:Yarn.YarnParams) = + if Environment.isLinux then + defaults + else + { defaults with + Yarn.YarnParams.YarnFilePath = (__SOURCE_DIRECTORY__ @@ "packages/tooling/Yarnpkg.Yarn/content/bin/yarn.cmd") + } + Yarn.install setParams + +// Build Key.json if necessary from GD_KEY env variable +Target.create "BuildKeys" <| fun _ -> + let jsonPath = + __SOURCE_DIRECTORY__ @@ "src/Core/Key.json" + |> FileInfo.ofPath + let key = + let insertKey s = sprintf "{ \"key\": \"%s\" }" s + + getEnvFromAllOrNone "GD_KEY" + |> Option.map (insertKey) + |> defaultArg <| "" + TraceSecrets.register "" key + + if key <> "" && jsonPath.Exists |> not then + File.writeString false jsonPath.FullName key + else () + +// -------------------------------------------------------------------------------------- +// Build tasks + +Target.create "Build" <| fun _ -> + let setParams (defaults:MSBuildParams) = + { defaults with + Verbosity = Some(Quiet) + Targets = ["Build"] + Properties = + [ + "Optimize", "True" + "DebugSymbols", "True" + "Configuration", configuration() + "Version", release.AssemblyVersion + "GenerateDocumentationFile", "true" + "DependsOnNETStandard", "true" + ] + } + restoreSolution() + MSBuild.build setParams solutionFile + +Target.create "BuildElectron" <| fun _ -> + Npm.exec "rebuild node-sass" id + Yarn.exec "compile" id + +// Run Dev mode +Target.create "Dev" <| fun _ -> + Yarn.exec "dev" id + +// Build artifacts +Target.create "DistWin" <| fun _ -> + Yarn.exec "distwin" id + +// Build artifacts +Target.create "DistMac" <| fun _ -> + Yarn.exec "distmac" id + +// Gets latest docker image to build for linux +Target.create "PullDockerImage" <| fun _ -> + CmdLine.Empty + |> CmdLine.append "pull" + |> CmdLine.append "electronuserland/builder" + |> CmdLine.toString + |> CreateProcess.fromRawCommandLine "docker" + |> CreateProcess.ensureExitCodeWithMessage "Pulling electronuserland/builder docker container failed." + |> Proc.run + |> ignore + +// Build artifacts +Target.create "DistLinux" <| fun _ -> + let sandboxPath = @"./node_modules/electron/dist/chrome-sandbox" + + CmdLine.Empty + |> CmdLine.append "run" + |> CmdLine.append "--rm" + |> CmdLine.appendRaw (sprintf "-v %s:/project" __SOURCE_DIRECTORY__) + |> CmdLine.appendRaw "-v electron:/root/.cache/electron" + |> CmdLine.appendRaw "-v electron-builder:/root/.cache/electron-builder electronuserland/builder" + |> CmdLine.appendRaw (sprintf "/bin/bash -c \"chown -R root %s && chmod 4755 %s && yarn --link-duplicates --pure-lockfile && yarn distLinux\"" sandboxPath sandboxPath) + |> CmdLine.toString + |> CreateProcess.fromRawCommandLine "docker" + |> CreateProcess.ensureExitCodeWithMessage "Failed to build linux image." + |> Proc.run + |> ignore + +// -------------------------------------------------------------------------------------- +// Create differentials for updating + +Target.create "CreateDiffs" <| fun _ -> + let latestTag = (Git.CommandHelper.runSimpleGitCommand __SOURCE_DIRECTORY__ "describe --tag").Split('-').[0] + let latestRelease = + if Version(release.NugetVersion) <= Version(latestTag.Substring(1)) then + failwith "Cannot create diff of older version" + else + sprintf "https://github.com/Shmew/MordhauBuddy/releases/download/%s" latestTag + + let downloadSignature (fi: FileInfo) = + let file = + match fi.Extension with + | ext when ext = ".exe" -> sprintf "MordhauBuddy.Setup.%s%s.sig" (latestTag.Substring(1)) ext + | ext when ext = ".AppImage" -> sprintf "MordhauBuddy-%s%s.sig" (latestTag.Substring(1)) ext + | _ -> failwith "Invalid file extention for generating delta" + + sprintf "%s/%s" latestRelease file + |> downloadFile (fi.Directory.FullName @@ file) + + !! (__SOURCE_DIRECTORY__ @@ "dist/linux-x64/*.AppImage") + ++ (__SOURCE_DIRECTORY__ @@ "dist/win-x64/*.exe") + |> List.ofSeq + |> List.distinct + |> List.iter (fun f -> + let fi = FileInfo.ofPath(f) + genSigNew (sprintf "%s.sig" fi.Name) fi + + downloadSignature fi + |> FileInfo.ofPath + |> genDelta fi) + +// -------------------------------------------------------------------------------------- +// Publish net core applications + +Target.create "PublishDotNet" <| fun _ -> + let runPublish (project: string) (framework: string) = + let buildWithRunTime (rt: string) = + let setParams (defaults:MSBuildParams) = + { defaults with + Verbosity = Some(Quiet) + Targets = ["Publish"] + Properties = + [ + "Optimize", "True" + "DebugSymbols", "True" + "Configuration", configuration() + "Version", release.AssemblyVersion + "GenerateDocumentationFile", "true" + "TargetFramework", framework + "SelfContained", "true" + "RuntimeIdentifier", rt + ] + } + MSBuild.build setParams project + runTimes |> List.iter buildWithRunTime + + !! srcGlob + -- (__SOURCE_DIRECTORY__ @@ "src/**/*.shproj") + -- (__SOURCE_DIRECTORY__ @@ "src/**/*.vbproj") + |> Seq.map + ((fun f -> (((Path.getDirectory f) @@ "bin" @@ configuration()), f) ) + >> + (fun f -> + Directory.EnumerateDirectories(fst f) + |> Seq.filter (fun frFolder -> frFolder.Contains("netcoreapp")) + |> Seq.map (fun frFolder -> DirectoryInfo(frFolder).Name), snd f)) + |> Seq.iter (fun (l,p) -> l |> Seq.iter (runPublish p)) + +// -------------------------------------------------------------------------------------- +// Lint and format source code to ensure consistency + +Target.create "Format" <| fun _ -> + let config = + { FormatConfig.Default with + PageWidth = 120 + SpaceBeforeColon = false } + + fsSrcAndTest + |> List.ofSeq + |> formatCode config + |> Async.RunSynchronously + |> printfn "Formatted files: %A" + +Target.create "Lint" <| fun _ -> + fsSrcAndTest + -- (__SOURCE_DIRECTORY__ @@ "src/**/AssemblyInfo.*") + |> (fun src -> List.fold foldExcludeGlobs src relaxedNameLinting) + |> (fun fGlob -> + match fsRelaxedNameLinting with + | Some(glob) -> + [(false, fGlob); (true, glob)] + | None -> [(false, fGlob)]) + |> Seq.map (fun (b,glob) -> (b,glob |> List.ofSeq)) + |> List.ofSeq + |> FSharpLinter.lintFiles (__SOURCE_DIRECTORY__ @@ "bin/LintResults.xml") + +// -------------------------------------------------------------------------------------- +// Validate JavaScript dependencies + +Target.create "ValidateJSPackages" <| fun _ -> + let validate () = + fsProjGlob + |> Seq.iter (fun file -> + dotnet.femto id + (sprintf "--resolve %s" file)) + TaskRunner.runWithRetries validate 5 + +// -------------------------------------------------------------------------------------- +// Run the unit test binaries + +Target.create "RunTests" <| fun _ -> + !! ("tests/**/bin" @@ configuration() @@ "**" @@ "*Tests.exe") + |> Seq.iter (fun f -> + CreateProcess.fromCommand(setCmd f []) + |> CreateProcess.withTimeout (TimeSpan.MaxValue) + |> CreateProcess.ensureExitCodeWithMessage "Tests failed." + |> Proc.run + |> ignore) + +// -------------------------------------------------------------------------------------- +// Generate Paket load scripts +Target.create "LoadScripts" <| fun _ -> + let frameworks = + __SOURCE_DIRECTORY__ @@ "bin" + |> Directory.EnumerateDirectories + |> Seq.map (fun d -> + Directory.EnumerateDirectories d + |> Seq.map (fun f -> DirectoryInfo(f).Name) + |> List.ofSeq) + |> List.ofSeq + |> List.reduce List.append + |> List.distinct + |> List.reduce (fun acc elem -> sprintf "%s --framework %s" elem acc) + |> function + | e when e.Length > 0 -> + Some (sprintf "--framework %s" e) + | _ -> None + + let arguments = + [Some("generate-load-scripts"); frameworks] + |> List.choose id + |> List.reduce (fun acc elem -> sprintf "%s %s" acc elem) + + arguments + |> CreateProcess.fromRawCommandLine ((__SOURCE_DIRECTORY__ @@ ".paket") @@ "paket.exe") + |> CreateProcess.withTimeout (TimeSpan.MaxValue) + |> CreateProcess.ensureExitCodeWithMessage "Failed to generate paket load scripts." + |> Proc.run + |> ignore + +// -------------------------------------------------------------------------------------- +// Generate the documentation + + +// Paths with template/source/output locations +let content = __SOURCE_DIRECTORY__ @@ "docsrc/content" +let output = __SOURCE_DIRECTORY__ @@ "docs" +let files = __SOURCE_DIRECTORY__ @@ "docsrc/files" +let templates = __SOURCE_DIRECTORY__ @@ "docsrc/tools/templates" +let formatting = __SOURCE_DIRECTORY__ @@ "packages/formatting/FSharp.Formatting" +let toolPath = __SOURCE_DIRECTORY__ @@ "packages/formatting/FSharp.Formatting.CommandTool/tools/fsformatting.exe" +let docTemplate = "docpage.cshtml" + +Target.create "LocalDocs" <| fun _ -> + FakeVar.set "Website" website // for now we never generate local docs +Target.create "ReleaseDocs" <| fun _ -> + FakeVar.set "Website" website + +// Specify more information about your project +let info () = + [ "project-name", project + "project-author", author + "project-summary", summary + "project-repo", repo + "root", FakeVar.getOrDefault "Website" website ] + +let referenceBinaries = [] + +let layoutRootsAll = new Collections.Generic.Dictionary() +layoutRootsAll.Add("en",[ templates; + formatting @@ "templates" + formatting @@ "templates/reference" ]) + +Target.create "ReferenceDocs" <| fun _ -> + Directory.ensure (output @@ "reference") + + let lDirs = + DirectoryInfo.getSubDirectories <| DirectoryInfo bin + |> Array.map DirectoryInfo.getSubDirectories + |> Array.reduce Array.append + |> Array.map (fun x -> x.FullName.ToLower()) + |> List.ofArray + printfn "lDirs=%A" lDirs + let binaries () = + let manuallyAdded = + referenceBinaries + |> List.map (fun b -> bin @@ b) + + let conventionBased = + DirectoryInfo.getSubDirectories <| DirectoryInfo bin + |> Array.collect (fun d -> + let name, dInfo = + let netFrameworkBin = + DirectoryInfo.getSubDirectories d |> Array.filter(fun x -> x.FullName.ToLower().Contains("net4")) + let netCoreBin = + DirectoryInfo.getSubDirectories d |> Array.filter(fun x -> x.FullName.ToLower().Contains("netcoreapp")) + + match netFrameworkBin.Length > 0 with + | true -> + d.Name, netFrameworkBin |> Array.head + | false -> + d.Name, netCoreBin |> Array.head + + dInfo.GetFiles() + |> Array.filter (fun x -> + x.Name.ToLower() = (sprintf "%s.dll" name).ToLower() + || x.Name.ToLower() = (sprintf "%s.exe" name).ToLower()) + |> Array.map (fun x -> x.FullName)) + |> List.ofArray + + conventionBased @ manuallyAdded + printfn "Binaries=%A" (binaries()) + binaries() + |> FSFormatting.createDocsForDlls (fun args -> + { args with + OutputDirectory = output @@ "reference" + LayoutRoots = layoutRootsAll.["en"] + ProjectParameters = info() + LibDirs = lDirs + ToolPath = toolPath + SourceRepository = repo @@ "tree/master" }) + +let copyFiles () = + Shell.copyRecursive files output true + |> Trace.logItems "Copying file: " + Directory.ensure (output @@ "content") + Shell.copyRecursive (formatting @@ "styles") (output @@ "content") true + |> Trace.logItems "Copying styles and scripts: " + +Target.create "Docs" <| fun _ -> + File.delete "docsrc/content/release-notes.md" + Shell.copyFile "docsrc/content/" "RELEASE_NOTES.md" + Shell.rename "docsrc/content/release-notes.md" "docsrc/content/RELEASE_NOTES.md" + + DirectoryInfo.getSubDirectories (DirectoryInfo.ofPath templates) + |> Seq.iter (fun d -> + let name = d.Name + if name.Length = 2 || name.Length = 3 then + layoutRootsAll.Add( + name, [templates @@ name + formatting @@ "templates" + formatting @@ "templates/reference" ])) + copyFiles () + + for dir in [ content ] do + let langSpecificPath(lang, path:string) = + path.Split([|'/'; '\\'|], StringSplitOptions.RemoveEmptyEntries) + |> Array.exists(fun i -> i = lang) + let layoutRoots = + let key = layoutRootsAll.Keys |> Seq.tryFind (fun i -> langSpecificPath(i, dir)) + match key with + | Some lang -> layoutRootsAll.[lang] + | None -> layoutRootsAll.["en"] // "en" is the default language + + FSFormatting.createDocs (fun args -> + { args with + Source = content + OutputDirectory = output + LayoutRoots = layoutRoots + ProjectParameters = info() + Template = docTemplate }) + +Target.create "GenerateDocs" ignore + +// -------------------------------------------------------------------------------------- +// Release Scripts + +Target.create "GitPush" <| fun p -> + let msg = + p.Context.Arguments + |> List.choose (fun s -> + match s.StartsWith("--Msg=") with + | true -> Some(s.Substring 6) + | false -> None) + |> List.tryHead + |> function + | Some(s) -> s + | None -> (sprintf "Bump version to %s" release.NugetVersion) + + Git.Staging.stageAll "" + Git.Commit.exec "" msg + Git.Branches.push "" + +Target.create "GitTag" <| fun _ -> + Git.Branches.tag "" release.NugetVersion + Git.Branches.pushTag "" "origin" release.NugetVersion + +// -------------------------------------------------------------------------------------- +// Run all targets by default. Invoke 'build -t ' to override + +Target.create "All" ignore +Target.create "Release" ignore +Target.create "UpdateDocs" ignore +Target.create "AllDev" ignore +Target.create "QDev" <| fun _ -> + Yarn.exec "dev" id + +"Clean" + ==> "AssemblyInfo" + ==> "Restore" + ==> "YarnInstall" + ==> "Build" + ==> "BuildElectron" + ==> "PostBuildClean" + ==> "CopyBinaries" + +"Build" ==> "RunTests" + +"Build" + ==> "PostBuildClean" + ==> "PublishDotNet" + ==> "PostPublishClean" + ==> "CopyBinaries" + +"Restore" ==> "Lint" +"Restore" ==> "Format" + +"Lint" + ?=> "Build" + ?=> "RunTests" + ?=> "CleanDocs" + +"CopyBinaries" + ==> "CleanDocs" + ==> "Docs" + ==> "ReferenceDocs" + ==> "GenerateDocs" + ?=> "CleanElectronBin" + +"Clean" + ==> "GitPush" + ?=> "GitTag" + +"All" <== [ "CleanElectronBin"] + +"AllDev" <== ["CleanElectronBin"] + +"All" ?=> "Release" + +"LocalDocs" ?=> "All" +"ReleaseDocs" ?=> "All" + +"ConfigDebug" ?=> "Clean" +"ConfigRelease" ?=> "Clean" + +"PullDockerImage" + ==> "DistLinux" + + +"YarnInstall" + ==> "DistWin" + + +"DistWin" ?=> "DistLinux" + +"Dev" <== ["All"; "LocalDocs"; "ConfigDebug"] + +"DistWin" <== ["All"; "ConfigRelease"] +"DistLinux" <== ["All"; "ConfigRelease"] +"Release" <== ["All"; "ConfigRelease"; "DistWin"; "DistLinux"] +"UpdateDocs" <== ["All"; "ReleaseDocs"; "ConfigRelease"] + +Target.runOrDefaultWithArguments "Dev" diff --git a/build.proj b/build.proj new file mode 100644 index 0000000..b677fc3 --- /dev/null +++ b/build.proj @@ -0,0 +1,25 @@ + + + + + netstandard2.0 + true + + + + $([System.IO.Path]::GetFullPath("$(MSBuildThisFileDirectory)")) + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..1d539a8 --- /dev/null +++ b/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# to properly set Travis permissions: https://stackoverflow.com/questions/33820638/travis-yml-gradlew-permission-denied +# git update-index --chmod=+x fake.sh +# git commit -m "permission access for travis" + +set -eu +set -o pipefail + +dotnet tool restore +dotnet paket install +# dotnet restore build.proj + +if [ ! -f build.fsx ]; then + dotnet fake run init.fsx +fi + +dotnet fake build $@ \ No newline at end of file diff --git a/build/icon.png b/build/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..076ee0ea023cd6bc2839ef860857735486ca47d0 GIT binary patch literal 64568 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

tjet2PdE~))w3ptf> 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 + + + + + Contact + + + + + + + + + + + + + + + + +

+ + +
+ +

+ If you encounter any problems using or downloading the software, please see the Gihub Issue page, or create a new issue on the ISSIE GitHub repository. + Any feedback and suggestions are also welcome! +


+ +
+ + + + diff --git a/docs/DeveloperInfo.html b/docs/DeveloperInfo.html new file mode 100644 index 0000000..427e272 --- /dev/null +++ b/docs/DeveloperInfo.html @@ -0,0 +1,64 @@ + + + + + + Developer Info + + + + + + + + + + + + + + + + + + + +
+ +

+ Marco's Dissertation or his Poster. +


+ + +
    +
  • Issie is designed to be usable without needing a User Manual. Developer information can be found in the + Github README. +
  • +

+ + + +

+ The project is hosted on Github where you can report issues, fork the project and submit pull + requests. Please take a look at the contribution guidelines for more information. Contact Tom Clarke + for more information about development. +


+ + + +
+ + + + diff --git a/docs/Download.html b/docs/Download.html new file mode 100644 index 0000000..afb1686 --- /dev/null +++ b/docs/Download.html @@ -0,0 +1,62 @@ + + + + + + Download + + + + + + + + + + + + + + + + + + + +
+ +

+ Latest stable release: Click here for the latest GitHub release page, where the latest .zip and .tar file can be found. +

+ Possibly unstable: Download latest master .zip +


+ + +

+ Currently no known incompatibilities. Linux users can run the windows .zip file under WINE. + See Getting Started for information about how to run the binaries. +


+ + +

+ All releases: Click here +
+
+ Latest release notes: Click here +

+
+ + + + diff --git a/docs/UserGuide.html b/docs/UserGuide.html new file mode 100644 index 0000000..3d52944 --- /dev/null +++ b/docs/UserGuide.html @@ -0,0 +1,85 @@ + + + + + + User Guide + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/blog.md b/docs/blog.md new file mode 100644 index 0000000..99a8091 --- /dev/null +++ b/docs/blog.md @@ -0,0 +1,2 @@ + + diff --git a/docs/community.html b/docs/community.html new file mode 100644 index 0000000..cdc8329 --- /dev/null +++ b/docs/community.html @@ -0,0 +1,62 @@ + + + + + Community + + + + + + + + + + + + + + + + +
+
+ +

issie

+
+
+
+
+ +

Community

+

This presently just has the Announcements page, but more may be added in the future.

+

Announcements

+

*

+ + +
+
+ +
+
+
+ + diff --git a/docs/content/github-blue.png b/docs/content/github-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..57432a035c7f20cf128620849ab94f969e0ec853 GIT binary patch literal 817 zcmV-11J3-3P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGmbN~PnbOGLGA9w%&02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qRNAp5A0007@Nklr)FLcgCVo9Pvg?e5tk=Ui)SuA%` z>1o4{wxPwR%9U~5+L&%ls#w8NV|1j`86;G9ye0XMMwbNvLCEIXB3@X_<9QM&PQ##< zqjvVS5ApIs!iII1N(E2-&H!NYBC#h43k zgdD-4Boe98n`5jHN6wiY0k*z6prMIJ09VEeo$e5~y6$7^i`{&aM?`!ec!QkN6JqO= z*GCT;r98GHiIT<I!b@WezA>?4X7&B*H2#4IfluGP|Zy)2P`VAW);lZ4LJLU;QUEVM{r7;1s-7i*wDfKoQ6AJ;^oCSTA zHBVr4VH?6UGQ>idRmGx}1_W}10Je7i-ZaT}xVNcSfC<%htG?KL)VoK%5WvgAYm!Ly vTcJ303H%O3+ok$3c@AwF`ZmL2~800000NkvXXu0mjf^MPk* literal 0 HcmV?d00001 diff --git a/docs/content/github.png b/docs/content/github.png new file mode 100644 index 0000000000000000000000000000000000000000..5d48d83fab5dfd443c9e3bec2a262537f4ecece8 GIT binary patch literal 806 zcmV+>1KIqEP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGmbN~PnbOGLGA9w%&02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qRNAp5A0007&NklyiRZ_dM+J&{THbRBQ2Kj2Fi3@98KxAP};1Qsq1e#z#5bWXI>-9m9nx-eS z;LglB+?hM`xSRik)nhS zmCyV8bF;H=Ha46NhhuklV|{(jZ1(wl)$3~{K#t_UT3rwOUQwkUZk`IKqA(%lf9*?v0qwene zR;dZU^Lb1hBmT-{IBbo$TCdkjbKAnTx5p?-g#s^De}1#c#Jt$`1kaP~`+!0~W|YN+ z1vu+M0lyz-tjJ5dUD4Bn)qlUeok}JJ)*bM-JkP(~+?2~?Oa*pybcASK2n(SZ9YxLf zfP4*w&?%DfdTmWmps=s3FfucI2FS$Jg@Du3Q_{TeCnq1BPRzGqVgip!q6FWLkHr!& zX;)YD?2JUI5P;7WVpEfo*=#nQPNP$}DUAsbPaLsNZa0mIg#c*bUTA@7W(JmQY?D|B zyXtniXh1-N5P;G~hlfdatg$pyLHs(6CL9h^?=6~z08Ezm;NY3XlFQ|&OTf=``nkmt k3&0v`MUN|IUr}cp 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 literal 0 HcmV?d00001 diff --git a/docs/content/img/circuit/RAMviewer.png b/docs/content/img/circuit/RAMviewer.png new file mode 100644 index 0000000000000000000000000000000000000000..cb0cbc8d36cad1968164bee7cbc4c5d21cc58066 GIT binary patch literal 142211 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

q^8 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 K$UJ3w>;C}Q`gN-S literal 0 HcmV?d00001 diff --git a/docs/content/img/circuit/catalog.png b/docs/content/img/circuit/catalog.png new file mode 100644 index 0000000000000000000000000000000000000000..a29ba19b323e3f780b1bc300f254120c4ab20bb8 GIT binary patch literal 67426 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

e0~!t=F4Dnx41 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

NEpRe>!de87K!_0xg`2|<0Ii&S-j?O31 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