From 9bc391d09b6043ce6f3dc2eb1c5207a309c56775 Mon Sep 17 00:00:00 2001 From: hneemann Date: Tue, 4 Jul 2017 22:50:12 +0200 Subject: [PATCH] added a getValueSigned() function to ObservableValue --- .../neemann/digital/core/ObservableValue.java | 13 ++++++++++++ .../digital/core/ObservableValueTest.java | 20 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/main/java/de/neemann/digital/core/ObservableValue.java b/src/main/java/de/neemann/digital/core/ObservableValue.java index 943f729fe..7cccf8d9a 100644 --- a/src/main/java/de/neemann/digital/core/ObservableValue.java +++ b/src/main/java/de/neemann/digital/core/ObservableValue.java @@ -11,6 +11,7 @@ public class ObservableValue extends Observable implements PinDescription { private final String name; private final long mask; + private final long signedFlag; private final boolean supportsHighZ; private final int bits; private long value; @@ -45,6 +46,7 @@ public class ObservableValue extends Observable implements PinDescription { mask = -1; else mask = (1L << bits) - 1; + signedFlag = 1 << (bits - 1); this.name = name; supportsHighZ = highZ; } @@ -140,6 +142,17 @@ public class ObservableValue extends Observable implements PinDescription { } } + /** + * returns the actual value as a signed long + * + * @return the signed value + */ + public long getValueSigned() { + long v = getValue(); + if ((v & signedFlag) != 0) v |= ~mask; + return v; + } + /** * converts a value to a minimal hex string * diff --git a/src/test/java/de/neemann/digital/core/ObservableValueTest.java b/src/test/java/de/neemann/digital/core/ObservableValueTest.java index 4c546dc1a..abca4784e 100644 --- a/src/test/java/de/neemann/digital/core/ObservableValueTest.java +++ b/src/test/java/de/neemann/digital/core/ObservableValueTest.java @@ -25,4 +25,24 @@ public class ObservableValueTest extends TestCase { assertEquals((1L << 62) - 1, v.getValue()); } + public void testSigned() { + ObservableValue v = new ObservableValue("z", 4); + assertEquals(0, v.setValue(0).getValueSigned()); + assertEquals(1, v.setValue(1).getValueSigned()); + assertEquals(7, v.setValue(7).getValueSigned()); + assertEquals(-8, v.setValue(8).getValueSigned()); + assertEquals(-1, v.setValue(15).getValueSigned()); + assertEquals(-1, v.setValue(-1).getValueSigned()); + + v = new ObservableValue("z", 1); + assertEquals(0, v.setValue(0).getValueSigned()); + assertEquals(-1, v.setValue(1).getValueSigned()); + + v = new ObservableValue("z", 8); + assertEquals(127, v.setValue(127).getValueSigned()); + assertEquals(-128, v.setValue(128).getValueSigned()); + assertEquals(255, v.setValue(-1).getValue()); + assertEquals(-1, v.setValue(-1).getValueSigned()); + } + } \ No newline at end of file