package org.batfish.z3.node;
import org.batfish.datamodel.Ip;
import org.batfish.z3.NodProgram;
import com.microsoft.z3.BitVecExpr;
import com.microsoft.z3.Context;
import com.microsoft.z3.Z3Exception;
public class LitIntExpr extends IntExpr {
private int _bits;
private long _num;
public LitIntExpr(Ip ip) {
_num = ip.asLong();
_bits = 32;
}
public LitIntExpr(long num, int bits) {
_num = num;
_bits = bits;
}
public LitIntExpr(long num, int low, int high) {
_bits = high - low + 1;
_num = num >> low;
}
@Override
public boolean equals(Object o) {
if (o instanceof LitIntExpr) {
LitIntExpr rhs = (LitIntExpr) o;
return _bits == rhs._bits && _num == rhs._num;
}
return false;
}
private String getNumString() {
String _numString;
if (_bits % 4 == 0) {
// hex
int numNibbles = _bits / 4;
_numString = "#x" + String.format("%0" + numNibbles + "x", _num);
}
else {
// bin
_numString = "#b";
for (int pos = _bits - 1; pos >= 0; pos--) {
long mask = 1L << pos;
long bit = _num & mask;
_numString += (bit != 0) ? 1 : 0;
}
}
return _numString;
}
@Override
public int hashCode() {
return getNumString().hashCode();
}
@Override
public void print(StringBuilder sb, int indent) {
sb.append(getNumString());
}
@Override
public BitVecExpr toBitVecExpr(NodProgram nodProgram) throws Z3Exception {
Context ctx = nodProgram.getContext();
BitVecExpr result = ctx.mkBV(_num, _bits);
return result;
}
}