Added MSB first versions of parse() and toString()
authorDaniel Kirschten <daniel.kirschten@gmx.de>
Sun, 30 Jun 2019 16:39:00 +0000 (18:39 +0200)
committerDaniel Kirschten <daniel.kirschten@gmx.de>
Sun, 30 Jun 2019 16:39:00 +0000 (18:39 +0200)
net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVector.java
net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVectorFormatter.java
net.mograsim.logic.ui.am2900/test/net/mograsim/logic/ui/am2900/TestableAm2901Impl.java
net.mograsim.logic.ui/src/net/mograsim/logic/ui/LogicUICanvas.java

index 4d5365a..9e09f43 100644 (file)
@@ -286,26 +286,45 @@ public final class BitVector implements StrictLogicType<BitVector>, Iterable<Bit
                return Arrays.equals(bits, offset, offset + other.length(), other.bits, 0, other.length());
        }
 
+       @Override
+       public String toString()
+       {
+               return toBitStringMSBFirst();
+       }
+
        /**
         * All {@link Bit}s symbols concatenated together
         * 
         * @see #parse(String)
         */
-       @Override
-       public String toString()
+       public String toBitStringLSBFirst()
+       {
+               StringBuilder sb = new StringBuilder(bits.length);
+               for (Bit bit : bits)
+                       sb.append(bit);
+               return sb.toString();
+       }
+
+       /**
+        * All {@link Bit}s symbols concatenated together, with the MSB coming first (like a binary number)
+        * 
+        * @see #parse(String)
+        */
+       public String toBitStringMSBFirst()
        {
                StringBuilder sb = new StringBuilder(bits.length);
                for (Bit bit : bits)
                        sb.append(bit);
+               sb.reverse();
                return sb.toString();
        }
 
        /**
         * Parses a String containing solely {@link Bit} symbols
         * 
-        * @see #toString()
+        * @see #toBitStringLSBFirst()
         */
-       public static BitVector parse(String s)
+       public static BitVector parseLSBFirst(String s)
        {
                Bit[] values = new Bit[s.length()];
                for (int i = 0; i < s.length(); i++)
@@ -315,6 +334,21 @@ public final class BitVector implements StrictLogicType<BitVector>, Iterable<Bit
                return new BitVector(values);
        }
 
+       /**
+        * Parses a String containing solely {@link Bit} symbols, with the MSB coming first (like a binary number)
+        * 
+        * @see #toBitStringLSBFirst()
+        */
+       public static BitVector parseMSBFirst(String s)
+       {
+               Bit[] values = new Bit[s.length()];
+               for (int i = 0, j = s.length() - 1; j >= 0; i++, j--)
+               {
+                       values[i] = Bit.parse(s, j);
+               }
+               return new BitVector(values);
+       }
+
        @Override
        public Iterator<Bit> iterator()
        {
index 67a2730..3cb35b3 100644 (file)
@@ -16,7 +16,7 @@ public class BitVectorFormatter
        {
                if (bitVector == null)
                        return "null";
-               return bitVector.toString();
+               return bitVector.toBitStringMSBFirst();
        }
 
        // TODO doesn't this belong to logic.ui?
index 0b1adc2..1862ae3 100644 (file)
@@ -181,8 +181,7 @@ public class TestableAm2901Impl implements TestableAm2901
        @Override
        public void setReg_A(String val_4_bit)
        {
-               // reverse because the BitVector.parse() expects the LSBit at the beginning and the MSBit at the end
-               var bits = BitVector.parse(new StringBuilder(val_4_bit).reverse().toString());
+               var bits = BitVector.parseMSBFirst(val_4_bit);
                A3.setToValueOf(bits.getBit(3));
                A2.setToValueOf(bits.getBit(2));
                A1.setToValueOf(bits.getBit(1));
@@ -192,8 +191,7 @@ public class TestableAm2901Impl implements TestableAm2901
        @Override
        public void setReg_B(String val_4_bit)
        {
-               // reverse because the BitVector.parse() expects the LSBit at the beginning and the MSBit at the end
-               var bits = BitVector.parse(new StringBuilder(val_4_bit).reverse().toString());
+               var bits = BitVector.parseMSBFirst(val_4_bit);
                B3.setToValueOf(bits.getBit(3));
                B2.setToValueOf(bits.getBit(2));
                B1.setToValueOf(bits.getBit(1));
@@ -215,8 +213,7 @@ public class TestableAm2901Impl implements TestableAm2901
        @Override
        public void setD(String val_4_bit)
        {
-               // reverse because the BitVector.parse() expects the LSBit at the beginning and the MSBit at the end
-               var bits = BitVector.parse(new StringBuilder(val_4_bit).reverse().toString());
+               var bits = BitVector.parseMSBFirst(val_4_bit);
                D4.setToValueOf(bits.getBit(3));
                D3.setToValueOf(bits.getBit(2));
                D2.setToValueOf(bits.getBit(1));
@@ -320,8 +317,7 @@ public class TestableAm2901Impl implements TestableAm2901
                var y2 = Y3.getDisplayedValue();
                var y1 = Y2.getDisplayedValue();
                var y0 = Y1.getDisplayedValue();
-               // reverse because BitVector.toString() returns the LSBit at the beginning and the MSBit at the end
-               return new StringBuilder(y0.concat(y1).concat(y2).concat(y3).toString()).reverse().toString();
+               return y0.concat(y1).concat(y2).concat(y3).toBitStringMSBFirst();
        }
 
        private void setField(String name, Object value)
@@ -353,15 +349,13 @@ public class TestableAm2901Impl implements TestableAm2901
        @Override
        public void setDirectly(Register r, String val_4_bit)
        {
-               // reverse because the BitVector.parse() expects the LSBit at the beginning and the MSBit at the end
-               am2901.setHighLevelState(regToStateID(r), BitVector.parse(new StringBuilder(val_4_bit).reverse().toString()));
+               am2901.setHighLevelState(regToStateID(r), BitVector.parseMSBFirst(val_4_bit));
        }
 
        @Override
        public String getDirectly(Register r)
        {
-               // reverse because BitVector.toString() returns the LSBit at the beginning and the MSBit at the end
-               return new StringBuilder(am2901.getHighLevelState(regToStateID(r)).toString()).reverse().toString();
+               return ((BitVector) am2901.getHighLevelState(regToStateID(r))).toBitStringMSBFirst();
        }
 
        private static String regToStateID(Register r)
index 73c1f06..2974278 100644 (file)
@@ -122,7 +122,7 @@ public class LogicUICanvas extends ZoomableCanvas
                                if (radioBit.getSelection())
                                        value = Bit.parse(valueString);
                                else if (radioBitVector.getSelection())
-                                       value = BitVector.parse(new StringBuilder(valueString).reverse().toString());
+                                       value = BitVector.parseMSBFirst(valueString);
                                else
                                        throw new RuntimeException("No value type selected");
                                target.setHighLevelState(stateIDText.getText(), value);