1 package net.mograsim.logic.core.types;
3 import static net.mograsim.logic.core.types.BitVector.*;
4 import static net.mograsim.logic.core.types.Bit.*;
5 import static org.junit.jupiter.api.Assertions.*;
7 import java.math.BigInteger;
8 import java.util.Iterator;
10 import org.junit.jupiter.api.Test;
18 BitVector.of(); // should be allowed and work
20 assertSame(SINGLE_U, BitVector.of(U));
21 assertSame(SINGLE_X, BitVector.of(X));
22 assertSame(SINGLE_0, BitVector.of(ZERO));
23 assertSame(SINGLE_1, BitVector.of(ONE));
24 assertSame(SINGLE_Z, BitVector.of(Z));
30 assertEquals(BitVector.of(), BitVector.of(ONE, 0));
32 assertSame(SINGLE_U, BitVector.of(U, 1));
33 assertSame(SINGLE_X, BitVector.of(X, 1));
34 assertSame(SINGLE_0, BitVector.of(ZERO, 1));
35 assertSame(SINGLE_1, BitVector.of(ONE, 1));
36 assertSame(SINGLE_Z, BitVector.of(Z, 1));
38 assertEquals(BitVector.of(X, X, X), BitVector.of(X, 3));
44 assertEquals(BitVector.parse("101"), BitVector.from(BigInteger.valueOf(0b101), 3));
45 assertEquals(BitVector.parse("01010"), BitVector.from(BigInteger.valueOf(0b01010), 5));
46 assertEquals(BitVector.parse("10101"), BitVector.from(BigInteger.valueOf(-11), 5));
47 assertEquals(BitVector.parse("0000"), BitVector.from(BigInteger.valueOf(0), 4));
51 void testGetUnsignedValue()
53 assertEquals(BigInteger.valueOf(0b101), BitVector.parse("101").getUnsignedValue());
54 assertEquals(BigInteger.valueOf(0b01010), BitVector.parse("01010").getUnsignedValue());
55 assertEquals(BigInteger.valueOf(0), BitVector.parse("0000").getUnsignedValue());
57 assertThrows(NumberFormatException.class, () -> BitVector.parse("00X1").getUnsignedValue());
62 void testToBigInteger()
64 assertEquals(BigInteger.valueOf(0b101), BitVector.parse("101").toBigInteger(false));
65 assertEquals(BigInteger.valueOf(0b01010), BitVector.parse("01010").toBigInteger(false));
66 assertEquals(BigInteger.valueOf(0), BitVector.parse("0000").toBigInteger(false));
68 // assertEquals(BigInteger.valueOf(-11), BitVector.parse("10101").toBigInteger(true)); TODO
70 assertThrows(NumberFormatException.class, () -> BitVector.parse("00X1").toBigInteger(false));
76 assertEquals(BitVector.parse("101"), BitVector.of(0b101L, 3));
77 assertEquals(BitVector.parse("01010"), BitVector.of(0b01010L, 5));
78 assertEquals(BitVector.parse("10101"), BitVector.of(-11L, 5));
79 assertEquals(BitVector.parse("0000"), BitVector.of(0L, 4));
83 void testOfBigIntegerInt()
85 assertEquals(BitVector.parse("101"), BitVector.of(BigInteger.valueOf(0b101), 3));
86 assertEquals(BitVector.parse("01010"), BitVector.of(BigInteger.valueOf(0b01010), 5));
87 assertEquals(BitVector.parse("10101"), BitVector.of(BigInteger.valueOf(-11), 5));
88 assertEquals(BitVector.parse("0000"), BitVector.of(BigInteger.valueOf(0), 4));
94 var bv = BitVector.SINGLE_1;
95 var bvm = bv.mutator();
97 assertFalse(bvm.isEmpty());
98 assertEquals(ONE, bvm.getLSBit(0));
99 assertEquals(SINGLE_1, bvm.toBitVector());
105 assertEquals(ONE, SINGLE_1.getMSBit(0));
106 assertEquals(ONE, BitVector.of(ONE, X, X, X).getMSBit(0));
107 assertEquals(ONE, BitVector.of(X, X, X, X, ONE, X).getMSBit(4));
113 assertEquals(ONE, SINGLE_1.getLSBit(0));
114 assertEquals(ONE, BitVector.of(X, X, X, ONE).getLSBit(0));
115 assertEquals(ONE, BitVector.of(X, X, X, X, ONE, X).getLSBit(1));
121 assertArrayEquals(new Bit[] { X, ONE, Z }, BitVector.of(X, ONE, Z).getBits());
122 assertArrayEquals(new Bit[] { X, ONE, Z }, BitVector.parse("X1Z").getBits());
128 assertTrue(SINGLE_0.isBinary());
129 assertTrue(SINGLE_1.isBinary());
131 assertFalse(SINGLE_U.isBinary());
132 assertFalse(SINGLE_X.isBinary());
133 assertFalse(SINGLE_Z.isBinary());
135 assertTrue(BitVector.of(ONE, ZERO, ONE, ONE, ZERO).isBinary());
136 assertFalse(BitVector.of(ONE, ZERO, ZERO, X).isBinary());
143 assertEquals(SINGLE_0, SINGLE_0.join(SINGLE_0));
144 assertEquals(SINGLE_X, SINGLE_0.join(SINGLE_1));
145 assertEquals(SINGLE_1, SINGLE_1.join(SINGLE_1));
148 assertEquals(SINGLE_1, SINGLE_Z.join(SINGLE_1));
149 assertEquals(SINGLE_U, SINGLE_0.join(SINGLE_U));
150 assertEquals(SINGLE_X, SINGLE_X.join(SINGLE_Z));
153 var result = BitVector.of(U, X, ZERO, ONE, Z).join(BitVector.of(ONE, ZERO, ZERO, ONE, Z));
154 assertEquals(BitVector.of(U, X, ZERO, ONE, Z), result);
161 assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_0));
162 assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_1));
163 assertEquals(SINGLE_1, SINGLE_1.and(SINGLE_1));
166 assertEquals(SINGLE_X, SINGLE_Z.and(SINGLE_1));
167 assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_U));
168 assertEquals(SINGLE_X, SINGLE_X.and(SINGLE_Z));
171 var result = BitVector.of(U, X, ZERO, ONE, ONE).and(BitVector.of(ONE, ONE, ZERO, ZERO, ONE));
172 assertEquals(BitVector.of(U, X, ZERO, ZERO, ONE), result);
179 assertEquals(SINGLE_0, SINGLE_0.or(SINGLE_0));
180 assertEquals(SINGLE_1, SINGLE_0.or(SINGLE_1));
181 assertEquals(SINGLE_1, SINGLE_1.or(SINGLE_1));
184 assertEquals(SINGLE_1, SINGLE_Z.or(SINGLE_1));
185 assertEquals(SINGLE_1, SINGLE_1.or(SINGLE_U));
186 assertEquals(SINGLE_X, SINGLE_X.or(SINGLE_Z));
189 var result = BitVector.of(U, X, ZERO, ONE, ZERO).or(BitVector.of(ZERO, ZERO, ZERO, ONE, ONE));
190 assertEquals(BitVector.of(U, X, ZERO, ONE, ONE), result);
197 assertEquals(SINGLE_0, SINGLE_0.xor(SINGLE_0));
198 assertEquals(SINGLE_1, SINGLE_0.xor(SINGLE_1));
199 assertEquals(SINGLE_0, SINGLE_1.xor(SINGLE_1));
202 assertEquals(SINGLE_X, SINGLE_Z.xor(SINGLE_1));
203 assertEquals(SINGLE_U, SINGLE_0.xor(SINGLE_U));
204 assertEquals(SINGLE_X, SINGLE_X.xor(SINGLE_Z));
207 var result = BitVector.of(U, X, ZERO, ONE, ONE).xor(BitVector.of(ONE, ZERO, ZERO, ZERO, ONE));
208 assertEquals(BitVector.of(U, X, ZERO, ONE, ZERO), result);
215 assertEquals(SINGLE_1, SINGLE_0.not());
216 assertEquals(SINGLE_0, SINGLE_1.not());
219 assertEquals(SINGLE_U, SINGLE_U.not());
220 assertEquals(SINGLE_X, SINGLE_X.not());
221 assertEquals(SINGLE_X, SINGLE_Z.not());
224 var result = BitVector.of(U, X, ZERO, ONE, Z).not();
225 assertEquals(BitVector.of(U, X, ONE, ZERO, X), result);
231 assertEquals(0, BitVector.of().length());
232 assertEquals(1, SINGLE_0.length());
233 assertEquals(3, BitVector.of(X, X, Z).length());
239 assertEquals(BitVector.of(U, X), SINGLE_U.concat(SINGLE_X));
240 assertEquals(BitVector.of(Z, X, U, ONE, X), BitVector.of(Z, X, U).concat(BitVector.of(ONE, X)));
244 void testSubVectorInt()
246 assertEquals(SINGLE_0, SINGLE_0.subVector(0));
247 assertEquals(BitVector.of(), SINGLE_0.subVector(1));
248 assertEquals(SINGLE_0, BitVector.of(ONE, ZERO).subVector(1));
249 assertEquals(BitVector.of(X, Z), BitVector.of(ZERO, U, ONE, X, Z).subVector(3));
253 void testSubVectorIntInt()
255 assertEquals(SINGLE_0, SINGLE_0.subVector(0, 1));
256 assertEquals(BitVector.of(), SINGLE_0.subVector(0, 0));
257 assertEquals(SINGLE_0, BitVector.of(ONE, ZERO).subVector(1, 2));
258 assertEquals(BitVector.of(ONE, X), BitVector.of(ZERO, U, ONE, X, Z).subVector(2, 4));
262 void testEqualsObject()
264 assertEquals(SINGLE_X, SINGLE_X);
265 assertNotEquals(SINGLE_0, SINGLE_1);
267 assertEquals(BitVector.of(X, Z, U), BitVector.of(X, Z, U));
268 assertNotEquals(BitVector.of(X, Z, U), BitVector.of(X, X, U));
272 void testEqualsWithOffset()
274 assertTrue(SINGLE_X.equalsWithOffset(SINGLE_X, 0));
275 assertFalse(SINGLE_0.equalsWithOffset(SINGLE_1, 0));
277 assertTrue(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(Z, U), 1));
278 assertFalse(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(X, U), 1));
279 assertTrue(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(U), 2));
285 assertEquals(SINGLE_U, BitVector.parse("U"));
286 assertEquals(SINGLE_X, BitVector.parse("X"));
287 assertEquals(SINGLE_0, BitVector.parse("0"));
288 assertEquals(SINGLE_1, BitVector.parse("1"));
289 assertEquals(SINGLE_Z, BitVector.parse("Z"));
291 assertEquals(BitVector.of(X, U, Z, ONE, ZERO), BitVector.parse("XUZ10"));
293 assertThrows(RuntimeException.class, () -> BitVector.parse("01BX"));
299 var bv = BitVector.of(U, Z, ONE, ZERO, X);
300 Iterator<Bit> it = bv.iterator();
302 assertEquals(U, it.next());
303 assertEquals(Z, it.next());
304 assertEquals(ONE, it.next());
305 assertEquals(ZERO, it.next());
306 assertEquals(X, it.next());
307 assertFalse(it.hasNext());