Merge branch 'development' of https://gitlab.lrz.de/lrr-tum/students/eragp-misim...
authorFabian Stemmler <stemmler@in.tum.de>
Mon, 16 Sep 2019 15:56:03 +0000 (17:56 +0200)
committerFabian Stemmler <stemmler@in.tum.de>
Mon, 16 Sep 2019 15:56:03 +0000 (17:56 +0200)
53 files changed:
.gitmodules
build_from_source.txt [new file with mode: 0644]
plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/Am2900.json
plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionMemoryDefinition.java
plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/standardComponentIDMapping.json
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelMerger.java [deleted file]
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelSplitter.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/MergerAdapter.java [deleted file]
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IndirectModelComponentCreator.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentParams.java [deleted file]
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentSerializer.java [deleted file]
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/StandardComponentIdMappingContainer.java [deleted file]
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentSerializer.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/standardComponentIDMapping.json
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/standardSnippetIDMapping.json
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/standardSnippetIDMapping.json
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/util/JsonHandler.java
plugins/net.mograsim.machine/src/net/mograsim/machine/standardComponentIDMapping.json
plugins/net.mograsim.plugin.core/plugin.xml
plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/EclipsePreferences.java [new file with mode: 0644]
plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/MainPreferencePage.java [new file with mode: 0644]
plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/MograsimActivator.java
plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/SimulationPreview.java
plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/ThemePreferences.java [deleted file]
plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/views/LogicUIPart.java
plugins/net.mograsim.preferences/src/net/mograsim/preferences/DefaultPreferences.java
tests/net.mograsim.logic.core.tests/.classpath [new file with mode: 0644]
tests/net.mograsim.logic.core.tests/.project [new file with mode: 0644]
tests/net.mograsim.logic.core.tests/.settings/org.eclipse.core.resources.prefs [new file with mode: 0644]
tests/net.mograsim.logic.core.tests/.settings/org.eclipse.jdt.core.prefs [new file with mode: 0644]
tests/net.mograsim.logic.core.tests/.settings/org.eclipse.jdt.ui.prefs [new file with mode: 0644]
tests/net.mograsim.logic.core.tests/.settings/org.eclipse.m2e.core.prefs [new file with mode: 0644]
tests/net.mograsim.logic.core.tests/META-INF/MANIFEST.MF [new file with mode: 0644]
tests/net.mograsim.logic.core.tests/build.properties [new file with mode: 0644]
tests/net.mograsim.logic.core.tests/src/net/mograsim/logic/core/tests/CoreComponentTest.java [new file with mode: 0644]
tests/net.mograsim.logic.core.tests/src/net/mograsim/logic/core/tests/GUITest.java [new file with mode: 0644]
tests/net.mograsim.logic.core.tests/src/net/mograsim/logic/core/tests/TestCoreBitDisplay.java [new file with mode: 0644]
tests/net.mograsim.logic.core.tests/src/net/mograsim/logic/core/types/BitVectorTest.java [new file with mode: 0644]
tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/TestableAm2904.json
tests/net.mograsim.logic.tests/.classpath [deleted file]
tests/net.mograsim.logic.tests/.project [deleted file]
tests/net.mograsim.logic.tests/.settings/org.eclipse.core.resources.prefs [deleted file]
tests/net.mograsim.logic.tests/.settings/org.eclipse.jdt.core.prefs [deleted file]
tests/net.mograsim.logic.tests/.settings/org.eclipse.jdt.ui.prefs [deleted file]
tests/net.mograsim.logic.tests/.settings/org.eclipse.m2e.core.prefs [deleted file]
tests/net.mograsim.logic.tests/META-INF/MANIFEST.MF [deleted file]
tests/net.mograsim.logic.tests/build.properties [deleted file]
tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/CoreComponentTest.java [deleted file]
tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/GUITest.java [deleted file]
tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/TestCoreBitDisplay.java [deleted file]
tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/types/BitVectorTest.java [deleted file]

index 3f39c8a..d498435 100644 (file)
@@ -1,3 +1,3 @@
-[submodule "SWTHelper"]
+[submodule "SWTHelper/bundles"]
        path = SWTHelper/bundles
        url = https://github.com/Haspamelodica/SWTHelper.git
diff --git a/build_from_source.txt b/build_from_source.txt
new file mode 100644 (file)
index 0000000..1b16efd
--- /dev/null
@@ -0,0 +1,47 @@
+This is a very basic instruction for building Mograsim from source. It assumes you know nothing about Eclipse Plug-In development, Maven, or Git.
+
+0. Prerequisites
+       0.1 Eclipse 2019-06
+       0.2 (optional) Git
+
+1. Install PDE
+       1.1 In Eclipse, click on "Help" -> "Install New Software..."
+       1.2 Next to "Work With:", select "The Eclipse Project Updates"
+       1.3 Tick "Eclipse PDE Plug-in Developer Resources" (expand "Eclipse Plugin Development Tools" or type "PDE" in the search bar to see it)
+       1.4 Click on "Next >" two times, read and accept the license, and click on "Finish"
+       1.5 Wait for the installation to complete (may take a while). When prompted, restart Eclipse.
+
+2. Clone the Git repository and import the projects
+       Can be done via Git or via EGit (Eclipse Git).
+       2.a via EGit
+               2.a.1 In Eclipse, click on "Window" -> "Show View" -> "Other..."
+               2.a.2 Select "Git Repositories" (expand "Git" to see it)
+               2.a.3 In the "Git Repositories" view, click on "Clone a Git repository"
+               2.a.4 Enter the repository URL ("Host", "Repository path", and "Protocol" should fill automatically); click on "Next >"
+               2.a.5 Select only "development"; click on "Next >"
+               2.a.6 Enter the directory you want the Mograsim projects to be saved in
+               2.a.7 Tick "Clone submodules" and "Import all existing Eclipse projects after clone finishes"; click on "Finish"
+       2.b via Git (needs Git to be installed)
+               2.b.1 In a command prompt (Terminal on Linux; git-bash on Windows), execute "git clone --recurse-submodules --single-branch -b development <repository URL> <target directory>"
+               2.b.2 (optional) Import the repository in Eclipse:
+                       2.b.2.1 In Eclipse, open the "Git Repositories" view as described in 2.a.1 - 2.a.2
+                       2.b.2.2 In the "Git Repositories" view, click on "Add an existing local Git repository"
+                       2.b.2.3 Enter the directory of the repository and tick the repository you see in the list below; click on "Add". (If there is another repository ending with "SWTHelper", ignore it)
+               2.b.3 Import the projects into the workspace
+                       2.b.2.1 Click on "File" -> "Import..."
+                       2.b.2.2 Select "Existing Projects into Workspace" (expand "General" to see it); click on "Next >"
+                       2.b.2.3 Tick "Select root directory:" and "Search for nested projects"
+                       2.b.2.4 Next to "Select root directory:", enter the directory of the repository; click on "Finish"
+
+Note: After importing the projects, probably an automatic workspace build will start. Wait for it to finish before continuing.
+
+3. Do the Maven Tycho workaround:
+       In the project explorer or package explorer, right-click on "net.mograsim.tycho-download", click on "Run As" -> "Maven clean" and wait for it to finish
+
+4. Build the Update Site
+       4.1 In the project explorer or package explorer, right-click on "net.mograsim", click on "Run As" -> "Maven build..."
+       4.2 Next to "Goals", enter "clean verify"; click on "Run" and wait for it to finish (this will take a while)
+       4.3 Select all projects, right-click, and click on "Refresh"
+
+The update site now should be built and is located in net.mograsim.plugin.updatesite/target/repository.
+In there you should see, among other files, a folder named "features", a folder named "plugins" containing some jar files, and two jar files called "artifacts.jar" and "content.jar".
\ No newline at end of file
index b97159c..39a469c 100644 (file)
@@ -5,47 +5,12 @@
   "innerScale": 0.4,
   "submodel": {
     "components": [
-      {
-        "id": "ManualSwitch",
-        "name": "@bz_pc_cpol",
-        "pos": {
-          "x": 120.0,
-          "y": 435.0
-        },
-        "params": 1
-      },
       {
         "id": "ManualSwitch",
         "name": "@c",
         "pos": {
           "x": 120.0,
-          "y": 350.0
-        },
-        "params": 1
-      },
-      {
-        "id": "dlatch80",
-        "name": "@dlatch80#1",
-        "pos": {
-          "x": 295.0,
-          "y": 675.0
-        }
-      },
-      {
-        "id": "ManualSwitch",
-        "name": "@ireg_cpol",
-        "pos": {
-          "x": 120.0,
-          "y": 410.0
-        },
-        "params": 1
-      },
-      {
-        "id": "ManualSwitch",
-        "name": "@mireg_cpol",
-        "pos": {
-          "x": 120.0,
-          "y": 385.0
+          "y": 355.0
         },
         "params": 1
       },
           "y": 510.0
         }
       },
+      {
+        "id": "BitDisplay",
+        "name": "BitDisplay#0",
+        "pos": {
+          "x": 245.0,
+          "y": 550.0
+        },
+        "params": 12
+      },
       {
         "id": "BitDisplay",
         "name": "BitDisplay#1",
         "pos": {
-          "x": 255.0,
+          "x": 280.0,
           "y": 30.0
         },
         "params": 16
         "id": "BitDisplay",
         "name": "BitDisplay#2",
         "pos": {
-          "x": 255.0,
-          "y": 45.0
+          "x": 280.0,
+          "y": 60.0
         },
         "params": 16
       },
         },
         "params": {
           "bits": [
-            null
+            "ZERO"
           ]
         }
       },
       },
       {
         "id": "NandGate",
-        "name": "NandGate#6",
+        "name": "NandGate#7",
         "pos": {
-          "x": 240.0,
-          "y": 525.0
+          "x": 150.0,
+          "y": 375.0
         },
         "params": 1
       },
       },
       {
         "id": "TextComponent",
-        "name": "TextComponent#13",
-        "pos": {
-          "x": 60.0,
-          "y": 385.0
-        },
-        "params": "mireg cpol"
-      },
-      {
-        "id": "TextComponent",
-        "name": "TextComponent#14",
-        "pos": {
-          "x": 60.0,
-          "y": 415.0
-        },
-        "params": "ireg cpol"
-      },
-      {
-        "id": "TextComponent",
-        "name": "TextComponent#15",
+        "name": "TextComponent#2",
         "pos": {
-          "x": 60.0,
-          "y": 435.0
+          "x": 265.0,
+          "y": 545.0
         },
-        "params": "bz/pc cpol"
-      },
-      {
-        "id": "TextComponent",
-        "name": "TextComponent#3",
-        "pos": {
-          "x": 515.0,
-          "y": 110.0
-        },
-        "params": "asdf"
+        "params": "MPM addr"
       },
       {
         "id": "TextComponent",
         "name": "TextComponent#4",
         "pos": {
-          "x": 60.0,
-          "y": 350.0
+          "x": 110.0,
+          "y": 355.0
         },
         "params": "c"
       },
         "id": "WireCrossPoint",
         "name": "WireCrossPoint#18",
         "pos": {
-          "x": 249.0,
+          "x": 274.0,
           "y": 44.0
         },
         "params": 16
         "id": "WireCrossPoint",
         "name": "WireCrossPoint#19",
         "pos": {
-          "x": 244.0,
+          "x": 274.0,
           "y": 59.0
         },
         "params": 16
         "id": "WireCrossPoint",
         "name": "WireCrossPoint#29",
         "pos": {
-          "x": 244.0,
+          "x": 249.0,
           "y": 44.0
         },
         "params": 16
         "id": "WireCrossPoint",
         "name": "WireCrossPoint#38",
         "pos": {
-          "x": 234.0,
-          "y": 529.0
+          "x": 174.0,
+          "y": 384.0
         },
         "params": 1
       },
         "id": "WireCrossPoint",
         "name": "WireCrossPoint#39",
         "pos": {
-          "x": 234.0,
-          "y": 539.0
+          "x": 179.0,
+          "y": 364.0
         },
         "params": 1
       },
         },
         "params": 1
       },
+      {
+        "id": "WireCrossPoint",
+        "name": "WireCrossPoint#40",
+        "pos": {
+          "x": 144.0,
+          "y": 364.0
+        },
+        "params": 1
+      },
+      {
+        "id": "WireCrossPoint",
+        "name": "WireCrossPoint#41",
+        "pos": {
+          "x": 144.0,
+          "y": 379.0
+        },
+        "params": 1
+      },
+      {
+        "id": "WireCrossPoint",
+        "name": "WireCrossPoint#42",
+        "pos": {
+          "x": 364.0,
+          "y": 289.0
+        },
+        "params": 1
+      },
+      {
+        "id": "WireCrossPoint",
+        "name": "WireCrossPoint#43",
+        "pos": {
+          "x": 239.0,
+          "y": 564.0
+        },
+        "params": 12
+      },
       {
         "id": "WireCrossPoint",
         "name": "WireCrossPoint#5",
           "y": 675.0
         }
       },
+      {
+        "id": "dlatch80",
+        "name": "dlatch80#1",
+        "pos": {
+          "x": 295.0,
+          "y": 675.0
+        }
+      },
       {
         "id": "inc",
         "name": "inc#0",
           "x": 635.0,
           "y": 240.0
         }
-      },
-      {
-        "id": "xor",
-        "name": "xor#0",
-        "pos": {
-          "x": 145.0,
-          "y": 380.0
-        }
-      },
-      {
-        "id": "xor",
-        "name": "xor#1",
-        "pos": {
-          "x": 145.0,
-          "y": 405.0
-        }
-      },
-      {
-        "id": "xor",
-        "name": "xor#2",
-        "pos": {
-          "x": 145.0,
-          "y": 430.0
-        }
       }
     ],
     "wires": [
       },
       {
         "pin1": {
-          "compName": "@mireg_cpol",
+          "compName": "WireCrossPoint#39",
           "pinName": ""
         },
         "pin2": {
-          "compName": "xor#0",
-          "pinName": "B"
+          "compName": "WireCrossPoint#20",
+          "pinName": ""
         },
         "name": "unnamedWire#100",
         "path": []
       },
       {
         "pin1": {
-          "compName": "xor#1",
-          "pinName": "Y"
+          "compName": "WireCrossPoint#39",
+          "pinName": ""
         },
         "pin2": {
-          "compName": "dff16_invwe#0",
-          "pinName": "C"
+          "compName": "dlatch80#1",
+          "pinName": "E"
         },
         "name": "unnamedWire#102",
         "path": [
           {
-            "x": 255.0,
-            "y": 310.0
+            "x": 180.0,
+            "y": 480.0
           },
           {
-            "x": 480.0,
-            "y": 310.0
+            "x": 235.0,
+            "y": 480.0
           },
           {
-            "x": 480.0,
-            "y": 170.0
+            "x": 235.0,
+            "y": 670.0
+          },
+          {
+            "x": 285.0,
+            "y": 670.0
+          },
+          {
+            "x": 285.0,
+            "y": 680.0
           }
         ]
       },
           },
           {
             "x": 340.0,
-            "y": 285.0
+            "y": 260.0
           },
           {
             "x": 180.0,
-            "y": 285.0
+            "y": 260.0
           },
           {
             "x": 180.0,
       },
       {
         "pin1": {
-          "compName": "@dlatch80#1",
+          "compName": "dlatch80#1",
           "pinName": "Q"
         },
         "pin2": {
       },
       {
         "pin1": {
-          "compName": "@dlatch80#1",
+          "compName": "dlatch80#1",
           "pinName": "D"
         },
         "pin2": {
       },
       {
         "pin1": {
-          "compName": "Am2910#0",
-          "pinName": "Y"
-        },
-        "pin2": {
           "compName": "Am2900MicroInstructionMemory#0",
           "pinName": "A"
         },
+        "pin2": {
+          "compName": "WireCrossPoint#43",
+          "pinName": ""
+        },
         "name": "unnamedWire#163",
         "path": [
-          {
-            "x": 440.0,
-            "y": 565.0
-          },
           {
             "x": 205.0,
-            "y": 565.0
+            "y": 595.0
           },
           {
             "x": 205.0,
-            "y": 595.0
+            "y": 565.0
           }
         ]
       },
           },
           {
             "x": 175.0,
-            "y": 290.0
+            "y": 265.0
           },
           {
             "x": 345.0,
-            "y": 290.0
+            "y": 265.0
           }
         ]
       },
       },
       {
         "pin1": {
-          "compName": "@c",
+          "compName": "WireCrossPoint#41",
           "pinName": ""
         },
         "pin2": {
-          "compName": "WireCrossPoint#20",
-          "pinName": ""
+          "compName": "NandGate#7",
+          "pinName": "A"
         },
         "name": "unnamedWire#25",
         "path": []
         "path": [
           {
             "x": 355.0,
-            "y": 285.0
+            "y": 265.0
           },
           {
-            "x": 485.0,
-            "y": 285.0
+            "x": 480.0,
+            "y": 265.0
           },
           {
-            "x": 485.0,
+            "x": 480.0,
             "y": 185.0
           }
         ]
           "pinName": ""
         },
         "pin2": {
-          "compName": "mux1_16#0",
-          "pinName": "I0"
+          "compName": "BitDisplay#1",
+          "pinName": ""
         },
         "name": "unnamedWire#330",
-        "path": [
-          {
-            "x": 250.0,
-            "y": 135.0
-          }
-        ]
+        "path": []
       },
       {
         "pin1": {
           "pinName": ""
         },
         "pin2": {
-          "compName": "BitDisplay#1",
-          "pinName": ""
+          "compName": "mux1_16#0",
+          "pinName": "I0"
         },
         "name": "unnamedWire#332",
-        "path": []
+        "path": [
+          {
+            "x": 250.0,
+            "y": 135.0
+          }
+        ]
       },
       {
         "pin1": {
           "pinName": "C"
         },
         "name": "unnamedWire#34",
-        "path": [
-          {
-            "x": 445.0,
-            "y": 365.0981951658187
-          }
-        ]
+        "path": []
       },
       {
         "pin1": {
       },
       {
         "pin1": {
-          "compName": "xor#0",
-          "pinName": "Y"
+          "compName": "WireCrossPoint#38",
+          "pinName": ""
         },
         "pin2": {
-          "compName": "WireCrossPoint#38",
+          "compName": "WireCrossPoint#42",
           "pinName": ""
         },
         "name": "unnamedWire#346",
-        "path": []
+        "path": [
+          {
+            "x": 175.0,
+            "y": 290.0
+          }
+        ]
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#38",
+          "compName": "WireCrossPoint#42",
           "pinName": ""
         },
         "pin2": {
-          "compName": "WireCrossPoint#39",
-          "pinName": ""
+          "compName": "dff16#0",
+          "pinName": "C"
         },
         "name": "unnamedWire#347",
-        "path": []
+        "path": [
+          {
+            "x": 365.0,
+            "y": 110.0
+          }
+        ]
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#39",
+          "compName": "WireCrossPoint#42",
           "pinName": ""
         },
         "pin2": {
-          "compName": "dlatch80#0",
-          "pinName": "E"
+          "compName": "dff16_invwe#0",
+          "pinName": "C"
         },
         "name": "unnamedWire#348",
         "path": [
           {
-            "x": 235.0,
-            "y": 680.0
+            "x": 485.0,
+            "y": 290.0
+          },
+          {
+            "x": 485.0,
+            "y": 170.0
           }
         ]
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#38",
+          "compName": "WireCrossPoint#43",
           "pinName": ""
         },
         "pin2": {
-          "compName": "NandGate#6",
-          "pinName": "A"
+          "compName": "Am2910#0",
+          "pinName": "Y"
         },
         "name": "unnamedWire#349",
-        "path": []
+        "path": [
+          {
+            "x": 440.0,
+            "y": 565.0
+          }
+        ]
       },
       {
         "pin1": {
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#39",
+          "compName": "WireCrossPoint#43",
           "pinName": ""
         },
         "pin2": {
-          "compName": "NandGate#6",
-          "pinName": "B"
+          "compName": "BitDisplay#0",
+          "pinName": ""
         },
         "name": "unnamedWire#350",
         "path": []
       },
-      {
-        "pin1": {
-          "compName": "NandGate#6",
-          "pinName": "Y"
-        },
-        "pin2": {
-          "compName": "@dlatch80#1",
-          "pinName": "E"
-        },
-        "name": "unnamedWire#351",
-        "path": [
-          {
-            "x": 290.0,
-            "y": 535.0
-          },
-          {
-            "x": 290.0,
-            "y": 680.0
-          }
-        ]
-      },
       {
         "pin1": {
           "compName": "FixedOutput#2",
       },
       {
         "pin1": {
-          "compName": "xor#2",
-          "pinName": "Y"
+          "compName": "@c",
+          "pinName": ""
         },
         "pin2": {
-          "compName": "dff16#0",
-          "pinName": "C"
+          "compName": "WireCrossPoint#40",
+          "pinName": ""
         },
         "name": "unnamedWire#94",
-        "path": [
-          {
-            "x": 245.0,
-            "y": 270.0
-          },
-          {
-            "x": 365.0,
-            "y": 270.0
-          },
-          {
-            "x": 365.0,
-            "y": 110.0
-          }
-        ]
+        "path": []
       },
       {
         "pin1": {
-          "compName": "@bz_pc_cpol",
+          "compName": "WireCrossPoint#40",
           "pinName": ""
         },
         "pin2": {
-          "compName": "xor#2",
-          "pinName": "B"
+          "compName": "WireCrossPoint#39",
+          "pinName": ""
         },
         "name": "unnamedWire#95",
         "path": []
       },
       {
         "pin1": {
-          "compName": "@c",
+          "compName": "WireCrossPoint#41",
           "pinName": ""
         },
         "pin2": {
-          "compName": "xor#2",
-          "pinName": "A"
+          "compName": "NandGate#7",
+          "pinName": "B"
         },
         "name": "unnamedWire#96",
-        "path": []
+        "path": [
+          {
+            "x": 145.0,
+            "y": 390.0
+          }
+        ]
       },
       {
         "pin1": {
-          "compName": "xor#1",
-          "pinName": "B"
+          "compName": "WireCrossPoint#40",
+          "pinName": ""
         },
         "pin2": {
-          "compName": "@ireg_cpol",
+          "compName": "WireCrossPoint#41",
           "pinName": ""
         },
         "name": "unnamedWire#97",
       },
       {
         "pin1": {
-          "compName": "xor#1",
-          "pinName": "A"
+          "compName": "NandGate#7",
+          "pinName": "Y"
         },
         "pin2": {
-          "compName": "@c",
+          "compName": "WireCrossPoint#38",
           "pinName": ""
         },
         "name": "unnamedWire#98",
       },
       {
         "pin1": {
-          "compName": "xor#0",
-          "pinName": "A"
+          "compName": "WireCrossPoint#38",
+          "pinName": ""
         },
         "pin2": {
-          "compName": "@c",
-          "pinName": ""
+          "compName": "dlatch80#0",
+          "pinName": "E"
         },
         "name": "unnamedWire#99",
-        "path": []
+        "path": [
+          {
+            "x": 175.0,
+            "y": 485.0
+          },
+          {
+            "x": 230.0,
+            "y": 485.0
+          },
+          {
+            "x": 230.0,
+            "y": 680.0
+          }
+        ]
       }
     ],
     "version": "0.1.1"
     "pinLabelMargin": 0.5
   },
   "outlineRendererSnippetID": "default",
-  "highLevelStateHandlerSnippetID": "default",
+  "highLevelStateHandlerSnippetID": "standard",
+  "highLevelStateHandlerParams": {
+    "subcomponentHighLevelStates": {
+      "am2901_11-8": {
+        "id": "delegating",
+        "params": {
+          "delegateTarget": "Am2901#1"
+        }
+      },
+      "am2901_15-12": {
+        "id": "delegating",
+        "params": {
+          "delegateTarget": "Am2901#0"
+        }
+      },
+      "am2901_3-0": {
+        "id": "delegating",
+        "params": {
+          "delegateTarget": "Am2901#3"
+        }
+      },
+      "am2901_7-4": {
+        "id": "delegating",
+        "params": {
+          "delegateTarget": "Am2901#2"
+        }
+      },
+      "am2904": {
+        "id": "delegating",
+        "params": {
+          "delegateTarget": "Am2904#0"
+        }
+      },
+      "am2910": {
+        "id": "delegating",
+        "params": {
+          "delegateTarget": "Am2910#0"
+        }
+      },
+      "ir": {
+        "id": "delegating",
+        "params": {
+          "delegateTarget": "dff16_invwe#0"
+        }
+      },
+      "mpm": {
+        "id": "delegating",
+        "params": {
+          "delegateTarget": "Am2900MicroInstructionMemory#0"
+        }
+      },
+      "muir_1": {
+        "id": "delegating",
+        "params": {
+          "delegateTarget": "dlatch80#0"
+        }
+      },
+      "muir_2": {
+        "id": "delegating",
+        "params": {
+          "delegateTarget": "dlatch80#1"
+        }
+      },
+      "pc": {
+        "id": "delegating",
+        "params": {
+          "delegateTarget": "dff16#0"
+        }
+      },
+      "ram": {
+        "id": "delegating",
+        "params": {
+          "delegateTarget": "Am2900MainMemory#0"
+        }
+      }
+    },
+    "atomicHighLevelStates": {}
+  },
   "version": "0.1.5"
 }
\ No newline at end of file
index 01b8321..1fb5054 100644 (file)
@@ -21,7 +21,7 @@ public class Am2900MicroInstructionMemoryDefinition implements MicroInstructionM
        @Override
        public long getMaximalAddress()
        {
-               return 4096;
+               return 0xFFF;
        }
 
        @Override
index b753895..d67ee2a 100644 (file)
@@ -1,68 +1,65 @@
 {
-  "version": "0.1.0",
-  "map": {
-       "Am2900MainMemory": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.ModelAm2900MainMemory",
-       "Am2900MicroInstructionMemory": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.ModelAm2900MicroInstructionMemory",
-    "Am2904RegCTInstrDecode": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2904.ModelAm2904RegCTInstrDecode",
-    "Am2904ShiftInstrDecode": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2904.ModelAm2904ShiftInstrDecode",
-    "Am2910InstrPLA": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2910.ModelAm2910InstrPLA",
-    "Am2910RegCntr": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2910.ModelAm2910RegCntr",
-    "Am2910SP": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2910.ModelAm2910SP",
-    "dff12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modeldff12",
-    "dff4_finewe": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modeldff4_finewe",
-    "inc": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelinc",
-    "nor12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelnor12",
-    "ram5_12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelram5_12",
-    "sel4_12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelsel4_12",
-    "Am2900": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/Am2900.json",
-    "Am2901": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901.json",
-    "Am2901ALUFuncDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUFuncDecode.json",
-    "Am2901ALUInclDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclDecode.json",
-    "Am2901ALUInclSourceDecodeInclFunctionDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclSourceDecodeInclFunctionDecode.json",
-    "Am2901ALUOneBit": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUOneBit.json",
-    "Am2904": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904.json",
-    "Am2910": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2910/Am2910.json",
-    "Am2904MSR": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904MSR.json",
-    "Am2904muSR": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904muSR.json",
-    "Am2904TestLogic": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904TestLogic.json",
-    "Am2901DestDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901DestDecode.json",
-    "Am2901SourceDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901SourceDecode.json",
-    "_rsLatch": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/_rsLatch.json",
-    "and": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/and.json",
-    "and41": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/and41.json",
-    "andor414": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/andor414.json",
-    "demux2": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/demux2.json",
-    "dff": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff.json",
-    "dff4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff4.json",
-    "dff4_invwe": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff4_invwe.json",
-    "dff8": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff8.json",
-    "dff12_we": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff12_we.json",
-    "dff16": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff16.json",
-    "dff16_we": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff16_we.json",
-    "dff16_invwe": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff16_invwe.json",
-    "dff80": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff80.json",
-    "dlatch": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch.json",
-    "dlatch4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch4.json",
-    "dlatch8": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch8.json",
-    "dlatch80": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch80.json",
-    "fulladder": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/fulladder.json",
-    "halfadder": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/halfadder.json",
-    "mux1": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1.json",
-    "mux1_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_4.json",
-    "mux1_8": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_8.json",
-    "mux1_12": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_12.json",
-    "mux1_16": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_16.json",
-    "mux2": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux2.json",
-    "mux3": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux3.json",
-    "nand3": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/nand3.json",
-    "not4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/not4.json",
-    "or4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/or4.json",
-    "or_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/or_4.json",
-    "ram2": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/ram2.json",
-    "ram4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/ram4.json",
-    "sel1": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/sel1.json",
-    "sel2_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/sel2_4.json",
-    "sel3_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/sel3_4.json",
-    "xor": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/xor.json"
-  }
+  "Am2900MainMemory": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.ModelAm2900MainMemory",
+  "Am2900MicroInstructionMemory": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.ModelAm2900MicroInstructionMemory",
+  "Am2904RegCTInstrDecode": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2904.ModelAm2904RegCTInstrDecode",
+  "Am2904ShiftInstrDecode": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2904.ModelAm2904ShiftInstrDecode",
+  "Am2910InstrPLA": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2910.ModelAm2910InstrPLA",
+  "Am2910RegCntr": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2910.ModelAm2910RegCntr",
+  "Am2910SP": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2910.ModelAm2910SP",
+  "dff12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modeldff12",
+  "dff4_finewe": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modeldff4_finewe",
+  "inc": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelinc",
+  "nor12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelnor12",
+  "ram5_12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelram5_12",
+  "sel4_12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelsel4_12",
+  "Am2900": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/Am2900.json",
+  "Am2901": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901.json",
+  "Am2901ALUFuncDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUFuncDecode.json",
+  "Am2901ALUInclDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclDecode.json",
+  "Am2901ALUInclSourceDecodeInclFunctionDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclSourceDecodeInclFunctionDecode.json",
+  "Am2901ALUOneBit": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUOneBit.json",
+  "Am2904": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904.json",
+  "Am2910": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2910/Am2910.json",
+  "Am2904MSR": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904MSR.json",
+  "Am2904muSR": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904muSR.json",
+  "Am2904TestLogic": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904TestLogic.json",
+  "Am2901DestDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901DestDecode.json",
+  "Am2901SourceDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901SourceDecode.json",
+  "_rsLatch": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/_rsLatch.json",
+  "and": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/and.json",
+  "and41": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/and41.json",
+  "andor414": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/andor414.json",
+  "demux2": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/demux2.json",
+  "dff": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff.json",
+  "dff4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff4.json",
+  "dff4_invwe": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff4_invwe.json",
+  "dff8": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff8.json",
+  "dff12_we": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff12_we.json",
+  "dff16": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff16.json",
+  "dff16_we": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff16_we.json",
+  "dff16_invwe": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff16_invwe.json",
+  "dff80": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff80.json",
+  "dlatch": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch.json",
+  "dlatch4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch4.json",
+  "dlatch8": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch8.json",
+  "dlatch80": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch80.json",
+  "fulladder": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/fulladder.json",
+  "halfadder": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/halfadder.json",
+  "mux1": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1.json",
+  "mux1_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_4.json",
+  "mux1_8": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_8.json",
+  "mux1_12": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_12.json",
+  "mux1_16": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_16.json",
+  "mux2": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux2.json",
+  "mux3": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux3.json",
+  "nand3": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/nand3.json",
+  "not4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/not4.json",
+  "or4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/or4.json",
+  "or_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/or_4.json",
+  "ram2": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/ram2.json",
+  "ram4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/ram4.json",
+  "sel1": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/sel1.json",
+  "sel2_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/sel2_4.json",
+  "sel3_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/sel3_4.json",
+  "xor": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/xor.json"
 }
\ No newline at end of file
index 15346c6..c4a8c2d 100644 (file)
@@ -38,8 +38,6 @@ import net.mograsim.preferences.Preferences;
  */
 public class LogicUICanvas extends ZoomableCanvas
 {
-       private static final boolean OPEN_DEBUG_SETHIGHLEVELSTATE_SHELL = false;
-
        private final LogicModel model;
 
        public LogicUICanvas(Composite parent, int style, LogicModel model)
@@ -60,7 +58,7 @@ public class LogicUICanvas extends ZoomableCanvas
 
                addListener(SWT.MouseDown, this::mouseDown);
 
-               if (OPEN_DEBUG_SETHIGHLEVELSTATE_SHELL)
+               if (Preferences.current().getBoolean("net.mograsim.logic.model.debug.openhlsshell"))
                        openDebugSetHighLevelStateShell(model);
        }
 
diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelMerger.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelMerger.java
deleted file mode 100644 (file)
index 6efc9ad..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-package net.mograsim.logic.model.model.components.atomic;
-
-import org.eclipse.swt.SWT;
-
-import net.haspamelodica.swt.helper.gcs.GeneralGC;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
-import net.mograsim.logic.core.types.BitVectorFormatter;
-import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
-import net.mograsim.logic.model.model.LogicModelModifiable;
-import net.mograsim.logic.model.model.components.ModelComponent;
-import net.mograsim.logic.model.model.components.Orientation;
-import net.mograsim.logic.model.model.components.atomic.ModelSplitter.SplitterParams;
-import net.mograsim.logic.model.model.wires.Pin;
-import net.mograsim.logic.model.model.wires.PinUsage;
-import net.mograsim.logic.model.modeladapter.LogicCoreAdapter;
-import net.mograsim.logic.model.modeladapter.componentadapters.MergerAdapter;
-import net.mograsim.logic.model.serializing.IdentifyParams;
-import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
-import net.mograsim.preferences.ColorDefinition;
-import net.mograsim.preferences.ColorManager;
-import net.mograsim.preferences.Preferences;
-
-//TODO delete this legacy class
-public class ModelMerger extends ModelComponent
-{
-       private static final double width = 10;
-       private static final double heightPerPin = 10;
-
-       public final int logicWidth;
-       private final Pin outputPin;
-
-       private final ReadEnd[] inputEnds;
-       private ReadEnd outputEnd;
-
-       public ModelMerger(LogicModelModifiable model, int logicWidth)
-       {
-               this(model, logicWidth, null);
-       }
-
-       public ModelMerger(LogicModelModifiable model, int logicWidth, String name)
-       {
-               super(model, name, false);
-               this.logicWidth = logicWidth;
-               setSize(width, (logicWidth - 1) * heightPerPin);
-               double inputHeight = (logicWidth - 1) * heightPerPin;
-               for (int i = 0; i < logicWidth; i++, inputHeight -= 10)
-                       addPin(new Pin(model, this, "O" + i, 1, PinUsage.TRISTATE, 0, inputHeight));
-               addPin(this.outputPin = new Pin(model, this, "I", logicWidth, PinUsage.TRISTATE, width, (logicWidth - 1) * heightPerPin / 2));
-               inputEnds = new ReadEnd[logicWidth];
-
-               init();
-       }
-
-       @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
-       {
-               double posX = getPosX();
-               double posY = getPosY();
-
-               ColorDefinition c = BitVectorFormatter.formatAsColor(outputEnd);
-               if (c != null)
-                       gc.setForeground(ColorManager.current().toColor(c));
-               gc.setLineWidth(
-                               Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire." + (logicWidth == 1 ? "singlebit" : "multibit")));
-               double outLineY = posY + (logicWidth - 1) * heightPerPin / 2;
-               gc.drawLine(posX + width / 2, outLineY, posX + width, outLineY);
-               gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire.singlebit"));
-               double inputHeight = posY;
-               for (int i = 0; i < logicWidth; i++, inputHeight += 10)
-               {
-                       c = BitVectorFormatter.formatAsColor(inputEnds[i]);
-                       if (c != null)
-                               gc.setForeground(ColorManager.current().toColor(c));
-                       gc.drawLine(posX, inputHeight, posX + width / 2, inputHeight);
-               }
-               gc.setForeground(Preferences.current().getColor("net.mograsim.logic.model.color.foreground"));
-               int oldLineCap = gc.getLineCap();
-               int lineJoin = gc.getLineJoin();
-               // TODO find better "replacement" for JOIN_BEVEL
-               // TODO it looks weird that the vertical line is thinner than the single multibit wire.
-               gc.setLineCap(lineJoin == SWT.JOIN_MITER ? SWT.CAP_SQUARE : lineJoin == SWT.JOIN_ROUND ? SWT.CAP_ROUND : SWT.CAP_SQUARE);
-               gc.drawLine(posX + width / 2, posY, posX + width / 2, posY + heightPerPin * (logicWidth - 1));
-               gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default"));
-               gc.setLineCap(oldLineCap);
-       }
-
-       @Override
-       public Pin getPin(String name)
-       {
-               Pin pin = getPinOrNull(name);
-               return pin == null ? getPin(name.replace('O', 'i').replace('I', 'O').replace('i', 'I')) : pin;
-       }
-
-       @Override
-       public String getIDForSerializing(IdentifyParams idParams)
-       {
-               return "Splitter";
-       }
-
-       @Override
-       public SplitterParams getParamsForSerializing(IdentifyParams idParams)
-       {
-               SplitterParams splitterParams = new SplitterParams();
-               splitterParams.logicWidth = logicWidth;
-               splitterParams.orientation = Orientation.LEFT;
-               return splitterParams;
-       }
-
-       public void setCoreModelBinding(ReadEnd[] inputEnds, ReadEnd outputEnd)
-       {
-               System.arraycopy(inputEnds, 0, this.inputEnds, 0, logicWidth);
-               this.outputEnd = outputEnd;
-       }
-
-       public Pin getOutputPin()
-       {
-               return outputPin;
-       }
-
-       static
-       {
-               LogicCoreAdapter.addComponentAdapter(new MergerAdapter());
-               IndirectModelComponentCreator.setComponentSupplier(ModelMerger.class.getCanonicalName(),
-                               (m, p, n) -> new ModelMerger(m, p.getAsInt(), n));
-       }
-}
\ No newline at end of file
index 962f2ac..b47f50b 100644 (file)
@@ -148,18 +148,7 @@ public class ModelSplitter extends ModelComponent
        static
        {
                LogicCoreAdapter.addComponentAdapter(new SplitterAdapter());
-               IndirectModelComponentCreator.setComponentSupplier(ModelSplitter.class.getCanonicalName(), (m, p, n) ->
-               {
-                       // TODO remove legacy params parsing
-                       SplitterParams params;
-                       if (p.isJsonPrimitive())
-                       {
-                               params = new SplitterParams();
-                               params.logicWidth = p.getAsInt();
-                               params.orientation = Orientation.RIGHT;
-                       } else
-                               params = JsonHandler.fromJsonTree(p, SplitterParams.class);
-                       return new ModelSplitter(m, params, n);
-               });
+               IndirectModelComponentCreator.setComponentSupplier(ModelSplitter.class.getCanonicalName(),
+                               (m, p, n) -> new ModelSplitter(m, JsonHandler.fromJsonTree(p, SplitterParams.class), n));
        }
 }
\ No newline at end of file
index 9388e2f..745597d 100644 (file)
@@ -68,26 +68,14 @@ public abstract class SubmodelComponent extends ModelComponent
         * A pseudo-component containing all submodel interface pins on the submodel side.
         */
        private final SubmodelInterface submodelInterface;
-
        /**
         * The factor by which the submodel is scaled when rendering.
         */
        private double submodelScale;
-       /**
-        * If this {@link SubmodelComponent} fills at least this amount of the visible region vertically or horizontally, the submodel starts to
-        * be visible.
-        */
-       private double maxVisibleRegionFillRatioForAlpha0;
-       /**
-        * If this {@link SubmodelComponent} fills at least this amount of the visible region vertically or horizontally, the submodel is fully
-        * visible.
-        */
-       private double minVisibleRegionFillRatioForAlpha1;
        /**
         * The renderer used for rendering the submodel.
         */
        private final LogicUIRenderer renderer;
-
        /**
         * The {@link Renderer} used to render the symbol of this SubmodelCoponent.
         */
@@ -118,8 +106,6 @@ public abstract class SubmodelComponent extends ModelComponent
                this.submodelInterface = new SubmodelInterface(submodelModifiable);
 
                this.submodelScale = 1;
-               this.maxVisibleRegionFillRatioForAlpha0 = 0.8;
-               this.minVisibleRegionFillRatioForAlpha1 = 0.9;
                this.renderer = new LogicUIRenderer(submodelModifiable);
 
                Consumer<Runnable> redrawHandlerChangedListener = submodelModifiable::setRedrawHandler;
@@ -377,6 +363,16 @@ public abstract class SubmodelComponent extends ModelComponent
                GeneralGC tgc = new TranslatedGC(gc, getPosX(), getPosY(), submodelScale, true);
                conf.reset(tgc);
                double visibleRegionFillRatio = Math.max(getWidth() / visibleRegion.width, getHeight() / visibleRegion.height);
+               /**
+                * If this {@link SubmodelComponent} fills at least this amount of the visible region vertically or horizontally, the submodel
+                * starts to be visible.
+                */
+               double maxVisibleRegionFillRatioForAlpha0 = Preferences.current().getDouble("net.mograsim.logic.model.submodel.zoomalpha0");
+               /**
+                * If this {@link SubmodelComponent} fills at least this amount of the visible region vertically or horizontally, the submodel is
+                * fully visible.
+                */
+               double minVisibleRegionFillRatioForAlpha1 = Preferences.current().getDouble("net.mograsim.logic.model.submodel.zoomalpha1");
                double alphaFactor = map(visibleRegionFillRatio, maxVisibleRegionFillRatioForAlpha0, minVisibleRegionFillRatioForAlpha1, 0, 1);
                alphaFactor = Math.max(0, Math.min(1, alphaFactor));
                // we need to take the old alpha into account to support nested submodules better.
diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/MergerAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/MergerAdapter.java
deleted file mode 100644 (file)
index 22d6112..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-package net.mograsim.logic.model.modeladapter.componentadapters;
-
-import java.util.Map;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.wires.CoreWire;
-import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
-import net.mograsim.logic.model.model.components.atomic.ModelMerger;
-import net.mograsim.logic.model.model.wires.Pin;
-import net.mograsim.logic.model.modeladapter.CoreModelParameters;
-
-public class MergerAdapter implements ComponentAdapter<ModelMerger>
-{
-       @Override
-       public Class<ModelMerger> getSupportedClass()
-       {
-               return ModelMerger.class;
-       }
-
-       @Override
-       public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelMerger modelComponent,
-                       Map<Pin, CoreWire> logicWiresPerPin)
-       {
-               CoreWire output = logicWiresPerPin.get(modelComponent.getPin("O"));
-               ReadEnd[] inputEnds = new ReadEnd[modelComponent.logicWidth];
-               for (int i = 0; i < modelComponent.logicWidth; i++)
-               {
-                       CoreWire input = logicWiresPerPin.get(modelComponent.getPin("I" + (modelComponent.logicWidth - 1 - i)));
-                       CoreWire.fuse(input, output, 0, i);
-                       inputEnds[i] = input.createReadOnlyEnd();
-               }
-               modelComponent.setCoreModelBinding(inputEnds, output.createReadOnlyEnd());
-       }
-}
\ No newline at end of file
index c149848..d4b758c 100644 (file)
@@ -10,24 +10,20 @@ import java.util.Objects;
 
 import com.google.gson.JsonElement;
 import com.google.gson.JsonNull;
-import com.google.gson.JsonObject;
 
 import net.mograsim.logic.model.model.LogicModelModifiable;
 import net.mograsim.logic.model.model.components.ModelComponent;
 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
 import net.mograsim.logic.model.util.JsonHandler;
-import net.mograsim.logic.model.util.Version;
 
 public class IndirectModelComponentCreator
 {
-       public static final Version CURRENT_STD_ID_MAPPING_VERSION = Version.parseSemver("0.1.0");
-
        private static final Map<String, String> standardComponentIDs = new HashMap<>();
        private static final Map<String, String> standardComponentIDsUnmodifiable = Collections.unmodifiableMap(standardComponentIDs);
 
        private static final Map<String, ComponentSupplier> componentSuppliers = new HashMap<>();
        private static final Map<String, ResourceLoader> resourceLoaders = new HashMap<>();
-       private static final Map<String, JsonObject> componentCache = new HashMap<>();
+       private static final Map<String, SubmodelComponentParams> componentCache = new HashMap<>();
 
        private static final ResourceLoader defaultResourceLoader;
        static
@@ -42,7 +38,7 @@ public class IndirectModelComponentCreator
                {
                        if (s == null)
                                throw new IOException("Resource not found");
-                       Map<String, String> tmp = JsonHandler.readJson(s, StandardComponentIdMappingContainer.class).getMap();
+                       Map<String, String> tmp = JsonHandler.readJson(s, Map.class);
                        // don't use putAll to apply sanity checks
                        tmp.forEach((st, id) ->
                        {
@@ -107,11 +103,11 @@ public class IndirectModelComponentCreator
                String firstPart = parts[0];
                if (firstPart.equals("jsonfile"))
                {
-                       JsonObject jsonContents;
+                       SubmodelComponentParams jsonContents;
                        try
                        {
                                // don't use parts[1], because the path could contain ':'
-                               jsonContents = JsonHandler.readJson(resolvedID.substring("jsonfile:".length()), JsonObject.class);
+                               jsonContents = JsonHandler.readJson(resolvedID.substring("jsonfile:".length()), SubmodelComponentParams.class);
                        }
                        catch (IOException e)
                        {
@@ -142,12 +138,12 @@ public class IndirectModelComponentCreator
                }
                if (resTypeID.equals("jsonres"))
                {
-                       JsonObject jsonContents;
+                       SubmodelComponentParams jsonContents;
                        try
                        {
                                @SuppressWarnings("resource") // jsonStream is closed in JsonHandler
                                InputStream jsonStream = Objects.requireNonNull(loader.loadResource(resID), "Error loading JSON resource: Not found");
-                               jsonContents = JsonHandler.readJson(jsonStream, JsonObject.class);
+                               jsonContents = JsonHandler.readJson(jsonStream, SubmodelComponentParams.class);
                        }
                        catch (IOException e)
                        {
@@ -188,15 +184,10 @@ public class IndirectModelComponentCreator
        }
 
        private static SubmodelComponent loadComponentFromJsonObject(LogicModelModifiable model, String id, String name,
-                       JsonObject jsonContents)
+                       SubmodelComponentParams jsonContents)
        {
                componentCache.putIfAbsent(id, jsonContents);
-               SerializablePojo jsonContentsAsSerializablePojo = JsonHandler.parser.fromJson(jsonContents, SerializablePojo.class);
-               if (jsonContentsAsSerializablePojo.version == null)
-                       return LegacySubmodelComponentSerializer.deserialize(model,
-                                       JsonHandler.parser.fromJson(jsonContents, LegacySubmodelComponentParams.class), name, id, null);
-               return SubmodelComponentSerializer.deserialize(model, JsonHandler.parser.fromJson(jsonContents, SubmodelComponentParams.class),
-                               name, id, null);
+               return SubmodelComponentSerializer.deserialize(model, jsonContents, name, id, null);
        }
 
        public static void registerResourceLoader(ResourceLoader resourceLoader)
diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentParams.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentParams.java
deleted file mode 100644 (file)
index c21fa86..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-package net.mograsim.logic.model.serializing;
-
-import java.io.IOException;
-
-import com.google.gson.JsonElement;
-
-import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
-import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
-import net.mograsim.logic.model.util.JsonHandler;
-
-/**
- * This class contains all the information necessary to create a new {@link SubmodelComponent}
- */
-public class LegacySubmodelComponentParams
-{
-       // basic stuff
-       public double width, height;
-       public LegacyInterfacePinParams[] interfacePins;
-       public LegacySubmodelParameters submodel;
-
-       // functionality that needs to be expressed in Java code
-       public String symbolRendererSnippetID;
-       public JsonElement symbolRendererParams;
-
-       public String outlineRendererSnippetID;
-       public JsonElement outlineRendererParams;
-
-       public String highLevelStateHandlerSnippetID;
-       public JsonElement highLevelStateHandlerParams;
-
-       public static class LegacyInterfacePinParams
-       {
-               public Point location;
-               public String name;
-               public int logicWidth;
-       }
-
-       public static class LegacySubmodelParameters
-       {
-               public double innerScale;
-               public LegacyInnerComponentParams[] subComps;
-               public LegacyInnerWireParams[] innerWires;
-
-               public static class LegacyInnerComponentParams
-               {
-                       public String id;
-                       public String name;
-                       public Point pos;
-                       public JsonElement params;
-               }
-
-               public static class LegacyInnerWireParams
-               {
-                       public LegacyInnerPinParams pin1, pin2;
-                       public String name;
-                       public Point[] path;
-
-                       public static class LegacyInnerPinParams
-                       {
-                               public String compName;
-                               public String pinName;
-                       }
-               }
-       }
-
-       public static LegacySubmodelComponentParams readJson(String path) throws IOException
-       {
-               return JsonHandler.readJson(path, LegacySubmodelComponentParams.class);
-       }
-
-       /**
-        * Writes this {@link LegacySubmodelComponentParams} object into a file in json format. The correct file extension is important! Check
-        * {@link LegacySubmodelComponentParams}.fileExtension
-        */
-       public void writeJson(String path)
-       {
-               try
-               {
-                       JsonHandler.writeJson(this, path);
-               }
-               catch (IOException e)
-               {
-                       System.err.println("Failed to write SubComponentParams to file");
-                       e.printStackTrace();
-               }
-       }
-}
\ No newline at end of file
diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentSerializer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentSerializer.java
deleted file mode 100644 (file)
index 93fc945..0000000
+++ /dev/null
@@ -1,305 +0,0 @@
-package net.mograsim.logic.model.serializing;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.function.Function;
-
-import com.google.gson.JsonElement;
-
-import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
-import net.mograsim.logic.model.model.LogicModelModifiable;
-import net.mograsim.logic.model.model.components.ModelComponent;
-import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
-import net.mograsim.logic.model.model.wires.ModelWire;
-import net.mograsim.logic.model.model.wires.MovablePin;
-import net.mograsim.logic.model.model.wires.Pin;
-import net.mograsim.logic.model.model.wires.PinUsage;
-import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacyInterfacePinParams;
-import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters;
-import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters.LegacyInnerComponentParams;
-import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters.LegacyInnerWireParams;
-import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters.LegacyInnerWireParams.LegacyInnerPinParams;
-import net.mograsim.logic.model.snippets.HighLevelStateHandler;
-import net.mograsim.logic.model.snippets.Renderer;
-import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers;
-import net.mograsim.logic.model.util.JsonHandler;
-
-/**
- * Creates {@link SubmodelComponent}s from {@link LegacySubmodelComponentParams}
- * 
- * @author Fabian Stemmler
- * @author Daniel Kirschten
- */
-public final class LegacySubmodelComponentSerializer
-{
-       // convenience methods
-
-       /**
-        * Like {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams)}, but first reading the
-        * {@link LegacySubmodelComponentParams} from the given file path.
-        * 
-        * @author Daniel Kirschten
-        */
-       public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath) throws IOException
-       {
-               return deserialize(model, JsonHandler.readJson(sourcePath, LegacySubmodelComponentParams.class));
-       }
-
-       /**
-        * Like {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, JsonElement)}, but first reading the
-        * {@link LegacySubmodelComponentParams} from the given file path.
-        * 
-        * @author Daniel Kirschten
-        */
-       public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String idForSerializingOverride,
-                       JsonElement paramsForSerializingOverride) throws IOException
-       {
-               return deserialize(model, JsonHandler.readJson(sourcePath, LegacySubmodelComponentParams.class), idForSerializingOverride,
-                               paramsForSerializingOverride);
-       }
-
-       /**
-        * Like {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String)}, but first reading the
-        * {@link LegacySubmodelComponentParams} from the given file path.
-        * 
-        * @author Daniel Kirschten
-        */
-       public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String name) throws IOException
-       {
-               return deserialize(model, JsonHandler.readJson(sourcePath, LegacySubmodelComponentParams.class), name);
-       }
-
-       /**
-        * Like {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement)}, but first reading the
-        * {@link LegacySubmodelComponentParams} from the given file path.
-        * 
-        * @author Daniel Kirschten
-        */
-       public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String name, String idForSerializingOverride,
-                       JsonElement paramsForSerializingOverride) throws IOException
-       {
-               return deserialize(model, JsonHandler.readJson(sourcePath, LegacySubmodelComponentParams.class), name, idForSerializingOverride,
-                               paramsForSerializingOverride);
-       }
-
-       /**
-        * {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement)} with no
-        * <code>idForSerializingOverride</code> set and using the default name.
-        * 
-        * @author Daniel Kirschten
-        */
-       public static SubmodelComponent deserialize(LogicModelModifiable model, LegacySubmodelComponentParams params)
-       {
-               return deserialize(model, params, null, null, null);
-       }
-
-       /**
-        * {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement)} using the default name.
-        * 
-        * @author Daniel Kirschten
-        */
-       public static SubmodelComponent deserialize(LogicModelModifiable model, LegacySubmodelComponentParams params,
-                       String idForSerializingOverride, JsonElement paramsForSerializingOverride)
-       {
-               return deserialize(model, params, null, idForSerializingOverride, paramsForSerializingOverride);
-       }
-
-       /**
-        * {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement)} with no
-        * <code>idForSerializingOverride</code> set.
-        * 
-        * @author Daniel Kirschten
-        */
-       public static SubmodelComponent deserialize(LogicModelModifiable model, LegacySubmodelComponentParams params, String name)
-       {
-               return deserialize(model, params, name, null, null);
-       }
-
-       /**
-        * Like {@link #serialize(SubmodelComponent)}, but instead of returning the generated {@link LegacySubmodelComponentParams} they are
-        * written to a file at the given path.
-        * 
-        * @author Daniel Kirschten
-        */
-       public static void serialize(SubmodelComponent comp, String targetPath) throws IOException
-       {
-               JsonHandler.writeJson(serialize(comp), targetPath);
-       }
-
-       /**
-        * Like {@link #serialize(SubmodelComponent, Function)}, but instead of returning the generated {@link LegacySubmodelComponentParams}
-        * they are written to a file at the given path.
-        * 
-        * @author Daniel Kirschten
-        */
-       public static void serialize(SubmodelComponent comp, IdentifyParams idParams, String targetPath) throws IOException
-       {
-               JsonHandler.writeJson(serialize(comp, idParams), targetPath);
-       }
-
-       /**
-        * {@link #serialize(SubmodelComponent, Function)} using the default {@link IdentifyParams} (see <code>IdentifyParams</code>'s
-        * {@link IdentifyParams#IdentifyParams() default constructor})
-        * 
-        * @author Daniel Kirschten
-        */
-       public static LegacySubmodelComponentParams serialize(SubmodelComponent comp)
-       {
-               return serialize(comp, new IdentifyParams());
-       }
-
-       // "core" methods
-       /**
-        * Creates a {@link SubmodelComponent} from the specified {@link LegacySubmodelComponentParams} with the given name.
-        * <p>
-        * When serializing a <code>SubmodelComponent</code>, it is undesired for every subcomponent to be serialized with its complete inner
-        * structure. Instead, these sub-<code>SubmodelComponent</code>s should be serialized with the ID and params which were used to
-        * determine the <code>SubmodelComponentParams</code> defining the sub-<code>SubmodelComponent</code>. Because of this, it is possible
-        * to override the ID and params used in {@link #serialize(SubmodelComponent, Function) serialize(...)} to describe this subcomponent.
-        * See there for details.
-        * 
-        * @author Fabian Stemmler
-        * @author Daniel Kirschten
-        */
-       @SuppressWarnings("unused") // for ModelWire being created
-       public static SubmodelComponent deserialize(LogicModelModifiable model, LegacySubmodelComponentParams params, String name,
-                       String idForSerializingOverride, JsonElement paramsForSerializingOverride)
-       {
-               DeserializedSubmodelComponent comp = new DeserializedSubmodelComponent(model, name, idForSerializingOverride,
-                               paramsForSerializingOverride);
-               comp.setSubmodelScale(params.submodel.innerScale);
-               comp.setSize(params.width, params.height);
-               for (LegacyInterfacePinParams iPinParams : params.interfacePins)
-                       // TRISTATE because we don't have a better choice
-                       comp.addSubmodelInterface(new MovablePin(model, comp, iPinParams.name, iPinParams.logicWidth, PinUsage.TRISTATE,
-                                       iPinParams.location.x, iPinParams.location.y));
-               LegacySubmodelParameters submodelParams = params.submodel;
-               LogicModelModifiable submodelModifiable = comp.getSubmodelModifiable();
-               Map<String, ModelComponent> componentsByName = submodelModifiable.getComponentsByName();
-               ModelComponent[] components = new ModelComponent[submodelParams.subComps.length];
-               for (int i = 0; i < components.length; i++)
-               {
-                       LegacyInnerComponentParams cParams = submodelParams.subComps[i];
-                       components[i] = IndirectModelComponentCreator.createComponent(submodelModifiable, cParams.id, cParams.params, cParams.name);
-                       components[i].moveTo(cParams.pos.x, cParams.pos.y);
-               }
-
-               for (int i = 0; i < submodelParams.innerWires.length; i++)
-               {
-                       LegacyInnerWireParams innerWire = submodelParams.innerWires[i];
-                       new ModelWire(submodelModifiable, innerWire.name, componentsByName.get(innerWire.pin1.compName).getPin(innerWire.pin1.pinName),
-                                       componentsByName.get(innerWire.pin2.compName).getPin(innerWire.pin2.pinName), innerWire.path);
-               }
-               comp.setSymbolRenderer(SubmodelComponentSnippetSuppliers.symbolRendererSupplier.getSnippetSupplier(params.symbolRendererSnippetID)
-                               .create(comp, params.symbolRendererParams));
-               comp.setOutlineRenderer(SubmodelComponentSnippetSuppliers.outlineRendererSupplier
-                               .getSnippetSupplier(params.outlineRendererSnippetID).create(comp, params.outlineRendererParams));
-               comp.setHighLevelStateHandler(SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier
-                               .getSnippetSupplier(params.highLevelStateHandlerSnippetID).create(comp, params.highLevelStateHandlerParams));
-               return comp;
-       }
-
-       /**
-        * Returns {@link LegacySubmodelComponentParams}, which describe this {@link SubmodelComponent}. <br>
-        * Subcomponents are serialized in the following way: <br>
-        * If a subcomponent is a <code>SubmodelComponent</code> which has been deserialized, and it has an
-        * {@link DeserializedSubmodelComponent#idForSerializingOverride idForSerializingOverride} set (e.g. non-null; see
-        * {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement) deserialize(...)}), this ID and
-        * the component's {@link DeserializedSubmodelComponent#paramsForSerializingOverride paramsForSerializingOverride} are written.<br>
-        * If this case doesn't apply (e.g. if the subcomponent is not a <code>SubmodelComponent</code>; or it is a
-        * <code>SubmodelComponent</code>, but hasn't been deserialized; or it has no
-        * {@link DeserializedSubmodelComponent#idForSerializingOverride idForSerializingOverride} set), the ID defined by <code>idGetter</code>
-        * and the params obtained by {@link ModelComponent#getParamsForSerializing() getParams()} are written.<br>
-        * CodeSnippets are serialized using the ID defined by <code>idGetter</code> and the params obtained by the respective
-        * <coce>getParamsForSerializing</code> methods ({@link Renderer#getParamsForSerializing()}).
-        * 
-        * @author Fabian Stemmler
-        * @author Daniel Kirschten
-        */
-       public static LegacySubmodelComponentParams serialize(SubmodelComponent comp, IdentifyParams idParams)
-       {
-               LegacySubmodelParameters submodelParams = new LegacySubmodelParameters();
-               submodelParams.innerScale = comp.getSubmodelScale();
-
-               Map<String, ModelComponent> components = new HashMap<>(comp.submodel.getComponentsByName());
-               components.remove(SubmodelComponent.SUBMODEL_INTERFACE_NAME);
-               LegacyInnerComponentParams[] componentParams = new LegacyInnerComponentParams[components.size()];
-               int i1 = 0;
-               for (ModelComponent innerComponent : components.values())
-               {
-                       LegacyInnerComponentParams innerComponentParams = new LegacyInnerComponentParams();
-                       componentParams[i1] = innerComponentParams;
-                       innerComponentParams.pos = new Point(innerComponent.getPosX(), innerComponent.getPosY());
-                       innerComponentParams.id = innerComponent.getIDForSerializing(idParams);
-                       innerComponentParams.params = innerComponent.getParamsForSerializingJSON(idParams);
-                       innerComponentParams.name = innerComponent.getName();
-                       i1++;
-               }
-               submodelParams.subComps = componentParams;
-
-               Collection<ModelWire> wires = comp.submodel.getWiresByName().values();
-               LegacyInnerWireParams wireParams[] = new LegacyInnerWireParams[wires.size()];
-               i1 = 0;
-               for (ModelWire innerWire : wires)
-               {
-                       LegacyInnerWireParams innerWireParams = new LegacyInnerWireParams();
-                       wireParams[i1] = innerWireParams;
-                       LegacyInnerPinParams pin1Params = new LegacyInnerPinParams(), pin2Params = new LegacyInnerPinParams();
-
-                       pin1Params.pinName = innerWire.getPin1().name;
-                       pin1Params.compName = innerWire.getPin1().component.getName();
-                       pin2Params.pinName = innerWire.getPin2().name;
-                       pin2Params.compName = innerWire.getPin2().component.getName();
-                       innerWireParams.name = innerWire.name;
-                       innerWireParams.pin1 = pin1Params;
-                       innerWireParams.pin2 = pin2Params;
-                       innerWireParams.path = innerWire.getPath();
-                       i1++;
-               }
-               submodelParams.innerWires = wireParams;
-
-               LegacySubmodelComponentParams params = new LegacySubmodelComponentParams();
-               params.submodel = submodelParams;
-
-               params.width = comp.getWidth();
-               params.height = comp.getHeight();
-
-               LegacyInterfacePinParams[] iPins = new LegacyInterfacePinParams[comp.getPins().size()];
-               int i = 0;
-               for (Pin p : comp.getPins().values())
-               {
-                       LegacyInterfacePinParams iPinParams = new LegacyInterfacePinParams();
-                       iPins[i] = iPinParams;
-                       iPinParams.location = p.getRelPos();
-                       iPinParams.name = p.name;
-                       iPinParams.logicWidth = p.logicWidth;
-                       i++;
-               }
-               params.interfacePins = iPins;
-
-               Renderer symbolRenderer = comp.getSymbolRenderer();
-               if (symbolRenderer != null)
-               {
-                       params.symbolRendererSnippetID = symbolRenderer.getIDForSerializing(idParams);
-                       params.symbolRendererParams = symbolRenderer.getParamsForSerializingJSON(idParams);
-               }
-
-               Renderer outlineRenderer = comp.getOutlineRenderer();
-               if (outlineRenderer != null)
-               {
-                       params.outlineRendererSnippetID = outlineRenderer.getIDForSerializing(idParams);
-                       params.outlineRendererParams = outlineRenderer.getParamsForSerializingJSON(idParams);
-               }
-
-               HighLevelStateHandler highLevelStateHandler = comp.getHighLevelStateHandler();
-               if (highLevelStateHandler != null)
-               {
-                       params.highLevelStateHandlerSnippetID = highLevelStateHandler.getIDForSerializing(idParams);
-                       params.highLevelStateHandlerParams = highLevelStateHandler.getParamsForSerializingJSON(idParams);
-               }
-
-               return params;
-       }
-}
\ No newline at end of file
diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/StandardComponentIdMappingContainer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/StandardComponentIdMappingContainer.java
deleted file mode 100644 (file)
index 9467200..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-package net.mograsim.logic.model.serializing;
-
-import java.util.Map;
-
-import net.mograsim.logic.model.util.Version;
-
-public class StandardComponentIdMappingContainer extends SerializablePojo
-{
-       public Map<String, String> map;
-
-       public StandardComponentIdMappingContainer(Version version)
-       {
-               super(version);
-       }
-
-       public Map<String, String> getMap()
-       {
-               return map;
-       }
-}
index cf13988..cc3cf91 100644 (file)
@@ -187,7 +187,7 @@ public final class SubmodelComponentSerializer
 
        /**
         * Returns {@link SubmodelComponentParams}, which describe this {@link SubmodelComponent}. <br>
-        * See {@link LogicModelSerializer#serialize(net.mograsim.logic.model.model.LogicModel, IdentifierGetter)
+        * See {@link LogicModelSerializer#serialize(net.mograsim.logic.model.model.LogicModel, IdentifyParams)
         * LogicModelSerializer.serialize(...)} for how subcomponents are serialized.<br>
         * CodeSnippets are serialized using the ID defined by <code>idGetter</code> and the params obtained by the respective
         * <coce>getParamsForSerializing</code> methods ({@link Renderer#getParamsForSerializing()}).
index b0b8bed..9da19e5 100644 (file)
@@ -1,17 +1,13 @@
 {
-  "version": "0.1.0",
-  "map": {
-    "AndGate": "class:net.mograsim.logic.model.model.components.atomic.ModelAndGate",
-    "BitDisplay": "class:net.mograsim.logic.model.model.components.atomic.ModelBitDisplay",
-    "Clock": "class:net.mograsim.logic.model.model.components.atomic.ModelClock",
-    "FixedOutput": "class:net.mograsim.logic.model.model.components.atomic.ModelFixedOutput",
-    "ManualSwitch": "class:net.mograsim.logic.model.model.components.atomic.ModelManualSwitch",
-    "Merger": "class:net.mograsim.logic.model.model.components.atomic.ModelMerger",
-    "NandGate": "class:net.mograsim.logic.model.model.components.atomic.ModelNandGate",
-    "OrGate": "class:net.mograsim.logic.model.model.components.atomic.ModelOrGate",
-    "Splitter": "class:net.mograsim.logic.model.model.components.atomic.ModelSplitter",
-    "TriStateBuffer": "class:net.mograsim.logic.model.model.components.atomic.ModelTriStateBuffer",
-    "TextComponent": "class:net.mograsim.logic.model.model.components.atomic.ModelTextComponent",
-    "WireCrossPoint": "class:net.mograsim.logic.model.model.wires.ModelWireCrossPoint"
-  }
+  "AndGate": "class:net.mograsim.logic.model.model.components.atomic.ModelAndGate",
+  "BitDisplay": "class:net.mograsim.logic.model.model.components.atomic.ModelBitDisplay",
+  "Clock": "class:net.mograsim.logic.model.model.components.atomic.ModelClock",
+  "FixedOutput": "class:net.mograsim.logic.model.model.components.atomic.ModelFixedOutput",
+  "ManualSwitch": "class:net.mograsim.logic.model.model.components.atomic.ModelManualSwitch",
+  "NandGate": "class:net.mograsim.logic.model.model.components.atomic.ModelNandGate",
+  "OrGate": "class:net.mograsim.logic.model.model.components.atomic.ModelOrGate",
+  "Splitter": "class:net.mograsim.logic.model.model.components.atomic.ModelSplitter",
+  "TriStateBuffer": "class:net.mograsim.logic.model.model.components.atomic.ModelTriStateBuffer",
+  "TextComponent": "class:net.mograsim.logic.model.model.components.atomic.ModelTextComponent",
+  "WireCrossPoint": "class:net.mograsim.logic.model.model.wires.ModelWireCrossPoint"
 }
\ No newline at end of file
index 20491ce..950b953 100644 (file)
@@ -39,9 +39,7 @@ public class JsonHandler
 
        public static <T> T fromJson(String src, Class<T> type)
        {
-               // throw away legacy version line
-               String rawJson = src.lines().dropWhile(s -> s.length() == 0 || s.charAt(0) != '{').collect(Collectors.joining());
-               return parser.fromJson(rawJson, type);
+               return parser.fromJson(src, type);
        }
 
        public static <T> T fromJsonTree(JsonElement src, Class<T> type)
index 8391e4a..cb94fb0 100644 (file)
             label="%fontDefinition.label">
       </fontDefinition>
    </extension>
+   <extension
+         point="org.eclipse.ui.preferencePages">
+      <page
+            class="net.mograsim.plugin.MainPreferencePage"
+            id="net.mograsim.plugin.core.mainprefpage"
+            name="Mograsim preferences">
+      </page>
+   </extension>
 
 </plugin>
diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/EclipsePreferences.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/EclipsePreferences.java
new file mode 100644 (file)
index 0000000..1e2c447
--- /dev/null
@@ -0,0 +1,72 @@
+package net.mograsim.plugin;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ColorRegistry;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.ui.statushandlers.StatusManager;
+import org.eclipse.ui.themes.ITheme;
+
+import net.mograsim.preferences.ColorDefinition;
+import net.mograsim.preferences.DefaultPreferences;
+import net.mograsim.preferences.Preferences;
+
+public class EclipsePreferences extends Preferences
+{
+       private final ITheme theme;
+       private final IPreferenceStore prefs;
+       private final Preferences defaultPrefs;
+
+       public EclipsePreferences(ITheme theme, IPreferenceStore prefs)
+       {
+               this.theme = theme;
+               this.prefs = prefs;
+               this.defaultPrefs = new DefaultPreferences();
+       }
+
+       @Override
+       public boolean getBoolean(String name)
+       {
+               prefs.setDefault(name, defaultPrefs.getBoolean(name));
+               return prefs.getBoolean(name);
+       }
+
+       @Override
+       public int getInt(String name)
+       {
+               prefs.setDefault(name, defaultPrefs.getInt(name));
+               return prefs.getInt(name);
+       }
+
+       @Override
+       public double getDouble(String name)
+       {
+               prefs.setDefault(name, defaultPrefs.getDouble(name));
+               return prefs.getDouble(name);
+       }
+
+       @Override
+       public ColorDefinition getColorDefinition(String name)
+       {
+               RGB rgb = getColorRegistry().getRGB(name);
+               if (rgb == null)
+               {
+                       StatusManager.getManager().handle(new Status(IStatus.ERROR, "net.mograsim.plugin.core", "No color for name " + name));
+                       return null;
+               }
+               return new ColorDefinition(rgb.red, rgb.green, rgb.blue);
+       }
+
+       @Override
+       public Color getColor(String name)
+       {
+               return getColorRegistry().get(name);
+       }
+
+       private ColorRegistry getColorRegistry()
+       {
+               return theme.getColorRegistry();
+       }
+}
\ No newline at end of file
diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/MainPreferencePage.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/MainPreferencePage.java
new file mode 100644 (file)
index 0000000..69430ed
--- /dev/null
@@ -0,0 +1,27 @@
+package net.mograsim.plugin;
+
+import org.eclipse.jface.preference.BooleanFieldEditor;
+import org.eclipse.jface.preference.FieldEditorPreferencePage;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+public class MainPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage
+{
+       public MainPreferencePage()
+       {
+               super(GRID);
+       }
+
+       @Override
+       public void init(IWorkbench workbench)
+       {
+               setPreferenceStore(MograsimActivator.instance().getPreferenceStore());
+       }
+
+       @Override
+       protected void createFieldEditors()
+       {
+               addField(new BooleanFieldEditor("net.mograsim.logic.model.debug.openhlsshell", "Open the debug HLS shell", getFieldEditorParent()));
+               // TODO add other preferences
+       }
+}
\ No newline at end of file
index c17f530..2d8e8e6 100644 (file)
@@ -6,9 +6,20 @@ import net.mograsim.machine.MachineRegistry;
 
 public final class MograsimActivator extends AbstractUIPlugin
 {
+       private static MograsimActivator instance;
 
        public MograsimActivator()
        {
+               if (instance != null)
+                       throw new IllegalStateException("MograsimActivator already created!");
+               instance = this;
                MachineRegistry.reload();
        }
-}
+
+       public static MograsimActivator instance()
+       {
+               if (instance == null)
+                       throw new IllegalStateException("MograsimActivator not yet created!");
+               return instance;
+       }
+}
\ No newline at end of file
index 5fcc168..92d45a5 100644 (file)
@@ -32,7 +32,7 @@ public class SimulationPreview implements IThemePreview
        {
                oldPreferences = Preferences.current();
 
-               currentThemePreferences = new ThemePreferences(currentTheme);
+               currentThemePreferences = new EclipsePreferences(currentTheme, MograsimActivator.instance().getPreferenceStore());
                // TODO this will change the global preferences; so if another LogicUICanvas redraws, it will use the "new" colors too.
                Preferences.setPreferences(currentThemePreferences);
 
diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/ThemePreferences.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/ThemePreferences.java
deleted file mode 100644 (file)
index 42da25d..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-package net.mograsim.plugin;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.ColorRegistry;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.ui.themes.ITheme;
-
-import net.mograsim.preferences.ColorDefinition;
-import net.mograsim.preferences.DefaultPreferences;
-import net.mograsim.preferences.Preferences;
-
-// TODO proper getInt/getDouble implementation, maybe via own preferences page?
-public class ThemePreferences extends Preferences
-{
-       private final ITheme theme;
-
-       public ThemePreferences(ITheme theme)
-       {
-               this.theme = theme;
-       }
-
-       @Override
-       public boolean getBoolean(String name)
-       {
-               return new DefaultPreferences().getBoolean(name);
-       }
-
-       @Override
-       public int getInt(String name)
-       {
-               return new DefaultPreferences().getInt(name);
-       }
-
-       @Override
-       public double getDouble(String name)
-       {
-               return new DefaultPreferences().getDouble(name);
-       }
-
-       @Override
-       public ColorDefinition getColorDefinition(String name)
-       {
-               RGB rgb = getColorRegistry().getRGB(name);
-               if (rgb == null)
-               {
-                       StatusManager.getManager().handle(new Status(IStatus.ERROR, "net.mograsim.plugin.core", "No color for name " + name));
-                       return null;
-               }
-               return new ColorDefinition(rgb.red, rgb.green, rgb.blue);
-       }
-
-       @Override
-       public Color getColor(String name)
-       {
-               return getColorRegistry().get(name);
-       }
-
-       private ColorRegistry getColorRegistry()
-       {
-               return theme.getColorRegistry();
-       }
-}
\ No newline at end of file
index 212f777..9916bf4 100644 (file)
@@ -12,8 +12,9 @@ import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInpu
 import net.mograsim.logic.model.LogicExecuter;
 import net.mograsim.logic.model.LogicUICanvas;
 import net.mograsim.machine.Machine;
+import net.mograsim.plugin.EclipsePreferences;
 import net.mograsim.plugin.MachineContext;
-import net.mograsim.plugin.ThemePreferences;
+import net.mograsim.plugin.MograsimActivator;
 import net.mograsim.preferences.Preferences;
 
 public class LogicUIPart extends ViewPart
@@ -35,7 +36,8 @@ public class LogicUIPart extends ViewPart
        public void createPartControl(Composite parent)
        {
                // set preferences
-               Preferences.setPreferences(new ThemePreferences(PlatformUI.getWorkbench().getThemeManager().getCurrentTheme()));
+               Preferences.setPreferences(new EclipsePreferences(PlatformUI.getWorkbench().getThemeManager().getCurrentTheme(),
+                               MograsimActivator.instance().getPreferenceStore()));
 
                Machine m = MachineContext.getInstance().getMachine();
 
index 2f5c7c2..b261003 100644 (file)
@@ -11,6 +11,8 @@ public class DefaultPreferences extends Preferences
                {
                case "net.mograsim.logic.model.improvetext":
                        return true;
+               case "net.mograsim.logic.model.debug.openhlsshell":
+                       return false;
                default:
                        throw new IllegalArgumentException("Unknown boolean preference name: " + name);
                }
@@ -37,6 +39,10 @@ public class DefaultPreferences extends Preferences
                        return 0.5;
                case "net.mograsim.logic.model.linewidth.wire.multibit":
                        return 0.85;
+               case "net.mograsim.logic.model.submodel.zoomalpha0":
+                       return 0.8;
+               case "net.mograsim.logic.model.submodel.zoomalpha1":
+                       return 0.9;
                default:
                        throw new IllegalArgumentException("Unknown double preference name: " + name);
                }
diff --git a/tests/net.mograsim.logic.core.tests/.classpath b/tests/net.mograsim.logic.core.tests/.classpath
new file mode 100644 (file)
index 0000000..e61c696
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="src" output="target/classes" path="src">
+               <attributes>
+                       <attribute name="test" value="true"/>
+                       <attribute name="optional" value="true"/>
+                       <attribute name="maven.pomderived" value="true"/>
+               </attributes>
+       </classpathentry>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11">
+               <attributes>
+                       <attribute name="module" value="true"/>
+                       <attribute name="maven.pomderived" value="true"/>
+               </attributes>
+       </classpathentry>
+       <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/5"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/tests/net.mograsim.logic.core.tests/.project b/tests/net.mograsim.logic.core.tests/.project
new file mode 100644 (file)
index 0000000..2d57f64
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>net.mograsim.logic.core.tests</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/tests/net.mograsim.logic.core.tests/.settings/org.eclipse.core.resources.prefs b/tests/net.mograsim.logic.core.tests/.settings/org.eclipse.core.resources.prefs
new file mode 100644 (file)
index 0000000..99f26c0
--- /dev/null
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/tests/net.mograsim.logic.core.tests/.settings/org.eclipse.jdt.core.prefs b/tests/net.mograsim.logic.core.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644 (file)
index 0000000..f8bd225
--- /dev/null
@@ -0,0 +1,456 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.indent_tag_description=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=140
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.lineSplit=140
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/tests/net.mograsim.logic.core.tests/.settings/org.eclipse.jdt.ui.prefs b/tests/net.mograsim.logic.core.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644 (file)
index 0000000..8f2c0a4
--- /dev/null
@@ -0,0 +1,63 @@
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_MoGraSim
+formatter_settings_version=16
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=false
+sp_cleanup.organize_imports=false
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=false
+sp_cleanup.remove_redundant_type_arguments=false
+sp_cleanup.remove_trailing_whitespaces=false
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/tests/net.mograsim.logic.core.tests/.settings/org.eclipse.m2e.core.prefs b/tests/net.mograsim.logic.core.tests/.settings/org.eclipse.m2e.core.prefs
new file mode 100644 (file)
index 0000000..f897a7f
--- /dev/null
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/tests/net.mograsim.logic.core.tests/META-INF/MANIFEST.MF b/tests/net.mograsim.logic.core.tests/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..5fd49fc
--- /dev/null
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Logic Tests
+Bundle-SymbolicName: net.mograsim.logic.core.tests;singleton:=true
+Bundle-Version: 0.1.0.qualifier
+Bundle-Vendor: Mograsim Team
+Fragment-Host: net.mograsim.logic.model;bundle-version="0.1.0"
+Automatic-Module-Name: net.mograsim.logic.tests
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Require-Bundle: org.junit.jupiter.api;bundle-version="5.4.0";visibility:=reexport,
+ org.junit.jupiter.params;bundle-version="5.4.0";visibility:=reexport,
+ org.junit;bundle-version="4.12.0"
diff --git a/tests/net.mograsim.logic.core.tests/build.properties b/tests/net.mograsim.logic.core.tests/build.properties
new file mode 100644 (file)
index 0000000..34d2e4d
--- /dev/null
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/tests/net.mograsim.logic.core.tests/src/net/mograsim/logic/core/tests/CoreComponentTest.java b/tests/net.mograsim.logic.core.tests/src/net/mograsim/logic/core/tests/CoreComponentTest.java
new file mode 100644 (file)
index 0000000..12df584
--- /dev/null
@@ -0,0 +1,465 @@
+package net.mograsim.logic.core.tests;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import net.mograsim.logic.core.components.CoreDemux;
+import net.mograsim.logic.core.components.CoreMux;
+import net.mograsim.logic.core.components.CoreTriStateBuffer;
+import net.mograsim.logic.core.components.CoreUnidirectionalMerger;
+import net.mograsim.logic.core.components.CoreUnidirectionalSplitter;
+import net.mograsim.logic.core.components.gates.CoreAndGate;
+import net.mograsim.logic.core.components.gates.CoreNandGate;
+import net.mograsim.logic.core.components.gates.CoreNorGate;
+import net.mograsim.logic.core.components.gates.CoreNotGate;
+import net.mograsim.logic.core.components.gates.CoreOrGate;
+import net.mograsim.logic.core.components.gates.CoreXorGate;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.Bit;
+import net.mograsim.logic.core.types.BitVector;
+import net.mograsim.logic.core.wires.CoreWire;
+import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
+import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd;
+
+@SuppressWarnings("unused")
+class CoreComponentTest
+{
+       private Timeline t = new Timeline(11);
+
+       @BeforeEach
+       void resetTimeline()
+       {
+               t.reset();
+       }
+
+       @Test
+       void circuitExampleTest()
+       {
+               CoreWire a = new CoreWire(t, 1, 1), b = new CoreWire(t, 1, 1), c = new CoreWire(t, 1, 10), d = new CoreWire(t, 2, 1),
+                               e = new CoreWire(t, 1, 1), f = new CoreWire(t, 1, 1), g = new CoreWire(t, 1, 1), h = new CoreWire(t, 2, 1),
+                               i = new CoreWire(t, 2, 1), j = new CoreWire(t, 1, 1), k = new CoreWire(t, 1, 1);
+               new CoreAndGate(t, 1, f.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
+               new CoreNotGate(t, 1, f.createReadOnlyEnd(), g.createReadWriteEnd());
+               new CoreUnidirectionalMerger(t, h.createReadWriteEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd());
+               new CoreMux(t, 1, i.createReadWriteEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd());
+               new CoreUnidirectionalSplitter(t, i.createReadOnlyEnd(), k.createReadWriteEnd(), j.createReadWriteEnd());
+
+               a.createReadWriteEnd().feedSignals(Bit.ZERO);
+               b.createReadWriteEnd().feedSignals(Bit.ONE);
+               c.createReadWriteEnd().feedSignals(Bit.ZERO);
+               d.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE);
+               e.createReadWriteEnd().feedSignals(Bit.ZERO);
+
+               t.executeAll();
+
+               assertEquals(Bit.ONE, j.getValue());
+               assertEquals(Bit.ZERO, k.getValue());
+       }
+
+       @Test
+       void splitterTest()
+       {
+               CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), in = new CoreWire(t, 8, 1);
+               in.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
+               new CoreUnidirectionalSplitter(t, in.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), c.createReadWriteEnd());
+
+               t.executeAll();
+
+               assertBitArrayEquals(a.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO);
+               assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO);
+               assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE);
+       }
+
+       @Test
+       void mergerTest()
+       {
+               CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), out = new CoreWire(t, 8, 1);
+               a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO);
+               b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO);
+               c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
+
+               new CoreUnidirectionalMerger(t, out.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
+
+               t.executeAll();
+
+               assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
+       }
+
+       @Test
+       void fusionTest1()
+       {
+               CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), out = new CoreWire(t, 8, 1);
+               CoreWire.fuse(a, out, 0, 0, a.width);
+               CoreWire.fuse(b, out, 0, a.width, b.width);
+               CoreWire.fuse(c, out, 0, a.width + b.width, c.width);
+               ReadWriteEnd rA = a.createReadWriteEnd();
+               rA.feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO);
+               ReadWriteEnd rB = b.createReadWriteEnd();
+               rB.feedSignals(Bit.ONE, Bit.ZERO);
+               ReadWriteEnd rC = c.createReadWriteEnd();
+               rC.feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
+
+               t.executeAll();
+               assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
+               out.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
+               t.executeAll();
+               assertBitArrayEquals(rA.getValues(), Bit.X, Bit.X, Bit.X);
+               assertBitArrayEquals(rB.getValues(), Bit.X, Bit.X);
+               assertBitArrayEquals(rC.getValues(), Bit.X, Bit.X, Bit.X);
+               rA.clearSignals();
+               rB.clearSignals();
+               rC.clearSignals();
+               t.executeAll();
+               assertBitArrayEquals(rA.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE);
+               assertBitArrayEquals(rB.getValues(), Bit.ZERO, Bit.ONE);
+               assertBitArrayEquals(rC.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO);
+       }
+
+       @Test
+       void fusionTest2()
+       {
+               CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1);
+               CoreWire.fuse(a, b);
+               ReadWriteEnd rw = a.createReadWriteEnd();
+               t.executeAll();
+               assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U);
+
+               rw.feedSignals(Bit.ONE, Bit.U, Bit.Z);
+               t.executeAll();
+               assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.U, Bit.Z);
+       }
+
+       @Test
+       void fusionTest3()
+       {
+               CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1);
+               a.createReadWriteEnd().feedSignals(Bit.Z, Bit.U, Bit.X);
+               t.executeAll();
+               CoreWire.fuse(a, b);
+               t.executeAll();
+               assertBitArrayEquals(b.getValues(), Bit.Z, Bit.U, Bit.X);
+       }
+
+       @Test
+       void fusionTest4()
+       {
+               CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1);
+               a.createReadWriteEnd();
+               t.executeAll();
+
+               CoreWire.fuse(a, b);
+               t.executeAll();
+               assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U);
+       }
+
+//     @Test
+//     void connectorTest()
+//     {
+//             t.reset();
+//             Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1);
+//             new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect();
+////           b.createReadWriteEnd();
+//             a.createReadWriteEnd();
+//             t.executeAll();
+//             assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U);
+//     }
+
+       @Test
+       void triStateBufferTest()
+       {
+               CoreWire a = new CoreWire(t, 1, 1), b = new CoreWire(t, 1, 1), en = new CoreWire(t, 1, 1), notEn = new CoreWire(t, 1, 1);
+               new CoreNotGate(t, 1, en.createReadOnlyEnd(), notEn.createReadWriteEnd());
+               new CoreTriStateBuffer(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd(), en.createReadOnlyEnd());
+               new CoreTriStateBuffer(t, 1, b.createReadOnlyEnd(), a.createReadWriteEnd(), notEn.createReadOnlyEnd());
+
+               ReadWriteEnd enI = en.createReadWriteEnd(), aI = a.createReadWriteEnd(), bI = b.createReadWriteEnd();
+               enI.feedSignals(Bit.ONE);
+               aI.feedSignals(Bit.ONE);
+               bI.feedSignals(Bit.Z);
+
+               t.executeAll();
+
+               assertEquals(Bit.ONE, b.getValue());
+
+               bI.feedSignals(Bit.ZERO);
+
+               t.executeAll();
+
+               assertEquals(Bit.X, b.getValue());
+               assertEquals(Bit.ONE, a.getValue());
+
+               aI.clearSignals();
+               enI.feedSignals(Bit.ZERO);
+
+               t.executeAll();
+
+               assertEquals(Bit.ZERO, a.getValue());
+
+       }
+
+       @Test
+       void muxTest()
+       {
+               CoreWire a = new CoreWire(t, 4, 3), b = new CoreWire(t, 4, 6), c = new CoreWire(t, 4, 4), select = new CoreWire(t, 2, 5),
+                               out = new CoreWire(t, 4, 1);
+               ReadWriteEnd selectIn = select.createReadWriteEnd();
+
+               selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
+               a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
+               c.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
+
+               new CoreMux(t, 1, out.createReadWriteEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(),
+                               c.createReadOnlyEnd());
+               t.executeAll();
+
+               assertBitArrayEquals(out.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
+               selectIn.feedSignals(Bit.ONE, Bit.ZERO);
+               t.executeAll();
+
+               assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
+
+               selectIn.feedSignals(Bit.ONE, Bit.ONE);
+               t.executeAll();
+
+               assertBitArrayEquals(out.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
+
+       }
+
+       @Test
+       void demuxTest()
+       {
+               CoreWire a = new CoreWire(t, 4, 3), b = new CoreWire(t, 4, 6), c = new CoreWire(t, 4, 4), select = new CoreWire(t, 2, 5),
+                               in = new CoreWire(t, 4, 1);
+               ReadWriteEnd selectIn = select.createReadWriteEnd();
+
+               selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
+               in.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
+
+               new CoreDemux(t, 1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(),
+                               c.createReadWriteEnd());
+               t.executeAll();
+
+               assertBitArrayEquals(a.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
+               assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
+               assertBitArrayEquals(c.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
+               selectIn.feedSignals(Bit.ONE, Bit.ZERO);
+               t.executeAll();
+
+               assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
+               assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
+               assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
+
+               selectIn.feedSignals(Bit.ONE, Bit.ONE);
+               t.executeAll();
+
+               assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
+               assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
+               assertBitArrayEquals(c.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
+
+       }
+
+       @Test
+       void andTest()
+       {
+               CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1);
+               new CoreAndGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
+               a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
+               b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
+
+               t.executeAll();
+
+               assertBitArrayEquals(c.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ZERO);
+       }
+
+       @Test
+       void orTest()
+       {
+               CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1);
+               new CoreOrGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
+               a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
+               b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
+
+               t.executeAll();
+
+               assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ONE);
+       }
+
+       @Test
+       void nandTest()
+       {
+               CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1), d = new CoreWire(t, 4, 1);
+               new CoreNandGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
+               a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
+               b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
+               c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
+
+               t.executeAll();
+
+               assertBitArrayEquals(d.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ONE);
+       }
+
+       @Test
+       void norTest()
+       {
+               CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1), d = new CoreWire(t, 4, 1);
+               new CoreNorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
+               a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
+               b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
+               c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
+
+               t.executeAll();
+
+               assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ZERO, Bit.ONE, Bit.ZERO);
+       }
+
+       @Test
+       void xorTest()
+       {
+               CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 2), c = new CoreWire(t, 3, 1), d = new CoreWire(t, 3, 1);
+               new CoreXorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
+               a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
+               b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
+               c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
+
+               t.executeAll();
+
+               assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE);
+       }
+
+       @Test
+       void notTest()
+       {
+               CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 2);
+               new CoreNotGate(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd());
+               a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
+
+               t.executeAll();
+
+               assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO, Bit.ZERO);
+       }
+
+       @Test
+       void rsLatchCircuitTest()
+       {
+               CoreWire r = new CoreWire(t, 1, 1), s = new CoreWire(t, 1, 1), t1 = new CoreWire(t, 1, 15), t2 = new CoreWire(t, 1, 1),
+                               q = new CoreWire(t, 1, 1), nq = new CoreWire(t, 1, 1);
+
+               new CoreOrGate(t, 1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
+               new CoreOrGate(t, 1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
+               new CoreNotGate(t, 1, t2.createReadOnlyEnd(), q.createReadWriteEnd());
+               new CoreNotGate(t, 1, t1.createReadOnlyEnd(), nq.createReadWriteEnd());
+
+               ReadWriteEnd sIn = s.createReadWriteEnd(), rIn = r.createReadWriteEnd();
+
+               sIn.feedSignals(Bit.ONE);
+               rIn.feedSignals(Bit.ZERO);
+
+               t.executeAll();
+
+               assertEquals(Bit.ONE, q.getValue());
+               assertEquals(Bit.ZERO, nq.getValue());
+
+               sIn.feedSignals(Bit.ZERO);
+
+               t.executeAll();
+               assertEquals(Bit.ONE, q.getValue());
+               assertEquals(Bit.ZERO, nq.getValue());
+
+               rIn.feedSignals(Bit.ONE);
+
+               t.executeAll();
+
+               assertEquals(Bit.ZERO, q.getValue());
+               assertEquals(Bit.ONE, nq.getValue());
+       }
+
+       @Test
+       void numericValueTest()
+       {
+               CoreWire a = new CoreWire(t, 4, 1);
+               a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ONE);
+
+               t.executeAll();
+
+               assertEquals(11, a.getValues().getUnsignedValueLong());
+               assertEquals(-5, a.getValues().getSignedValueLong());
+       }
+
+       boolean flag = false;
+
+       @Test
+       void simpleTimelineTest()
+       {
+               Timeline t = new Timeline(3);
+               flag = false;
+               t.addEvent((e) ->
+               {
+                       if (!flag)
+                               fail("Events executed out of order!");
+                       flag = false;
+               }, 15);
+               t.addEvent((e) ->
+               {
+                       if (flag)
+                               fail("Events executed out of order!");
+                       flag = true;
+               }, 10);
+               t.addEvent((e) ->
+               {
+                       if (flag)
+                               fail("Events executed out of order!");
+                       flag = true;
+               }, 20);
+               t.addEvent((e) ->
+               {
+                       fail("Only supposed to execute until timestamp 20, not 25");
+               }, 25);
+
+               t.executeUntil(t.laterThan(20), 100);
+
+               if (!flag)
+                       fail("Not all events were executed in order!");
+       }
+
+       // TODO: Adapt this test, now that update notifications are issued whenever any input to a wire changes
+       @Disabled("Out of date")
+       @Test
+       void multipleInputs()
+       {
+               CoreWire w = new CoreWire(t, 2, 1);
+               ReadWriteEnd wI1 = w.createReadWriteEnd(), wI2 = w.createReadWriteEnd();
+               wI1.feedSignals(Bit.ONE, Bit.Z);
+               wI2.feedSignals(Bit.Z, Bit.X);
+               t.executeAll();
+               assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.X);
+
+               wI2.feedSignals(Bit.ZERO, Bit.Z);
+               t.executeAll();
+               assertBitArrayEquals(w.getValues(), Bit.X, Bit.Z);
+
+               wI2.feedSignals(Bit.Z, Bit.Z);
+               t.executeAll();
+               assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
+
+               wI2.feedSignals(Bit.ONE, Bit.Z);
+               ReadEnd rE = w.createReadOnlyEnd();
+               rE.registerObserver((i) -> fail("WireEnd notified observer, although value did not change."));
+               t.executeAll();
+               rE.close();
+               wI1.feedSignals(Bit.X, Bit.X);
+               t.executeAll();
+               wI1.registerObserver((i) -> fail("WireEnd notified observer, although it was closed."));
+               wI1.close();
+               assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
+       }
+
+       private static void assertBitArrayEquals(BitVector actual, Bit... expected)
+       {
+               assertArrayEquals(expected, actual.getBits());
+       }
+}
diff --git a/tests/net.mograsim.logic.core.tests/src/net/mograsim/logic/core/tests/GUITest.java b/tests/net.mograsim.logic.core.tests/src/net/mograsim/logic/core/tests/GUITest.java
new file mode 100644 (file)
index 0000000..a3689a3
--- /dev/null
@@ -0,0 +1,302 @@
+package net.mograsim.logic.core.tests;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.WindowConstants;
+
+import net.mograsim.logic.core.components.CoreManualSwitch;
+import net.mograsim.logic.core.components.gates.CoreNotGate;
+import net.mograsim.logic.core.components.gates.CoreOrGate;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.timeline.Timeline.ExecutionResult;
+import net.mograsim.logic.core.wires.CoreWire;
+
+public class GUITest extends JPanel
+{
+
+       private static final long serialVersionUID = 1L;
+
+       private static final int WIRE_DELAY = 40;
+       private static final int OR_DELAY = 100;
+       private static final int NOT_DELAY = 100;
+
+       private Timeline t = new Timeline(11);
+
+       CoreWire r = new CoreWire(t, 1, WIRE_DELAY);
+       CoreWire s = new CoreWire(t, 1, WIRE_DELAY);
+       CoreWire t1 = new CoreWire(t, 1, WIRE_DELAY);
+       CoreWire t2 = new CoreWire(t, 1, WIRE_DELAY);
+       CoreWire q = new CoreWire(t, 1, WIRE_DELAY);
+       CoreWire nq = new CoreWire(t, 1, WIRE_DELAY);
+
+       CoreManualSwitch rIn = new CoreManualSwitch(t, r.createReadWriteEnd());
+       CoreManualSwitch sIn = new CoreManualSwitch(t, s.createReadWriteEnd());
+
+       CoreOrGate or1 = new CoreOrGate(t, OR_DELAY, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
+       CoreOrGate or2 = new CoreOrGate(t, OR_DELAY, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
+       CoreNotGate not1 = new CoreNotGate(t, NOT_DELAY, t2.createReadOnlyEnd(), q.createReadWriteEnd());
+       CoreNotGate not2 = new CoreNotGate(t, NOT_DELAY, t1.createReadOnlyEnd(), nq.createReadWriteEnd());
+
+       Map<CoreManualSwitch, Rectangle> switchMap = new HashMap<>();
+
+       int height;
+       int width;
+       boolean sizeChanged;
+
+       public GUITest()
+       {
+               addMouseListener(new MouseListener()
+               {
+
+                       @Override
+                       public void mouseReleased(MouseEvent e)
+                       {
+                               for (Entry<CoreManualSwitch, Rectangle> dim : switchMap.entrySet())
+                               {
+                                       if (dim.getValue().contains(e.getPoint()))
+                                       {
+                                               dim.getKey().switchFullOff();
+                                               repaint();
+                                       }
+                               }
+                       }
+
+                       @Override
+                       public void mousePressed(MouseEvent e)
+                       {
+                               for (Entry<CoreManualSwitch, Rectangle> dim : switchMap.entrySet())
+                               {
+                                       if (dim.getValue().contains(e.getPoint()))
+                                       {
+                                               dim.getKey().switchFullOn();
+                                               repaint();
+                                       }
+                               }
+                       }
+
+                       @Override
+                       public void mouseExited(MouseEvent e)
+                       {
+                               // none
+                       }
+
+                       @Override
+                       public void mouseEntered(MouseEvent e)
+                       {
+                               // none
+                       }
+
+                       @Override
+                       public void mouseClicked(MouseEvent e)
+                       {
+                               // If you want toggle buttons, use this code instead
+//                             for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet()) {
+//                                     if (dim.getValue().contains(e.getPoint())) {
+//                                             dim.getKey().toggle();
+//                                             repaint();
+//                                     }
+//                             }
+                       }
+               });
+       }
+
+       public Timeline getTimeline()
+       {
+               return t;
+       }
+
+       @Override
+       public void paint(Graphics some_g)
+       {
+               super.paint(some_g);
+               Graphics2D g = ((Graphics2D) some_g);
+               g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
+               g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+               g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
+
+               checkSizeChange();
+               adaptFont(g);
+
+               drawWire(g, r, "r", 2, 9, 4, 9);
+
+               drawWire(g, s, "s", 2, 3, 4, 3);
+
+               drawWire(g, t2, "t2", 5, 8.5, 6, 8.5);
+
+               drawWire(g, t1, "t1", 5, 3.5, 6, 3.5);
+
+               drawWire(g, q, "q", 7, 8.5, 9, 8.5);
+
+               drawWire(g, nq, "nq", 7, 3.5, 9, 3.5);
+
+               drawWire(g, q, "", 7.5, 8.5, 7.5, 7.5);
+               drawWire(g, q, "", 7.5, 7.5, 3, 4.5);
+               drawWire(g, q, "", 3, 4.5, 3, 4);
+               drawWire(g, q, "q", 3, 4, 4, 4);
+
+               drawWire(g, nq, "", 7.5, 3.5, 7.5, 4.5);
+               drawWire(g, nq, "", 7.5, 4.5, 3, 7.5);
+               drawWire(g, nq, "", 3, 7.5, 3, 8);
+               drawWire(g, nq, "nq", 3, 8, 4, 8);
+
+               drawSquare(g, 4, 8, "OR");
+               drawSquare(g, 4, 3, "OR");
+
+               drawSquare(g, 6, 8, "NOT");
+               drawSquare(g, 6, 3, "NOT");
+
+               drawSwitch(g, rIn, "Switch R", 0.5, 8.25, 2, 9.75);
+               drawSwitch(g, sIn, "Switch S", 0.5, 2.25, 2, 3.75);
+
+               drawString(g, "Hint: drag the cursor out of the pressed switch to keep it's state", 5, 0, 0.0, 1.0);
+       }
+
+       private void checkSizeChange()
+       {
+               sizeChanged = height != getHeight() || width != getWidth();
+               if (sizeChanged)
+               {
+                       height = getHeight();
+                       width = getWidth();
+               }
+       }
+
+       private void adaptFont(Graphics g)
+       {
+               g.setFont(g.getFont().deriveFont(Math.min(height, width) / 40f));
+       }
+
+       @SuppressWarnings("static-method")
+       private void drawString(Graphics g, String s, int x, int y, double anchorX, double anchorY)
+       {
+               int h = g.getFontMetrics().getAscent();
+               int w = g.getFontMetrics().stringWidth(s);
+               g.drawString(s, x - (int) (w * anchorX), y + (int) (h * anchorY));
+       }
+
+       private void drawWire(Graphics g, CoreWire wa, String name, double x1, double y1, double x2, double y2)
+       {
+               setTo(g, wa);
+               g.drawLine(gX(x1), gY(y1), gX(x2), gY(y2));
+               drawString(g, name, (gX(x1) + gX(x2)) / 2, (gY(y1) + gY(y2)) / 2 - 5, 0, 0);
+       }
+
+       private void drawSquare(Graphics g, int posX, int posY, String text)
+       {
+               int x1 = gX(posX) - 5;
+               int x2 = gX(posX + 1) + 5;
+               int y1 = gY(posY) - 5;
+               int y2 = gY(posY + 1) + 5;
+
+               g.setColor(Color.WHITE);
+               g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
+               setBlack(g);
+               g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
+               drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5);
+
+       }
+
+       private void drawSwitch(Graphics g, CoreManualSwitch ms, String text, double posX1, double posY1, double posX2, double posY2)
+       {
+               int x1 = gX(posX1) - 5;
+               int x2 = gX(posX2) + 5;
+               int y1 = gY(posY1) - 5;
+               int y2 = gY(posY2) + 5;
+
+               if (sizeChanged)
+               {
+                       Rectangle r = new Rectangle(x1, y1, x2 - x1, y2 - y1);
+                       switchMap.put(ms, r);
+               }
+
+               g.setColor(ms.isFullOn() ? Color.getHSBColor(.3f, .5f, 1f) : Color.WHITE);
+               g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
+               setBlack(g);
+               g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
+               drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5);
+       }
+
+       private static void setBlack(Graphics g)
+       {
+               g.setColor(Color.BLACK);
+       }
+
+       private static void setTo(Graphics g, CoreWire wa)
+       {
+               switch (wa.getValue())
+               {
+               case ONE:
+                       g.setColor(Color.GREEN);
+                       break;
+               case X:
+                       g.setColor(Color.RED);
+                       break;
+               case Z:
+                       g.setColor(Color.DARK_GRAY);
+                       break;
+               case ZERO:
+                       g.setColor(Color.BLACK);
+                       break;
+               case U:
+                       g.setColor(Color.MAGENTA);
+                       break;
+               default:
+                       throw new IllegalArgumentException();
+               }
+       }
+
+       private int gY(double pos)
+       {
+               return (int) (pos * height / 11);
+       }
+
+       private int gX(double pos)
+       {
+               return (int) (pos * width / 11) + 50;
+       }
+
+       public static void main(String[] args)
+       {
+               JFrame f = new JFrame("Test circuit 1.0.0");
+               GUITest gt = new GUITest();
+               f.add(gt);
+               f.setSize(800, 600);
+               f.setLocation(500, 400);
+               f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+               f.setVisible(true);
+
+               long begin = System.currentTimeMillis();
+
+               long lastFrame = begin;
+               long updateT = 16;
+
+               while (f.isVisible())
+               {
+                       ExecutionResult er = gt.getTimeline().executeUntil(gt.getTimeline().laterThan((lastFrame - begin) * 3), lastFrame + 14);
+//                             if (t.hasNext()) 
+//                             t.executeNext();
+                       if (er != ExecutionResult.NOTHING_DONE)
+                               gt.repaint(12);
+                       try
+                       {
+                               Thread.sleep(Math.max(updateT - System.currentTimeMillis() + lastFrame, 0));
+                       }
+                       catch (Exception e)
+                       {
+                               e.printStackTrace();
+                       }
+                       lastFrame = System.currentTimeMillis();
+               }
+       }
+}
diff --git a/tests/net.mograsim.logic.core.tests/src/net/mograsim/logic/core/tests/TestCoreBitDisplay.java b/tests/net.mograsim.logic.core.tests/src/net/mograsim/logic/core/tests/TestCoreBitDisplay.java
new file mode 100644 (file)
index 0000000..5056345
--- /dev/null
@@ -0,0 +1,52 @@
+package net.mograsim.logic.core.tests;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+
+import java.util.function.LongConsumer;
+
+import net.mograsim.logic.core.components.CoreBitDisplay;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.timeline.TimelineEventHandler;
+import net.mograsim.logic.core.types.Bit;
+import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
+
+public final class TestCoreBitDisplay extends CoreBitDisplay
+{
+
+       public TestCoreBitDisplay(Timeline timeline, ReadEnd in)
+       {
+               super(timeline, in);
+       }
+
+       public void assertDisplays(Bit... expected)
+       {
+               assertArrayEquals(expected, getDisplayedValue().getBits());
+       }
+
+       public void assertAfterSimulationIs(Bit... expected)
+       {
+               timeline.executeAll();
+               assertDisplays(expected);
+       }
+
+       public void assertAfterSimulationIs(LongConsumer r, Bit... expected)
+       {
+               while (timeline.hasNext())
+               {
+                       timeline.executeNext();
+                       r.accept(timeline.getSimulationTime());
+               }
+               assertDisplays(expected);
+       }
+
+       @Override
+       protected TimelineEventHandler compute()
+       {
+               TimelineEventHandler handler = super.compute();
+               return e ->
+               {
+                       handler.handle(e);
+                       System.out.println("update: value is " + getDisplayedValue());
+               };
+       }
+}
diff --git a/tests/net.mograsim.logic.core.tests/src/net/mograsim/logic/core/types/BitVectorTest.java b/tests/net.mograsim.logic.core.tests/src/net/mograsim/logic/core/types/BitVectorTest.java
new file mode 100644 (file)
index 0000000..2b46a6c
--- /dev/null
@@ -0,0 +1,289 @@
+package net.mograsim.logic.core.types;
+
+import static net.mograsim.logic.core.types.BitVector.*;
+import static net.mograsim.logic.core.types.Bit.*;
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.math.BigInteger;
+import java.util.Iterator;
+
+import org.junit.jupiter.api.Test;
+
+class BitVectorTest
+{
+
+       @Test
+       void testOfBitArray()
+       {
+               BitVector.of(); // should be allowed and work
+
+               assertSame(SINGLE_U, BitVector.of(U));
+               assertSame(SINGLE_X, BitVector.of(X));
+               assertSame(SINGLE_0, BitVector.of(ZERO));
+               assertSame(SINGLE_1, BitVector.of(ONE));
+               assertSame(SINGLE_Z, BitVector.of(Z));
+       }
+
+       @Test
+       void testOfBitInt()
+       {
+               assertEquals(BitVector.of(), BitVector.of(ONE, 0));
+
+               assertSame(SINGLE_U, BitVector.of(U, 1));
+               assertSame(SINGLE_X, BitVector.of(X, 1));
+               assertSame(SINGLE_0, BitVector.of(ZERO, 1));
+               assertSame(SINGLE_1, BitVector.of(ONE, 1));
+               assertSame(SINGLE_Z, BitVector.of(Z, 1));
+
+               assertEquals(BitVector.of(X, X, X), BitVector.of(X, 3));
+       }
+
+       @Test
+       void testGetUnsignedValue()
+       {
+               assertEquals(BigInteger.valueOf(0b101), BitVector.parse("101").getUnsignedValue());
+               assertEquals(BigInteger.valueOf(0b01010), BitVector.parse("01010").getUnsignedValue());
+               assertEquals(BigInteger.valueOf(0), BitVector.parse("0000").getUnsignedValue());
+               assertEquals(BigInteger.valueOf(0b0000000101), BitVector.parse("0000000101").getUnsignedValue());
+               assertEquals(BigInteger.valueOf(0b1010000000), BitVector.parse("1010000000").getUnsignedValue());
+
+               assertThrows(NumberFormatException.class, () -> BitVector.parse("00X1").getUnsignedValue());
+       }
+
+       @Test
+       void testOfLongInt()
+       {
+               assertEquals(BitVector.parse("101"), BitVector.from(0b101L, 3));
+               assertEquals(BitVector.parse("01010"), BitVector.from(0b01010L, 5));
+               assertEquals(BitVector.parse("10101"), BitVector.from(-11L, 5));
+               assertEquals(BitVector.parse("0000"), BitVector.from(0L, 4));
+       }
+
+       @Test
+       void testOfBigIntegerInt()
+       {
+               assertEquals(BitVector.parse("101"), BitVector.from(BigInteger.valueOf(0b101), 3));
+               assertEquals(BitVector.parse("01010"), BitVector.from(BigInteger.valueOf(0b01010), 5));
+               assertEquals(BitVector.parse("10101"), BitVector.from(BigInteger.valueOf(-11), 5));
+               assertEquals(BitVector.parse("0000"), BitVector.from(BigInteger.valueOf(0), 4));
+       }
+
+       @Test
+       void testMutator()
+       {
+               var bv = BitVector.SINGLE_1;
+               var bvm = bv.mutator();
+
+               assertFalse(bvm.isEmpty());
+               assertEquals(ONE, bvm.getLSBit(0));
+               assertEquals(SINGLE_1, bvm.toBitVector());
+       }
+
+       @Test
+       void testGetMSBit()
+       {
+               assertEquals(ONE, SINGLE_1.getMSBit(0));
+               assertEquals(ONE, BitVector.of(ONE, X, X, X).getMSBit(0));
+               assertEquals(ONE, BitVector.of(X, X, X, X, ONE, X).getMSBit(4));
+       }
+
+       @Test
+       void testGetLSBit()
+       {
+               assertEquals(ONE, SINGLE_1.getLSBit(0));
+               assertEquals(ONE, BitVector.of(X, X, X, ONE).getLSBit(0));
+               assertEquals(ONE, BitVector.of(X, X, X, X, ONE, X).getLSBit(1));
+       }
+
+       @Test
+       void testGetBits()
+       {
+               assertArrayEquals(new Bit[] { X, ONE, Z }, BitVector.of(X, ONE, Z).getBits());
+               assertArrayEquals(new Bit[] { X, ONE, Z }, BitVector.parse("X1Z").getBits());
+       }
+
+       @Test
+       void testIsBinary()
+       {
+               assertTrue(SINGLE_0.isBinary());
+               assertTrue(SINGLE_1.isBinary());
+
+               assertFalse(SINGLE_U.isBinary());
+               assertFalse(SINGLE_X.isBinary());
+               assertFalse(SINGLE_Z.isBinary());
+
+               assertTrue(BitVector.of(ONE, ZERO, ONE, ONE, ZERO).isBinary());
+               assertFalse(BitVector.of(ONE, ZERO, ZERO, X).isBinary());
+       }
+
+       @Test
+       void testJoin()
+       {
+               // binary
+               assertEquals(SINGLE_0, SINGLE_0.join(SINGLE_0));
+               assertEquals(SINGLE_X, SINGLE_0.join(SINGLE_1));
+               assertEquals(SINGLE_1, SINGLE_1.join(SINGLE_1));
+
+               // other
+               assertEquals(SINGLE_1, SINGLE_Z.join(SINGLE_1));
+               assertEquals(SINGLE_U, SINGLE_0.join(SINGLE_U));
+               assertEquals(SINGLE_X, SINGLE_X.join(SINGLE_Z));
+
+               // higher length
+               var result = BitVector.of(U, X, ZERO, ONE, Z).join(BitVector.of(ONE, ZERO, ZERO, ONE, Z));
+               assertEquals(BitVector.of(U, X, ZERO, ONE, Z), result);
+       }
+
+       @Test
+       void testAnd()
+       {
+               // binary
+               assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_0));
+               assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_1));
+               assertEquals(SINGLE_1, SINGLE_1.and(SINGLE_1));
+
+               // other
+               assertEquals(SINGLE_X, SINGLE_Z.and(SINGLE_1));
+               assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_U));
+               assertEquals(SINGLE_X, SINGLE_X.and(SINGLE_Z));
+
+               // higher length
+               var result = BitVector.of(U, X, ZERO, ONE, ONE).and(BitVector.of(ONE, ONE, ZERO, ZERO, ONE));
+               assertEquals(BitVector.of(U, X, ZERO, ZERO, ONE), result);
+       }
+
+       @Test
+       void testOr()
+       {
+               // binary
+               assertEquals(SINGLE_0, SINGLE_0.or(SINGLE_0));
+               assertEquals(SINGLE_1, SINGLE_0.or(SINGLE_1));
+               assertEquals(SINGLE_1, SINGLE_1.or(SINGLE_1));
+
+               // other
+               assertEquals(SINGLE_1, SINGLE_Z.or(SINGLE_1));
+               assertEquals(SINGLE_1, SINGLE_1.or(SINGLE_U));
+               assertEquals(SINGLE_X, SINGLE_X.or(SINGLE_Z));
+
+               // higher length
+               var result = BitVector.of(U, X, ZERO, ONE, ZERO).or(BitVector.of(ZERO, ZERO, ZERO, ONE, ONE));
+               assertEquals(BitVector.of(U, X, ZERO, ONE, ONE), result);
+       }
+
+       @Test
+       void testXor()
+       {
+               // binary
+               assertEquals(SINGLE_0, SINGLE_0.xor(SINGLE_0));
+               assertEquals(SINGLE_1, SINGLE_0.xor(SINGLE_1));
+               assertEquals(SINGLE_0, SINGLE_1.xor(SINGLE_1));
+
+               // other
+               assertEquals(SINGLE_X, SINGLE_Z.xor(SINGLE_1));
+               assertEquals(SINGLE_U, SINGLE_0.xor(SINGLE_U));
+               assertEquals(SINGLE_X, SINGLE_X.xor(SINGLE_Z));
+
+               // higher length
+               var result = BitVector.of(U, X, ZERO, ONE, ONE).xor(BitVector.of(ONE, ZERO, ZERO, ZERO, ONE));
+               assertEquals(BitVector.of(U, X, ZERO, ONE, ZERO), result);
+       }
+
+       @Test
+       void testNot()
+       {
+               // binary
+               assertEquals(SINGLE_1, SINGLE_0.not());
+               assertEquals(SINGLE_0, SINGLE_1.not());
+
+               // other
+               assertEquals(SINGLE_U, SINGLE_U.not());
+               assertEquals(SINGLE_X, SINGLE_X.not());
+               assertEquals(SINGLE_X, SINGLE_Z.not());
+
+               // higher length
+               var result = BitVector.of(U, X, ZERO, ONE, Z).not();
+               assertEquals(BitVector.of(U, X, ONE, ZERO, X), result);
+       }
+
+       @Test
+       void testLength()
+       {
+               assertEquals(0, BitVector.of().length());
+               assertEquals(1, SINGLE_0.length());
+               assertEquals(3, BitVector.of(X, X, Z).length());
+       }
+
+       @Test
+       void testConcat()
+       {
+               assertEquals(BitVector.of(U, X), SINGLE_U.concat(SINGLE_X));
+               assertEquals(BitVector.of(Z, X, U, ONE, X), BitVector.of(Z, X, U).concat(BitVector.of(ONE, X)));
+       }
+
+       @Test
+       void testSubVectorInt()
+       {
+               assertEquals(SINGLE_0, SINGLE_0.subVector(0));
+               assertEquals(BitVector.of(), SINGLE_0.subVector(1));
+               assertEquals(SINGLE_0, BitVector.of(ONE, ZERO).subVector(1));
+               assertEquals(BitVector.of(X, Z), BitVector.of(ZERO, U, ONE, X, Z).subVector(3));
+       }
+
+       @Test
+       void testSubVectorIntInt()
+       {
+               assertEquals(SINGLE_0, SINGLE_0.subVector(0, 1));
+               assertEquals(BitVector.of(), SINGLE_0.subVector(0, 0));
+               assertEquals(SINGLE_0, BitVector.of(ONE, ZERO).subVector(1, 2));
+               assertEquals(BitVector.of(ONE, X), BitVector.of(ZERO, U, ONE, X, Z).subVector(2, 4));
+       }
+
+       @Test
+       void testEqualsObject()
+       {
+               assertEquals(SINGLE_X, SINGLE_X);
+               assertNotEquals(SINGLE_0, SINGLE_1);
+
+               assertEquals(BitVector.of(X, Z, U), BitVector.of(X, Z, U));
+               assertNotEquals(BitVector.of(X, Z, U), BitVector.of(X, X, U));
+       }
+
+       @Test
+       void testEqualsWithOffset()
+       {
+               assertTrue(SINGLE_X.equalsWithOffset(SINGLE_X, 0));
+               assertFalse(SINGLE_0.equalsWithOffset(SINGLE_1, 0));
+
+               assertTrue(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(Z, U), 1));
+               assertFalse(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(X, U), 1));
+               assertTrue(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(U), 2));
+       }
+
+       @Test
+       void testParse()
+       {
+               assertEquals(SINGLE_U, BitVector.parse("U"));
+               assertEquals(SINGLE_X, BitVector.parse("X"));
+               assertEquals(SINGLE_0, BitVector.parse("0"));
+               assertEquals(SINGLE_1, BitVector.parse("1"));
+               assertEquals(SINGLE_Z, BitVector.parse("Z"));
+
+               assertEquals(BitVector.of(X, U, Z, ONE, ZERO), BitVector.parse("XUZ10"));
+
+               assertThrows(RuntimeException.class, () -> BitVector.parse("01BX"));
+       }
+
+       @Test
+       void testIterator()
+       {
+               var bv = BitVector.of(U, Z, ONE, ZERO, X);
+               Iterator<Bit> it = bv.iterator();
+
+               assertEquals(U, it.next());
+               assertEquals(Z, it.next());
+               assertEquals(ONE, it.next());
+               assertEquals(ZERO, it.next());
+               assertEquals(X, it.next());
+               assertFalse(it.hasNext());
+       }
+}
index 964d7d3..06aa591 100644 (file)
   "submodel": {
     "components": [
       {
-        "id": "Merger",
+        "id": "Am2904",
+        "name": "Am2904#0",
+        "pos": {
+          "x": 20.0,
+          "y": 15.0
+        }
+      },
+      {
+        "id": "Splitter",
         "name": "Merger#0",
         "pos": {
           "x": -30.0,
           "y": 70.0
         },
-        "params": 13
+        "params": {
+          "logicWidth": 13,
+          "orientation": "LEFT"
+        }
       },
       {
         "id": "Splitter",
           "x": -45.0,
           "y": 140.0
         },
-        "params": 6
+        "params": {
+          "logicWidth": 6,
+          "orientation": "RIGHT"
+        }
       },
       {
         "id": "Splitter",
           "x": -45.0,
           "y": 100.0
         },
-        "params": 4
+        "params": {
+          "logicWidth": 4,
+          "orientation": "RIGHT"
+        }
       },
       {
         "id": "Splitter",
           "x": -45.0,
           "y": 70.0
         },
-        "params": 2
-      },
-      {
-        "id": "Am2904",
-        "name": "Am2904#0",
-        "pos": {
-          "x": 20.0,
-          "y": 15.0
+        "params": {
+          "logicWidth": 2,
+          "orientation": "RIGHT"
         }
       }
     ],
       {
         "pin1": {
           "compName": "Merger#0",
-          "pinName": "I0"
+          "pinName": "O0"
         },
         "pin2": {
           "compName": "Splitter#0",
         },
         "pin2": {
           "compName": "Merger#0",
-          "pinName": "I1"
+          "pinName": "O1"
         },
         "name": "unnamedWire#13",
         "path": []
       {
         "pin1": {
           "compName": "Merger#0",
-          "pinName": "I2"
+          "pinName": "O2"
         },
         "pin2": {
           "compName": "Splitter#0",
         },
         "pin2": {
           "compName": "Merger#0",
-          "pinName": "I3"
+          "pinName": "O3"
         },
         "name": "unnamedWire#15",
         "path": []
       {
         "pin1": {
           "compName": "Merger#0",
-          "pinName": "I4"
+          "pinName": "O4"
         },
         "pin2": {
           "compName": "Splitter#0",
         },
         "pin2": {
           "compName": "Merger#0",
-          "pinName": "I5"
+          "pinName": "O5"
         },
         "name": "unnamedWire#17",
         "path": []
         },
         "pin2": {
           "compName": "Merger#0",
-          "pinName": "I6"
+          "pinName": "O6"
         },
         "name": "unnamedWire#18",
         "path": []
       {
         "pin1": {
           "compName": "Merger#0",
-          "pinName": "I7"
+          "pinName": "O7"
         },
         "pin2": {
           "compName": "Splitter#1",
         },
         "pin2": {
           "compName": "Merger#0",
-          "pinName": "I8"
+          "pinName": "O8"
         },
         "name": "unnamedWire#20",
         "path": []
       {
         "pin1": {
           "compName": "Merger#0",
-          "pinName": "I9"
+          "pinName": "O9"
         },
         "pin2": {
           "compName": "Splitter#1",
         },
         "pin2": {
           "compName": "Merger#0",
-          "pinName": "I11"
+          "pinName": "O11"
         },
         "name": "unnamedWire#22",
         "path": []
       {
         "pin1": {
           "compName": "Merger#0",
-          "pinName": "I12"
+          "pinName": "O12"
         },
         "pin2": {
           "compName": "Splitter#2",
       {
         "pin1": {
           "compName": "Merger#0",
-          "pinName": "O"
+          "pinName": "I"
         },
         "pin2": {
           "compName": "Am2904#0",
         },
         "pin2": {
           "compName": "Merger#0",
-          "pinName": "I10"
+          "pinName": "O10"
         },
         "name": "unnamedWire#26",
         "path": []
   "highLevelStateHandlerSnippetID": "standard",
   "highLevelStateHandlerParams": {
     "subcomponentHighLevelStates": {
-      "musr": {
+      "msr": {
         "id": "delegating",
         "params": {
           "delegateTarget": "Am2904#0",
-          "prefix": "musr"
+          "prefix": "msr"
         }
       },
-      "msr": {
+      "musr": {
         "id": "delegating",
         "params": {
           "delegateTarget": "Am2904#0",
-          "prefix": "msr"
+          "prefix": "musr"
         }
       }
     },
diff --git a/tests/net.mograsim.logic.tests/.classpath b/tests/net.mograsim.logic.tests/.classpath
deleted file mode 100644 (file)
index e61c696..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-       <classpathentry kind="src" output="target/classes" path="src">
-               <attributes>
-                       <attribute name="test" value="true"/>
-                       <attribute name="optional" value="true"/>
-                       <attribute name="maven.pomderived" value="true"/>
-               </attributes>
-       </classpathentry>
-       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11">
-               <attributes>
-                       <attribute name="module" value="true"/>
-                       <attribute name="maven.pomderived" value="true"/>
-               </attributes>
-       </classpathentry>
-       <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/5"/>
-       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-       <classpathentry kind="output" path="target/classes"/>
-</classpath>
diff --git a/tests/net.mograsim.logic.tests/.project b/tests/net.mograsim.logic.tests/.project
deleted file mode 100644 (file)
index b8cd02d..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-       <name>net.mograsim.logic.tests</name>
-       <comment></comment>
-       <projects>
-       </projects>
-       <buildSpec>
-               <buildCommand>
-                       <name>org.eclipse.jdt.core.javabuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-       </buildSpec>
-       <natures>
-               <nature>org.eclipse.jdt.core.javanature</nature>
-       </natures>
-</projectDescription>
diff --git a/tests/net.mograsim.logic.tests/.settings/org.eclipse.core.resources.prefs b/tests/net.mograsim.logic.tests/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644 (file)
index 99f26c0..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-eclipse.preferences.version=1
-encoding/<project>=UTF-8
diff --git a/tests/net.mograsim.logic.tests/.settings/org.eclipse.jdt.core.prefs b/tests/net.mograsim.logic.tests/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644 (file)
index f8bd225..0000000
+++ /dev/null
@@ -1,456 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
-org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=11
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.APILeak=warning
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
-org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning
-org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning
-org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
-org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
-org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.release=enabled
-org.eclipse.jdt.core.compiler.source=11
-org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
-org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
-org.eclipse.jdt.core.formatter.align_with_spaces=false
-org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
-org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
-org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
-org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0
-org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0
-org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
-org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
-org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
-org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
-org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
-org.eclipse.jdt.core.formatter.comment.indent_tag_description=false
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
-org.eclipse.jdt.core.formatter.comment.line_length=140
-org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
-org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
-org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=2
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
-org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
-org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
-org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
-org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.join_lines_in_comments=true
-org.eclipse.jdt.core.formatter.join_wrapped_lines=true
-org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.lineSplit=140
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=tab
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_on_off_tags=true
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
-org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
-org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
-org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/tests/net.mograsim.logic.tests/.settings/org.eclipse.jdt.ui.prefs b/tests/net.mograsim.logic.tests/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644 (file)
index 8f2c0a4..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_MoGraSim
-formatter_settings_version=16
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.on_save_use_additional_actions=false
-sp_cleanup.organize_imports=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_blocks=false
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/tests/net.mograsim.logic.tests/.settings/org.eclipse.m2e.core.prefs b/tests/net.mograsim.logic.tests/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644 (file)
index f897a7f..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
diff --git a/tests/net.mograsim.logic.tests/META-INF/MANIFEST.MF b/tests/net.mograsim.logic.tests/META-INF/MANIFEST.MF
deleted file mode 100644 (file)
index 4a72ac6..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Logic Tests
-Bundle-SymbolicName: net.mograsim.logic.tests;singleton:=true
-Bundle-Version: 0.1.0.qualifier
-Bundle-Vendor: Mograsim Team
-Fragment-Host: net.mograsim.logic.model;bundle-version="0.1.0"
-Automatic-Module-Name: net.mograsim.logic.tests
-Bundle-RequiredExecutionEnvironment: JavaSE-11
-Require-Bundle: org.junit.jupiter.api;bundle-version="5.4.0";visibility:=reexport,
- org.junit.jupiter.params;bundle-version="5.4.0";visibility:=reexport,
- org.junit;bundle-version="4.12.0"
diff --git a/tests/net.mograsim.logic.tests/build.properties b/tests/net.mograsim.logic.tests/build.properties
deleted file mode 100644 (file)
index 34d2e4d..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/CoreComponentTest.java b/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/CoreComponentTest.java
deleted file mode 100644 (file)
index 12df584..0000000
+++ /dev/null
@@ -1,465 +0,0 @@
-package net.mograsim.logic.core.tests;
-
-import static org.junit.jupiter.api.Assertions.assertArrayEquals;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.fail;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-import net.mograsim.logic.core.components.CoreDemux;
-import net.mograsim.logic.core.components.CoreMux;
-import net.mograsim.logic.core.components.CoreTriStateBuffer;
-import net.mograsim.logic.core.components.CoreUnidirectionalMerger;
-import net.mograsim.logic.core.components.CoreUnidirectionalSplitter;
-import net.mograsim.logic.core.components.gates.CoreAndGate;
-import net.mograsim.logic.core.components.gates.CoreNandGate;
-import net.mograsim.logic.core.components.gates.CoreNorGate;
-import net.mograsim.logic.core.components.gates.CoreNotGate;
-import net.mograsim.logic.core.components.gates.CoreOrGate;
-import net.mograsim.logic.core.components.gates.CoreXorGate;
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.Bit;
-import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.wires.CoreWire;
-import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
-import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd;
-
-@SuppressWarnings("unused")
-class CoreComponentTest
-{
-       private Timeline t = new Timeline(11);
-
-       @BeforeEach
-       void resetTimeline()
-       {
-               t.reset();
-       }
-
-       @Test
-       void circuitExampleTest()
-       {
-               CoreWire a = new CoreWire(t, 1, 1), b = new CoreWire(t, 1, 1), c = new CoreWire(t, 1, 10), d = new CoreWire(t, 2, 1),
-                               e = new CoreWire(t, 1, 1), f = new CoreWire(t, 1, 1), g = new CoreWire(t, 1, 1), h = new CoreWire(t, 2, 1),
-                               i = new CoreWire(t, 2, 1), j = new CoreWire(t, 1, 1), k = new CoreWire(t, 1, 1);
-               new CoreAndGate(t, 1, f.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
-               new CoreNotGate(t, 1, f.createReadOnlyEnd(), g.createReadWriteEnd());
-               new CoreUnidirectionalMerger(t, h.createReadWriteEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd());
-               new CoreMux(t, 1, i.createReadWriteEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd());
-               new CoreUnidirectionalSplitter(t, i.createReadOnlyEnd(), k.createReadWriteEnd(), j.createReadWriteEnd());
-
-               a.createReadWriteEnd().feedSignals(Bit.ZERO);
-               b.createReadWriteEnd().feedSignals(Bit.ONE);
-               c.createReadWriteEnd().feedSignals(Bit.ZERO);
-               d.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE);
-               e.createReadWriteEnd().feedSignals(Bit.ZERO);
-
-               t.executeAll();
-
-               assertEquals(Bit.ONE, j.getValue());
-               assertEquals(Bit.ZERO, k.getValue());
-       }
-
-       @Test
-       void splitterTest()
-       {
-               CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), in = new CoreWire(t, 8, 1);
-               in.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
-               new CoreUnidirectionalSplitter(t, in.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), c.createReadWriteEnd());
-
-               t.executeAll();
-
-               assertBitArrayEquals(a.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO);
-               assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO);
-               assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE);
-       }
-
-       @Test
-       void mergerTest()
-       {
-               CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), out = new CoreWire(t, 8, 1);
-               a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO);
-               b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO);
-               c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
-
-               new CoreUnidirectionalMerger(t, out.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
-
-               t.executeAll();
-
-               assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
-       }
-
-       @Test
-       void fusionTest1()
-       {
-               CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), out = new CoreWire(t, 8, 1);
-               CoreWire.fuse(a, out, 0, 0, a.width);
-               CoreWire.fuse(b, out, 0, a.width, b.width);
-               CoreWire.fuse(c, out, 0, a.width + b.width, c.width);
-               ReadWriteEnd rA = a.createReadWriteEnd();
-               rA.feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO);
-               ReadWriteEnd rB = b.createReadWriteEnd();
-               rB.feedSignals(Bit.ONE, Bit.ZERO);
-               ReadWriteEnd rC = c.createReadWriteEnd();
-               rC.feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
-
-               t.executeAll();
-               assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
-               out.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
-               t.executeAll();
-               assertBitArrayEquals(rA.getValues(), Bit.X, Bit.X, Bit.X);
-               assertBitArrayEquals(rB.getValues(), Bit.X, Bit.X);
-               assertBitArrayEquals(rC.getValues(), Bit.X, Bit.X, Bit.X);
-               rA.clearSignals();
-               rB.clearSignals();
-               rC.clearSignals();
-               t.executeAll();
-               assertBitArrayEquals(rA.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE);
-               assertBitArrayEquals(rB.getValues(), Bit.ZERO, Bit.ONE);
-               assertBitArrayEquals(rC.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO);
-       }
-
-       @Test
-       void fusionTest2()
-       {
-               CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1);
-               CoreWire.fuse(a, b);
-               ReadWriteEnd rw = a.createReadWriteEnd();
-               t.executeAll();
-               assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U);
-
-               rw.feedSignals(Bit.ONE, Bit.U, Bit.Z);
-               t.executeAll();
-               assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.U, Bit.Z);
-       }
-
-       @Test
-       void fusionTest3()
-       {
-               CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1);
-               a.createReadWriteEnd().feedSignals(Bit.Z, Bit.U, Bit.X);
-               t.executeAll();
-               CoreWire.fuse(a, b);
-               t.executeAll();
-               assertBitArrayEquals(b.getValues(), Bit.Z, Bit.U, Bit.X);
-       }
-
-       @Test
-       void fusionTest4()
-       {
-               CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1);
-               a.createReadWriteEnd();
-               t.executeAll();
-
-               CoreWire.fuse(a, b);
-               t.executeAll();
-               assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U);
-       }
-
-//     @Test
-//     void connectorTest()
-//     {
-//             t.reset();
-//             Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1);
-//             new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect();
-////           b.createReadWriteEnd();
-//             a.createReadWriteEnd();
-//             t.executeAll();
-//             assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U);
-//     }
-
-       @Test
-       void triStateBufferTest()
-       {
-               CoreWire a = new CoreWire(t, 1, 1), b = new CoreWire(t, 1, 1), en = new CoreWire(t, 1, 1), notEn = new CoreWire(t, 1, 1);
-               new CoreNotGate(t, 1, en.createReadOnlyEnd(), notEn.createReadWriteEnd());
-               new CoreTriStateBuffer(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd(), en.createReadOnlyEnd());
-               new CoreTriStateBuffer(t, 1, b.createReadOnlyEnd(), a.createReadWriteEnd(), notEn.createReadOnlyEnd());
-
-               ReadWriteEnd enI = en.createReadWriteEnd(), aI = a.createReadWriteEnd(), bI = b.createReadWriteEnd();
-               enI.feedSignals(Bit.ONE);
-               aI.feedSignals(Bit.ONE);
-               bI.feedSignals(Bit.Z);
-
-               t.executeAll();
-
-               assertEquals(Bit.ONE, b.getValue());
-
-               bI.feedSignals(Bit.ZERO);
-
-               t.executeAll();
-
-               assertEquals(Bit.X, b.getValue());
-               assertEquals(Bit.ONE, a.getValue());
-
-               aI.clearSignals();
-               enI.feedSignals(Bit.ZERO);
-
-               t.executeAll();
-
-               assertEquals(Bit.ZERO, a.getValue());
-
-       }
-
-       @Test
-       void muxTest()
-       {
-               CoreWire a = new CoreWire(t, 4, 3), b = new CoreWire(t, 4, 6), c = new CoreWire(t, 4, 4), select = new CoreWire(t, 2, 5),
-                               out = new CoreWire(t, 4, 1);
-               ReadWriteEnd selectIn = select.createReadWriteEnd();
-
-               selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
-               a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
-               c.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
-
-               new CoreMux(t, 1, out.createReadWriteEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(),
-                               c.createReadOnlyEnd());
-               t.executeAll();
-
-               assertBitArrayEquals(out.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
-               selectIn.feedSignals(Bit.ONE, Bit.ZERO);
-               t.executeAll();
-
-               assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
-
-               selectIn.feedSignals(Bit.ONE, Bit.ONE);
-               t.executeAll();
-
-               assertBitArrayEquals(out.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
-
-       }
-
-       @Test
-       void demuxTest()
-       {
-               CoreWire a = new CoreWire(t, 4, 3), b = new CoreWire(t, 4, 6), c = new CoreWire(t, 4, 4), select = new CoreWire(t, 2, 5),
-                               in = new CoreWire(t, 4, 1);
-               ReadWriteEnd selectIn = select.createReadWriteEnd();
-
-               selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
-               in.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
-
-               new CoreDemux(t, 1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(),
-                               c.createReadWriteEnd());
-               t.executeAll();
-
-               assertBitArrayEquals(a.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
-               assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
-               assertBitArrayEquals(c.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
-               selectIn.feedSignals(Bit.ONE, Bit.ZERO);
-               t.executeAll();
-
-               assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
-               assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
-               assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
-
-               selectIn.feedSignals(Bit.ONE, Bit.ONE);
-               t.executeAll();
-
-               assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
-               assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
-               assertBitArrayEquals(c.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
-
-       }
-
-       @Test
-       void andTest()
-       {
-               CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1);
-               new CoreAndGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
-               a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
-               b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
-
-               t.executeAll();
-
-               assertBitArrayEquals(c.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ZERO);
-       }
-
-       @Test
-       void orTest()
-       {
-               CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1);
-               new CoreOrGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
-               a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
-               b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
-
-               t.executeAll();
-
-               assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ONE);
-       }
-
-       @Test
-       void nandTest()
-       {
-               CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1), d = new CoreWire(t, 4, 1);
-               new CoreNandGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
-               a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
-               b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
-               c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
-
-               t.executeAll();
-
-               assertBitArrayEquals(d.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ONE);
-       }
-
-       @Test
-       void norTest()
-       {
-               CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1), d = new CoreWire(t, 4, 1);
-               new CoreNorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
-               a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
-               b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
-               c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
-
-               t.executeAll();
-
-               assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ZERO, Bit.ONE, Bit.ZERO);
-       }
-
-       @Test
-       void xorTest()
-       {
-               CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 2), c = new CoreWire(t, 3, 1), d = new CoreWire(t, 3, 1);
-               new CoreXorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
-               a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
-               b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
-               c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
-
-               t.executeAll();
-
-               assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE);
-       }
-
-       @Test
-       void notTest()
-       {
-               CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 2);
-               new CoreNotGate(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd());
-               a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
-
-               t.executeAll();
-
-               assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO, Bit.ZERO);
-       }
-
-       @Test
-       void rsLatchCircuitTest()
-       {
-               CoreWire r = new CoreWire(t, 1, 1), s = new CoreWire(t, 1, 1), t1 = new CoreWire(t, 1, 15), t2 = new CoreWire(t, 1, 1),
-                               q = new CoreWire(t, 1, 1), nq = new CoreWire(t, 1, 1);
-
-               new CoreOrGate(t, 1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
-               new CoreOrGate(t, 1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
-               new CoreNotGate(t, 1, t2.createReadOnlyEnd(), q.createReadWriteEnd());
-               new CoreNotGate(t, 1, t1.createReadOnlyEnd(), nq.createReadWriteEnd());
-
-               ReadWriteEnd sIn = s.createReadWriteEnd(), rIn = r.createReadWriteEnd();
-
-               sIn.feedSignals(Bit.ONE);
-               rIn.feedSignals(Bit.ZERO);
-
-               t.executeAll();
-
-               assertEquals(Bit.ONE, q.getValue());
-               assertEquals(Bit.ZERO, nq.getValue());
-
-               sIn.feedSignals(Bit.ZERO);
-
-               t.executeAll();
-               assertEquals(Bit.ONE, q.getValue());
-               assertEquals(Bit.ZERO, nq.getValue());
-
-               rIn.feedSignals(Bit.ONE);
-
-               t.executeAll();
-
-               assertEquals(Bit.ZERO, q.getValue());
-               assertEquals(Bit.ONE, nq.getValue());
-       }
-
-       @Test
-       void numericValueTest()
-       {
-               CoreWire a = new CoreWire(t, 4, 1);
-               a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ONE);
-
-               t.executeAll();
-
-               assertEquals(11, a.getValues().getUnsignedValueLong());
-               assertEquals(-5, a.getValues().getSignedValueLong());
-       }
-
-       boolean flag = false;
-
-       @Test
-       void simpleTimelineTest()
-       {
-               Timeline t = new Timeline(3);
-               flag = false;
-               t.addEvent((e) ->
-               {
-                       if (!flag)
-                               fail("Events executed out of order!");
-                       flag = false;
-               }, 15);
-               t.addEvent((e) ->
-               {
-                       if (flag)
-                               fail("Events executed out of order!");
-                       flag = true;
-               }, 10);
-               t.addEvent((e) ->
-               {
-                       if (flag)
-                               fail("Events executed out of order!");
-                       flag = true;
-               }, 20);
-               t.addEvent((e) ->
-               {
-                       fail("Only supposed to execute until timestamp 20, not 25");
-               }, 25);
-
-               t.executeUntil(t.laterThan(20), 100);
-
-               if (!flag)
-                       fail("Not all events were executed in order!");
-       }
-
-       // TODO: Adapt this test, now that update notifications are issued whenever any input to a wire changes
-       @Disabled("Out of date")
-       @Test
-       void multipleInputs()
-       {
-               CoreWire w = new CoreWire(t, 2, 1);
-               ReadWriteEnd wI1 = w.createReadWriteEnd(), wI2 = w.createReadWriteEnd();
-               wI1.feedSignals(Bit.ONE, Bit.Z);
-               wI2.feedSignals(Bit.Z, Bit.X);
-               t.executeAll();
-               assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.X);
-
-               wI2.feedSignals(Bit.ZERO, Bit.Z);
-               t.executeAll();
-               assertBitArrayEquals(w.getValues(), Bit.X, Bit.Z);
-
-               wI2.feedSignals(Bit.Z, Bit.Z);
-               t.executeAll();
-               assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
-
-               wI2.feedSignals(Bit.ONE, Bit.Z);
-               ReadEnd rE = w.createReadOnlyEnd();
-               rE.registerObserver((i) -> fail("WireEnd notified observer, although value did not change."));
-               t.executeAll();
-               rE.close();
-               wI1.feedSignals(Bit.X, Bit.X);
-               t.executeAll();
-               wI1.registerObserver((i) -> fail("WireEnd notified observer, although it was closed."));
-               wI1.close();
-               assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
-       }
-
-       private static void assertBitArrayEquals(BitVector actual, Bit... expected)
-       {
-               assertArrayEquals(expected, actual.getBits());
-       }
-}
diff --git a/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/GUITest.java b/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/GUITest.java
deleted file mode 100644 (file)
index a3689a3..0000000
+++ /dev/null
@@ -1,302 +0,0 @@
-package net.mograsim.logic.core.tests;
-
-import java.awt.Color;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Rectangle;
-import java.awt.RenderingHints;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import javax.swing.JFrame;
-import javax.swing.JPanel;
-import javax.swing.WindowConstants;
-
-import net.mograsim.logic.core.components.CoreManualSwitch;
-import net.mograsim.logic.core.components.gates.CoreNotGate;
-import net.mograsim.logic.core.components.gates.CoreOrGate;
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.timeline.Timeline.ExecutionResult;
-import net.mograsim.logic.core.wires.CoreWire;
-
-public class GUITest extends JPanel
-{
-
-       private static final long serialVersionUID = 1L;
-
-       private static final int WIRE_DELAY = 40;
-       private static final int OR_DELAY = 100;
-       private static final int NOT_DELAY = 100;
-
-       private Timeline t = new Timeline(11);
-
-       CoreWire r = new CoreWire(t, 1, WIRE_DELAY);
-       CoreWire s = new CoreWire(t, 1, WIRE_DELAY);
-       CoreWire t1 = new CoreWire(t, 1, WIRE_DELAY);
-       CoreWire t2 = new CoreWire(t, 1, WIRE_DELAY);
-       CoreWire q = new CoreWire(t, 1, WIRE_DELAY);
-       CoreWire nq = new CoreWire(t, 1, WIRE_DELAY);
-
-       CoreManualSwitch rIn = new CoreManualSwitch(t, r.createReadWriteEnd());
-       CoreManualSwitch sIn = new CoreManualSwitch(t, s.createReadWriteEnd());
-
-       CoreOrGate or1 = new CoreOrGate(t, OR_DELAY, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
-       CoreOrGate or2 = new CoreOrGate(t, OR_DELAY, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
-       CoreNotGate not1 = new CoreNotGate(t, NOT_DELAY, t2.createReadOnlyEnd(), q.createReadWriteEnd());
-       CoreNotGate not2 = new CoreNotGate(t, NOT_DELAY, t1.createReadOnlyEnd(), nq.createReadWriteEnd());
-
-       Map<CoreManualSwitch, Rectangle> switchMap = new HashMap<>();
-
-       int height;
-       int width;
-       boolean sizeChanged;
-
-       public GUITest()
-       {
-               addMouseListener(new MouseListener()
-               {
-
-                       @Override
-                       public void mouseReleased(MouseEvent e)
-                       {
-                               for (Entry<CoreManualSwitch, Rectangle> dim : switchMap.entrySet())
-                               {
-                                       if (dim.getValue().contains(e.getPoint()))
-                                       {
-                                               dim.getKey().switchFullOff();
-                                               repaint();
-                                       }
-                               }
-                       }
-
-                       @Override
-                       public void mousePressed(MouseEvent e)
-                       {
-                               for (Entry<CoreManualSwitch, Rectangle> dim : switchMap.entrySet())
-                               {
-                                       if (dim.getValue().contains(e.getPoint()))
-                                       {
-                                               dim.getKey().switchFullOn();
-                                               repaint();
-                                       }
-                               }
-                       }
-
-                       @Override
-                       public void mouseExited(MouseEvent e)
-                       {
-                               // none
-                       }
-
-                       @Override
-                       public void mouseEntered(MouseEvent e)
-                       {
-                               // none
-                       }
-
-                       @Override
-                       public void mouseClicked(MouseEvent e)
-                       {
-                               // If you want toggle buttons, use this code instead
-//                             for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet()) {
-//                                     if (dim.getValue().contains(e.getPoint())) {
-//                                             dim.getKey().toggle();
-//                                             repaint();
-//                                     }
-//                             }
-                       }
-               });
-       }
-
-       public Timeline getTimeline()
-       {
-               return t;
-       }
-
-       @Override
-       public void paint(Graphics some_g)
-       {
-               super.paint(some_g);
-               Graphics2D g = ((Graphics2D) some_g);
-               g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
-               g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-               g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
-
-               checkSizeChange();
-               adaptFont(g);
-
-               drawWire(g, r, "r", 2, 9, 4, 9);
-
-               drawWire(g, s, "s", 2, 3, 4, 3);
-
-               drawWire(g, t2, "t2", 5, 8.5, 6, 8.5);
-
-               drawWire(g, t1, "t1", 5, 3.5, 6, 3.5);
-
-               drawWire(g, q, "q", 7, 8.5, 9, 8.5);
-
-               drawWire(g, nq, "nq", 7, 3.5, 9, 3.5);
-
-               drawWire(g, q, "", 7.5, 8.5, 7.5, 7.5);
-               drawWire(g, q, "", 7.5, 7.5, 3, 4.5);
-               drawWire(g, q, "", 3, 4.5, 3, 4);
-               drawWire(g, q, "q", 3, 4, 4, 4);
-
-               drawWire(g, nq, "", 7.5, 3.5, 7.5, 4.5);
-               drawWire(g, nq, "", 7.5, 4.5, 3, 7.5);
-               drawWire(g, nq, "", 3, 7.5, 3, 8);
-               drawWire(g, nq, "nq", 3, 8, 4, 8);
-
-               drawSquare(g, 4, 8, "OR");
-               drawSquare(g, 4, 3, "OR");
-
-               drawSquare(g, 6, 8, "NOT");
-               drawSquare(g, 6, 3, "NOT");
-
-               drawSwitch(g, rIn, "Switch R", 0.5, 8.25, 2, 9.75);
-               drawSwitch(g, sIn, "Switch S", 0.5, 2.25, 2, 3.75);
-
-               drawString(g, "Hint: drag the cursor out of the pressed switch to keep it's state", 5, 0, 0.0, 1.0);
-       }
-
-       private void checkSizeChange()
-       {
-               sizeChanged = height != getHeight() || width != getWidth();
-               if (sizeChanged)
-               {
-                       height = getHeight();
-                       width = getWidth();
-               }
-       }
-
-       private void adaptFont(Graphics g)
-       {
-               g.setFont(g.getFont().deriveFont(Math.min(height, width) / 40f));
-       }
-
-       @SuppressWarnings("static-method")
-       private void drawString(Graphics g, String s, int x, int y, double anchorX, double anchorY)
-       {
-               int h = g.getFontMetrics().getAscent();
-               int w = g.getFontMetrics().stringWidth(s);
-               g.drawString(s, x - (int) (w * anchorX), y + (int) (h * anchorY));
-       }
-
-       private void drawWire(Graphics g, CoreWire wa, String name, double x1, double y1, double x2, double y2)
-       {
-               setTo(g, wa);
-               g.drawLine(gX(x1), gY(y1), gX(x2), gY(y2));
-               drawString(g, name, (gX(x1) + gX(x2)) / 2, (gY(y1) + gY(y2)) / 2 - 5, 0, 0);
-       }
-
-       private void drawSquare(Graphics g, int posX, int posY, String text)
-       {
-               int x1 = gX(posX) - 5;
-               int x2 = gX(posX + 1) + 5;
-               int y1 = gY(posY) - 5;
-               int y2 = gY(posY + 1) + 5;
-
-               g.setColor(Color.WHITE);
-               g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
-               setBlack(g);
-               g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
-               drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5);
-
-       }
-
-       private void drawSwitch(Graphics g, CoreManualSwitch ms, String text, double posX1, double posY1, double posX2, double posY2)
-       {
-               int x1 = gX(posX1) - 5;
-               int x2 = gX(posX2) + 5;
-               int y1 = gY(posY1) - 5;
-               int y2 = gY(posY2) + 5;
-
-               if (sizeChanged)
-               {
-                       Rectangle r = new Rectangle(x1, y1, x2 - x1, y2 - y1);
-                       switchMap.put(ms, r);
-               }
-
-               g.setColor(ms.isFullOn() ? Color.getHSBColor(.3f, .5f, 1f) : Color.WHITE);
-               g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
-               setBlack(g);
-               g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
-               drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5);
-       }
-
-       private static void setBlack(Graphics g)
-       {
-               g.setColor(Color.BLACK);
-       }
-
-       private static void setTo(Graphics g, CoreWire wa)
-       {
-               switch (wa.getValue())
-               {
-               case ONE:
-                       g.setColor(Color.GREEN);
-                       break;
-               case X:
-                       g.setColor(Color.RED);
-                       break;
-               case Z:
-                       g.setColor(Color.DARK_GRAY);
-                       break;
-               case ZERO:
-                       g.setColor(Color.BLACK);
-                       break;
-               case U:
-                       g.setColor(Color.MAGENTA);
-                       break;
-               default:
-                       throw new IllegalArgumentException();
-               }
-       }
-
-       private int gY(double pos)
-       {
-               return (int) (pos * height / 11);
-       }
-
-       private int gX(double pos)
-       {
-               return (int) (pos * width / 11) + 50;
-       }
-
-       public static void main(String[] args)
-       {
-               JFrame f = new JFrame("Test circuit 1.0.0");
-               GUITest gt = new GUITest();
-               f.add(gt);
-               f.setSize(800, 600);
-               f.setLocation(500, 400);
-               f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
-               f.setVisible(true);
-
-               long begin = System.currentTimeMillis();
-
-               long lastFrame = begin;
-               long updateT = 16;
-
-               while (f.isVisible())
-               {
-                       ExecutionResult er = gt.getTimeline().executeUntil(gt.getTimeline().laterThan((lastFrame - begin) * 3), lastFrame + 14);
-//                             if (t.hasNext()) 
-//                             t.executeNext();
-                       if (er != ExecutionResult.NOTHING_DONE)
-                               gt.repaint(12);
-                       try
-                       {
-                               Thread.sleep(Math.max(updateT - System.currentTimeMillis() + lastFrame, 0));
-                       }
-                       catch (Exception e)
-                       {
-                               e.printStackTrace();
-                       }
-                       lastFrame = System.currentTimeMillis();
-               }
-       }
-}
diff --git a/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/TestCoreBitDisplay.java b/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/TestCoreBitDisplay.java
deleted file mode 100644 (file)
index 5056345..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-package net.mograsim.logic.core.tests;
-
-import static org.junit.jupiter.api.Assertions.assertArrayEquals;
-
-import java.util.function.LongConsumer;
-
-import net.mograsim.logic.core.components.CoreBitDisplay;
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.timeline.TimelineEventHandler;
-import net.mograsim.logic.core.types.Bit;
-import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
-
-public final class TestCoreBitDisplay extends CoreBitDisplay
-{
-
-       public TestCoreBitDisplay(Timeline timeline, ReadEnd in)
-       {
-               super(timeline, in);
-       }
-
-       public void assertDisplays(Bit... expected)
-       {
-               assertArrayEquals(expected, getDisplayedValue().getBits());
-       }
-
-       public void assertAfterSimulationIs(Bit... expected)
-       {
-               timeline.executeAll();
-               assertDisplays(expected);
-       }
-
-       public void assertAfterSimulationIs(LongConsumer r, Bit... expected)
-       {
-               while (timeline.hasNext())
-               {
-                       timeline.executeNext();
-                       r.accept(timeline.getSimulationTime());
-               }
-               assertDisplays(expected);
-       }
-
-       @Override
-       protected TimelineEventHandler compute()
-       {
-               TimelineEventHandler handler = super.compute();
-               return e ->
-               {
-                       handler.handle(e);
-                       System.out.println("update: value is " + getDisplayedValue());
-               };
-       }
-}
diff --git a/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/types/BitVectorTest.java b/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/types/BitVectorTest.java
deleted file mode 100644 (file)
index 2b46a6c..0000000
+++ /dev/null
@@ -1,289 +0,0 @@
-package net.mograsim.logic.core.types;
-
-import static net.mograsim.logic.core.types.BitVector.*;
-import static net.mograsim.logic.core.types.Bit.*;
-import static org.junit.jupiter.api.Assertions.*;
-
-import java.math.BigInteger;
-import java.util.Iterator;
-
-import org.junit.jupiter.api.Test;
-
-class BitVectorTest
-{
-
-       @Test
-       void testOfBitArray()
-       {
-               BitVector.of(); // should be allowed and work
-
-               assertSame(SINGLE_U, BitVector.of(U));
-               assertSame(SINGLE_X, BitVector.of(X));
-               assertSame(SINGLE_0, BitVector.of(ZERO));
-               assertSame(SINGLE_1, BitVector.of(ONE));
-               assertSame(SINGLE_Z, BitVector.of(Z));
-       }
-
-       @Test
-       void testOfBitInt()
-       {
-               assertEquals(BitVector.of(), BitVector.of(ONE, 0));
-
-               assertSame(SINGLE_U, BitVector.of(U, 1));
-               assertSame(SINGLE_X, BitVector.of(X, 1));
-               assertSame(SINGLE_0, BitVector.of(ZERO, 1));
-               assertSame(SINGLE_1, BitVector.of(ONE, 1));
-               assertSame(SINGLE_Z, BitVector.of(Z, 1));
-
-               assertEquals(BitVector.of(X, X, X), BitVector.of(X, 3));
-       }
-
-       @Test
-       void testGetUnsignedValue()
-       {
-               assertEquals(BigInteger.valueOf(0b101), BitVector.parse("101").getUnsignedValue());
-               assertEquals(BigInteger.valueOf(0b01010), BitVector.parse("01010").getUnsignedValue());
-               assertEquals(BigInteger.valueOf(0), BitVector.parse("0000").getUnsignedValue());
-               assertEquals(BigInteger.valueOf(0b0000000101), BitVector.parse("0000000101").getUnsignedValue());
-               assertEquals(BigInteger.valueOf(0b1010000000), BitVector.parse("1010000000").getUnsignedValue());
-
-               assertThrows(NumberFormatException.class, () -> BitVector.parse("00X1").getUnsignedValue());
-       }
-
-       @Test
-       void testOfLongInt()
-       {
-               assertEquals(BitVector.parse("101"), BitVector.from(0b101L, 3));
-               assertEquals(BitVector.parse("01010"), BitVector.from(0b01010L, 5));
-               assertEquals(BitVector.parse("10101"), BitVector.from(-11L, 5));
-               assertEquals(BitVector.parse("0000"), BitVector.from(0L, 4));
-       }
-
-       @Test
-       void testOfBigIntegerInt()
-       {
-               assertEquals(BitVector.parse("101"), BitVector.from(BigInteger.valueOf(0b101), 3));
-               assertEquals(BitVector.parse("01010"), BitVector.from(BigInteger.valueOf(0b01010), 5));
-               assertEquals(BitVector.parse("10101"), BitVector.from(BigInteger.valueOf(-11), 5));
-               assertEquals(BitVector.parse("0000"), BitVector.from(BigInteger.valueOf(0), 4));
-       }
-
-       @Test
-       void testMutator()
-       {
-               var bv = BitVector.SINGLE_1;
-               var bvm = bv.mutator();
-
-               assertFalse(bvm.isEmpty());
-               assertEquals(ONE, bvm.getLSBit(0));
-               assertEquals(SINGLE_1, bvm.toBitVector());
-       }
-
-       @Test
-       void testGetMSBit()
-       {
-               assertEquals(ONE, SINGLE_1.getMSBit(0));
-               assertEquals(ONE, BitVector.of(ONE, X, X, X).getMSBit(0));
-               assertEquals(ONE, BitVector.of(X, X, X, X, ONE, X).getMSBit(4));
-       }
-
-       @Test
-       void testGetLSBit()
-       {
-               assertEquals(ONE, SINGLE_1.getLSBit(0));
-               assertEquals(ONE, BitVector.of(X, X, X, ONE).getLSBit(0));
-               assertEquals(ONE, BitVector.of(X, X, X, X, ONE, X).getLSBit(1));
-       }
-
-       @Test
-       void testGetBits()
-       {
-               assertArrayEquals(new Bit[] { X, ONE, Z }, BitVector.of(X, ONE, Z).getBits());
-               assertArrayEquals(new Bit[] { X, ONE, Z }, BitVector.parse("X1Z").getBits());
-       }
-
-       @Test
-       void testIsBinary()
-       {
-               assertTrue(SINGLE_0.isBinary());
-               assertTrue(SINGLE_1.isBinary());
-
-               assertFalse(SINGLE_U.isBinary());
-               assertFalse(SINGLE_X.isBinary());
-               assertFalse(SINGLE_Z.isBinary());
-
-               assertTrue(BitVector.of(ONE, ZERO, ONE, ONE, ZERO).isBinary());
-               assertFalse(BitVector.of(ONE, ZERO, ZERO, X).isBinary());
-       }
-
-       @Test
-       void testJoin()
-       {
-               // binary
-               assertEquals(SINGLE_0, SINGLE_0.join(SINGLE_0));
-               assertEquals(SINGLE_X, SINGLE_0.join(SINGLE_1));
-               assertEquals(SINGLE_1, SINGLE_1.join(SINGLE_1));
-
-               // other
-               assertEquals(SINGLE_1, SINGLE_Z.join(SINGLE_1));
-               assertEquals(SINGLE_U, SINGLE_0.join(SINGLE_U));
-               assertEquals(SINGLE_X, SINGLE_X.join(SINGLE_Z));
-
-               // higher length
-               var result = BitVector.of(U, X, ZERO, ONE, Z).join(BitVector.of(ONE, ZERO, ZERO, ONE, Z));
-               assertEquals(BitVector.of(U, X, ZERO, ONE, Z), result);
-       }
-
-       @Test
-       void testAnd()
-       {
-               // binary
-               assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_0));
-               assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_1));
-               assertEquals(SINGLE_1, SINGLE_1.and(SINGLE_1));
-
-               // other
-               assertEquals(SINGLE_X, SINGLE_Z.and(SINGLE_1));
-               assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_U));
-               assertEquals(SINGLE_X, SINGLE_X.and(SINGLE_Z));
-
-               // higher length
-               var result = BitVector.of(U, X, ZERO, ONE, ONE).and(BitVector.of(ONE, ONE, ZERO, ZERO, ONE));
-               assertEquals(BitVector.of(U, X, ZERO, ZERO, ONE), result);
-       }
-
-       @Test
-       void testOr()
-       {
-               // binary
-               assertEquals(SINGLE_0, SINGLE_0.or(SINGLE_0));
-               assertEquals(SINGLE_1, SINGLE_0.or(SINGLE_1));
-               assertEquals(SINGLE_1, SINGLE_1.or(SINGLE_1));
-
-               // other
-               assertEquals(SINGLE_1, SINGLE_Z.or(SINGLE_1));
-               assertEquals(SINGLE_1, SINGLE_1.or(SINGLE_U));
-               assertEquals(SINGLE_X, SINGLE_X.or(SINGLE_Z));
-
-               // higher length
-               var result = BitVector.of(U, X, ZERO, ONE, ZERO).or(BitVector.of(ZERO, ZERO, ZERO, ONE, ONE));
-               assertEquals(BitVector.of(U, X, ZERO, ONE, ONE), result);
-       }
-
-       @Test
-       void testXor()
-       {
-               // binary
-               assertEquals(SINGLE_0, SINGLE_0.xor(SINGLE_0));
-               assertEquals(SINGLE_1, SINGLE_0.xor(SINGLE_1));
-               assertEquals(SINGLE_0, SINGLE_1.xor(SINGLE_1));
-
-               // other
-               assertEquals(SINGLE_X, SINGLE_Z.xor(SINGLE_1));
-               assertEquals(SINGLE_U, SINGLE_0.xor(SINGLE_U));
-               assertEquals(SINGLE_X, SINGLE_X.xor(SINGLE_Z));
-
-               // higher length
-               var result = BitVector.of(U, X, ZERO, ONE, ONE).xor(BitVector.of(ONE, ZERO, ZERO, ZERO, ONE));
-               assertEquals(BitVector.of(U, X, ZERO, ONE, ZERO), result);
-       }
-
-       @Test
-       void testNot()
-       {
-               // binary
-               assertEquals(SINGLE_1, SINGLE_0.not());
-               assertEquals(SINGLE_0, SINGLE_1.not());
-
-               // other
-               assertEquals(SINGLE_U, SINGLE_U.not());
-               assertEquals(SINGLE_X, SINGLE_X.not());
-               assertEquals(SINGLE_X, SINGLE_Z.not());
-
-               // higher length
-               var result = BitVector.of(U, X, ZERO, ONE, Z).not();
-               assertEquals(BitVector.of(U, X, ONE, ZERO, X), result);
-       }
-
-       @Test
-       void testLength()
-       {
-               assertEquals(0, BitVector.of().length());
-               assertEquals(1, SINGLE_0.length());
-               assertEquals(3, BitVector.of(X, X, Z).length());
-       }
-
-       @Test
-       void testConcat()
-       {
-               assertEquals(BitVector.of(U, X), SINGLE_U.concat(SINGLE_X));
-               assertEquals(BitVector.of(Z, X, U, ONE, X), BitVector.of(Z, X, U).concat(BitVector.of(ONE, X)));
-       }
-
-       @Test
-       void testSubVectorInt()
-       {
-               assertEquals(SINGLE_0, SINGLE_0.subVector(0));
-               assertEquals(BitVector.of(), SINGLE_0.subVector(1));
-               assertEquals(SINGLE_0, BitVector.of(ONE, ZERO).subVector(1));
-               assertEquals(BitVector.of(X, Z), BitVector.of(ZERO, U, ONE, X, Z).subVector(3));
-       }
-
-       @Test
-       void testSubVectorIntInt()
-       {
-               assertEquals(SINGLE_0, SINGLE_0.subVector(0, 1));
-               assertEquals(BitVector.of(), SINGLE_0.subVector(0, 0));
-               assertEquals(SINGLE_0, BitVector.of(ONE, ZERO).subVector(1, 2));
-               assertEquals(BitVector.of(ONE, X), BitVector.of(ZERO, U, ONE, X, Z).subVector(2, 4));
-       }
-
-       @Test
-       void testEqualsObject()
-       {
-               assertEquals(SINGLE_X, SINGLE_X);
-               assertNotEquals(SINGLE_0, SINGLE_1);
-
-               assertEquals(BitVector.of(X, Z, U), BitVector.of(X, Z, U));
-               assertNotEquals(BitVector.of(X, Z, U), BitVector.of(X, X, U));
-       }
-
-       @Test
-       void testEqualsWithOffset()
-       {
-               assertTrue(SINGLE_X.equalsWithOffset(SINGLE_X, 0));
-               assertFalse(SINGLE_0.equalsWithOffset(SINGLE_1, 0));
-
-               assertTrue(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(Z, U), 1));
-               assertFalse(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(X, U), 1));
-               assertTrue(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(U), 2));
-       }
-
-       @Test
-       void testParse()
-       {
-               assertEquals(SINGLE_U, BitVector.parse("U"));
-               assertEquals(SINGLE_X, BitVector.parse("X"));
-               assertEquals(SINGLE_0, BitVector.parse("0"));
-               assertEquals(SINGLE_1, BitVector.parse("1"));
-               assertEquals(SINGLE_Z, BitVector.parse("Z"));
-
-               assertEquals(BitVector.of(X, U, Z, ONE, ZERO), BitVector.parse("XUZ10"));
-
-               assertThrows(RuntimeException.class, () -> BitVector.parse("01BX"));
-       }
-
-       @Test
-       void testIterator()
-       {
-               var bv = BitVector.of(U, Z, ONE, ZERO, X);
-               Iterator<Bit> it = bv.iterator();
-
-               assertEquals(U, it.next());
-               assertEquals(Z, it.next());
-               assertEquals(ONE, it.next());
-               assertEquals(ZERO, it.next());
-               assertEquals(X, it.next());
-               assertFalse(it.hasNext());
-       }
-}