New inner-project dependency management - commit for logicui
authorDaniel Kirschten <daniel.kirschten@gmx.de>
Tue, 14 May 2019 13:27:07 +0000 (15:27 +0200)
committerDaniel Kirschten <daniel.kirschten@gmx.de>
Tue, 14 May 2019 13:27:07 +0000 (15:27 +0200)
33 files changed:
.gitignore [deleted file]
.gitmodules [deleted file]
REQUIREMENTS.MD [deleted file]
SWTHelper [deleted submodule]
era.mi/.classpath [deleted file]
era.mi/.gitignore [deleted file]
era.mi/.project [deleted file]
era.mi/.settings/org.eclipse.jdt.core.prefs [deleted file]
era.mi/src/era/mi/logic/Bit.java [deleted file]
era.mi/src/era/mi/logic/Simulation.java [deleted file]
era.mi/src/era/mi/logic/Util.java [deleted file]
era.mi/src/era/mi/logic/components/BasicComponent.java [deleted file]
era.mi/src/era/mi/logic/components/BitDisplay.java [deleted file]
era.mi/src/era/mi/logic/components/Clock.java [deleted file]
era.mi/src/era/mi/logic/components/Component.java [deleted file]
era.mi/src/era/mi/logic/components/Demux.java [deleted file]
era.mi/src/era/mi/logic/components/Merger.java [deleted file]
era.mi/src/era/mi/logic/components/Mux.java [deleted file]
era.mi/src/era/mi/logic/components/Splitter.java [deleted file]
era.mi/src/era/mi/logic/components/TriStateBuffer.java [deleted file]
era.mi/src/era/mi/logic/components/gates/AndGate.java [deleted file]
era.mi/src/era/mi/logic/components/gates/MultiInputGate.java [deleted file]
era.mi/src/era/mi/logic/components/gates/NotGate.java [deleted file]
era.mi/src/era/mi/logic/components/gates/OrGate.java [deleted file]
era.mi/src/era/mi/logic/components/gates/XorGate.java [deleted file]
era.mi/src/era/mi/logic/tests/ComponentTest.java [deleted file]
era.mi/src/era/mi/logic/tests/Connector.java [deleted file]
era.mi/src/era/mi/logic/tests/TestBitDisplay.java [deleted file]
era.mi/src/era/mi/logic/timeline/Timeline.java [deleted file]
era.mi/src/era/mi/logic/timeline/TimelineEvent.java [deleted file]
era.mi/src/era/mi/logic/timeline/TimelineEventHandler.java [deleted file]
era.mi/src/era/mi/logic/wires/WireArray.java [deleted file]
era.mi/src/era/mi/logic/wires/WireArrayObserver.java [deleted file]

diff --git a/.gitignore b/.gitignore
deleted file mode 100644 (file)
index c427aa7..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-era.mi/bin
-
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644 (file)
index 0839732..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "SWTHelper"]
-       path = SWTHelper
-       url = https://github.com/Haspamelodica/SWTHelper.git
diff --git a/REQUIREMENTS.MD b/REQUIREMENTS.MD
deleted file mode 100644 (file)
index 7a3d46d..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-# Rechnerarchitektur GP 2019
-#### Modularer Grafischer Schaltkreis Simulator (für die MI-Maschine)
-
-*Ihr könnt hier gerne nach belieben Dinge ändern, haltet euch nicht zurück^^*
-
-## Anforderungen
-
-### Pflichtfeatures
-1.  Emulation der MI-Maschine (siehe Am2900ME)
-2.  Visualisierung der MI-Maschine sehr ähnlich dem Bild der VL
-3.  sehr gute Website, Dokumentation, Hilfe aus dem Kontextmenü heraus
-4.  Hilfreiche Fehlermeldungen, Warnungen bei gefährlichen Operationen  
-    für uns/Entwickler: gutes Loggen, Absturzberichte
-5.  Immer hilfreiche Tooltips zu fast allem.
-    
-
-### Sollte möglich sein
-1.  Export der Ansicht
-2.  Sicht des Assemblerprogrammierers, spezifizieren einer ISA und Nutzung
-3.  Farben, Schriftgröße & Co. einstellbar (für Präsentation, Hell/Dunkel, Farbenblind/…)
-4.  Entwurf eines Schaltkreises mit einem Editor
-5.  Sprache ändern (für nicht Muttersprachler, internat. Potenzial, Erweiterungsmögl.)
-6.  Sehr einfache Installation (Eclipse Marketplace)
-7.  Editor sollte tooltip Einstellung erlauben
-8.  Rückgängig
-    
-
-### Wunschfeatures
-1.  Debuggen im Sinne von Breakpoints & Co.
-2.  interaktives Tutorial in der GUI
-3.  Zurückspulen der Simulation / Zeitleiste
-4.  Wiederherstellungspunkt (Status)
-
-### Weiterführende Ideen
-1.  x86 Modell
-2.  ARM Modell
-3.  Signalgraphen
-
-### Use Cases
-<details><summary><strong>Alle Use Cases anzeigen</strong></summary><p>
-
-#### 01. Installation
-Das Programm lässt sich entweder über den Eclipse Marketplace einfach installieren (oder als Eclipse Projekt) oder als eigenes Eclipse RPC Projekt direkt herunterladen (ggf. entpacken) und starten.<sup>[A]</sup> Das Programm / Plugin lässt sich auf Windows (7+), MacOS und Linux ausführen; alle verbreitete Hardware nach 2010 mit 64 Bit OS sollte funktionieren.<sup>[B]</sup> Es muss auf den Rechnern in den TUM Rechnerhallen funktionieren.<sup>[C]</sup>
-
-#### 02. Deinstallation
-Das Programm muss sich ohne nennenswerten Aufwand oder Kentnisse vom Benutzer rückstandslos entfernen lassen.<sup>[A]</sup>
-
-#### 03. Programmstart
-Das Programm bzw. Plugin startet schnell (unter 10 sec.; besser unter 5 sec).<sup>[A]</sup> Bei dem ersten Programmstart ist ein Willkommensfenster zu sehen, das auf erklärende Resourcen verweist, den Nutzer grüßt und ggf. auf die (Sprach-)Einstellungen hinweist.<sup>[B]</sup> Es wird bestenfalls auf ein Beispielprojekt verwiesen (kann erstellt werden?) um dem Nutzer zu ermöglichen, sich damit vertraut zu machen.<sup>[C]</sup> Ein schnell Link zum Erstellen eines neuen Projekts/Simulation/... wird angezeigt.<sup>[D]</sup>
-
-#### 04. Programmende
-Sollten bei Beenden des Programms oder Programmabsturz nicht persistierte Daten vorliegen, muss dafür gesorgt werden, dass diese nicht verloren gehen.<sup>[A]</sup> Enweder durch einen Dialog<sup>[B]</sup>, oder durch erzeugte Recovery-Dateien<sup>[C]</sup>. Bei Absturz des Programms wird eine passende und aufschlussreiche Fehlermeldung angezeigt, bestenfalls mit Link zu einer Report-Möglichkeit.<sup>[D]</sup>
-
-#### 05. Einstellungen
-Die Hauptextfarbe und Schriftgröße muss einstellbar sein<sup>[A]</sup>, besser noch Hintergrund- und Markierungsfarben und Schriftstil.<sup>[B]</sup> Die Einstellung der Sprache muss möglich sein.<sup>[C]</sup>
-
-#### 06. Einstieg
-Das Einstiegsprojekt zeigt zu Beginn die passende Ansicht an, die Mikroprogrammierung ist wie bei dem Am2900ME ungehindert möglich.<sup>[A]</sup> Bestenfalls ist dieses beim (erstmaligen) Start direkt geöffnet.<sup>[B]</sup> Wichtige Fenster (v.a. die grafische Darstellung) sind direkt sichtbar, oder zumindest in einem Tab geöffnet (müssen nicht gesucht werden).<sup>[C]</sup>
-
-#### 07. Nutzung der Visualisierung
-Die Visualisierung soll möglichst der Vorlesung entsprechen.<sup>[A]</sup> Sie lässt sich transformieren (z.B. Zoom mit dem Mausrad, Verschieben mit Mausklick oder Mausklick und Alt) und wieder zurücksetzen.<sup>[B]</sup>
-
-#### 08. Hilfestellung
-Mit dem Produkt wird eine offline-Dokumentation mitgeliefert. (bestenfalls DE und EN)<sup>[A]</sup> Mit Rechtsklick lässt sich über ein Kontextmenü der Teil der Dokumentation öffnen, der das angeklickte und seine Funktion beschreibt (Vorbild Cinema4D). Dies sollte mit fast allem möglich sein.<sup>[B]</sup> Bleibt man mit der Maus länger über einem GUI-Bestandteil, wird eine kurze Beschreibung/Hilfe dazu angezeigt (Tooltip).<sup>[C]</sup>
-
-#### 09. Dateihandhabung
-Die Dateien sollten möglichst menschenlesbar sein, z.B. in CSV-Format, um Kommunikation mit anderer Software und Änderungen durch den Nutzer zu ermöglichen.<sup>[A]</sup> Die Dateien enthalten eine Versionsnummer, um Abwärtskompatibilität und hilfreiche Fehlermeldungen zu ermöglichen.<sup>[B]</sup>
-
-#### 10. Entwicklerunterstützung
-Das Projekt soll sich einfach bauen/kompilieren/exportieren lassen, es muss beschrieben werden wie das möglich ist.<sup>[A]</sup> Die Verbreitung zur Anwendung soll ebenfalls unproblematisch sein.<sup>[B]</sup>
-
-#### Fügt hier eure eigenen dazu, fortlaufend nummeriert und ggf. mit <sup>[A,B,C,..]</sup> genauer spezifiziert.
-
-</p></details>
-
-### UML und Ähnliches
-#### Grobe Struktur
-![image](https://user-images.githubusercontent.com/11130248/57186855-aae24600-6ee6-11e9-88b4-371622d43adc.png)
-
-## Technologie-Stack
-*   Git (anscheinend über Gitlab)
-*   Eclipse RCP
-    -  (noch zu testen)
-*   Java
-    -   Version 8?
-    -   Version 10?
-    -   Version 12?
-*   Bibliotheken
-    -   JUnit 5.4.x ? AssertJ? [http://joel-costigliola.github.io/assertj/index.html](http://joel-costigliola.github.io/assertj/index.html)
-    - (Apache Commons?)
-    Sehr weit verbreitete und gut designte & getestete Lib;  
-    aber zusätzliche Dep.
-    - Sonstiges? Logging? Log4j
--   Automatischer Build mit Maven? Wohl eher nicht, wegen ERPC Build
-
-## Meilensteine
-
-## Außenwirkung
-### Name, Abkürzung
-### Signet, Logo
-### Beschreibung
-
-## Sonstiges
-### Nützliche Links
-- [https://wiki.eclipse.org/Rich_Client_Platform](https://wiki.eclipse.org/Rich_Client_Platform) -Links
-- [https://wiki.eclipse.org/User_Interface_Guidelines](https://wiki.eclipse.org/User_Interface_Guidelines) - etwas alt, aber nützlich
-- [https://download.eclipse.org/eclipse/downloads/](https://download.eclipse.org/eclipse/downloads/) - Eclipse Project
-- [https://www.vogella.com/tutorials/EclipseRCP/article.html](https://www.vogella.com/tutorials/EclipseRCP/article.html) - **Eclipse RPC Tutorial**
-- [https://github.com/eclipse/gef/wiki](https://github.com/eclipse/gef/wiki) - **Wiki für das Grafikframework**
-- [https://github.com/eclipse/MaisiKoleni/Am2900ME](https://github.com/eclipse/MaisiKoleni/Am2900ME) - der geistige Vorgänger
-- [https://github.com/Haspamelodica/Am2900ME_swt](https://github.com/Haspamelodica/Am2900ME_swt) -  ... auch mit SWT
-
-### Rechtliches
-<details><summary>
-MIT Lizenz? - https://choosealicense.com/licenses/mit/
-
-</summary><p>
-
->MIT License
->
->Copyright (c) 2019 Christian Femers, Daniel Kirschten, Fabian Stemmler
->
-> 
->
->Permission is hereby granted, free of charge, to any person obtaining a copy
->of this software and associated documentation files (the "Software"), to deal
->in the Software without restriction, including without limitation the rights
->to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
->copies of the Software, and to permit persons to whom the Software is
->furnished to do so, subject to the following conditions:
->
->The above copyright notice and this permission notice shall be included in all
->copies or substantial portions of the Software.
->
->THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
->IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
->FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
->AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
->LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
->OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
->SOFTWARE.
-
-</p></details>
-Muss ggf. Eclipse Public License verwendet werden wegen Copyleft?
diff --git a/SWTHelper b/SWTHelper
deleted file mode 160000 (submodule)
index 0275db1..0000000
--- a/SWTHelper
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 0275db10c78d3c3d98bf197eca5f29e4556ffb90
diff --git a/era.mi/.classpath b/era.mi/.classpath
deleted file mode 100644 (file)
index bc8d71b..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-       <classpathentry kind="src" path="src"/>
-       <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/5"/>
-       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-10">
-               <attributes>
-                       <attribute name="module" value="true"/>
-               </attributes>
-       </classpathentry>
-       <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/era.mi/.gitignore b/era.mi/.gitignore
deleted file mode 100644 (file)
index 72b65a8..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-*.class
-*.log
-
-# package files
-*.jar
-*.war
-*.nar
-*.ear
-*.zip
-*.tar.gz
-*.rar
-
-# vm crash logs
-hs_err_pid*
\ No newline at end of file
diff --git a/era.mi/.project b/era.mi/.project
deleted file mode 100644 (file)
index 9a89f37..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-       <name>era.mi</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/era.mi/.settings/org.eclipse.jdt.core.prefs b/era.mi/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644 (file)
index a54bb93..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=10
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=10
-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.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.release=enabled
-org.eclipse.jdt.core.compiler.source=10
diff --git a/era.mi/src/era/mi/logic/Bit.java b/era.mi/src/era/mi/logic/Bit.java
deleted file mode 100644 (file)
index 804ecc9..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-package era.mi.logic;
-
-import java.util.Arrays;
-
-public enum Bit
-{
-       ONE, ZERO, Z, X;
-
-       public static Bit and(Bit a, Bit b)
-       {
-               return a.and(b);
-       }
-
-       public Bit and(Bit other)
-       {
-               if (equals(Bit.ZERO) || other.equals(Bit.ZERO))
-                       return Bit.ZERO;
-               else if (equals(other) && equals(Bit.ONE))
-                       return Bit.ONE;
-               else
-                       return Bit.X;
-       }
-
-       public static Bit or(Bit a, Bit b)
-       {
-               return a.or(b);
-       }
-
-       public Bit or(Bit other)
-       {
-               if (equals(Bit.ONE) || other.equals(Bit.ONE))
-                       return Bit.ONE;
-               else if (equals(other) && equals(Bit.ZERO))
-                       return Bit.ZERO;
-               else
-                       return Bit.X;
-       }
-
-       public static Bit xor(Bit a, Bit b)
-       {
-               return a.xor(b);
-       }
-
-       public Bit xor(Bit other)
-       {
-               if(this == Bit.X || this == Bit.Z
-                               || other == Bit.X || other == Bit.Z)
-                       return Bit.X;
-               else
-                       return this == other ? Bit.ZERO : Bit.ONE;
-       }
-
-       public Bit not()
-       {
-               switch (this)
-                       {
-                       case ONE:
-                               return Bit.ZERO;
-                       case ZERO:
-                               return Bit.ONE;
-                       default:
-                               return Bit.X;
-                       }
-       }
-       
-       public Bit[] makeArray(int length)
-       {
-               Bit[] bits = new Bit[length];
-               Arrays.fill(bits, this);
-               return bits;
-       }
-
-       /**
-        * Rules for two bits that get directly connected<br>
-        * <code><table>
-        * <tbody>
-        * <tr><td><td>X<td>0<td>1<td>Z</tr>
-        * <tr><td>X<td>X<td>X<td>X<td>X</tr>
-        * <tr><td>0<td>X<td>0<td>X<td>0</tr>
-        * <tr><td>1<td>X<td>X<td>1<td>1</tr>
-        * <tr><td>Z<td>X<td>0<td>1<td>Z</tr>
-        * </tbody>
-        * </table><code>
-        * 
-        * @return the result according to the table
-        * 
-        * @author Christian Femers
-        */
-       public Bit combineWith(Bit other)
-       {
-               if (this == other)
-                       return this;
-               if (this == X || other == X)
-                       return X;
-               if (other == Z)
-                       return this;
-               if (this == Z)
-                       return other;
-               return X;
-       }
-
-       public static Bit combine(Bit a, Bit b)
-       {
-               return a.combineWith(b);
-       }
-}
diff --git a/era.mi/src/era/mi/logic/Simulation.java b/era.mi/src/era/mi/logic/Simulation.java
deleted file mode 100644 (file)
index 6a63e15..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-package era.mi.logic;
-
-import era.mi.logic.timeline.Timeline;
-
-public class Simulation
-{
-       public final static Timeline TIMELINE = new Timeline(11);
-       
-       public static void main(String[] args)
-       {
-       }
-}
\ No newline at end of file
diff --git a/era.mi/src/era/mi/logic/Util.java b/era.mi/src/era/mi/logic/Util.java
deleted file mode 100644 (file)
index 0cd4b82..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-package era.mi.logic;
-
-import java.util.Arrays;
-
-public final class Util
-{
-    
-    @SuppressWarnings("unchecked")
-    public static <T> T[] concat(T[]... arrays)
-    {
-       if (arrays.length == 0)
-           throw new IllegalArgumentException("Cannot concatenate 0 arrays.");
-
-       int length = 0;
-       for (T[] array : arrays)
-           length += array.length;
-
-       T[] newArray = Arrays.copyOf(arrays[0], length);
-       int appendIndex = arrays[0].length;
-       for (int i = 1; i < arrays.length; i++)
-       {
-           System.arraycopy(arrays[i], 0, newArray, appendIndex, arrays[i].length);
-           appendIndex += arrays[i].length;
-       }
-
-       return newArray;
-    }
-
-//     @SuppressWarnings("unchecked")
-//     public static <T> T[][] split(T[] array, int... lengths)
-//     {
-//             //TODO: implement array split again; This version contains an illegal cast
-//             int totalLength = 0;
-//             for(int length : lengths)
-//                     totalLength += length;
-//             
-//             if(totalLength != array.length)
-//                     throw new IllegalArgumentException(); //TODO: add proper error message
-//             
-//             Object[][] newArray = new Object[lengths.length][];
-//             int splitIndex = 0;
-//             for(int i = 0; i < lengths.length; i++)
-//             {
-//                     System.arraycopy(array, splitIndex, newArray, 0, lengths[i]);
-//                     splitIndex += lengths[i];
-//             }
-//             
-//             return (T[][]) newArray;
-//     }
-
-    public static Bit[] and(Bit[] a, Bit[] b)
-    {
-       return binBitOp(a, b, (bA, bB) -> Bit.and(bA, bB));
-    }
-
-    public static Bit[] or(Bit[] a, Bit[] b)
-    {
-       return binBitOp(a, b, (bA, bB) -> Bit.or(bA, bB));
-    }
-
-    public static Bit[] xor(Bit[] a, Bit[] b)
-    {
-       return binBitOp(a, b, (bA, bB) -> Bit.xor(bA, bB));
-    }
-
-    private static Bit[] binBitOp(Bit[] a, Bit[] b, BitOp op)
-    {
-       if (a.length != b.length)
-           throw new IllegalArgumentException("Bit Arrays were not of equal length.");
-       Bit[] out = new Bit[a.length];
-       for (int i = 0; i < a.length; i++)
-       {
-           out[i] = op.execute(a[i], b[i]);
-       }
-       return out;
-    }
-
-    public static Bit[] not(Bit[] a)
-    {
-       Bit[] out = new Bit[a.length];
-       for (int i = 0; i < a.length; i++)
-       {
-           out[i] = a[i].not();
-       }
-       return out;
-    }
-    
-    /**
-     * uses the {@link Bit#combineWith(Bit)} method, does not create a new array,
-     * the result is stored in the first array.
-     * 
-     * @author Christian Femers
-     */
-    public static Bit[] combineInto(Bit[] dest, Bit[] addition)
-    {
-    if (dest.length != addition.length)
-        throw new IllegalArgumentException("Bit Arrays were not of equal length.");
-    for (int i = 0; i < addition.length; i++) {
-           dest[i] = dest[i].combineWith(addition[i]);
-       }
-    return dest;
-    }
-
-    interface BitOp
-    {
-       Bit execute(Bit a, Bit b);
-    }
-}
diff --git a/era.mi/src/era/mi/logic/components/BasicComponent.java b/era.mi/src/era/mi/logic/components/BasicComponent.java
deleted file mode 100644 (file)
index 4e56c34..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-package era.mi.logic.components;
-
-import era.mi.logic.Bit;
-import era.mi.logic.Simulation;
-import era.mi.logic.wires.WireArray;
-import era.mi.logic.wires.WireArrayObserver;
-
-/**
- * A basic component that recomputes all outputs (with a delay), when it is updated.
- * @author Fabian Stemmler
- */
-public abstract class BasicComponent implements WireArrayObserver, Component
-{
-       private int processTime;
-       
-       /**
-        * 
-        * @param processTime Amount of time this component takes to update its outputs. Must be more than 0, otherwise 1 is assumed.
-        * 
-        * @author Fabian Stemmler
-        */
-       public BasicComponent(int processTime)
-       {
-               this.processTime = processTime > 0 ? processTime : 1;
-       }
-       
-       @Override
-       public void update(WireArray initiator, Bit[] oldValues)
-       {
-               Simulation.TIMELINE.addEvent((e) -> {compute();}, processTime);
-       }
-       
-       protected abstract void compute();
-}
diff --git a/era.mi/src/era/mi/logic/components/BitDisplay.java b/era.mi/src/era/mi/logic/components/BitDisplay.java
deleted file mode 100644 (file)
index 051010b..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-package era.mi.logic.components;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import era.mi.logic.Bit;
-import era.mi.logic.wires.WireArray;
-
-public class BitDisplay extends BasicComponent
-{
-       private final WireArray in;
-       private Bit[] displayedValue;
-
-       public BitDisplay(WireArray in)
-       {
-               super(1);
-               this.in = in;
-               in.addObserver(this);
-               compute();
-       }
-
-       @Override
-       protected void compute()
-       {
-               displayedValue = in.getValues();
-       }
-
-       public Bit[] getDisplayedValue()
-       {
-               return displayedValue;
-       }
-
-       public boolean isDisplaying(Bit... values)
-       {
-               return Arrays.equals(displayedValue, values);
-       }
-
-       @Override
-       public List<WireArray> getAllInputs()
-       {
-               return Collections.unmodifiableList(Arrays.asList(in));
-       }
-
-       @Override
-       public List<WireArray> getAllOutputs()
-       {
-               return Collections.unmodifiableList(new ArrayList<WireArray>());
-       }
-}
diff --git a/era.mi/src/era/mi/logic/components/Clock.java b/era.mi/src/era/mi/logic/components/Clock.java
deleted file mode 100644 (file)
index 5d3f7db..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-package era.mi.logic.components;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import era.mi.logic.Bit;
-import era.mi.logic.Simulation;
-import era.mi.logic.timeline.TimelineEvent;
-import era.mi.logic.timeline.TimelineEventHandler;
-import era.mi.logic.wires.WireArray;
-import era.mi.logic.wires.WireArray.WireArrayInput;
-
-public class Clock implements TimelineEventHandler, Component
-{
-       private boolean toggle = false;
-       private WireArrayInput outI;
-       private int delta;
-       
-       /**
-        * 
-        * @param out {@link WireArray} the clock's impulses are fed into
-        * @param delta ticks between rising and falling edge
-        */
-       public Clock(WireArray out, int delta)
-       {
-               this.delta = delta;
-               this.outI = out.createInput();
-               Simulation.TIMELINE.addEvent(this, 50);
-       }
-
-       @Override
-       public void handle(TimelineEvent e)
-       {
-               addToTimeline();
-               outI.feedSignals(new Bit[] { toggle ? Bit.ONE : Bit.ZERO });
-               toggle = !toggle;
-       }
-
-       public WireArray getOut()
-       {
-               return outI.owner;
-       }
-       
-       private void addToTimeline()
-       {
-               Simulation.TIMELINE.addEvent(this, delta);
-       }
-
-       @Override
-       public List<WireArray> getAllInputs()
-       {
-               return Collections.unmodifiableList(Arrays.asList());
-       }
-
-       @Override
-       public List<WireArray> getAllOutputs()
-       {
-               return Collections.unmodifiableList(Arrays.asList(outI.owner));
-       }
-}
diff --git a/era.mi/src/era/mi/logic/components/Component.java b/era.mi/src/era/mi/logic/components/Component.java
deleted file mode 100644 (file)
index 2d40cc2..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-package era.mi.logic.components;
-
-import java.util.List;
-
-import era.mi.logic.wires.WireArray;
-
-public interface Component
-{
-
-       /**
-        * Returns immutable list of all inputs to the {@link Component} (including e.g. the select bits to a MUX).
-        * Intended for visualization in the UI.
-        */
-       public List<WireArray> getAllInputs();
-       
-       /**
-        * Returns immutable list of all outputs to the {@link Component}.
-        * Intended for visualization in the UI.
-        */
-       public List<WireArray> getAllOutputs();
-}
diff --git a/era.mi/src/era/mi/logic/components/Demux.java b/era.mi/src/era/mi/logic/components/Demux.java
deleted file mode 100644 (file)
index e5f49f4..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-package era.mi.logic.components;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import era.mi.logic.wires.WireArray;
-import era.mi.logic.wires.WireArray.WireArrayInput;
-
-/**
- * Models a multiplexer. Takes an arbitrary amount of input {@link WireArray}s, one of which,
- * as determined by select, is put through to the output.
- * @author Fabian Stemmler
- *
- */
-public class Demux extends BasicComponent
-{
-       private final WireArray select, in;
-       private final WireArray[] outputs;
-       private final WireArrayInput[] outputsI;
-       private final int outputSize;
-       private int selected = -1;
-       
-       /**
-        * Input {@link WireArray}s and out must be of uniform length
-        * @param out Must be of uniform length with all inputs.
-        * @param select Indexes the input array which is to be mapped to the output. Must have enough bits
-        * to index all inputs.
-        * @param outputs One of these inputs is mapped to the output, depending on the select bits
-        */
-       public Demux(int processTime, WireArray in, WireArray select, WireArray... outputs)
-       {
-               super(processTime);
-               outputSize = in.length;
-               
-               this.in = in;
-               this.outputs = outputs;
-               this.outputsI = new WireArrayInput[outputs.length];
-               for(int i = 0; i < this.outputsI.length; i++)
-               {
-                       if(outputs[i].length != outputSize)
-                               throw new IllegalArgumentException("All DEMUX wire arrays must be of uniform length!");
-                       this.outputsI[i] = outputs[i].createInput();
-               }
-               
-               this.select = select;
-               select.addObserver(this);
-               
-               int maxInputs = 1 << select.length;
-               if(this.outputsI.length > maxInputs)
-                       throw new IllegalArgumentException("There are more outputs ("
-                                       + this.outputsI.length + ") to the DEMUX than supported by "
-                                       + select.length + " select bits (" + maxInputs + ").");
-               in.addObserver(this);
-       }
-
-       @Override
-       public void compute() {
-               int selectValue = select.hasNumericValue() ? (int) select.getUnsignedValue() : -1;
-               if(selectValue >= outputsI.length)
-                       selectValue = -1;
-               
-               if(selected != selectValue && selected != -1)
-                       outputsI[selected].clearSignals();
-               
-               selected = selectValue;
-               
-               if(selectValue != -1)
-                       outputsI[selectValue].feedSignals(in.getValues());
-       }
-
-       @Override
-       public List<WireArray> getAllInputs()
-       {
-               return Collections.unmodifiableList(Arrays.asList(in, select));
-       }
-
-       @Override
-       public List<WireArray> getAllOutputs()
-       {
-               return Collections.unmodifiableList(Arrays.asList(outputs));
-       }
-}
diff --git a/era.mi/src/era/mi/logic/components/Merger.java b/era.mi/src/era/mi/logic/components/Merger.java
deleted file mode 100644 (file)
index 591bfc1..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-package era.mi.logic.components;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import era.mi.logic.Bit;
-import era.mi.logic.wires.WireArray;
-import era.mi.logic.wires.WireArray.WireArrayInput;
-import era.mi.logic.wires.WireArrayObserver;
-
-public class Merger implements WireArrayObserver, Component
-{
-    private WireArrayInput outI;
-    private WireArray[] inputs;
-    private int[] beginningIndex;
-
-    /**
-     * 
-     * @param union  The output of merging n {@link WireArray}s into one. Must have
-     *               length = a1.length() + a2.length() + ... + an.length().
-     * @param inputs The inputs to be merged into the union
-     */
-    public Merger(WireArray union, WireArray... inputs)
-    {
-       this.inputs = inputs;
-       this.outI = union.createInput();
-       this.beginningIndex = new int[inputs.length];
-
-       int length = 0;
-       for (int i = 0; i < inputs.length; i++)
-       {
-           beginningIndex[i] = length;
-           length += inputs[i].length;
-           inputs[i].addObserver(this);
-       }
-
-       if (length != union.length)
-           throw new IllegalArgumentException(
-                   "The output of merging n WireArrays into one must have length = a1.length() + a2.length() + ... + an.length().");
-    }
-
-    public WireArray getInput(int index)
-    {
-       return inputs[index];
-    }
-
-    public WireArray getUnion()
-    {
-       return outI.owner;
-    }
-
-    @Override
-    public void update(WireArray initiator, Bit[] oldValues)
-    {
-       int index = find(initiator);
-       int beginning = beginningIndex[index];
-       outI.feedSignals(beginning, initiator.getValues());
-    }
-
-    private int find(WireArray w)
-    {
-       for (int i = 0; i < inputs.length; i++)
-           if (inputs[i] == w)
-               return i;
-       return -1;
-    }
-
-    public WireArray[] getInputs()
-    {
-       return inputs.clone();
-    }
-
-       @Override
-       public List<WireArray> getAllInputs()
-       {
-               return Collections.unmodifiableList(Arrays.asList(inputs));
-       }
-
-       @Override
-       public List<WireArray> getAllOutputs()
-       {
-               return Collections.unmodifiableList(Arrays.asList(outI.owner));
-       }
-}
diff --git a/era.mi/src/era/mi/logic/components/Mux.java b/era.mi/src/era/mi/logic/components/Mux.java
deleted file mode 100644 (file)
index 4e09f92..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-package era.mi.logic.components;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import era.mi.logic.wires.WireArray;
-import era.mi.logic.wires.WireArray.WireArrayInput;
-
-/**
- * Models a multiplexer. Takes an arbitrary amount of input {@link WireArray}s, one of which,
- * as determined by select, is put through to the output.
- * @author Fabian Stemmler
- *
- */
-public class Mux extends BasicComponent
-{
-       private WireArray select;
-       private WireArrayInput outI;
-       private WireArray[] inputs;
-       private final int outputSize;
-       /**
-        * Input {@link WireArray}s and out must be of uniform length
-        * @param out Must be of uniform length with all inputs.
-        * @param select Indexes the input array which is to be mapped to the output. Must have enough bits
-        * to index all inputs.
-        * @param inputs One of these inputs is mapped to the output, depending on the select bits
-        */
-       public Mux(int processTime, WireArray out, WireArray select, WireArray... inputs)
-       {
-               super(processTime);
-               outputSize = out.length;
-               
-               this.inputs = inputs.clone();
-               for(int i = 0; i < this.inputs.length; i++)
-               {
-                       if(inputs[i].length != outputSize)
-                               throw new IllegalArgumentException("All MUX wire arrays must be of uniform length!");
-                       inputs[i].addObserver(this);
-               }
-               
-               this.select = select;
-               select.addObserver(this);
-               
-               int maxInputs = 1 << select.length;
-               if(this.inputs.length > maxInputs)
-                       throw new IllegalArgumentException("There are more inputs ("
-                                       + this.inputs.length + ") to the MUX than supported by "
-                                       + select.length + " select bits (" + maxInputs + ").");
-               
-               outI = out.createInput();
-       }
-       
-       public WireArray getOut()
-       {
-               return outI.owner;
-       }
-
-       public WireArray getSelect()
-       {
-               return select;
-       }
-
-       @Override
-       public void compute() {
-               int selectValue;
-               if(!select.hasNumericValue() || (selectValue = (int) select.getUnsignedValue()) >= inputs.length)
-               {
-                       outI.clearSignals();
-                       return;
-               }
-               
-               WireArray active = inputs[selectValue];
-               outI.feedSignals(active.getValues());
-       }
-
-       @Override
-       public List<WireArray> getAllInputs()
-       {
-               ArrayList<WireArray> wires = new ArrayList<WireArray>(Arrays.asList(inputs));
-               wires.add(select);
-               return Collections.unmodifiableList(wires);
-       }
-
-       @Override
-       public List<WireArray> getAllOutputs()
-       {
-               return Collections.unmodifiableList(Arrays.asList(outI.owner));
-       }
-}
diff --git a/era.mi/src/era/mi/logic/components/Splitter.java b/era.mi/src/era/mi/logic/components/Splitter.java
deleted file mode 100644 (file)
index 2a52327..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-package era.mi.logic.components;
-
-import era.mi.logic.Bit;
-import era.mi.logic.wires.WireArray;
-import era.mi.logic.wires.WireArray.WireArrayInput;
-import era.mi.logic.wires.WireArrayObserver;
-
-public class Splitter implements WireArrayObserver
-{
-       private WireArray input;
-       private WireArrayInput[] outputs;
-       
-       public Splitter(WireArray input, WireArray... outputs)
-       {
-               this.input = input;
-               this.outputs = WireArray.extractInputs(outputs);
-               input.addObserver(this);
-               int length = 0;
-               for(WireArray out : outputs)
-                       length += out.length;
-               
-               if(input.length != length)
-                       throw new IllegalArgumentException("The input of splitting one into n WireArrays must have length = a1.length() + a2.length() + ... + an.length().");
-       }
-
-       protected void compute()
-       {
-               int startIndex = 0;
-               Bit[] inputBits = input.getValues();
-               for(int i = 0; i < outputs.length; i++)
-               {
-                       Bit[] outputBits = new Bit[outputs[i].owner.length];
-                       System.arraycopy(inputBits, startIndex, outputBits, 0, outputs[i].owner.length);
-                       outputs[i].feedSignals(outputBits);
-                       startIndex += outputs[i].owner.length;
-               }
-       }
-       
-       @Override
-       public void update(WireArray initiator, Bit[] oldValues)
-       {
-               compute();
-       }
-}
diff --git a/era.mi/src/era/mi/logic/components/TriStateBuffer.java b/era.mi/src/era/mi/logic/components/TriStateBuffer.java
deleted file mode 100644 (file)
index c21c476..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-package era.mi.logic.components;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import era.mi.logic.Bit;
-import era.mi.logic.wires.WireArray;
-import era.mi.logic.wires.WireArray.WireArrayInput;
-
-public class TriStateBuffer extends BasicComponent{
-       WireArray in, enable;
-       WireArrayInput outI;
-       
-       public TriStateBuffer(int processTime, WireArray in, WireArray out, WireArray enable) {
-               super(processTime);
-               if(in.length != out.length)
-                       throw new IllegalArgumentException("Tri-state output must have the same amount of bits as the input. Input: " + in.length + " Output: " + out.length);
-               if(enable.length != 1)
-                       throw new IllegalArgumentException("Tri-state enable must have exactly one bit, not " + enable.length + ".");
-               this.in = in;
-               in.addObserver(this);
-               this.enable = enable;
-               enable.addObserver(this);
-               outI = out.createInput();
-       }
-       
-       @Override
-       protected void compute()
-       {
-               if(enable.getValue() == Bit.ONE)
-                       outI.feedSignals(in.getValues());
-               else
-                       outI.clearSignals();
-       }
-
-       @Override
-       public List<WireArray> getAllInputs()
-       {
-               return Collections.unmodifiableList(Arrays.asList(in, enable));
-       }
-
-       @Override
-       public List<WireArray> getAllOutputs()
-       {
-               return Collections.unmodifiableList(Arrays.asList(outI.owner));
-       }
-
-}
diff --git a/era.mi/src/era/mi/logic/components/gates/AndGate.java b/era.mi/src/era/mi/logic/components/gates/AndGate.java
deleted file mode 100644 (file)
index 853fecc..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-package era.mi.logic.components.gates;
-
-import era.mi.logic.Util;
-import era.mi.logic.wires.WireArray;
-
-public class AndGate extends MultiInputGate
-{
-       public AndGate(int processTime, WireArray out, WireArray... in)
-       {
-               super(processTime, Util::and, out, in);
-       }
-}
diff --git a/era.mi/src/era/mi/logic/components/gates/MultiInputGate.java b/era.mi/src/era/mi/logic/components/gates/MultiInputGate.java
deleted file mode 100644 (file)
index b85939e..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-package era.mi.logic.components.gates;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import era.mi.logic.Bit;
-import era.mi.logic.components.BasicComponent;
-import era.mi.logic.wires.WireArray;
-import era.mi.logic.wires.WireArray.WireArrayInput;
-
-public abstract class MultiInputGate extends BasicComponent
-{
-       protected WireArray[] in;
-       protected WireArray out;
-       protected WireArrayInput outI;
-       protected final int length;
-       protected Operation op;
-       
-       protected MultiInputGate(int processTime, Operation op, WireArray out, WireArray... in)
-       {
-               super(processTime);
-               this.op = op;
-               length = out.length;
-               this.in = in.clone();
-               if(in.length < 1)
-                       throw new IllegalArgumentException(String.format("Cannot create gate with %d wires.", in.length));
-               for(WireArray w : in)
-               {
-                       if(w.length != length)
-                               throw new IllegalArgumentException("All wires connected to the gate must be of uniform length.");
-                       w.addObserver(this);
-               }
-               this.out = out;
-               outI = out.createInput();
-       }
-
-
-       @Override
-       public List<WireArray> getAllInputs()
-       {
-               return Collections.unmodifiableList(Arrays.asList(in));
-       }
-
-       @Override
-       public List<WireArray> getAllOutputs()
-       {
-               return Collections.unmodifiableList(Arrays.asList(out));
-       }
-       
-       protected void compute()
-       {
-               Bit[] result = in[0].getValues();
-               for(int i = 1; i < in.length; i++)
-                       result = op.execute(result, in[i].getValues());
-               outI.feedSignals(result);
-       }
-       
-       protected interface Operation
-       {
-               public Bit[] execute(Bit[] a, Bit[] b);
-       }
-}
diff --git a/era.mi/src/era/mi/logic/components/gates/NotGate.java b/era.mi/src/era/mi/logic/components/gates/NotGate.java
deleted file mode 100644 (file)
index 6a011be..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-package era.mi.logic.components.gates;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import era.mi.logic.Util;
-import era.mi.logic.components.BasicComponent;
-import era.mi.logic.wires.WireArray;
-import era.mi.logic.wires.WireArray.WireArrayInput;
-
-public class NotGate extends BasicComponent
-{
-       private WireArray in, out;
-       private WireArrayInput outI;
-
-       
-       public NotGate(int processTime, WireArray in, WireArray out)
-       {
-               super(processTime);
-               this.in = in;
-               in.addObserver(this);
-               this.out = out;
-               outI = out.createInput();
-       }
-       
-       public void compute()
-       {
-               outI.feedSignals(Util.not(in.getValues()));
-       }
-
-       public WireArray getIn()
-       {
-               return in;
-       }
-
-       public WireArray getOut()
-       {
-               return out;
-       }
-       
-       @Override
-       public List<WireArray> getAllInputs()
-       {
-               return Collections.unmodifiableList(Arrays.asList(in));
-       }
-
-       @Override
-       public List<WireArray> getAllOutputs()
-       {
-               return Collections.unmodifiableList(Arrays.asList(out));
-       }
-}
diff --git a/era.mi/src/era/mi/logic/components/gates/OrGate.java b/era.mi/src/era/mi/logic/components/gates/OrGate.java
deleted file mode 100644 (file)
index b538eb4..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-package era.mi.logic.components.gates;
-
-import era.mi.logic.Util;
-import era.mi.logic.wires.WireArray;
-
-public class OrGate extends MultiInputGate
-{      
-       public OrGate(int processTime, WireArray out, WireArray... in)
-       {
-               super(processTime, Util::or, out, in);
-       }
-}
diff --git a/era.mi/src/era/mi/logic/components/gates/XorGate.java b/era.mi/src/era/mi/logic/components/gates/XorGate.java
deleted file mode 100644 (file)
index c20af6f..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-package era.mi.logic.components.gates;
-
-import era.mi.logic.Util;
-import era.mi.logic.wires.WireArray;
-
-/**
- * Outputs 1 when the number of 1 inputs is odd.
- * @author Fabian Stemmler
- */
-public class XorGate extends MultiInputGate
-{      
-       public XorGate(int processTime, WireArray out, WireArray... in)
-       {
-               super(processTime, Util::xor, out, in);
-       }
-
-}
diff --git a/era.mi/src/era/mi/logic/tests/ComponentTest.java b/era.mi/src/era/mi/logic/tests/ComponentTest.java
deleted file mode 100644 (file)
index d48c5c6..0000000
+++ /dev/null
@@ -1,373 +0,0 @@
-package era.mi.logic.tests;
-
-import static org.junit.jupiter.api.Assertions.*;
-
-import java.util.Arrays;
-import java.util.function.LongConsumer;
-
-import org.junit.jupiter.api.Test;
-
-import era.mi.logic.Bit;
-import era.mi.logic.Simulation;
-import era.mi.logic.components.Demux;
-import era.mi.logic.components.Merger;
-import era.mi.logic.components.Mux;
-import era.mi.logic.components.Splitter;
-import era.mi.logic.components.TriStateBuffer;
-import era.mi.logic.components.gates.AndGate;
-import era.mi.logic.components.gates.NotGate;
-import era.mi.logic.components.gates.OrGate;
-import era.mi.logic.components.gates.XorGate;
-import era.mi.logic.wires.WireArray;
-import era.mi.logic.wires.WireArray.WireArrayInput;
-
-class ComponentTest
-{
-    
-       @Test
-       void circuitExampleTest()
-       {
-               Simulation.TIMELINE.reset();
-               WireArray a = new WireArray(1, 1), b = new WireArray(1, 1), c = new WireArray(1, 10), d = new WireArray(2, 1), e = new WireArray(1, 1),
-                               f = new WireArray(1, 1), g = new WireArray(1, 1), h = new WireArray(2, 1), i = new WireArray(2, 1), j = new WireArray(1, 1), k = new WireArray(1, 1);
-               new AndGate(1, f, a, b);
-               new NotGate(1, f, g);
-               new Merger(h, c, g);
-               new Mux(1, i, e, h, d);
-               new Splitter(i, k, j);
-               
-               a.createInput().feedSignals(Bit.ZERO);
-               b.createInput().feedSignals(Bit.ONE);
-               c.createInput().feedSignals(Bit.ZERO);
-               d.createInput().feedSignals(Bit.ONE, Bit.ONE);
-               e.createInput().feedSignals(Bit.ZERO);
-               
-               Simulation.TIMELINE.executeAll();
-               
-               assertEquals(Bit.ONE, j.getValue());
-               assertEquals(Bit.ZERO, k.getValue());
-       }
-
-    @Test
-    void splitterTest()
-    {
-       Simulation.TIMELINE.reset();
-       WireArray a = new WireArray(3, 1), b = new WireArray(2, 1), c = new WireArray(3, 1), in = new WireArray(8, 1);
-       in.createInput().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
-       new Splitter(in, a, b, c);
-
-       Simulation.TIMELINE.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()
-    {
-       Simulation.TIMELINE.reset();
-       WireArray a = new WireArray(3, 1), b = new WireArray(2, 1), c = new WireArray(3, 1), out = new WireArray(8, 1);
-       a.createInput().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO);
-       b.createInput().feedSignals(Bit.ONE, Bit.ZERO);
-       c.createInput().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
-
-       new Merger(out, a, b, c);
-
-       Simulation.TIMELINE.executeAll();
-
-       assertTrue(Arrays.equals(out.getValues(),
-               new Bit[] { Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE }));
-    }
-
-    @Test
-    void triStateBufferTest()
-    {
-       WireArray a = new WireArray(1, 1), b = new WireArray(1, 1), en = new WireArray(1, 1),
-               notEn = new WireArray(1, 1);
-       new NotGate(1, en, notEn);
-       new TriStateBuffer(1, a, b, en);
-       new TriStateBuffer(1, b, a, notEn);
-
-       WireArrayInput enI = en.createInput(), aI = a.createInput(), bI = b.createInput();
-       enI.feedSignals(Bit.ONE);
-       aI.feedSignals(Bit.ONE);
-
-       Simulation.TIMELINE.executeAll();
-
-       assertEquals(Bit.ONE, b.getValue());
-
-       bI.feedSignals(Bit.ZERO);
-
-       Simulation.TIMELINE.executeAll();
-
-       assertEquals(Bit.X, b.getValue());
-       assertEquals(Bit.ONE, a.getValue());
-
-       aI.clearSignals();
-       enI.feedSignals(Bit.ZERO);
-
-       Simulation.TIMELINE.executeAll();
-
-       assertEquals(Bit.ZERO, a.getValue());
-
-    }
-
-    @Test
-    void muxTest()
-    {
-       Simulation.TIMELINE.reset();
-       WireArray a = new WireArray(4, 3), b = new WireArray(4, 6), c = new WireArray(4, 4),
-               select = new WireArray(2, 5), out = new WireArray(4, 1);
-       WireArrayInput selectIn = select.createInput();
-
-       selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
-       a.createInput().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
-       c.createInput().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
-
-       new Mux(1, out, select, a, b, c);
-       Simulation.TIMELINE.executeAll();
-
-       assertBitArrayEquals(out.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
-       selectIn.feedSignals(Bit.ZERO, Bit.ONE);
-       Simulation.TIMELINE.executeAll();
-
-       assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
-
-       selectIn.feedSignals(Bit.ONE, Bit.ONE);
-       Simulation.TIMELINE.executeAll();
-
-       assertBitArrayEquals(out.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
-
-    }
-
-    @Test
-    void demuxTest()
-    {
-       Simulation.TIMELINE.reset();
-       WireArray a = new WireArray(4, 3), b = new WireArray(4, 6), c = new WireArray(4, 4),
-               select = new WireArray(2, 5), in = new WireArray(4, 1);
-       WireArrayInput selectIn = select.createInput();
-
-       selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
-       in.createInput().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
-
-       new Demux(1, in, select, a, b, c);
-       Simulation.TIMELINE.executeAll();
-
-       assertBitArrayEquals(a.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
-       assertBitArrayEquals(b.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
-       assertBitArrayEquals(c.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
-       selectIn.feedSignals(Bit.ZERO, Bit.ONE);
-       Simulation.TIMELINE.executeAll();
-
-       assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
-       assertBitArrayEquals(b.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
-       assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
-
-       selectIn.feedSignals(Bit.ONE, Bit.ONE);
-       Simulation.TIMELINE.executeAll();
-
-       assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
-       assertBitArrayEquals(b.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
-       assertBitArrayEquals(c.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
-
-    }
-    
-    @Test
-    void andTest()
-    {
-       Simulation.TIMELINE.reset();
-       WireArray a = new WireArray(4, 1), b = new WireArray(4, 3), c = new WireArray(4, 1);
-       new AndGate(1, c, a, b);
-       a.createInput().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
-       b.createInput().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
-
-       Simulation.TIMELINE.executeAll();
-       
-       assertBitArrayEquals(c.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ZERO);
-    }
-
-    @Test
-    void orTest()
-    {
-       Simulation.TIMELINE.reset();
-       WireArray a = new WireArray(4, 1), b = new WireArray(4, 3), c = new WireArray(4, 1);
-       new OrGate(1, c, a, b);
-       a.createInput().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
-       b.createInput().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
-
-       Simulation.TIMELINE.executeAll();
-
-       assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ONE);
-    }
-    
-    @Test
-    void xorTest()
-    {
-       Simulation.TIMELINE.reset();
-       WireArray a = new WireArray(3, 1), b = new WireArray(3, 2), c = new WireArray(3, 1), d = new WireArray(3, 1);
-       new XorGate(1, d, a, b, c);
-       a.createInput().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
-       b.createInput().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
-       c.createInput().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
-
-       Simulation.TIMELINE.executeAll();
-
-       assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE);
-    }
-
-    @Test
-    void rsLatchCircuitTest()
-    {
-       Simulation.TIMELINE.reset();
-       WireArray r = new WireArray(1, 1), s = new WireArray(1, 1), t1 = new WireArray(1, 15), t2 = new WireArray(1, 1),
-               q = new WireArray(1, 1), nq = new WireArray(1, 1);
-
-       new OrGate(1, t2, r, nq);
-       new OrGate(1, t1, s, q);
-       new NotGate(1, t2, q);
-       new NotGate(1, t1, nq);
-
-       WireArrayInput sIn = s.createInput(), rIn = r.createInput();
-
-       sIn.feedSignals(Bit.ONE);
-       rIn.feedSignals(Bit.ZERO);
-
-       Simulation.TIMELINE.executeAll();
-
-       assertEquals(Bit.ONE, q.getValue());
-       assertEquals(Bit.ZERO, nq.getValue());
-
-       sIn.feedSignals(Bit.ZERO);
-
-       Simulation.TIMELINE.executeAll();
-       assertEquals(Bit.ONE, q.getValue());
-       assertEquals(Bit.ZERO, nq.getValue());
-
-       rIn.feedSignals(Bit.ONE);
-
-       Simulation.TIMELINE.executeAll();
-
-       assertEquals(Bit.ZERO, q.getValue());
-       assertEquals(Bit.ONE, nq.getValue());
-    }
-
-    @Test
-    void numericValueTest()
-    {
-       Simulation.TIMELINE.reset();
-
-       WireArray a = new WireArray(4, 1);
-       a.createInput().feedSignals(Bit.ONE, Bit.ONE, Bit.ONE, Bit.ONE);
-
-       Simulation.TIMELINE.executeAll();
-
-       assertEquals(15, a.getUnsignedValue());
-       assertEquals(-1, a.getSignedValue());
-    }
-
-    @Test
-    void multipleInputs()
-    {
-       Simulation.TIMELINE.reset();
-       WireArray w = new WireArray(2, 1);
-       WireArrayInput wI1 = w.createInput(), wI2 = w.createInput();
-       wI1.feedSignals(Bit.ONE, Bit.Z);
-       wI2.feedSignals(Bit.Z, Bit.X);
-       Simulation.TIMELINE.executeAll();
-       assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.X);
-
-       wI2.feedSignals(Bit.ZERO, Bit.Z);
-       Simulation.TIMELINE.executeAll();
-       assertBitArrayEquals(w.getValues(), Bit.X, Bit.Z);
-
-       wI2.feedSignals(Bit.Z, Bit.Z);
-       Simulation.TIMELINE.executeAll();
-       assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
-
-       wI2.feedSignals(Bit.ONE, Bit.Z);
-       w.addObserver((i, oldValues) -> fail("WireArray notified observer, although value did not change."));
-       Simulation.TIMELINE.executeAll();
-       assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
-    }
-
-       @Test
-       void wireConnections()
-       {
-               // Nur ein Experiment, was über mehrere 'passive' Bausteine hinweg passieren würde
-               
-               Simulation.TIMELINE.reset();
-
-               WireArray a = new WireArray(1, 2);
-               WireArray b = new WireArray(1, 2);
-               WireArray c = new WireArray(1, 2);
-               WireArrayInput aI = a.createInput();
-               WireArrayInput bI = b.createInput();
-               WireArrayInput cI = c.createInput();
-
-               TestBitDisplay test = new TestBitDisplay(c);
-               TestBitDisplay test2 = new TestBitDisplay(a);
-               LongConsumer print = time -> System.out.format("Time %2d\n   a: %s\n   b: %s\n   c: %s\n", time, a, b, c);
-
-               cI.feedSignals(Bit.ONE);
-               test.assertAfterSimulationIs(print, Bit.ONE);
-
-               cI.feedSignals(Bit.X);
-               test.assertAfterSimulationIs(print, Bit.X);
-
-               cI.feedSignals(Bit.X);
-               cI.feedSignals(Bit.Z);
-               test.assertAfterSimulationIs(print, Bit.Z);
-
-               new Connector(b, c);
-               test.assertAfterSimulationIs(print, Bit.Z);
-               System.err.println("ONE");
-               bI.feedSignals(Bit.ONE);
-               test.assertAfterSimulationIs(print, Bit.ONE);
-               System.err.println("ZERO");
-               bI.feedSignals(Bit.ZERO);
-               test.assertAfterSimulationIs(print, Bit.ZERO);
-               System.err.println("Z");
-               bI.feedSignals(Bit.Z);
-               test.assertAfterSimulationIs(print, Bit.Z);
-               
-               new Connector(a, b);
-               System.err.println("Z 2");
-               aI.feedSignals(Bit.Z);
-               test.assertAfterSimulationIs(print, Bit.Z);
-               test2.assertAfterSimulationIs(Bit.Z);
-               System.err.println("ONE 2");
-               aI.feedSignals(Bit.ONE);
-               test.assertAfterSimulationIs(print, Bit.ONE);
-               test2.assertAfterSimulationIs(Bit.ONE);
-               System.err.println("ZERO 2");
-               aI.feedSignals(Bit.ZERO);
-               test.assertAfterSimulationIs(print, Bit.ZERO);
-               test2.assertAfterSimulationIs(Bit.ZERO);
-               System.err.println("Z 2 II");
-               aI.feedSignals(Bit.Z);
-               test.assertAfterSimulationIs(print, Bit.Z);
-               test2.assertAfterSimulationIs(Bit.Z);
-               
-               System.err.println("No Conflict yet");
-               bI.feedSignals(Bit.ONE);
-               test.assertAfterSimulationIs(print, Bit.ONE);
-               test2.assertAfterSimulationIs(Bit.ONE);
-               aI.feedSignals(Bit.ONE);
-               test.assertAfterSimulationIs(print, Bit.ONE);
-               test2.assertAfterSimulationIs(Bit.ONE);
-               System.err.println("Conflict");
-               aI.feedSignals(Bit.ZERO);
-               test.assertAfterSimulationIs(print, Bit.X);
-               test2.assertAfterSimulationIs(Bit.X);
-               aI.feedSignals(Bit.ONE);
-               test.assertAfterSimulationIs(print, Bit.ONE);
-               test2.assertAfterSimulationIs(Bit.ONE);
-       }
-
-    private static void assertBitArrayEquals(Bit[] actual, Bit... expected)
-    {
-       assertArrayEquals(expected, actual);
-    }
-}
diff --git a/era.mi/src/era/mi/logic/tests/Connector.java b/era.mi/src/era/mi/logic/tests/Connector.java
deleted file mode 100644 (file)
index 11d7436..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-package era.mi.logic.tests;
-
-import era.mi.logic.Bit;
-import era.mi.logic.Simulation;
-import era.mi.logic.wires.WireArray;
-import era.mi.logic.wires.WireArray.WireArrayInput;
-import era.mi.logic.wires.WireArrayObserver;
-
-public class Connector implements WireArrayObserver
-{
-       private final WireArray a;
-//     private final WireArray b;
-       private final WireArrayInput aI;
-       private final WireArrayInput bI;
-
-       public Connector(WireArray a, WireArray b)
-       {
-               if (a.length != b.length)
-                       throw new IllegalArgumentException(String.format("WireArray width does not match: %d, %d", a.length, b.length));
-               this.a = a;
-//             this.b = b;
-               a.addObserver(this);
-               b.addObserver(this);
-               aI = a.createInput();
-               bI = b.createInput();
-       }
-
-       @Override
-       public void update(WireArray initiator, Bit[] oldValues)
-       {
-               Simulation.TIMELINE.addEvent((e) ->
-               {
-                       if (initiator == a)
-                               bI.feedSignals(aI.wireValuesExcludingMe());
-                       else
-                               aI.feedSignals(bI.wireValuesExcludingMe());
-               }, 1);
-       }
-}
diff --git a/era.mi/src/era/mi/logic/tests/TestBitDisplay.java b/era.mi/src/era/mi/logic/tests/TestBitDisplay.java
deleted file mode 100644 (file)
index 9913116..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-package era.mi.logic.tests;
-
-import static org.junit.jupiter.api.Assertions.assertArrayEquals;
-
-import java.util.Arrays;
-import java.util.function.LongConsumer;
-
-import era.mi.logic.Bit;
-import era.mi.logic.Simulation;
-import era.mi.logic.components.BitDisplay;
-import era.mi.logic.wires.WireArray;
-
-public final class TestBitDisplay extends BitDisplay
-{
-
-       public TestBitDisplay(WireArray in)
-       {
-               super(in);
-       }
-
-       public void assertDisplays(Bit... expected)
-       {
-               assertArrayEquals(expected, getDisplayedValue());
-       }
-
-       public void assertAfterSimulationIs(Bit... expected)
-       {
-               Simulation.TIMELINE.executeAll();
-               assertDisplays(expected);
-       }
-
-       public void assertAfterSimulationIs(LongConsumer r, Bit... expected)
-       {
-               while (Simulation.TIMELINE.hasNext())
-                       {
-                               Simulation.TIMELINE.executeNext();
-                               r.accept(Simulation.TIMELINE.getSimulationTime());
-                       }
-               assertDisplays(expected);
-       }
-
-       @Override
-       protected void compute()
-       {
-               super.compute();
-               System.out.println("update: value is " + Arrays.toString(getDisplayedValue()));
-       }
-}
diff --git a/era.mi/src/era/mi/logic/timeline/Timeline.java b/era.mi/src/era/mi/logic/timeline/Timeline.java
deleted file mode 100644 (file)
index 20bb400..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-package era.mi.logic.timeline;
-
-import java.util.PriorityQueue;
-
-/**
- * Orders Events by the time they are due to be executed. Can execute Events individually.
- * @author Fabian Stemmler
- *
- */
-public class Timeline
-{
-       private PriorityQueue<InnerEvent> events;
-       private long currentTime = 0;
-       
-       public Timeline(int initCapacity)
-       {
-               events = new PriorityQueue<InnerEvent>(initCapacity, (a, b) -> {
-                       long difference = a.getTiming() - b.getTiming();
-                       if(difference == 0)
-                               return 0;
-                       return difference < 0 ? -1 : 1;
-               });
-       }
-       
-       public boolean hasNext()
-       {
-               return !events.isEmpty();
-       }
-
-       public void executeNext()
-       {
-               InnerEvent first = events.poll();
-               currentTime = first.getTiming();
-               first.run();
-       }
-       
-       public void executeAll()
-       {
-               while (hasNext())
-                       executeNext();
-       }
-
-       public long getSimulationTime()
-       {
-               return currentTime;
-       }
-       
-       public void reset()
-       {
-               events.clear();
-               currentTime = 0;
-       }
-       
-       /**
-        * Adds an Event to the {@link Timeline}
-        * @param function The {@link TimelineEventHandler} that will be executed, when the {@link InnerEvent} occurs on the timeline.
-        * @param relativeTiming The amount of MI ticks in which the {@link InnerEvent} is called, starting from the current time.
-        */
-       public void addEvent(TimelineEventHandler function, int relativeTiming)
-       {
-               long timing = currentTime + relativeTiming;
-               events.add(new InnerEvent(function, new TimelineEvent(timing), timing));
-       }
-       
-       private class InnerEvent
-       {
-
-               private final long timing;
-               private final TimelineEventHandler function;
-               private final TimelineEvent event;
-               
-               /**
-                * Creates an {@link InnerEvent}
-                * @param function {@link TimelineEventHandler} to be executed when the {@link InnerEvent} occurs
-                * @param timing Point in the MI simulation {@link Timeline}, at which the {@link InnerEvent} is executed;
-                */
-               InnerEvent(TimelineEventHandler function, TimelineEvent event, long timing)
-               {
-                       this.function = function;
-                       this.event = event;
-                       this.timing = timing;
-               }
-
-               public long getTiming()
-               {
-                       return timing;
-               }
-               
-               public void run()
-               {
-                       function.handle(event);
-               }
-               
-               @Override
-               public String toString()
-               {
-                       return event.toString();
-               }
-       }
-       
-       @Override
-       public String toString()
-       {
-               return "simulation time: " + currentTime + ", " + events.toString();
-       }
-       
-       public static long toNanoseconds(long ticks)
-       {
-               return ticks; //TODO: Alter this when it has been determined how ticks should relate to real time.
-       }
-}
\ No newline at end of file
diff --git a/era.mi/src/era/mi/logic/timeline/TimelineEvent.java b/era.mi/src/era/mi/logic/timeline/TimelineEvent.java
deleted file mode 100644 (file)
index c5fe16c..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-package era.mi.logic.timeline;
-
-/**
- * A class that stores all relevant information about an event in the {@link Timeline}. Currently, there is not much relevant information to store.
- * @author Fabian Stemmler
- *
- */
-public class TimelineEvent
-{
-       private final long timing;
-       
-       TimelineEvent(long timing)
-       {
-               super();
-               this.timing = timing;
-       }
-
-       public long getTiming()
-       {
-               return timing;
-       }
-       
-       public String toString()
-       {
-               return "timestamp: " + timing;
-       }
-}
\ No newline at end of file
diff --git a/era.mi/src/era/mi/logic/timeline/TimelineEventHandler.java b/era.mi/src/era/mi/logic/timeline/TimelineEventHandler.java
deleted file mode 100644 (file)
index 59a91c9..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-package era.mi.logic.timeline;
-
-public interface TimelineEventHandler
-{
-       public void handle(TimelineEvent e);
-}
\ No newline at end of file
diff --git a/era.mi/src/era/mi/logic/wires/WireArray.java b/era.mi/src/era/mi/logic/wires/WireArray.java
deleted file mode 100644 (file)
index 153277a..0000000
+++ /dev/null
@@ -1,360 +0,0 @@
-package era.mi.logic.wires;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import era.mi.logic.Bit;
-import era.mi.logic.Simulation;
-import era.mi.logic.Util;
-
-/**
- * Represents an array of wires that can store n bits of information.
- * 
- * @author Fabian Stemmler
- *
- */
-public class WireArray
-{
-       private Bit[] values;
-       public final int travelTime;
-       private List<WireArrayObserver> observers = new ArrayList<WireArrayObserver>();
-       public final int length;
-       private List<WireArrayInput> inputs = new ArrayList<WireArrayInput>();
-
-       public WireArray(int length, int travelTime)
-       {
-               if (length < 1)
-                       throw new IllegalArgumentException(String.format("Tried to create an array of wires with length %d, but a length of less than 1 makes no sense.", length));
-               this.length = length;
-               this.travelTime = travelTime;
-               initValues();
-       }
-
-       private void initValues()
-       {
-               values = Bit.Z.makeArray(length);
-       }
-
-       private void recalculateSingleInput()
-       {
-               WireArrayInput input = inputs.get(0);
-               if (!Arrays.equals(input.getValues(), values))
-               {
-                       Bit[] oldValues = values.clone();
-                       System.arraycopy(input.getValues(), 0, values, 0, length);
-                       notifyObservers(oldValues);
-               }
-       }
-
-       private void recalculateMultipleInputs()
-       {
-               Iterator<WireArrayInput> it = inputs.iterator();
-               Bit[] newValues = it.next().inputValues.clone();
-
-               while (it.hasNext())
-               {
-                       WireArrayInput input = it.next();
-                       Bit[] bits = input.getValues();
-                       for (int i = 0; i < length; i++)
-                       {
-                               if (Bit.Z.equals(bits[i]) || newValues[i].equals(bits[i]))
-                                       continue;
-                               else if (Bit.Z.equals(newValues[i]))
-                                       newValues[i] = bits[i];
-                               else
-                                       newValues[i] = Bit.X;
-                       }
-               }
-
-               if (!Arrays.equals(newValues, values))
-               {
-                       Bit[] oldValues = values;
-                       values = newValues;
-                       notifyObservers(oldValues);
-               }
-       }
-
-       private void recalculate()
-       {
-               switch (inputs.size())
-               {
-               case 0:
-                       return;
-               case 1:
-                       recalculateSingleInput();
-                       break;
-               default:
-                       recalculateMultipleInputs();
-               }
-       }
-
-       /**
-        * The WireArray is interpreted as an unsigned integer with n bits.
-        * 
-        * @return <code>true</code> if all bits are either <code>Bit.ONE</code> or
-        *         <code>Bit.ZERO</code> (they do not all have to have the same value),
-        *         not <code>Bit.X</code> or <code>Bit.Z</code>. <code>false</code> is
-        *         returned otherwise.
-        * 
-        * @author Fabian Stemmler
-        */
-       public boolean hasNumericValue()
-       {
-               for (Bit b : values)
-               {
-                       if (b != Bit.ZERO && b != Bit.ONE)
-                               return false;
-               }
-               return true;
-       }
-
-       /**
-        * The WireArray is interpreted as an unsigned integer with n bits.
-        * 
-        * @return The unsigned value of the {@link WireArray}'s bits, where value 0
-        *         corresponds with 2^0, value 1 is 2^1 and so on.
-        * 
-        * @author Fabian Stemmler
-        */
-       public long getUnsignedValue()
-       {
-               long val = 0;
-               long mask = 1;
-               for (int i = 0; i < length; i++)
-               {
-                       switch (values[i])
-                       {
-                       default:
-                       case Z:
-                       case X:
-                               return 0; // TODO: Proper handling for getUnsignedValue(), if not all bits are 1 or 0;
-                       // Random number?
-                       case ONE:
-                               val |= mask;
-                               break;
-                       case ZERO:
-                       }
-                       mask = mask << 1;
-               }
-               return val;
-       }
-
-       /**
-        * The WireArray is interpreted as a signed integer with n bits.
-        * 
-        * @return The signed value of the {@link WireArray}'s bits, where value 0
-        *         corresponds with 2^0, value 1 is 2^1 and so on.
-        * 
-        * @author Fabian Stemmler
-        */
-       public long getSignedValue()
-       {
-               long val = getUnsignedValue();
-               long mask = 1 << (length - 1);
-               if ((mask & val) != 0)
-               {
-                       int shifts = 64 - length;
-                       return (val << shifts) >> shifts;
-               }
-               return val;
-       }
-
-       /**
-        * Included for convenient use on {@link WireArray}s of length 1.
-        * 
-        * @return The value of bit 0.
-        * 
-        * @author Fabian Stemmler
-        */
-       public Bit getValue()
-       {
-               return getValue(0);
-       }
-
-       /**
-        * 
-        * @param index Index of the requested bit.
-        * @return The value of the indexed bit.
-        * 
-        * @author Fabian Stemmler
-        */
-       public Bit getValue(int index)
-       {
-               return values[index];
-       }
-
-       public Bit[] getValues(int start, int end)
-       {
-               int length = end - start;
-               Bit[] bits = new Bit[length];
-               System.arraycopy(values, start, bits, 0, length);
-               return bits;
-       }
-
-       /**
-        * @return An array of length n containing the values of the n bits in the
-        *         {@link WireArray}. Can be safely modified.
-        * 
-        * @author Fabian Stemmler
-        */
-       public Bit[] getValues()
-       {
-               return values.clone();
-       }
-
-       /**
-        * Adds an {@link WireArrayObserver}, who will be notified when the value of the
-        * {@link WireArray} is updated.
-        * 
-        * @param ob The {@link WireArrayObserver} to be notified of changes.
-        * @return true if the given {@link WireArrayObserver} was not already
-        *         registered, false otherwise
-        * 
-        * @author Fabian Stemmler
-        */
-       public boolean addObserver(WireArrayObserver ob)
-       {
-               return observers.add(ob);
-       }
-
-       private void notifyObservers(Bit[] oldValues)
-       {
-               for (WireArrayObserver o : observers)
-                       o.update(this, oldValues);
-       }
-
-       /**
-        * Create and register a {@link WireArrayInput} object, which is tied to this
-        * {@link WireArray}.
-        */
-       public WireArrayInput createInput()
-       {
-               return new WireArrayInput(this);
-       }
-
-       private void registerInput(WireArrayInput toRegister)
-       {
-               inputs.add(toRegister);
-       }
-
-       /**
-        * A {@link WireArrayInput} feeds a constant signal into the {@link WireArray}
-        * it is tied to. The combination of all inputs determines the
-        * {@link WireArray}s final value. X dominates all other inputs Z does not
-        * affect the final value, unless there are no other inputs than Z 0 and 1 turn
-        * into X when they are mixed
-        * 
-        * @author Fabian Stemmler
-        */
-       public class WireArrayInput
-       {
-               public final WireArray owner;
-               private Bit[] inputValues;
-
-               private WireArrayInput(WireArray owner)
-               {
-                       super();
-                       this.owner = owner;
-                       initValues();
-                       owner.registerInput(this);
-               }
-
-               private void initValues()
-               {
-                       inputValues = Bit.Z.makeArray(length);
-               }
-
-               /**
-                * Sets the wires values. This takes up time, as specified by the
-                * {@link WireArray}s travel time.
-                * 
-                * @param newValues The new values the wires should take on.
-                * 
-                * @author Fabian Stemmler
-                */
-               public void feedSignals(Bit... newValues)
-               {
-                       if (newValues.length == length)
-                       {
-                               feedSignals(0, newValues);
-                       } else
-                               throw new IllegalArgumentException(String.format("Attempted to input %o bits instead of %o bits.", newValues.length, length));
-               }
-
-               /**
-                * Sets values of a subarray of wires. This takes up time, as specified by the
-                * {@link WireArray}s travel time.
-                * 
-                * @param newValues   The new values the wires should take on.
-                * @param startingBit The first index of the subarray of wires.
-                * 
-                * @author Fabian Stemmler
-                */
-               public void feedSignals(int startingBit, Bit... newValues)
-               {
-                       Simulation.TIMELINE.addEvent((e) -> setValues(startingBit, newValues), travelTime);
-               }
-
-               private void setValues(int startingBit, Bit... newValues)
-               {
-                       int exclLastIndex = startingBit + newValues.length;
-                       if (length < exclLastIndex)
-                               throw new ArrayIndexOutOfBoundsException(String.format("Attempted to input bits from index %o to %o when there are only %o wires.", startingBit, exclLastIndex - 1, length));
-                       if (!Arrays.equals(inputValues, startingBit, exclLastIndex, newValues, 0, newValues.length))
-                       {
-                               System.arraycopy(newValues, 0, inputValues, startingBit, newValues.length);
-                               owner.recalculate();
-                       }
-               }
-
-               /**
-                * Returns a copy (safe to modify) of the values the {@link WireArrayInput} is currently feeding into the associated {@link WireArray}.
-                */
-               public Bit[] getValues()
-               {
-                       return inputValues.clone();
-               }
-
-               /**
-                * {@link WireArrayInput} now feeds Z into the associated {@link WireArray}.
-                */
-               public void clearSignals()
-               {
-                       feedSignals(Bit.Z.makeArray(length));
-               }
-
-               public Bit[] wireValuesExcludingMe() 
-               {
-                       Bit[] bits = Bit.Z.makeArray(length);
-                       for (WireArrayInput wai : inputs) 
-                       {
-                               if(wai == this)
-                                       continue;
-                               Util.combineInto(bits, wai.getValues());
-                       }
-                       return bits;
-               }
-               
-               @Override
-               public String toString()
-               {
-                       return Arrays.toString(inputValues);
-               }
-       }
-
-       @Override
-       public String toString()
-       {
-               return String.format("wire 0x%08x value: %s inputs: %s", hashCode(), Arrays.toString(values), inputs);
-       }
-
-       public static WireArrayInput[] extractInputs(WireArray[] w)
-       {
-               WireArrayInput[] inputs = new WireArrayInput[w.length];
-               for (int i = 0; i < w.length; i++)
-                       inputs[i] = w[i].createInput();
-               return inputs;
-       }
-}
\ No newline at end of file
diff --git a/era.mi/src/era/mi/logic/wires/WireArrayObserver.java b/era.mi/src/era/mi/logic/wires/WireArrayObserver.java
deleted file mode 100644 (file)
index 2c807bb..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-package era.mi.logic.wires;
-
-import era.mi.logic.Bit;
-
-public interface WireArrayObserver
-{
-       public void update(WireArray initiator, Bit[] oldValues);
-}