Cleanup; Cleared warnings in the logic core
authorFabian Stemmler <stemmler@in.tum.de>
Sun, 2 Jun 2019 10:01:56 +0000 (12:01 +0200)
committerFabian Stemmler <stemmler@in.tum.de>
Sun, 2 Jun 2019 10:02:32 +0000 (12:02 +0200)
net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObservable.java
net.mograsim.logic.core/src/net/mograsim/logic/core/components/Mux.java
net.mograsim.logic.core/src/net/mograsim/logic/core/tests/ComponentTest.java
net.mograsim.logic.core/src/net/mograsim/logic/core/tests/GUITest.java
net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java
net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVectorFormatter.java
net.mograsim.logic.core/src/net/mograsim/logic/core/wires/Wire.java

index ddfa070..501d4b0 100644 (file)
@@ -4,7 +4,8 @@ public interface LogicObservable
 {\r
        public void registerObserver(LogicObserver ob);\r
 \r
+       public void deregisterObserver(LogicObserver ob);\r
+\r
        public void notifyObservers();\r
 \r
-//     public InnerState getInnerState();\r
 }\r
index 5e75f96..4980d77 100644 (file)
@@ -1,95 +1,95 @@
-package net.mograsim.logic.core.components;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.wires.Wire;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-/**
- * 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 ReadEnd select;
-       private ReadWriteEnd out;
-       private ReadEnd[] 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(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs)
-       {
-               super(timeline, 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].registerObserver(this);
-               }
-
-               this.select = select;
-               select.registerObserver(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 ReadEnd getOut()
-       {
-               return out;
-       }
-
-       public ReadEnd getSelect()
-       {
-               return select;
-       }
-
-       @Override
-       public void compute()
-       {
-               int selectValue;
-               if (!select.hasNumericValue() || (selectValue = (int) select.getUnsignedValue()) >= inputs.length)
-               {
-                       out.clearSignals();
-                       return;
-               }
-
-               ReadEnd active = inputs[selectValue];
-               out.feedSignals(active.getValues());
-       }
-
-       @Override
-       public List<ReadEnd> getAllInputs()
-       {
-               ArrayList<ReadEnd> wires = new ArrayList<ReadEnd>(Arrays.asList(inputs));
-               wires.add(select);
-               return Collections.unmodifiableList(wires);
-       }
-
-       @Override
-       public List<ReadWriteEnd> getAllOutputs()
-       {
-               return List.of(out);
-       }
-}
+package net.mograsim.logic.core.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 net.mograsim.logic.core.timeline.Timeline;\r
+import net.mograsim.logic.core.wires.Wire;\r
+import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\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 ReadEnd select;\r
+       private ReadWriteEnd out;\r
+       private ReadEnd[] 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(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs)\r
+       {\r
+               super(timeline, 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].registerObserver(this);\r
+               }\r
+\r
+               this.select = select;\r
+               select.registerObserver(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 ReadEnd getOut()\r
+       {\r
+               return out;\r
+       }\r
+\r
+       public ReadEnd 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
+               ReadEnd active = inputs[selectValue];\r
+               out.feedSignals(active.getValues());\r
+       }\r
+\r
+       @Override\r
+       public List<ReadEnd> getAllInputs()\r
+       {\r
+               ArrayList<ReadEnd> wires = new ArrayList<>(Arrays.asList(inputs));\r
+               wires.add(select);\r
+               return Collections.unmodifiableList(wires);\r
+       }\r
+\r
+       @Override\r
+       public List<ReadWriteEnd> getAllOutputs()\r
+       {\r
+               return List.of(out);\r
+       }\r
+}\r
index e97836b..c1bdba5 100644 (file)
@@ -1,6 +1,5 @@
 package net.mograsim.logic.core.tests;\r
 \r
-import static org.junit.Assert.assertTrue;\r
 import static org.junit.jupiter.api.Assertions.assertArrayEquals;\r
 import static org.junit.jupiter.api.Assertions.assertEquals;\r
 import static org.junit.jupiter.api.Assertions.fail;\r
@@ -26,6 +25,7 @@ import net.mograsim.logic.core.wires.Wire;
 import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
 \r
+@SuppressWarnings("unused")\r
 class ComponentTest\r
 {\r
        private Timeline t = new Timeline(11);\r
index 7d06621..544b064 100644 (file)
@@ -114,7 +114,7 @@ public class GUITest extends JPanel
        public Timeline getTimeline()
        {
                return t;
-       };
+       }
 
        @Override
        public void paint(Graphics some_g)
@@ -177,6 +177,7 @@ public class GUITest extends JPanel
                g.setFont(g.getFont().deriveFont(Math.min(height, width) / 40f));
        }
 
+       @SuppressWarnings("static-method")
        private void drawString(Graphics g, String s, int x, int y, double anchorX, double anchorY)
        {
                int h = g.getFontMetrics().getAscent();
index fb639be..80a65f4 100644 (file)
-package net.mograsim.logic.core.timeline;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.PriorityQueue;
-import java.util.function.BooleanSupplier;
-import java.util.function.Consumer;
-import java.util.function.LongSupplier;
-
-/**
- * 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 LongSupplier time;
-       private long lastTimeUpdated = 0;
-
-       private final List<Consumer<TimelineEvent>> eventAddedListener;
-
-       public Timeline(int initCapacity)
-       {
-               events = new PriorityQueue<InnerEvent>(initCapacity);
-
-               eventAddedListener = new ArrayList<>();
-               time = () -> lastTimeUpdated;
-       }
-
-       /**
-        * @param timestamp exclusive
-        * @return true if the first event is later than the timestamp
-        */
-       public BooleanSupplier laterThan(long timestamp)
-       {
-               return () -> timeCmp(events.peek().getTiming(), timestamp) > 0;
-       }
-
-       public boolean hasNext()
-       {
-               return !events.isEmpty();
-       }
-
-       /**
-        * Executes all events at the next timestamp, at which there are any
-        */
-       public void executeNext()
-       {
-               InnerEvent first = events.peek();
-               if (first != null)
-                       executeUntil(laterThan(first.getTiming()), -1);
-       }
-
-       public void executeAll()
-       {
-               while (hasNext())
-                       executeNext();
-       }
-
-       /**
-        * Executes all events until a given condition is met. The simulation process can be constrained by a real world timestamp.
-        * 
-        * @param condition  the condition until which the events are be processed
-        * @param stopMillis the System.currentTimeMillis() when simulation definitely needs to stop. A value of -1 means no timeout.
-        * @return State of the event execution
-        * @formatter:off
-        * <code>NOTHING_DONE</code> if the {@link Timeline} was already empty
-        * <code>EXEC_OUT_OF_TIME</code> if the given maximum time was reached
-        * <code>EXEC_UNTIL_CONDITION</code> if the condition was met
-        * <code>EXEC_UNTIL_EMPTY</code> if events were executed until the {@link Timeline} was empty
-        * @formatter:on
-        * @author Christian Femers, Fabian Stemmler
-        */
-       public ExecutionResult executeUntil(BooleanSupplier condition, long stopMillis)
-       {
-               if (events.isEmpty())
-               {
-                       lastTimeUpdated = getSimulationTime();
-                       return ExecutionResult.NOTHING_DONE;
-               }
-               int checkStop = 0;
-               InnerEvent first = events.peek();
-               while (hasNext() && !condition.getAsBoolean())
-               {
-                       events.remove();
-                       lastTimeUpdated = first.getTiming();
-                       first.run();
-                       // Don't check after every run
-                       checkStop = (checkStop + 1) % 10;
-                       if (checkStop == 0 && System.currentTimeMillis() >= stopMillis)
-                               return ExecutionResult.EXEC_OUT_OF_TIME;
-                       first = events.peek();
-               }
-               lastTimeUpdated = getSimulationTime();
-               return hasNext() ? ExecutionResult.EXEC_UNTIL_EMPTY : ExecutionResult.EXEC_UNTIL_CONDITION;
-       }
-
-       public void setTimeFunction(LongSupplier time)
-       {
-               this.time = time;
-       }
-
-       public long getSimulationTime()
-       {
-               return time.getAsLong();
-       }
-
-       public long nextEventTime()
-       {
-               if (!hasNext())
-                       return -1;
-               return events.peek().getTiming();
-       }
-
-       public void reset()
-       {
-               events.clear();
-               lastTimeUpdated = 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 = getSimulationTime() + relativeTiming;
-               TimelineEvent event = new TimelineEvent(timing);
-               events.add(new InnerEvent(function, event));
-               eventAddedListener.forEach(l -> l.accept(event));
-       }
-
-       private class InnerEvent implements Runnable, Comparable<InnerEvent>
-       {
-               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)
-               {
-                       this.function = function;
-                       this.event = event;
-               }
-
-               public long getTiming()
-               {
-                       return event.getTiming();
-               }
-
-               @Override
-               public void run()
-               {
-                       function.handle(event);
-               }
-
-               @Override
-               public String toString()
-               {
-                       return event.toString();
-               }
-
-               @Override
-               public int compareTo(InnerEvent o)
-               {
-                       return timeCmp(getTiming(), o.getTiming());
-               }
-       }
-
-       public static int timeCmp(long a, long b)
-       {
-               return Long.signum(a - b);
-       }
-
-       @Override
-       public String toString()
-       {
-               return String.format("Simulation time: %s, Last update: %d, Events: %s", getSimulationTime(), lastTimeUpdated, events.toString());
-       }
-
-       public enum ExecutionResult
-       {
-               NOTHING_DONE, EXEC_UNTIL_EMPTY, EXEC_UNTIL_CONDITION, EXEC_OUT_OF_TIME
-       }
+package net.mograsim.logic.core.timeline;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.PriorityQueue;\r
+import java.util.function.BooleanSupplier;\r
+import java.util.function.Consumer;\r
+import java.util.function.LongSupplier;\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 LongSupplier time;\r
+       private long lastTimeUpdated = 0;\r
+\r
+       private final List<Consumer<TimelineEvent>> eventAddedListener;\r
+\r
+       public Timeline(int initCapacity)\r
+       {\r
+               events = new PriorityQueue<>(initCapacity);\r
+\r
+               eventAddedListener = new ArrayList<>();\r
+               time = () -> lastTimeUpdated;\r
+       }\r
+\r
+       /**\r
+        * @param timestamp exclusive\r
+        * @return true if the first event is later than the timestamp\r
+        */\r
+       public BooleanSupplier laterThan(long timestamp)\r
+       {\r
+               return () -> timeCmp(events.peek().getTiming(), timestamp) > 0;\r
+       }\r
+\r
+       public boolean hasNext()\r
+       {\r
+               return !events.isEmpty();\r
+       }\r
+\r
+       /**\r
+        * Executes all events at the next timestamp, at which there are any\r
+        */\r
+       public void executeNext()\r
+       {\r
+               InnerEvent first = events.peek();\r
+               if (first != null)\r
+                       executeUntil(laterThan(first.getTiming()), -1);\r
+       }\r
+\r
+       public void executeAll()\r
+       {\r
+               while (hasNext())\r
+                       executeNext();\r
+       }\r
+\r
+       /**\r
+        * Executes all events until a given condition is met. The simulation process can be constrained by a real world timestamp.\r
+        * \r
+        * @param condition  the condition until which the events are be processed\r
+        * @param stopMillis the System.currentTimeMillis() when simulation definitely needs to stop. A value of -1 means no timeout.\r
+        * @return State of the event execution\r
+        * @formatter:off\r
+        * <code>NOTHING_DONE</code> if the {@link Timeline} was already empty\r
+        * <code>EXEC_OUT_OF_TIME</code> if the given maximum time was reached\r
+        * <code>EXEC_UNTIL_CONDITION</code> if the condition was met\r
+        * <code>EXEC_UNTIL_EMPTY</code> if events were executed until the {@link Timeline} was empty\r
+        * @formatter:on\r
+        * @author Christian Femers, Fabian Stemmler\r
+        */\r
+       public ExecutionResult executeUntil(BooleanSupplier condition, long stopMillis)\r
+       {\r
+               if (events.isEmpty())\r
+               {\r
+                       lastTimeUpdated = getSimulationTime();\r
+                       return ExecutionResult.NOTHING_DONE;\r
+               }\r
+               int checkStop = 0;\r
+               InnerEvent first = events.peek();\r
+               while (hasNext() && !condition.getAsBoolean())\r
+               {\r
+                       events.remove();\r
+                       lastTimeUpdated = 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.EXEC_OUT_OF_TIME;\r
+                       first = events.peek();\r
+               }\r
+               lastTimeUpdated = getSimulationTime();\r
+               return hasNext() ? ExecutionResult.EXEC_UNTIL_EMPTY : ExecutionResult.EXEC_UNTIL_CONDITION;\r
+       }\r
+\r
+       public void setTimeFunction(LongSupplier time)\r
+       {\r
+               this.time = time;\r
+       }\r
+\r
+       public long getSimulationTime()\r
+       {\r
+               return time.getAsLong();\r
+       }\r
+\r
+       public long nextEventTime()\r
+       {\r
+               if (!hasNext())\r
+                       return -1;\r
+               return events.peek().getTiming();\r
+       }\r
+\r
+       public void reset()\r
+       {\r
+               events.clear();\r
+               lastTimeUpdated = 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 = getSimulationTime() + relativeTiming;\r
+               TimelineEvent event = new TimelineEvent(timing);\r
+               events.add(new InnerEvent(function, event));\r
+               eventAddedListener.forEach(l -> l.accept(event));\r
+       }\r
+\r
+       private class InnerEvent implements Runnable, Comparable<InnerEvent>\r
+       {\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)\r
+               {\r
+                       this.function = function;\r
+                       this.event = event;\r
+               }\r
+\r
+               public long getTiming()\r
+               {\r
+                       return event.getTiming();\r
+               }\r
+\r
+               @Override\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
+               @Override\r
+               public int compareTo(InnerEvent o)\r
+               {\r
+                       return timeCmp(getTiming(), o.getTiming());\r
+               }\r
+       }\r
+\r
+       public static int timeCmp(long a, long b)\r
+       {\r
+               return Long.signum(a - b);\r
+       }\r
+\r
+       @Override\r
+       public String toString()\r
+       {\r
+               return String.format("Simulation time: %s, Last update: %d, Events: %s", getSimulationTime(), lastTimeUpdated, events.toString());\r
+       }\r
+\r
+       public enum ExecutionResult\r
+       {\r
+               NOTHING_DONE, EXEC_UNTIL_EMPTY, EXEC_UNTIL_CONDITION, EXEC_OUT_OF_TIME\r
+       }\r
 }
\ No newline at end of file
index a798531..eb4e45f 100644 (file)
@@ -1,53 +1,51 @@
-package net.mograsim.logic.core.types;
-
-import net.mograsim.logic.core.types.ColorDefinition.BuiltInColor;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-
-public class BitVectorFormatter
-{
-       public static String formatValueAsString(ReadEnd end)
-       {
-               return formatAsString(end == null ? null : end.getValues());
-       }
-
-       public static String formatAsString(BitVector bitVector)
-       {
-               if (bitVector == null)
-                       return "null";
-               else
-                       return bitVector.toString();
-       }
-
-       public static ColorDefinition formatAsColor(ReadEnd end)
-       {
-               return formatAsColor(end == null ? null : end.getValues());
-       }
-
-       public static ColorDefinition formatAsColor(BitVector bitVector)
-       {
-               // TODO maybe find a color assignment for multiple-bit bit vectors?
-               if (bitVector == null || bitVector.length() != 1)
-                       return new ColorDefinition(BuiltInColor.COLOR_BLACK);
-               else
-                       switch (bitVector.getBit(0))
-                       {
-                       case ONE:
-                               return new ColorDefinition(BuiltInColor.COLOR_GREEN);
-                       case U:
-                               return new ColorDefinition(BuiltInColor.COLOR_CYAN);
-                       case X:
-                               return new ColorDefinition(BuiltInColor.COLOR_RED);
-                       case Z:
-                               return new ColorDefinition(BuiltInColor.COLOR_YELLOW);
-                       case ZERO:
-                               return new ColorDefinition(BuiltInColor.COLOR_GRAY);
-                       default:
-                               throw new IllegalArgumentException("Unknown enum constant: " + bitVector.getBit(0));
-                       }
-       }
-
-       private BitVectorFormatter()
-       {
-               throw new UnsupportedOperationException("No BitVectorFormatter instances");
-       }
+package net.mograsim.logic.core.types;\r
+\r
+import net.mograsim.logic.core.types.ColorDefinition.BuiltInColor;\r
+import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
+\r
+public class BitVectorFormatter\r
+{\r
+       public static String formatValueAsString(ReadEnd end)\r
+       {\r
+               return formatAsString(end == null ? null : end.getValues());\r
+       }\r
+\r
+       public static String formatAsString(BitVector bitVector)\r
+       {\r
+               if (bitVector == null)\r
+                       return "null";\r
+               return bitVector.toString();\r
+       }\r
+\r
+       public static ColorDefinition formatAsColor(ReadEnd end)\r
+       {\r
+               return formatAsColor(end == null ? null : end.getValues());\r
+       }\r
+\r
+       public static ColorDefinition formatAsColor(BitVector bitVector)\r
+       {\r
+               // TODO maybe find a color assignment for multiple-bit bit vectors?\r
+               if (bitVector == null || bitVector.length() != 1)\r
+                       return new ColorDefinition(BuiltInColor.COLOR_BLACK);\r
+               switch (bitVector.getBit(0))\r
+               {\r
+               case ONE:\r
+                       return new ColorDefinition(BuiltInColor.COLOR_GREEN);\r
+               case U:\r
+                       return new ColorDefinition(BuiltInColor.COLOR_CYAN);\r
+               case X:\r
+                       return new ColorDefinition(BuiltInColor.COLOR_RED);\r
+               case Z:\r
+                       return new ColorDefinition(BuiltInColor.COLOR_YELLOW);\r
+               case ZERO:\r
+                       return new ColorDefinition(BuiltInColor.COLOR_GRAY);\r
+               default:\r
+                       throw new IllegalArgumentException("Unknown enum constant: " + bitVector.getBit(0));\r
+               }\r
+       }\r
+\r
+       private BitVectorFormatter()\r
+       {\r
+               throw new UnsupportedOperationException("No BitVectorFormatter instances");\r
+       }\r
 }
\ No newline at end of file
index 404aacd..ffbbd32 100644 (file)
@@ -23,10 +23,10 @@ public class Wire
 {\r
        private BitVector values;\r
        public final int travelTime;\r
-       private List<ReadEnd> attached = new ArrayList<ReadEnd>();\r
+       private List<ReadEnd> attached = new ArrayList<>();\r
        public final int length;\r
-       private List<ReadWriteEnd> inputs = new ArrayList<ReadWriteEnd>();\r
-       private Timeline timeline;\r
+       List<ReadWriteEnd> inputs = new ArrayList<>();\r
+       Timeline timeline;\r
 \r
        public Wire(Timeline timeline, int length, int travelTime)\r
        {\r
@@ -61,12 +61,12 @@ public class Wire
        {\r
                if (values.equals(newValues))\r
                        return;\r
-               BitVector oldValues = values;\r
+//             BitVector oldValues = values;\r
                values = newValues;\r
-               notifyObservers(oldValues);\r
+               notifyObservers();\r
        }\r
 \r
-       private void recalculate()\r
+       void recalculate()\r
        {\r
                switch (inputs.size())\r
                {\r
@@ -174,20 +174,20 @@ public class Wire
         * \r
         * @author Fabian Stemmler\r
         */\r
-       private void attachEnd(ReadEnd end)\r
+       void attachEnd(ReadEnd end)\r
        {\r
                attached.add(end);\r
        }\r
 \r
-       private void detachEnd(ReadEnd end)\r
+       void detachEnd(ReadEnd end)\r
        {\r
                attached.remove(end);\r
        }\r
 \r
-       private void notifyObservers(BitVector oldValues)\r
+       private void notifyObservers()\r
        {\r
                for (ReadEnd o : attached)\r
-                       o.update(oldValues);\r
+                       o.update();\r
        }\r
 \r
        /**\r
@@ -206,7 +206,7 @@ public class Wire
                return new ReadEnd();\r
        }\r
 \r
-       private void registerInput(ReadWriteEnd toRegister)\r
+       void registerInput(ReadWriteEnd toRegister)\r
        {\r
                inputs.add(toRegister);\r
        }\r
@@ -220,15 +220,15 @@ public class Wire
         */\r
        public class ReadEnd implements LogicObservable\r
        {\r
-               private List<LogicObserver> observers = new ArrayList<LogicObserver>();\r
+               private List<LogicObserver> observers = new ArrayList<>();\r
 \r
-               private ReadEnd()\r
+               ReadEnd()\r
                {\r
                        super();\r
                        Wire.this.attachEnd(this);\r
                }\r
 \r
-               public void update(BitVector oldValues)\r
+               public void update()\r
                {\r
                        notifyObservers();\r
                }\r
@@ -345,6 +345,12 @@ public class Wire
                        observers.add(ob);\r
                }\r
 \r
+               @Override\r
+               public void deregisterObserver(LogicObserver ob)\r
+               {\r
+                       observers.remove(ob);\r
+               }\r
+\r
                @Override\r
                public void notifyObservers()\r
                {\r
@@ -358,7 +364,7 @@ public class Wire
                private boolean open;\r
                private BitVector inputValues;\r
 \r
-               private ReadWriteEnd()\r
+               ReadWriteEnd()\r
                {\r
                        super();\r
                        open = true;\r