+ * Created by hneemann on 19.06.17.
+ */
+public class InValue {
+
+ private final long value;
+ private final boolean highZ;
+
+ /**
+ * Creates a new value
+ *
+ * @param value the value
+ */
+ public InValue(long value) {
+ this.value = value;
+ this.highZ = false;
+ }
+
+ /**
+ * Creates a new value
+ *
+ * @param highZ ht ehigh z state
+ */
+ public InValue(boolean highZ) {
+ this.value = 0;
+ this.highZ = true;
+ }
+
+ /**
+ * Creates a new value
+ *
+ * @param value the value
+ */
+ public InValue(ObservableValue value) {
+ if (value.isHighZ()) {
+ this.highZ = true;
+ this.value = 0;
+ } else {
+ this.highZ = false;
+ this.value = value.getValueIgnoreHighZ();
+ }
+ }
+
+ /**
+ * Creates a new instance
+ *
+ * @param value the value a "Z" means "high z"
+ * @throws NumberFormatException NumberFormatException
+ */
+ public InValue(String value) {
+ if (value.toLowerCase().trim().equalsIgnoreCase("z")) {
+ this.highZ = true;
+ this.value = 0;
+ } else {
+ this.highZ = false;
+ this.value = Long.decode(value.trim());
+ }
+
+ }
+
+ /**
+ * @return the value
+ */
+ public long getValue() {
+ return value;
+ }
+
+ /**
+ * @return High Z State
+ */
+ public boolean isHighZ() {
+ return highZ;
+ }
+
+ @Override
+ public String toString() {
+ if (highZ)
+ return "Z";
+ else
+ return Long.toString(value);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ InValue inValue = (InValue) o;
+
+ if (value != inValue.value) return false;
+ return highZ == inValue.highZ;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = (int) (value ^ (value >>> 32));
+ result = 31 * result + (highZ ? 1 : 0);
+ return result;
+ }
+}
diff --git a/src/main/java/de/neemann/digital/draw/elements/Circuit.java b/src/main/java/de/neemann/digital/draw/elements/Circuit.java
index f3f654687..509bce980 100644
--- a/src/main/java/de/neemann/digital/draw/elements/Circuit.java
+++ b/src/main/java/de/neemann/digital/draw/elements/Circuit.java
@@ -11,6 +11,7 @@ import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescription;
import de.neemann.digital.core.element.Rotation;
import de.neemann.digital.core.io.In;
+import de.neemann.digital.core.io.InValue;
import de.neemann.digital.core.io.IntFormat;
import de.neemann.digital.core.io.Out;
import de.neemann.digital.core.memory.DataField;
@@ -74,6 +75,9 @@ public class Circuit {
xStream.alias("vector", Vector.class);
xStream.aliasAttribute(Vector.class, "x", "x");
xStream.aliasAttribute(Vector.class, "y", "y");
+ xStream.alias("value", InValue.class);
+ xStream.aliasAttribute(InValue.class, "value", "v");
+ xStream.aliasAttribute(InValue.class, "highZ", "z");
xStream.addImplicitCollection(ElementAttributes.class, "attributes");
xStream.alias("data", DataField.class);
xStream.registerConverter(new DataFieldConverter());
diff --git a/src/main/java/de/neemann/digital/draw/graphics/Style.java b/src/main/java/de/neemann/digital/draw/graphics/Style.java
index 231c4c5a8..a2c7c162a 100644
--- a/src/main/java/de/neemann/digital/draw/graphics/Style.java
+++ b/src/main/java/de/neemann/digital/draw/graphics/Style.java
@@ -186,10 +186,10 @@ public class Style {
*/
public static Style getWireStyle(ObservableValue value) {
if (value == null) return WIRE;
- if (value.getBits() > 1) return WIRE_BUS;
if (value.isHighZ()) return WIRE_HIGHZ;
+ if (value.getBits() > 1) return WIRE_BUS;
- if (value.getValueIgnoreBurn() == 1) return WIRE_HIGH;
+ if (value.getValueIgnoreHighZ() == 1) return WIRE_HIGH;
else return WIRE_LOW;
}
diff --git a/src/main/java/de/neemann/digital/draw/shapes/SevenSegHexShape.java b/src/main/java/de/neemann/digital/draw/shapes/SevenSegHexShape.java
index e471ba72f..0f1ecf85c 100644
--- a/src/main/java/de/neemann/digital/draw/shapes/SevenSegHexShape.java
+++ b/src/main/java/de/neemann/digital/draw/shapes/SevenSegHexShape.java
@@ -43,7 +43,7 @@ public class SevenSegHexShape extends SevenShape {
if (i == 7) {
return dp.getBool();
} else {
- int v = (int) input.getValueIgnoreBurn() & 0xf;
+ int v = (int) input.getValueIgnoreHighZ() & 0xf;
v = TABLE[v];
return (v & (1 << i)) != 0;
}
diff --git a/src/main/java/de/neemann/digital/draw/shapes/SevenSegShape.java b/src/main/java/de/neemann/digital/draw/shapes/SevenSegShape.java
index 816e51d96..f3503a34c 100644
--- a/src/main/java/de/neemann/digital/draw/shapes/SevenSegShape.java
+++ b/src/main/java/de/neemann/digital/draw/shapes/SevenSegShape.java
@@ -89,13 +89,13 @@ public class SevenSegShape extends SevenShape {
if (persistence && commonCatode) {
if (!ccin.isHighZ() && !ccin.getBool())
- data[i] = inputs.get(i).getValueIgnoreBurn() > 0;
+ data[i] = inputs.get(i).getValueIgnoreHighZ() > 0;
return data[i];
} else {
if (commonCatode && (ccin.isHighZ() || ccin.getBool()))
return false;
- return inputs.get(i).getValueIgnoreBurn() > 0;
+ return inputs.get(i).getValueIgnoreHighZ() > 0;
}
}
diff --git a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java
index 8c2d988bd..a0f22c806 100644
--- a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java
+++ b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java
@@ -5,6 +5,7 @@ import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.*;
import de.neemann.digital.core.io.In;
+import de.neemann.digital.core.io.InValue;
import de.neemann.digital.draw.elements.*;
import de.neemann.digital.draw.shapes.InputShape;
import de.neemann.digital.gui.components.modification.*;
@@ -911,10 +912,10 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe
if (ve.equalsDescription(In.DESCRIPTION)) {
ObservableValue ov = ((InputShape) ve.getShape()).getObservableValue();
if (ov != null) {
- int newValue = (int) ov.getValue();
- int oldValue = ve.getElementAttributes().get(Keys.DEFAULT);
- if (newValue != oldValue)
- builder.add(new ModifyAttribute<>(ve, Keys.DEFAULT, newValue));
+ InValue newValue = new InValue(ov);
+ InValue oldValue = ve.getElementAttributes().get(Keys.INPUT_DEFAULT);
+ if (!newValue.equals(oldValue))
+ builder.add(new ModifyAttribute<>(ve, Keys.INPUT_DEFAULT, newValue));
}
}
modify(builder.build());
diff --git a/src/main/java/de/neemann/digital/gui/components/EditorFactory.java b/src/main/java/de/neemann/digital/gui/components/EditorFactory.java
index f432d7615..ef4c30b02 100644
--- a/src/main/java/de/neemann/digital/gui/components/EditorFactory.java
+++ b/src/main/java/de/neemann/digital/gui/components/EditorFactory.java
@@ -3,6 +3,7 @@ package de.neemann.digital.gui.components;
import de.neemann.digital.analyse.expression.format.FormatToExpression;
import de.neemann.digital.core.NodeException;
import de.neemann.digital.core.element.*;
+import de.neemann.digital.core.io.InValue;
import de.neemann.digital.core.io.IntFormat;
import de.neemann.digital.core.memory.DataField;
import de.neemann.digital.core.memory.ROM;
@@ -44,6 +45,7 @@ public final class EditorFactory {
private EditorFactory() {
add(String.class, StringEditor.class);
add(Integer.class, IntegerEditor.class);
+ add(InValue.class, InValueEditor.class);
add(File.class, FileEditor.class);
add(Color.class, ColorEditor.class);
add(Boolean.class, BooleanEditor.class);
@@ -209,6 +211,28 @@ public final class EditorFactory {
}
}
+ private final static class InValueEditor extends LabelEditor