Changed mnemonic X to use BitVector X; added X for integer immediates
[Mograsim.git] / plugins / net.mograsim.machine / src / net / mograsim / machine / mi / parameters / IntegerImmediate.java
1 package net.mograsim.machine.mi.parameters;
2
3 import static net.mograsim.logic.core.types.Bit.X;
4
5 import java.math.BigInteger;
6
7 import net.mograsim.logic.core.types.BitVector;
8
9 public final class IntegerImmediate implements MicroInstructionParameter
10 {
11         private IntegerClassification owner;
12         private BitVector value;
13
14         /**
15          * <code>value == null</code> means a vector consisting only of X
16          */
17         public IntegerImmediate(IntegerClassification owner, BigInteger value, int bits)
18         {
19                 this(owner, value == null ? BitVector.of(X, bits) : BitVector.from(value, bits));
20         }
21
22         public IntegerImmediate(IntegerClassification owner, BitVector value)
23         {
24                 this.owner = owner;
25                 this.value = value;
26         }
27
28         @Override
29         public BitVector getValue()
30         {
31                 return value;
32         }
33
34         @Override
35         public ParameterType getType()
36         {
37                 return ParameterType.INTEGER_IMMEDIATE;
38         }
39
40         @Override
41         public int hashCode()
42         {
43                 final int prime = 31;
44                 int result = 1;
45                 result = prime * result + ((value == null) ? 0 : value.hashCode());
46                 return result;
47         }
48
49         @Override
50         public boolean equals(Object obj)
51         {
52                 if (this == obj)
53                         return true;
54                 if (obj == null)
55                         return false;
56                 if (!(obj instanceof IntegerImmediate))
57                         return false;
58                 IntegerImmediate other = (IntegerImmediate) obj;
59                 if (value == null)
60                 {
61                         if (other.value != null)
62                                 return false;
63                 } else if (!value.equals(other.value))
64                         return false;
65                 return true;
66         }
67
68         public boolean isX()
69         {
70                 return value.equals(BitVector.of(X, value.length()));
71         }
72
73         /**
74          * @return The value of this IntegerImmediate as an unsigned BigInteger, or null, if the value is X.
75          */
76         public BigInteger getValueAsBigInteger()
77         {
78                 return isX() ? null : value.getUnsignedValue();
79         }
80
81         @Override
82         public String toString()
83         {
84                 return isX() ? "X" : getValueAsBigInteger().toString();
85         }
86
87         @Override
88         public boolean isDefault()
89         {
90                 return equals(owner.getDefault());
91         }
92 }