Merged logic into master
authorDaniel Kirschten <daniel.kirschten@gmx.de>
Mon, 20 May 2019 17:28:26 +0000 (19:28 +0200)
committerDaniel Kirschten <daniel.kirschten@gmx.de>
Mon, 20 May 2019 17:29:35 +0000 (19:29 +0200)
25 files changed:
.gitmodules [new file with mode: 0644]
README.md [new file with mode: 0644]
REQUIREMENTS.MD [new file with mode: 0644]
SampleERCP [new submodule]
era.mi/.classpath
era.mi/.project [deleted file]
era.mi/.settings/org.eclipse.jdt.core.prefs
era.mi/src/era/mi/logic/Simulation.java
era.mi/src/era/mi/logic/Util.java
era.mi/src/era/mi/logic/components/BasicComponent.java
era.mi/src/era/mi/logic/components/BitDisplay.java
era.mi/src/era/mi/logic/components/Clock.java
era.mi/src/era/mi/logic/components/Merger.java
era.mi/src/era/mi/logic/components/Mux.java
era.mi/src/era/mi/logic/components/Splitter.java
era.mi/src/era/mi/logic/components/gates/AndGate.java
era.mi/src/era/mi/logic/components/gates/NotGate.java
era.mi/src/era/mi/logic/components/gates/OrGate.java
era.mi/src/era/mi/logic/components/gates/XorGate.java
era.mi/src/era/mi/logic/tests/ComponentTest.java
era.mi/src/era/mi/logic/tests/TestBitDisplay.java
era.mi/src/era/mi/logic/timeline/Timeline.java
era.mi/src/era/mi/logic/timeline/TimelineEvent.java
era.mi/src/era/mi/logic/timeline/TimelineEventHandler.java
logicui [new submodule]

diff --git a/.gitmodules b/.gitmodules
new file mode 100644 (file)
index 0000000..a128354
--- /dev/null
@@ -0,0 +1,8 @@
+[submodule "logicui"]
+       path = logicui
+       url = <address of this repo>
+       branch = logicui
+[submodule "SampleERCP"]
+       path = SampleERCP
+       url = <address of this repo>
+       branch = SampleERCP
diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/REQUIREMENTS.MD b/REQUIREMENTS.MD
new file mode 100644 (file)
index 0000000..3a7a8d7
--- /dev/null
@@ -0,0 +1,165 @@
+# 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 and 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?
+<details><summary>
+Eclipse Public License 2.0? - https://www.eclipse.org/legal/epl-2.0/
+
+</summary><p>
+
+>Copyright (c) 2019 Christian Femers, Daniel Kirschten and Fabian Stemmler
+>
+>This program and the accompanying materials are made
+>available under the terms of the Eclipse Public License 2.0
+>which is available at https://www.eclipse.org/legal/epl-2.0/
+>
+>This Source Code may also be made available under the following Secondary
+>Licenses when the conditions for such availability set forth in the Eclipse
+>Public License, v. 2.0 are satisfied: GNU General Public License, version 2
+>with the GNU Classpath Exception which is
+>available at https://www.gnu.org/software/classpath/license.html.
+>
+>SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+
+</p></details>
diff --git a/SampleERCP b/SampleERCP
new file mode 160000 (submodule)
index 0000000..10e8749
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit 10e87495184e49c5cab906921f0afaf2473d9aed
index d286d86..be85523 100644 (file)
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="UTF-8"?>\r
-<classpath>\r
-       <classpathentry kind="src" path="src" />\r
-       <classpathentry kind="con"\r
-               path="org.eclipse.jdt.junit.JUNIT_CONTAINER/5" />\r
-       <classpathentry kind="con"\r
-               path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-10">\r
-               <attributes>\r
-                       <attribute name="module" value="true" />\r
-               </attributes>\r
-       </classpathentry>\r
-       <classpathentry kind="output" path="bin" />\r
-</classpath>\r
+<?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/.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>
index 0fc9edd..82c6671 100644 (file)
-eclipse.preferences.version=1\r
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled\r
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=10\r
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve\r
-org.eclipse.jdt.core.compiler.compliance=10\r
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate\r
-org.eclipse.jdt.core.compiler.debug.localVariable=generate\r
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate\r
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error\r
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error\r
-org.eclipse.jdt.core.compiler.release=enabled\r
-org.eclipse.jdt.core.compiler.source=10\r
-org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false\r
-org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647\r
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false\r
-org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false\r
-org.eclipse.jdt.core.formatter.align_with_spaces=false\r
-org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16\r
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16\r
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0\r
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16\r
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16\r
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16\r
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16\r
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0\r
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16\r
-org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16\r
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16\r
-org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16\r
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80\r
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0\r
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16\r
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16\r
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0\r
-org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16\r
-org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0\r
-org.eclipse.jdt.core.formatter.alignment_for_module_statements=16\r
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16\r
-org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16\r
-org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0\r
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0\r
-org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80\r
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16\r
-org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0\r
-org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16\r
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0\r
-org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0\r
-org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16\r
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1\r
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1\r
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0\r
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0\r
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1\r
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1\r
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1\r
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1\r
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0\r
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1\r
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1\r
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line\r
-org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true\r
-org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false\r
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false\r
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false\r
-org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true\r
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true\r
-org.eclipse.jdt.core.formatter.comment.format_header=false\r
-org.eclipse.jdt.core.formatter.comment.format_html=true\r
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true\r
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true\r
-org.eclipse.jdt.core.formatter.comment.format_source_code=true\r
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false\r
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=false\r
-org.eclipse.jdt.core.formatter.comment.indent_tag_description=false\r
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert\r
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert\r
-org.eclipse.jdt.core.formatter.comment.line_length=140\r
-org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true\r
-org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true\r
-org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false\r
-org.eclipse.jdt.core.formatter.compact_else_if=true\r
-org.eclipse.jdt.core.formatter.continuation_indentation=2\r
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2\r
-org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off\r
-org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on\r
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false\r
-org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false\r
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true\r
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true\r
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true\r
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true\r
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true\r
-org.eclipse.jdt.core.formatter.indent_empty_lines=false\r
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true\r
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true\r
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true\r
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false\r
-org.eclipse.jdt.core.formatter.indentation.size=4\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert\r
-org.eclipse.jdt.core.formatter.join_lines_in_comments=true\r
-org.eclipse.jdt.core.formatter.join_wrapped_lines=true\r
-org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false\r
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false\r
-org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false\r
-org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false\r
-org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false\r
-org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false\r
-org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false\r
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false\r
-org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.lineSplit=140\r
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false\r
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false\r
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0\r
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines\r
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true\r
-org.eclipse.jdt.core.formatter.tabulation.char=tab\r
-org.eclipse.jdt.core.formatter.tabulation.size=4\r
-org.eclipse.jdt.core.formatter.use_on_off_tags=true\r
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false\r
-org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false\r
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true\r
-org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true\r
-org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true\r
-org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter\r
+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
+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_binary_expression=16
+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_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=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_binary_operator=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_binary_operator=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_binary_operator=true
+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
index ca2c9e9..0468ec1 100644 (file)
@@ -1,9 +1,9 @@
-package era.mi.logic;\r
-\r
-import era.mi.logic.timeline.Timeline;\r
-\r
-public class Simulation\r
-{\r
-       public final static Timeline TIMELINE = new Timeline(11);\r
-\r
+package era.mi.logic;
+
+import era.mi.logic.timeline.Timeline;
+
+public class Simulation
+{
+       public final static Timeline TIMELINE = new Timeline(11);
+
 }
\ No newline at end of file
index 0567138..d621a44 100644 (file)
-package era.mi.logic;\r
-\r
-import java.util.Arrays;\r
-\r
-import era.mi.logic.types.Bit;\r
-\r
-public final class Util\r
-{\r
-\r
-       @SuppressWarnings("unchecked")\r
-       public static <T> T[] concat(T[]... arrays)\r
-       {\r
-               if (arrays.length == 0)\r
-                       throw new IllegalArgumentException("Cannot concatenate 0 arrays.");\r
-\r
-               int length = 0;\r
-               for (T[] array : arrays)\r
-                       length += array.length;\r
-\r
-               T[] newArray = Arrays.copyOf(arrays[0], length);\r
-               int appendIndex = arrays[0].length;\r
-               for (int i = 1; i < arrays.length; i++)\r
-               {\r
-                       System.arraycopy(arrays[i], 0, newArray, appendIndex, arrays[i].length);\r
-                       appendIndex += arrays[i].length;\r
-               }\r
-\r
-               return newArray;\r
-       }\r
-\r
-//     @SuppressWarnings("unchecked")\r
-//     public static <T> T[][] split(T[] array, int... lengths)\r
-//     {\r
-//             //TODO: implement array split again; This version contains an illegal cast\r
-//             int totalLength = 0;\r
-//             for(int length : lengths)\r
-//                     totalLength += length;\r
-//             \r
-//             if(totalLength != array.length)\r
-//                     throw new IllegalArgumentException(); //TODO: add proper error message\r
-//             \r
-//             Object[][] newArray = new Object[lengths.length][];\r
-//             int splitIndex = 0;\r
-//             for(int i = 0; i < lengths.length; i++)\r
-//             {\r
-//                     System.arraycopy(array, splitIndex, newArray, 0, lengths[i]);\r
-//                     splitIndex += lengths[i];\r
-//             }\r
-//             \r
-//             return (T[][]) newArray;\r
-//     }\r
-\r
-       public static Bit[] and(Bit[] a, Bit[] b)\r
-       {\r
-               return binBitOp(a, b, Bit::and);\r
-       }\r
-\r
-       public static Bit[] or(Bit[] a, Bit[] b)\r
-       {\r
-               return binBitOp(a, b, Bit::or);\r
-       }\r
-\r
-       public static Bit[] xor(Bit[] a, Bit[] b)\r
-       {\r
-               return binBitOp(a, b, Bit::xor);\r
-       }\r
-\r
-       private static Bit[] binBitOp(Bit[] a, Bit[] b, BitOp op)\r
-       {\r
-               if (a.length != b.length)\r
-                       throw new IllegalArgumentException("Bit Arrays were not of equal length.");\r
-               Bit[] out = new Bit[a.length];\r
-               for (int i = 0; i < a.length; i++)\r
-               {\r
-                       out[i] = op.execute(a[i], b[i]);\r
-               }\r
-               return out;\r
-       }\r
-\r
-       public static Bit[] not(Bit[] a)\r
-       {\r
-               Bit[] out = new Bit[a.length];\r
-               for (int i = 0; i < a.length; i++)\r
-               {\r
-                       out[i] = a[i].not();\r
-               }\r
-               return out;\r
-       }\r
-\r
-       /**\r
-        * uses the {@link Bit#combineWith(Bit)} method, does not create a new array, the result is stored in the first array.\r
-        * \r
-        * @author Christian Femers\r
-        */\r
-       public static Bit[] combineInto(Bit[] dest, Bit[] addition)\r
-       {\r
-               if (dest.length != addition.length)\r
-                       throw new IllegalArgumentException("Bit Arrays were not of equal length.");\r
-               for (int i = 0; i < addition.length; i++)\r
-               {\r
-                       dest[i] = dest[i].join(addition[i]);\r
-               }\r
-               return dest;\r
-       }\r
-\r
-       interface BitOp\r
-       {\r
-               Bit execute(Bit a, Bit b);\r
-       }\r
-}\r
+package era.mi.logic;
+
+import java.util.Arrays;
+
+import era.mi.logic.types.Bit;
+
+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, Bit::and);
+       }
+
+       public static Bit[] or(Bit[] a, Bit[] b)
+       {
+               return binBitOp(a, b, Bit::or);
+       }
+
+       public static Bit[] xor(Bit[] a, Bit[] b)
+       {
+               return binBitOp(a, b, Bit::xor);
+       }
+
+       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].join(addition[i]);
+               }
+               return dest;
+       }
+
+       interface BitOp
+       {
+               Bit execute(Bit a, Bit b);
+       }
+}
index 61935d1..e695283 100644 (file)
@@ -1,35 +1,35 @@
-package era.mi.logic.components;\r
-\r
-import era.mi.logic.Simulation;\r
-import era.mi.logic.types.BitVector;\r
-import era.mi.logic.wires.Wire;\r
-import era.mi.logic.wires.WireObserver;\r
-\r
-/**\r
- * A basic component that recomputes all outputs (with a delay), when it is updated.\r
- * \r
- * @author Fabian Stemmler\r
- */\r
-public abstract class BasicComponent implements WireObserver, Component\r
-{\r
-       private int processTime;\r
-\r
-       /**\r
-        * \r
-        * @param processTime Amount of time this component takes to update its outputs. Must be more than 0, otherwise 1 is assumed.\r
-        * \r
-        * @author Fabian Stemmler\r
-        */\r
-       public BasicComponent(int processTime)\r
-       {\r
-               this.processTime = processTime > 0 ? processTime : 1;\r
-       }\r
-\r
-       @Override\r
-       public void update(Wire initiator, BitVector oldValues)\r
-       {\r
-               Simulation.TIMELINE.addEvent(e -> compute(), processTime);\r
-       }\r
-\r
-       protected abstract void compute();\r
-}\r
+package era.mi.logic.components;
+
+import era.mi.logic.Simulation;
+import era.mi.logic.types.BitVector;
+import era.mi.logic.wires.Wire;
+import era.mi.logic.wires.WireObserver;
+
+/**
+ * A basic component that recomputes all outputs (with a delay), when it is updated.
+ * 
+ * @author Fabian Stemmler
+ */
+public abstract class BasicComponent implements WireObserver, 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(Wire initiator, BitVector oldValues)
+       {
+               Simulation.TIMELINE.addEvent(e -> compute(), processTime);
+       }
+
+       protected abstract void compute();
+}
index f11fdf8..971eb7a 100644 (file)
@@ -1,49 +1,49 @@
-package era.mi.logic.components;\r
-\r
-import java.util.List;\r
-\r
-import era.mi.logic.types.Bit;\r
-import era.mi.logic.types.BitVector;\r
-import era.mi.logic.wires.Wire.WireEnd;\r
-\r
-public class BitDisplay extends BasicComponent\r
-{\r
-       private final WireEnd in;\r
-       private BitVector displayedValue;\r
-\r
-       public BitDisplay(WireEnd in)\r
-       {\r
-               super(1);\r
-               this.in = in;\r
-               in.addObserver(this);\r
-               compute();\r
-       }\r
-\r
-       @Override\r
-       protected void compute()\r
-       {\r
-               displayedValue = in.getValues();\r
-       }\r
-\r
-       public BitVector getDisplayedValue()\r
-       {\r
-               return displayedValue;\r
-       }\r
-\r
-       public boolean isDisplaying(Bit... values)\r
-       {\r
-               return displayedValue.equals(BitVector.of(values));\r
-       }\r
-\r
-       @Override\r
-       public List<WireEnd> getAllInputs()\r
-       {\r
-               return List.of(in);\r
-       }\r
-\r
-       @Override\r
-       public List<WireEnd> getAllOutputs()\r
-       {\r
-               return List.of();\r
-       }\r
-}\r
+package era.mi.logic.components;
+
+import java.util.List;
+
+import era.mi.logic.types.Bit;
+import era.mi.logic.types.BitVector;
+import era.mi.logic.wires.Wire.WireEnd;
+
+public class BitDisplay extends BasicComponent
+{
+       private final WireEnd in;
+       private BitVector displayedValue;
+
+       public BitDisplay(WireEnd in)
+       {
+               super(1);
+               this.in = in;
+               in.addObserver(this);
+               compute();
+       }
+
+       @Override
+       protected void compute()
+       {
+               displayedValue = in.getValues();
+       }
+
+       public BitVector getDisplayedValue()
+       {
+               return displayedValue;
+       }
+
+       public boolean isDisplaying(Bit... values)
+       {
+               return displayedValue.equals(BitVector.of(values));
+       }
+
+       @Override
+       public List<WireEnd> getAllInputs()
+       {
+               return List.of(in);
+       }
+
+       @Override
+       public List<WireEnd> getAllOutputs()
+       {
+               return List.of();
+       }
+}
index a31f20c..07419b4 100644 (file)
@@ -1,59 +1,59 @@
-package era.mi.logic.components;\r
-\r
-import java.util.List;\r
-\r
-import era.mi.logic.Simulation;\r
-import era.mi.logic.timeline.TimelineEvent;\r
-import era.mi.logic.timeline.TimelineEventHandler;\r
-import era.mi.logic.types.Bit;\r
-import era.mi.logic.wires.Wire;\r
-import era.mi.logic.wires.Wire.WireEnd;\r
-\r
-public class Clock implements TimelineEventHandler, Component\r
-{\r
-       private boolean toggle = false;\r
-       private WireEnd out;\r
-       private int delta;\r
-\r
-       /**\r
-        * \r
-        * @param out   {@link Wire} the clock's impulses are fed into\r
-        * @param delta ticks between rising and falling edge\r
-        */\r
-       public Clock(WireEnd out, int delta)\r
-       {\r
-               this.delta = delta;\r
-               this.out = out;\r
-               addToTimeline();\r
-       }\r
-\r
-       @Override\r
-       public void handle(TimelineEvent e)\r
-       {\r
-               addToTimeline();\r
-               out.feedSignals(toggle ? Bit.ONE : Bit.ZERO);\r
-               toggle = !toggle;\r
-       }\r
-\r
-       public WireEnd getOut()\r
-       {\r
-               return out;\r
-       }\r
-\r
-       private void addToTimeline()\r
-       {\r
-               Simulation.TIMELINE.addEvent(this, delta);\r
-       }\r
-\r
-       @Override\r
-       public List<WireEnd> getAllInputs()\r
-       {\r
-               return List.of();\r
-       }\r
-\r
-       @Override\r
-       public List<WireEnd> getAllOutputs()\r
-       {\r
-               return List.of(out);\r
-       }\r
-}\r
+package era.mi.logic.components;
+
+import java.util.List;
+
+import era.mi.logic.Simulation;
+import era.mi.logic.timeline.TimelineEvent;
+import era.mi.logic.timeline.TimelineEventHandler;
+import era.mi.logic.types.Bit;
+import era.mi.logic.wires.Wire;
+import era.mi.logic.wires.Wire.WireEnd;
+
+public class Clock implements TimelineEventHandler, Component
+{
+       private boolean toggle = false;
+       private WireEnd out;
+       private int delta;
+
+       /**
+        * 
+        * @param out   {@link Wire} the clock's impulses are fed into
+        * @param delta ticks between rising and falling edge
+        */
+       public Clock(WireEnd out, int delta)
+       {
+               this.delta = delta;
+               this.out = out;
+               addToTimeline();
+       }
+
+       @Override
+       public void handle(TimelineEvent e)
+       {
+               addToTimeline();
+               out.feedSignals(toggle ? Bit.ONE : Bit.ZERO);
+               toggle = !toggle;
+       }
+
+       public WireEnd getOut()
+       {
+               return out;
+       }
+
+       private void addToTimeline()
+       {
+               Simulation.TIMELINE.addEvent(this, delta);
+       }
+
+       @Override
+       public List<WireEnd> getAllInputs()
+       {
+               return List.of();
+       }
+
+       @Override
+       public List<WireEnd> getAllOutputs()
+       {
+               return List.of(out);
+       }
+}
index 3232159..34ba217 100644 (file)
@@ -1,82 +1,82 @@
-package era.mi.logic.components;\r
-\r
-import java.util.List;\r
-\r
-import era.mi.logic.types.BitVector;\r
-import era.mi.logic.wires.Wire;\r
-import era.mi.logic.wires.Wire.WireEnd;\r
-import era.mi.logic.wires.WireObserver;\r
-\r
-public class Merger implements WireObserver, Component\r
-{\r
-       private WireEnd out;\r
-       private WireEnd[] inputs;\r
-       private int[] beginningIndex;\r
-\r
-       /**\r
-        * \r
-        * @param union  The output of merging n {@link Wire}s into one. Must have length = a1.length() + a2.length() + ... + an.length().\r
-        * @param inputs The inputs to be merged into the union\r
-        */\r
-       public Merger(WireEnd union, WireEnd... inputs)\r
-       {\r
-               this.inputs = inputs;\r
-               this.out = union;\r
-               this.beginningIndex = new int[inputs.length];\r
-\r
-               int length = 0;\r
-               for (int i = 0; i < inputs.length; i++)\r
-               {\r
-                       beginningIndex[i] = length;\r
-                       length += inputs[i].length();\r
-                       inputs[i].addObserver(this);\r
-               }\r
-\r
-               if (length != union.length())\r
-                       throw new IllegalArgumentException(\r
-                                       "The output of merging n WireArrays into one must have length = a1.length() + a2.length() + ... + an.length().");\r
-       }\r
-\r
-       public WireEnd getInput(int index)\r
-       {\r
-               return inputs[index];\r
-       }\r
-\r
-       public WireEnd getUnion()\r
-       {\r
-               return out;\r
-       }\r
-\r
-       @Override\r
-       public void update(Wire initiator, BitVector oldValues)\r
-       {\r
-               int index = find(initiator);\r
-               int beginning = beginningIndex[index];\r
-               out.feedSignals(beginning, inputs[index].getValues());\r
-       }\r
-\r
-       private int find(Wire w)\r
-       {\r
-               for (int i = 0; i < inputs.length; i++)\r
-                       if (inputs[i].getWire() == w)\r
-                               return i;\r
-               return -1;\r
-       }\r
-\r
-       public WireEnd[] getInputs()\r
-       {\r
-               return inputs.clone();\r
-       }\r
-\r
-       @Override\r
-       public List<WireEnd> getAllInputs()\r
-       {\r
-               return List.of(inputs);\r
-       }\r
-\r
-       @Override\r
-       public List<WireEnd> getAllOutputs()\r
-       {\r
-               return List.of(out);\r
-       }\r
-}\r
+package era.mi.logic.components;
+
+import java.util.List;
+
+import era.mi.logic.types.BitVector;
+import era.mi.logic.wires.Wire;
+import era.mi.logic.wires.Wire.WireEnd;
+import era.mi.logic.wires.WireObserver;
+
+public class Merger implements WireObserver, Component
+{
+       private WireEnd out;
+       private WireEnd[] inputs;
+       private int[] beginningIndex;
+
+       /**
+        * 
+        * @param union  The output of merging n {@link Wire}s into one. Must have length = a1.length() + a2.length() + ... + an.length().
+        * @param inputs The inputs to be merged into the union
+        */
+       public Merger(WireEnd union, WireEnd... inputs)
+       {
+               this.inputs = inputs;
+               this.out = union;
+               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 WireEnd getInput(int index)
+       {
+               return inputs[index];
+       }
+
+       public WireEnd getUnion()
+       {
+               return out;
+       }
+
+       @Override
+       public void update(Wire initiator, BitVector oldValues)
+       {
+               int index = find(initiator);
+               int beginning = beginningIndex[index];
+               out.feedSignals(beginning, inputs[index].getValues());
+       }
+
+       private int find(Wire w)
+       {
+               for (int i = 0; i < inputs.length; i++)
+                       if (inputs[i].getWire() == w)
+                               return i;
+               return -1;
+       }
+
+       public WireEnd[] getInputs()
+       {
+               return inputs.clone();
+       }
+
+       @Override
+       public List<WireEnd> getAllInputs()
+       {
+               return List.of(inputs);
+       }
+
+       @Override
+       public List<WireEnd> getAllOutputs()
+       {
+               return List.of(out);
+       }
+}
index 675c070..aea7116 100644 (file)
@@ -1,93 +1,93 @@
-package era.mi.logic.components;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Arrays;\r
-import java.util.Collections;\r
-import java.util.List;\r
-\r
-import era.mi.logic.wires.Wire;\r
-import era.mi.logic.wires.Wire.WireEnd;\r
-\r
-/**\r
- * Models a multiplexer. Takes an arbitrary amount of input {@link Wire}s, one of which, as determined by select, is put through to the\r
- * output.\r
- * \r
- * @author Fabian Stemmler\r
- *\r
- */\r
-public class Mux extends BasicComponent\r
-{\r
-       private WireEnd select;\r
-       private WireEnd out;\r
-       private WireEnd[] inputs;\r
-       private final int outputSize;\r
-\r
-       /**\r
-        * Input {@link Wire}s and out must be of uniform length\r
-        * \r
-        * @param out    Must be of uniform length with all inputs.\r
-        * @param select Indexes the input array which is to be mapped to the output. Must have enough bits to index all inputs.\r
-        * @param inputs One of these inputs is mapped to the output, depending on the select bits\r
-        */\r
-       public Mux(int processTime, WireEnd out, WireEnd select, WireEnd... inputs)\r
-       {\r
-               super(processTime);\r
-               outputSize = out.length();\r
-\r
-               this.inputs = inputs.clone();\r
-               for (int i = 0; i < this.inputs.length; i++)\r
-               {\r
-                       if (inputs[i].length() != outputSize)\r
-                               throw new IllegalArgumentException("All MUX wire arrays must be of uniform length!");\r
-                       inputs[i].addObserver(this);\r
-               }\r
-\r
-               this.select = select;\r
-               select.addObserver(this);\r
-\r
-               int maxInputs = 1 << select.length();\r
-               if (this.inputs.length > maxInputs)\r
-                       throw new IllegalArgumentException("There are more inputs (" + this.inputs.length + ") to the MUX than supported by "\r
-                                       + select.length() + " select bits (" + maxInputs + ").");\r
-\r
-               this.out = out;\r
-       }\r
-\r
-       public WireEnd getOut()\r
-       {\r
-               return out;\r
-       }\r
-\r
-       public WireEnd getSelect()\r
-       {\r
-               return select;\r
-       }\r
-\r
-       @Override\r
-       public void compute()\r
-       {\r
-               int selectValue;\r
-               if (!select.hasNumericValue() || (selectValue = (int) select.getUnsignedValue()) >= inputs.length)\r
-               {\r
-                       out.clearSignals();\r
-                       return;\r
-               }\r
-\r
-               WireEnd active = inputs[selectValue];\r
-               out.feedSignals(active.getValues());\r
-       }\r
-\r
-       @Override\r
-       public List<WireEnd> getAllInputs()\r
-       {\r
-               ArrayList<WireEnd> wires = new ArrayList<WireEnd>(Arrays.asList(inputs));\r
-               wires.add(select);\r
-               return Collections.unmodifiableList(wires);\r
-       }\r
-\r
-       @Override\r
-       public List<WireEnd> getAllOutputs()\r
-       {\r
-               return List.of(out);\r
-       }\r
-}\r
+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.Wire;
+import era.mi.logic.wires.Wire.WireEnd;
+
+/**
+ * Models a multiplexer. Takes an arbitrary amount of input {@link Wire}s, one of which, as determined by select, is put through to the
+ * output.
+ * 
+ * @author Fabian Stemmler
+ *
+ */
+public class Mux extends BasicComponent
+{
+       private WireEnd select;
+       private WireEnd out;
+       private WireEnd[] inputs;
+       private final int outputSize;
+
+       /**
+        * Input {@link Wire}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, WireEnd out, WireEnd select, WireEnd... 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 + ").");
+
+               this.out = out;
+       }
+
+       public WireEnd getOut()
+       {
+               return out;
+       }
+
+       public WireEnd getSelect()
+       {
+               return select;
+       }
+
+       @Override
+       public void compute()
+       {
+               int selectValue;
+               if (!select.hasNumericValue() || (selectValue = (int) select.getUnsignedValue()) >= inputs.length)
+               {
+                       out.clearSignals();
+                       return;
+               }
+
+               WireEnd active = inputs[selectValue];
+               out.feedSignals(active.getValues());
+       }
+
+       @Override
+       public List<WireEnd> getAllInputs()
+       {
+               ArrayList<WireEnd> wires = new ArrayList<WireEnd>(Arrays.asList(inputs));
+               wires.add(select);
+               return Collections.unmodifiableList(wires);
+       }
+
+       @Override
+       public List<WireEnd> getAllOutputs()
+       {
+               return List.of(out);
+       }
+}
index e936c82..4764c27 100644 (file)
@@ -1,43 +1,43 @@
-package era.mi.logic.components;\r
-\r
-import era.mi.logic.types.BitVector;\r
-import era.mi.logic.wires.Wire;\r
-import era.mi.logic.wires.Wire.WireEnd;\r
-import era.mi.logic.wires.WireObserver;\r
-\r
-public class Splitter implements WireObserver\r
-{\r
-       private WireEnd input;\r
-       private WireEnd[] outputs;\r
-\r
-       public Splitter(WireEnd input, WireEnd... outputs)\r
-       {\r
-               this.input = input;\r
-               this.outputs = outputs;\r
-               input.addObserver(this);\r
-               int length = 0;\r
-               for (WireEnd out : outputs)\r
-                       length += out.length();\r
-\r
-               if (input.length() != length)\r
-                       throw new IllegalArgumentException(\r
-                                       "The input of splitting one into n WireArrays must have length = a1.length() + a2.length() + ... + an.length().");\r
-       }\r
-\r
-       protected void compute()\r
-       {\r
-               BitVector inputBits = input.getValues();\r
-               int startIndex = 0;\r
-               for (int i = 0; i < outputs.length; i++)\r
-               {\r
-                       outputs[i].feedSignals(inputBits.subVector(startIndex, startIndex + outputs[i].length()));\r
-                       startIndex += outputs[i].length();\r
-               }\r
-       }\r
-\r
-       @Override\r
-       public void update(Wire initiator, BitVector oldValues)\r
-       {\r
-               compute();\r
-       }\r
-}\r
+package era.mi.logic.components;
+
+import era.mi.logic.types.BitVector;
+import era.mi.logic.wires.Wire;
+import era.mi.logic.wires.Wire.WireEnd;
+import era.mi.logic.wires.WireObserver;
+
+public class Splitter implements WireObserver
+{
+       private WireEnd input;
+       private WireEnd[] outputs;
+
+       public Splitter(WireEnd input, WireEnd... outputs)
+       {
+               this.input = input;
+               this.outputs = outputs;
+               input.addObserver(this);
+               int length = 0;
+               for (WireEnd 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()
+       {
+               BitVector inputBits = input.getValues();
+               int startIndex = 0;
+               for (int i = 0; i < outputs.length; i++)
+               {
+                       outputs[i].feedSignals(inputBits.subVector(startIndex, startIndex + outputs[i].length()));
+                       startIndex += outputs[i].length();
+               }
+       }
+
+       @Override
+       public void update(Wire initiator, BitVector oldValues)
+       {
+               compute();
+       }
+}
index a24acc7..5da680e 100644 (file)
@@ -1,12 +1,12 @@
-package era.mi.logic.components.gates;\r
-\r
-import era.mi.logic.types.BitVector.BitVectorMutator;\r
-import era.mi.logic.wires.Wire.WireEnd;\r
-\r
-public class AndGate extends MultiInputGate\r
-{\r
-       public AndGate(int processTime, WireEnd out, WireEnd... in)\r
-       {\r
-               super(processTime, BitVectorMutator::and, out, in);\r
-       }\r
-}\r
+package era.mi.logic.components.gates;
+
+import era.mi.logic.types.BitVector.BitVectorMutator;
+import era.mi.logic.wires.Wire.WireEnd;
+
+public class AndGate extends MultiInputGate
+{
+       public AndGate(int processTime, WireEnd out, WireEnd... in)
+       {
+               super(processTime, BitVectorMutator::and, out, in);
+       }
+}
index 7baf606..1c0d833 100644 (file)
@@ -1,48 +1,48 @@
-package era.mi.logic.components.gates;\r
-\r
-import java.util.List;\r
-\r
-import era.mi.logic.components.BasicComponent;\r
-import era.mi.logic.wires.Wire.WireEnd;\r
-\r
-public class NotGate extends BasicComponent\r
-{\r
-       private WireEnd in;\r
-       private WireEnd out;\r
-\r
-       public NotGate(int processTime, WireEnd in, WireEnd out)\r
-       {\r
-               super(processTime);\r
-               this.in = in;\r
-               in.addObserver(this);\r
-               this.out = out;\r
-       }\r
-\r
-       @Override\r
-       protected void compute()\r
-       {\r
-               out.feedSignals(in.getValues().not());\r
-       }\r
-\r
-       public WireEnd getIn()\r
-       {\r
-               return in;\r
-       }\r
-\r
-       public WireEnd getOut()\r
-       {\r
-               return out;\r
-       }\r
-\r
-       @Override\r
-       public List<WireEnd> getAllInputs()\r
-       {\r
-               return List.of(in);\r
-       }\r
-\r
-       @Override\r
-       public List<WireEnd> getAllOutputs()\r
-       {\r
-               return List.of(out);\r
-       }\r
-}\r
+package era.mi.logic.components.gates;
+
+import java.util.List;
+
+import era.mi.logic.components.BasicComponent;
+import era.mi.logic.wires.Wire.WireEnd;
+
+public class NotGate extends BasicComponent
+{
+       private WireEnd in;
+       private WireEnd out;
+
+       public NotGate(int processTime, WireEnd in, WireEnd out)
+       {
+               super(processTime);
+               this.in = in;
+               in.addObserver(this);
+               this.out = out;
+       }
+
+       @Override
+       protected void compute()
+       {
+               out.feedSignals(in.getValues().not());
+       }
+
+       public WireEnd getIn()
+       {
+               return in;
+       }
+
+       public WireEnd getOut()
+       {
+               return out;
+       }
+
+       @Override
+       public List<WireEnd> getAllInputs()
+       {
+               return List.of(in);
+       }
+
+       @Override
+       public List<WireEnd> getAllOutputs()
+       {
+               return List.of(out);
+       }
+}
index 0a8047c..8c1775f 100644 (file)
@@ -1,12 +1,12 @@
-package era.mi.logic.components.gates;\r
-\r
-import era.mi.logic.types.BitVector.BitVectorMutator;\r
-import era.mi.logic.wires.Wire.WireEnd;\r
-\r
-public class OrGate extends MultiInputGate\r
-{\r
-       public OrGate(int processTime, WireEnd out, WireEnd... in)\r
-       {\r
-               super(processTime, BitVectorMutator::or, out, in);\r
-       }\r
-}\r
+package era.mi.logic.components.gates;
+
+import era.mi.logic.types.BitVector.BitVectorMutator;
+import era.mi.logic.wires.Wire.WireEnd;
+
+public class OrGate extends MultiInputGate
+{
+       public OrGate(int processTime, WireEnd out, WireEnd... in)
+       {
+               super(processTime, BitVectorMutator::or, out, in);
+       }
+}
index 9311a1d..73a2556 100644 (file)
@@ -1,18 +1,18 @@
-package era.mi.logic.components.gates;\r
-\r
-import era.mi.logic.types.BitVector.BitVectorMutator;\r
-import era.mi.logic.wires.Wire.WireEnd;\r
-\r
-/**\r
- * Outputs 1 when the number of 1 inputs is odd.\r
- * \r
- * @author Fabian Stemmler\r
- */\r
-public class XorGate extends MultiInputGate\r
-{\r
-       public XorGate(int processTime, WireEnd out, WireEnd... in)\r
-       {\r
-               super(processTime, BitVectorMutator::xor, out, in);\r
-       }\r
-\r
-}\r
+package era.mi.logic.components.gates;
+
+import era.mi.logic.types.BitVector.BitVectorMutator;
+import era.mi.logic.wires.Wire.WireEnd;
+
+/**
+ * Outputs 1 when the number of 1 inputs is odd.
+ * 
+ * @author Fabian Stemmler
+ */
+public class XorGate extends MultiInputGate
+{
+       public XorGate(int processTime, WireEnd out, WireEnd... in)
+       {
+               super(processTime, BitVectorMutator::xor, out, in);
+       }
+
+}
index d25de9e..8a9bc5a 100644 (file)
-package era.mi.logic.tests;\r
-\r
-import static org.junit.jupiter.api.Assertions.*;\r
-\r
-import java.util.function.LongConsumer;\r
-\r
-import org.junit.jupiter.api.Test;\r
-\r
-import era.mi.logic.Simulation;\r
-import era.mi.logic.components.Connector;\r
-import era.mi.logic.components.Demux;\r
-import era.mi.logic.components.Merger;\r
-import era.mi.logic.components.Mux;\r
-import era.mi.logic.components.Splitter;\r
-import era.mi.logic.components.TriStateBuffer;\r
-import era.mi.logic.components.gates.AndGate;\r
-import era.mi.logic.components.gates.NotGate;\r
-import era.mi.logic.components.gates.OrGate;\r
-import era.mi.logic.components.gates.XorGate;\r
-import era.mi.logic.types.Bit;\r
-import era.mi.logic.types.BitVector;\r
-import era.mi.logic.wires.Wire;\r
-import era.mi.logic.wires.Wire.WireEnd;\r
-\r
-@SuppressWarnings("unused")\r
-class ComponentTest\r
-{\r
-\r
-       @Test\r
-       void circuitExampleTest()\r
-       {\r
-               Simulation.TIMELINE.reset();\r
-               Wire a = new Wire(1, 1), b = new Wire(1, 1), c = new Wire(1, 10), d = new Wire(2, 1), e = new Wire(1, 1), f = new Wire(1, 1),\r
-                               g = new Wire(1, 1), h = new Wire(2, 1), i = new Wire(2, 1), j = new Wire(1, 1), k = new Wire(1, 1);\r
-               new AndGate(1, f.createEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());\r
-               new NotGate(1, f.createReadOnlyEnd(), g.createEnd());\r
-               new Merger(h.createEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd());\r
-               new Mux(1, i.createEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd());\r
-               new Splitter(i.createReadOnlyEnd(), k.createEnd(), j.createEnd());\r
-\r
-               a.createEnd().feedSignals(Bit.ZERO);\r
-               b.createEnd().feedSignals(Bit.ONE);\r
-               c.createEnd().feedSignals(Bit.ZERO);\r
-               d.createEnd().feedSignals(Bit.ONE, Bit.ONE);\r
-               e.createEnd().feedSignals(Bit.ZERO);\r
-\r
-               Simulation.TIMELINE.executeAll();\r
-\r
-               assertEquals(Bit.ONE, j.getValue());\r
-               assertEquals(Bit.ZERO, k.getValue());\r
-       }\r
-\r
-       @Test\r
-       void splitterTest()\r
-       {\r
-               Simulation.TIMELINE.reset();\r
-               Wire a = new Wire(3, 1), b = new Wire(2, 1), c = new Wire(3, 1), in = new Wire(8, 1);\r
-               in.createEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
-               new Splitter(in.createReadOnlyEnd(), a.createEnd(), b.createEnd(), c.createEnd());\r
-\r
-               Simulation.TIMELINE.executeAll();\r
-\r
-               assertBitArrayEquals(a.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO);\r
-               assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO);\r
-               assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE);\r
-       }\r
-\r
-       @Test\r
-       void mergerTest()\r
-       {\r
-               Simulation.TIMELINE.reset();\r
-               Wire a = new Wire(3, 1), b = new Wire(2, 1), c = new Wire(3, 1), out = new Wire(8, 1);\r
-               a.createEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO);\r
-               b.createEnd().feedSignals(Bit.ONE, Bit.ZERO);\r
-               c.createEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);\r
-\r
-               new Merger(out.createEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());\r
-\r
-               Simulation.TIMELINE.executeAll();\r
-\r
-               assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
-       }\r
-\r
-       @Test\r
-       void triStateBufferTest()\r
-       {\r
-               Wire a = new Wire(1, 1), b = new Wire(1, 1), en = new Wire(1, 1), notEn = new Wire(1, 1);\r
-               new NotGate(1, en.createReadOnlyEnd(), notEn.createEnd());\r
-               new TriStateBuffer(1, a.createReadOnlyEnd(), b.createEnd(), en.createReadOnlyEnd());\r
-               new TriStateBuffer(1, b.createReadOnlyEnd(), a.createEnd(), notEn.createReadOnlyEnd());\r
-\r
-               WireEnd enI = en.createEnd(), aI = a.createEnd(), bI = b.createEnd();\r
-               enI.feedSignals(Bit.ONE);\r
-               aI.feedSignals(Bit.ONE);\r
-               bI.feedSignals(Bit.Z);\r
-\r
-               Simulation.TIMELINE.executeAll();\r
-\r
-               assertEquals(Bit.ONE, b.getValue());\r
-\r
-               bI.feedSignals(Bit.ZERO);\r
-\r
-               Simulation.TIMELINE.executeAll();\r
-\r
-               assertEquals(Bit.X, b.getValue());\r
-               assertEquals(Bit.ONE, a.getValue());\r
-\r
-               aI.clearSignals();\r
-               enI.feedSignals(Bit.ZERO);\r
-\r
-               Simulation.TIMELINE.executeAll();\r
-\r
-               assertEquals(Bit.ZERO, a.getValue());\r
-\r
-       }\r
-\r
-       @Test\r
-       void muxTest()\r
-       {\r
-               Simulation.TIMELINE.reset();\r
-               Wire a = new Wire(4, 3), b = new Wire(4, 6), c = new Wire(4, 4), select = new Wire(2, 5), out = new Wire(4, 1);\r
-               WireEnd selectIn = select.createEnd();\r
-\r
-               selectIn.feedSignals(Bit.ZERO, Bit.ZERO);\r
-               a.createEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
-               c.createEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
-\r
-               new Mux(1, out.createEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());\r
-               Simulation.TIMELINE.executeAll();\r
-\r
-               assertBitArrayEquals(out.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
-               selectIn.feedSignals(Bit.ZERO, Bit.ONE);\r
-               Simulation.TIMELINE.executeAll();\r
-\r
-               assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
-\r
-               selectIn.feedSignals(Bit.ONE, Bit.ONE);\r
-               Simulation.TIMELINE.executeAll();\r
-\r
-               assertBitArrayEquals(out.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);\r
-\r
-       }\r
-\r
-       @Test\r
-       void demuxTest()\r
-       {\r
-               Simulation.TIMELINE.reset();\r
-               Wire a = new Wire(4, 3), b = new Wire(4, 6), c = new Wire(4, 4), select = new Wire(2, 5), in = new Wire(4, 1);\r
-               WireEnd selectIn = select.createEnd();\r
-\r
-               selectIn.feedSignals(Bit.ZERO, Bit.ZERO);\r
-               in.createEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
-\r
-               new Demux(1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createEnd(), b.createEnd(), c.createEnd());\r
-               Simulation.TIMELINE.executeAll();\r
-\r
-               assertBitArrayEquals(a.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
-               assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);\r
-               assertBitArrayEquals(c.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);\r
-               selectIn.feedSignals(Bit.ZERO, Bit.ONE);\r
-               Simulation.TIMELINE.executeAll();\r
-\r
-               assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);\r
-               assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);\r
-               assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
-\r
-               selectIn.feedSignals(Bit.ONE, Bit.ONE);\r
-               Simulation.TIMELINE.executeAll();\r
-\r
-               assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);\r
-               assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);\r
-               assertBitArrayEquals(c.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);\r
-\r
-       }\r
-\r
-       @Test\r
-       void andTest()\r
-       {\r
-               Simulation.TIMELINE.reset();\r
-               Wire a = new Wire(4, 1), b = new Wire(4, 3), c = new Wire(4, 1);\r
-               new AndGate(1, c.createEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());\r
-               a.createEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);\r
-               b.createEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
-\r
-               Simulation.TIMELINE.executeAll();\r
-\r
-               assertBitArrayEquals(c.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ZERO);\r
-       }\r
-\r
-       @Test\r
-       void orTest()\r
-       {\r
-               Simulation.TIMELINE.reset();\r
-               Wire a = new Wire(4, 1), b = new Wire(4, 3), c = new Wire(4, 1);\r
-               new OrGate(1, c.createEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());\r
-               a.createEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);\r
-               b.createEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
-\r
-               Simulation.TIMELINE.executeAll();\r
-\r
-               assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ONE);\r
-       }\r
-\r
-       @Test\r
-       void xorTest()\r
-       {\r
-               Simulation.TIMELINE.reset();\r
-               Wire a = new Wire(3, 1), b = new Wire(3, 2), c = new Wire(3, 1), d = new Wire(3, 1);\r
-               new XorGate(1, d.createEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());\r
-               a.createEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);\r
-               b.createEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);\r
-               c.createEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);\r
-\r
-               Simulation.TIMELINE.executeAll();\r
-\r
-               assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE);\r
-       }\r
-\r
-       @Test\r
-       void notTest()\r
-       {\r
-               Simulation.TIMELINE.reset();\r
-               Wire a = new Wire(3, 1), b = new Wire(3, 2);\r
-               new NotGate(1, a.createReadOnlyEnd(), b.createEnd());\r
-               a.createEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);\r
-\r
-               Simulation.TIMELINE.executeAll();\r
-\r
-               assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO, Bit.ZERO);\r
-       }\r
-\r
-       @Test\r
-       void rsLatchCircuitTest()\r
-       {\r
-               Simulation.TIMELINE.reset();\r
-               Wire r = new Wire(1, 1), s = new Wire(1, 1), t1 = new Wire(1, 15), t2 = new Wire(1, 1), q = new Wire(1, 1), nq = new Wire(1, 1);\r
-\r
-               new OrGate(1, t2.createEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());\r
-               new OrGate(1, t1.createEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());\r
-               new NotGate(1, t2.createReadOnlyEnd(), q.createEnd());\r
-               new NotGate(1, t1.createReadOnlyEnd(), nq.createEnd());\r
-\r
-               WireEnd sIn = s.createEnd(), rIn = r.createEnd();\r
-\r
-               sIn.feedSignals(Bit.ONE);\r
-               rIn.feedSignals(Bit.ZERO);\r
-\r
-               Simulation.TIMELINE.executeAll();\r
-\r
-               assertEquals(Bit.ONE, q.getValue());\r
-               assertEquals(Bit.ZERO, nq.getValue());\r
-\r
-               sIn.feedSignals(Bit.ZERO);\r
-\r
-               Simulation.TIMELINE.executeAll();\r
-               assertEquals(Bit.ONE, q.getValue());\r
-               assertEquals(Bit.ZERO, nq.getValue());\r
-\r
-               rIn.feedSignals(Bit.ONE);\r
-\r
-               Simulation.TIMELINE.executeAll();\r
-\r
-               assertEquals(Bit.ZERO, q.getValue());\r
-               assertEquals(Bit.ONE, nq.getValue());\r
-       }\r
-\r
-       @Test\r
-       void numericValueTest()\r
-       {\r
-               Simulation.TIMELINE.reset();\r
-\r
-               Wire a = new Wire(4, 1);\r
-               a.createEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ONE, Bit.ONE);\r
-\r
-               Simulation.TIMELINE.executeAll();\r
-\r
-               assertEquals(15, a.getUnsignedValue());\r
-               assertEquals(-1, a.getSignedValue());\r
-       }\r
-\r
-       @Test\r
-       void multipleInputs()\r
-       {\r
-               Simulation.TIMELINE.reset();\r
-               Wire w = new Wire(2, 1);\r
-               WireEnd wI1 = w.createEnd(), wI2 = w.createEnd();\r
-               wI1.feedSignals(Bit.ONE, Bit.Z);\r
-               wI2.feedSignals(Bit.Z, Bit.X);\r
-               Simulation.TIMELINE.executeAll();\r
-               assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.X);\r
-\r
-               wI2.feedSignals(Bit.ZERO, Bit.Z);\r
-               Simulation.TIMELINE.executeAll();\r
-               assertBitArrayEquals(w.getValues(), Bit.X, Bit.Z);\r
-\r
-               wI2.feedSignals(Bit.Z, Bit.Z);\r
-               Simulation.TIMELINE.executeAll();\r
-               assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);\r
-\r
-               wI2.feedSignals(Bit.ONE, Bit.Z);\r
-               w.addObserver((i, oldValues) -> fail("WireArray notified observer, although value did not change."));\r
-               Simulation.TIMELINE.executeAll();\r
-               assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);\r
-       }\r
-\r
-       @Test\r
-       void wireConnections()\r
-       {\r
-               // Nur ein Experiment, was über mehrere 'passive' Bausteine hinweg passieren würde\r
-\r
-               Simulation.TIMELINE.reset();\r
-\r
-               Wire a = new Wire(1, 2);\r
-               Wire b = new Wire(1, 2);\r
-               Wire c = new Wire(1, 2);\r
-               WireEnd aI = a.createEnd();\r
-               WireEnd bI = b.createEnd();\r
-               WireEnd cI = c.createEnd();\r
-\r
-               TestBitDisplay test = new TestBitDisplay(c.createReadOnlyEnd());\r
-               TestBitDisplay test2 = new TestBitDisplay(a.createReadOnlyEnd());\r
-               LongConsumer print = time -> System.out.format("Time %2d\n   a: %s\n   b: %s\n   c: %s\n", time, a, b, c);\r
-\r
-               cI.feedSignals(Bit.ONE);\r
-               test.assertAfterSimulationIs(print, Bit.ONE);\r
-\r
-               cI.feedSignals(Bit.X);\r
-               test.assertAfterSimulationIs(print, Bit.X);\r
-\r
-               cI.feedSignals(Bit.X);\r
-               cI.feedSignals(Bit.Z);\r
-               test.assertAfterSimulationIs(print, Bit.Z);\r
-\r
-               new Connector(b.createEnd(), c.createEnd()).connect();\r
-               test.assertAfterSimulationIs(print, Bit.Z);\r
-               System.err.println("ONE");\r
-               bI.feedSignals(Bit.ONE);\r
-               test.assertAfterSimulationIs(print, Bit.ONE);\r
-               System.err.println("ZERO");\r
-               bI.feedSignals(Bit.ZERO);\r
-               test.assertAfterSimulationIs(print, Bit.ZERO);\r
-               System.err.println("Z");\r
-               bI.feedSignals(Bit.Z);\r
-               test.assertAfterSimulationIs(print, Bit.Z);\r
-\r
-               new Connector(a.createEnd(), b.createEnd()).connect();\r
-               System.err.println("Z 2");\r
-               aI.feedSignals(Bit.Z);\r
-               test.assertAfterSimulationIs(print, Bit.Z);\r
-               test2.assertAfterSimulationIs(Bit.Z);\r
-               System.err.println("ONE 2");\r
-               aI.feedSignals(Bit.ONE);\r
-               test.assertAfterSimulationIs(print, Bit.ONE);\r
-               test2.assertAfterSimulationIs(Bit.ONE);\r
-               System.err.println("ZERO 2");\r
-               aI.feedSignals(Bit.ZERO);\r
-               test.assertAfterSimulationIs(print, Bit.ZERO);\r
-               test2.assertAfterSimulationIs(Bit.ZERO);\r
-               System.err.println("Z 2 II");\r
-               aI.feedSignals(Bit.Z);\r
-               test.assertAfterSimulationIs(print, Bit.Z);\r
-               test2.assertAfterSimulationIs(Bit.Z);\r
-\r
-               System.err.println("No Conflict yet");\r
-               bI.feedSignals(Bit.ONE);\r
-               test.assertAfterSimulationIs(print, Bit.ONE);\r
-               test2.assertAfterSimulationIs(Bit.ONE);\r
-               aI.feedSignals(Bit.ONE);\r
-               test.assertAfterSimulationIs(print, Bit.ONE);\r
-               test2.assertAfterSimulationIs(Bit.ONE);\r
-               System.err.println("Conflict");\r
-               aI.feedSignals(Bit.ZERO);\r
-               test.assertAfterSimulationIs(print, Bit.X);\r
-               test2.assertAfterSimulationIs(Bit.X);\r
-               aI.feedSignals(Bit.ONE);\r
-               test.assertAfterSimulationIs(print, Bit.ONE);\r
-               test2.assertAfterSimulationIs(Bit.ONE);\r
-       }\r
-\r
-       private static void assertBitArrayEquals(BitVector actual, Bit... expected)\r
-       {\r
-               assertArrayEquals(expected, actual.getBits());\r
-       }\r
-}\r
+package era.mi.logic.tests;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.util.function.LongConsumer;
+
+import org.junit.jupiter.api.Test;
+
+import era.mi.logic.Simulation;
+import era.mi.logic.components.Connector;
+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.types.Bit;
+import era.mi.logic.types.BitVector;
+import era.mi.logic.wires.Wire;
+import era.mi.logic.wires.Wire.WireEnd;
+
+@SuppressWarnings("unused")
+class ComponentTest
+{
+
+       @Test
+       void circuitExampleTest()
+       {
+               Simulation.TIMELINE.reset();
+               Wire a = new Wire(1, 1), b = new Wire(1, 1), c = new Wire(1, 10), d = new Wire(2, 1), e = new Wire(1, 1), f = new Wire(1, 1),
+                               g = new Wire(1, 1), h = new Wire(2, 1), i = new Wire(2, 1), j = new Wire(1, 1), k = new Wire(1, 1);
+               new AndGate(1, f.createEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
+               new NotGate(1, f.createReadOnlyEnd(), g.createEnd());
+               new Merger(h.createEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd());
+               new Mux(1, i.createEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd());
+               new Splitter(i.createReadOnlyEnd(), k.createEnd(), j.createEnd());
+
+               a.createEnd().feedSignals(Bit.ZERO);
+               b.createEnd().feedSignals(Bit.ONE);
+               c.createEnd().feedSignals(Bit.ZERO);
+               d.createEnd().feedSignals(Bit.ONE, Bit.ONE);
+               e.createEnd().feedSignals(Bit.ZERO);
+
+               Simulation.TIMELINE.executeAll();
+
+               assertEquals(Bit.ONE, j.getValue());
+               assertEquals(Bit.ZERO, k.getValue());
+       }
+
+       @Test
+       void splitterTest()
+       {
+               Simulation.TIMELINE.reset();
+               Wire a = new Wire(3, 1), b = new Wire(2, 1), c = new Wire(3, 1), in = new Wire(8, 1);
+               in.createEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
+               new Splitter(in.createReadOnlyEnd(), a.createEnd(), b.createEnd(), c.createEnd());
+
+               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();
+               Wire a = new Wire(3, 1), b = new Wire(2, 1), c = new Wire(3, 1), out = new Wire(8, 1);
+               a.createEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO);
+               b.createEnd().feedSignals(Bit.ONE, Bit.ZERO);
+               c.createEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
+
+               new Merger(out.createEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
+
+               Simulation.TIMELINE.executeAll();
+
+               assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
+       }
+
+       @Test
+       void triStateBufferTest()
+       {
+               Wire a = new Wire(1, 1), b = new Wire(1, 1), en = new Wire(1, 1), notEn = new Wire(1, 1);
+               new NotGate(1, en.createReadOnlyEnd(), notEn.createEnd());
+               new TriStateBuffer(1, a.createReadOnlyEnd(), b.createEnd(), en.createReadOnlyEnd());
+               new TriStateBuffer(1, b.createReadOnlyEnd(), a.createEnd(), notEn.createReadOnlyEnd());
+
+               WireEnd enI = en.createEnd(), aI = a.createEnd(), bI = b.createEnd();
+               enI.feedSignals(Bit.ONE);
+               aI.feedSignals(Bit.ONE);
+               bI.feedSignals(Bit.Z);
+
+               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();
+               Wire a = new Wire(4, 3), b = new Wire(4, 6), c = new Wire(4, 4), select = new Wire(2, 5), out = new Wire(4, 1);
+               WireEnd selectIn = select.createEnd();
+
+               selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
+               a.createEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
+               c.createEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
+
+               new Mux(1, out.createEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
+               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();
+               Wire a = new Wire(4, 3), b = new Wire(4, 6), c = new Wire(4, 4), select = new Wire(2, 5), in = new Wire(4, 1);
+               WireEnd selectIn = select.createEnd();
+
+               selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
+               in.createEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
+
+               new Demux(1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createEnd(), b.createEnd(), c.createEnd());
+               Simulation.TIMELINE.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.ZERO, Bit.ONE);
+               Simulation.TIMELINE.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);
+               Simulation.TIMELINE.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()
+       {
+               Simulation.TIMELINE.reset();
+               Wire a = new Wire(4, 1), b = new Wire(4, 3), c = new Wire(4, 1);
+               new AndGate(1, c.createEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
+               a.createEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
+               b.createEnd().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();
+               Wire a = new Wire(4, 1), b = new Wire(4, 3), c = new Wire(4, 1);
+               new OrGate(1, c.createEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
+               a.createEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
+               b.createEnd().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();
+               Wire a = new Wire(3, 1), b = new Wire(3, 2), c = new Wire(3, 1), d = new Wire(3, 1);
+               new XorGate(1, d.createEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
+               a.createEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
+               b.createEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
+               c.createEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
+
+               Simulation.TIMELINE.executeAll();
+
+               assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE);
+       }
+
+       @Test
+       void notTest()
+       {
+               Simulation.TIMELINE.reset();
+               Wire a = new Wire(3, 1), b = new Wire(3, 2);
+               new NotGate(1, a.createReadOnlyEnd(), b.createEnd());
+               a.createEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
+
+               Simulation.TIMELINE.executeAll();
+
+               assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO, Bit.ZERO);
+       }
+
+       @Test
+       void rsLatchCircuitTest()
+       {
+               Simulation.TIMELINE.reset();
+               Wire r = new Wire(1, 1), s = new Wire(1, 1), t1 = new Wire(1, 15), t2 = new Wire(1, 1), q = new Wire(1, 1), nq = new Wire(1, 1);
+
+               new OrGate(1, t2.createEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
+               new OrGate(1, t1.createEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
+               new NotGate(1, t2.createReadOnlyEnd(), q.createEnd());
+               new NotGate(1, t1.createReadOnlyEnd(), nq.createEnd());
+
+               WireEnd sIn = s.createEnd(), rIn = r.createEnd();
+
+               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();
+
+               Wire a = new Wire(4, 1);
+               a.createEnd().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();
+               Wire w = new Wire(2, 1);
+               WireEnd wI1 = w.createEnd(), wI2 = w.createEnd();
+               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();
+
+               Wire a = new Wire(1, 2);
+               Wire b = new Wire(1, 2);
+               Wire c = new Wire(1, 2);
+               WireEnd aI = a.createEnd();
+               WireEnd bI = b.createEnd();
+               WireEnd cI = c.createEnd();
+
+               TestBitDisplay test = new TestBitDisplay(c.createReadOnlyEnd());
+               TestBitDisplay test2 = new TestBitDisplay(a.createReadOnlyEnd());
+               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.createEnd(), c.createEnd()).connect();
+               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.createEnd(), b.createEnd()).connect();
+               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(BitVector actual, Bit... expected)
+       {
+               assertArrayEquals(expected, actual.getBits());
+       }
+}
index d821752..cb0494e 100644 (file)
@@ -1,47 +1,47 @@
-package era.mi.logic.tests;\r
-\r
-import static org.junit.jupiter.api.Assertions.assertArrayEquals;\r
-\r
-import java.util.function.LongConsumer;\r
-\r
-import era.mi.logic.Simulation;\r
-import era.mi.logic.components.BitDisplay;\r
-import era.mi.logic.types.Bit;\r
-import era.mi.logic.wires.Wire.WireEnd;\r
-\r
-public final class TestBitDisplay extends BitDisplay\r
-{\r
-\r
-       public TestBitDisplay(WireEnd in)\r
-       {\r
-               super(in);\r
-       }\r
-\r
-       public void assertDisplays(Bit... expected)\r
-       {\r
-               assertArrayEquals(expected, getDisplayedValue().getBits());\r
-       }\r
-\r
-       public void assertAfterSimulationIs(Bit... expected)\r
-       {\r
-               Simulation.TIMELINE.executeAll();\r
-               assertDisplays(expected);\r
-       }\r
-\r
-       public void assertAfterSimulationIs(LongConsumer r, Bit... expected)\r
-       {\r
-               while (Simulation.TIMELINE.hasNext())\r
-               {\r
-                       Simulation.TIMELINE.executeNext();\r
-                       r.accept(Simulation.TIMELINE.getSimulationTime());\r
-               }\r
-               assertDisplays(expected);\r
-       }\r
-\r
-       @Override\r
-       protected void compute()\r
-       {\r
-               super.compute();\r
-               System.out.println("update: value is " + getDisplayedValue());\r
-       }\r
-}\r
+package era.mi.logic.tests;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+
+import java.util.function.LongConsumer;
+
+import era.mi.logic.Simulation;
+import era.mi.logic.components.BitDisplay;
+import era.mi.logic.types.Bit;
+import era.mi.logic.wires.Wire.WireEnd;
+
+public final class TestBitDisplay extends BitDisplay
+{
+
+       public TestBitDisplay(WireEnd in)
+       {
+               super(in);
+       }
+
+       public void assertDisplays(Bit... expected)
+       {
+               assertArrayEquals(expected, getDisplayedValue().getBits());
+       }
+
+       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 " + getDisplayedValue());
+       }
+}
index 9e64938..8107db9 100644 (file)
-package era.mi.logic.timeline;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-import java.util.PriorityQueue;\r
-import java.util.function.Consumer;\r
-\r
-/**\r
- * Orders Events by the time they are due to be executed. Can execute Events individually.\r
- * \r
- * @author Fabian Stemmler\r
- *\r
- */\r
-public class Timeline\r
-{\r
-       private PriorityQueue<InnerEvent> events;\r
-       private long currentTime = 0;\r
-\r
-       private final List<Consumer<TimelineEvent>> eventAddedListener;\r
-\r
-       public Timeline(int initCapacity)\r
-       {\r
-               events = new PriorityQueue<InnerEvent>(initCapacity, (a, b) ->\r
-               {\r
-                       long difference = a.getTiming() - b.getTiming();\r
-                       if (difference == 0)\r
-                               return 0;\r
-                       return difference < 0 ? -1 : 1;\r
-               });\r
-\r
-               eventAddedListener = new ArrayList<>();\r
-       }\r
-\r
-       public boolean hasNext()\r
-       {\r
-               return !events.isEmpty();\r
-       }\r
-\r
-       public void executeNext()\r
-       {\r
-               InnerEvent first = events.poll();\r
-               currentTime = first.getTiming();\r
-               first.run();\r
-       }\r
-\r
-       public void executeAll()\r
-       {\r
-               while (hasNext())\r
-                       executeNext();\r
-       }\r
-\r
-       /**\r
-        * Executes all events up to a given simulation timestamp. The simulation process can be constrained by a real world timestamp.\r
-        * \r
-        * @param timestamp  the simulation timestamp up to which the events will be processed\r
-        * @param stopMillis the System.currentTimeMillis() when simulation definitely needs to stop.\r
-        * @return if it was possible to fulfil the goal in the given real world time.\r
-        * @author Christian Femers\r
-        */\r
-       public ExecutionResult executeUpTo(long timestamp, long stopMillis)\r
-       {\r
-               if (events.isEmpty())\r
-               {\r
-                       currentTime = timestamp;\r
-                       return ExecutionResult.NOTHING_DONE;\r
-               }\r
-               int checkStop = 0;\r
-               InnerEvent first = events.peek();\r
-               while (first != null && first.getTiming() <= timestamp)\r
-               {\r
-                       events.remove();\r
-                       currentTime = first.getTiming();\r
-                       first.run();\r
-                       // Don't check after every run\r
-                       checkStop = (checkStop + 1) % 10;\r
-                       if (checkStop == 0 && System.currentTimeMillis() >= stopMillis)\r
-                               return ExecutionResult.RAN_OUT_OF_TIME;\r
-                       first = events.peek();\r
-               }\r
-               currentTime = timestamp;\r
-               return ExecutionResult.DONE_IN_TIME;\r
-       }\r
-\r
-       public long getSimulationTime()\r
-       {\r
-               return currentTime;\r
-       }\r
-\r
-       public long nextEventTime()\r
-       {\r
-               if (!hasNext())\r
-                       return -1;\r
-               return events.peek().timing;\r
-       }\r
-\r
-       public void reset()\r
-       {\r
-               events.clear();\r
-               currentTime = 0;\r
-       }\r
-\r
-       public void addEventAddedListener(Consumer<TimelineEvent> listener)\r
-       {\r
-               eventAddedListener.add(listener);\r
-       }\r
-\r
-       public void removeEventAddedListener(Consumer<TimelineEvent> listener)\r
-       {\r
-               eventAddedListener.remove(listener);\r
-       }\r
-\r
-       /**\r
-        * Adds an Event to the {@link Timeline}\r
-        * \r
-        * @param function       The {@link TimelineEventHandler} that will be executed, when the {@link InnerEvent} occurs on the timeline.\r
-        * @param relativeTiming The amount of MI ticks in which the {@link InnerEvent} is called, starting from the current time.\r
-        */\r
-       public void addEvent(TimelineEventHandler function, int relativeTiming)\r
-       {\r
-               long timing = currentTime + relativeTiming;\r
-               TimelineEvent event = new TimelineEvent(timing);\r
-               events.add(new InnerEvent(function, event, timing));\r
-               eventAddedListener.forEach(l -> l.accept(event));\r
-       }\r
-\r
-       private class InnerEvent\r
-       {\r
-\r
-               final long timing;\r
-               private final TimelineEventHandler function;\r
-               private final TimelineEvent event;\r
-\r
-               /**\r
-                * Creates an {@link InnerEvent}\r
-                * \r
-                * @param function {@link TimelineEventHandler} to be executed when the {@link InnerEvent} occurs\r
-                * @param timing   Point in the MI simulation {@link Timeline}, at which the {@link InnerEvent} is executed;\r
-                */\r
-               InnerEvent(TimelineEventHandler function, TimelineEvent event, long timing)\r
-               {\r
-                       this.function = function;\r
-                       this.event = event;\r
-                       this.timing = timing;\r
-               }\r
-\r
-               public long getTiming()\r
-               {\r
-                       return timing;\r
-               }\r
-\r
-               public void run()\r
-               {\r
-                       function.handle(event);\r
-               }\r
-\r
-               @Override\r
-               public String toString()\r
-               {\r
-                       return event.toString();\r
-               }\r
-       }\r
-\r
-       @Override\r
-       public String toString()\r
-       {\r
-               return "simulation time: " + currentTime + ", " + events.toString();\r
-       }\r
-\r
-       public static long toNanoseconds(long ticks)\r
-       {\r
-               return ticks; // TODO: Alter this when it has been determined how ticks should relate to real time.\r
-       }\r
-\r
-       public enum ExecutionResult\r
-       {\r
-               NOTHING_DONE, DONE_IN_TIME, RAN_OUT_OF_TIME\r
-       }\r
+package era.mi.logic.timeline;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.PriorityQueue;
+import java.util.function.Consumer;
+
+/**
+ * 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;
+
+       private final List<Consumer<TimelineEvent>> eventAddedListener;
+
+       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;
+               });
+
+               eventAddedListener = new ArrayList<>();
+       }
+
+       public boolean hasNext()
+       {
+               return !events.isEmpty();
+       }
+
+       public void executeNext()
+       {
+               InnerEvent first = events.poll();
+               currentTime = first.getTiming();
+               first.run();
+       }
+
+       public void executeAll()
+       {
+               while (hasNext())
+                       executeNext();
+       }
+
+       /**
+        * Executes all events up to a given simulation timestamp. The simulation process can be constrained by a real world timestamp.
+        * 
+        * @param timestamp  the simulation timestamp up to which the events will be processed
+        * @param stopMillis the System.currentTimeMillis() when simulation definitely needs to stop.
+        * @return if it was possible to fulfil the goal in the given real world time.
+        * @author Christian Femers
+        */
+       public ExecutionResult executeUpTo(long timestamp, long stopMillis)
+       {
+               if (events.isEmpty())
+               {
+                       currentTime = timestamp;
+                       return ExecutionResult.NOTHING_DONE;
+               }
+               int checkStop = 0;
+               InnerEvent first = events.peek();
+               while (first != null && first.getTiming() <= timestamp)
+               {
+                       events.remove();
+                       currentTime = first.getTiming();
+                       first.run();
+                       // Don't check after every run
+                       checkStop = (checkStop + 1) % 10;
+                       if (checkStop == 0 && System.currentTimeMillis() >= stopMillis)
+                               return ExecutionResult.RAN_OUT_OF_TIME;
+                       first = events.peek();
+               }
+               currentTime = timestamp;
+               return ExecutionResult.DONE_IN_TIME;
+       }
+
+       public long getSimulationTime()
+       {
+               return currentTime;
+       }
+
+       public long nextEventTime()
+       {
+               if (!hasNext())
+                       return -1;
+               return events.peek().timing;
+       }
+
+       public void reset()
+       {
+               events.clear();
+               currentTime = 0;
+       }
+
+       public void addEventAddedListener(Consumer<TimelineEvent> listener)
+       {
+               eventAddedListener.add(listener);
+       }
+
+       public void removeEventAddedListener(Consumer<TimelineEvent> listener)
+       {
+               eventAddedListener.remove(listener);
+       }
+
+       /**
+        * 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;
+               TimelineEvent event = new TimelineEvent(timing);
+               events.add(new InnerEvent(function, event, timing));
+               eventAddedListener.forEach(l -> l.accept(event));
+       }
+
+       private class InnerEvent
+       {
+
+               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.
+       }
+
+       public enum ExecutionResult
+       {
+               NOTHING_DONE, DONE_IN_TIME, RAN_OUT_OF_TIME
+       }
 }
\ No newline at end of file
index cc37c99..46decf5 100644 (file)
@@ -1,30 +1,30 @@
-package era.mi.logic.timeline;\r
-\r
-/**\r
- * A class that stores all relevant information about an event in the {@link Timeline}. Currently, there is not much relevant information to\r
- * store.\r
- * \r
- * @author Fabian Stemmler\r
- *\r
- */\r
-public class TimelineEvent\r
-{\r
-       private final long timing;\r
-\r
-       TimelineEvent(long timing)\r
-       {\r
-               super();\r
-               this.timing = timing;\r
-       }\r
-\r
-       public long getTiming()\r
-       {\r
-               return timing;\r
-       }\r
-\r
-       @Override\r
-       public String toString()\r
-       {\r
-               return "timestamp: " + timing;\r
-       }\r
+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;
+       }
+
+       @Override
+       public String toString()
+       {
+               return "timestamp: " + timing;
+       }
 }
\ No newline at end of file
index c2dcb98..59a91c9 100644 (file)
@@ -1,6 +1,6 @@
-package era.mi.logic.timeline;\r
-\r
-public interface TimelineEventHandler\r
-{\r
-       public void handle(TimelineEvent e);\r
+package era.mi.logic.timeline;
+
+public interface TimelineEventHandler
+{
+       public void handle(TimelineEvent e);
 }
\ No newline at end of file
diff --git a/logicui b/logicui
new file mode 160000 (submodule)
index 0000000..32a3d41
--- /dev/null
+++ b/logicui
@@ -0,0 +1 @@
+Subproject commit 32a3d41c11b96c2530c25b6059b4341a8b34a2e2