package org.batfish.z3.node;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.batfish.z3.NodProgram;
import com.microsoft.z3.BoolExpr;
import com.microsoft.z3.Context;
import com.microsoft.z3.Z3Exception;
public class EqExpr extends BooleanExpr implements ComplexExpr {
private IntExpr _lhs;
private IntExpr _rhs;
private List<Expr> _subExpressions;
public EqExpr() {
init();
}
public EqExpr(IntExpr lhs, IntExpr rhs) {
init();
_lhs = lhs;
_rhs = rhs;
refreshSubExpressions();
}
@Override
public List<Expr> getSubExpressions() {
return _subExpressions;
}
@Override
public Set<String> getVariables() {
Set<String> variables = new HashSet<>();
variables.addAll(_lhs.getVariables());
variables.addAll(_rhs.getVariables());
return variables;
}
private void init() {
_subExpressions = new ArrayList<>();
_printer = new CollapsedComplexExprPrinter(this);
}
private void refreshSubExpressions() {
_subExpressions.clear();
_subExpressions.add(new IdExpr("="));
_subExpressions.add(_lhs);
_subExpressions.add(_rhs);
}
public void setLhs(IntExpr lhs) {
_lhs = lhs;
refreshSubExpressions();
}
public void setRhs(IntExpr rhs) {
_rhs = rhs;
refreshSubExpressions();
}
@Override
public BooleanExpr simplify() {
if (_lhs.equals(_rhs)) {
return TrueExpr.INSTANCE;
}
else if (_lhs instanceof LitIntExpr && _rhs instanceof LitIntExpr) {
return FalseExpr.INSTANCE;
}
else {
return this;
}
}
@Override
public BoolExpr toBoolExpr(NodProgram nodProgram) throws Z3Exception {
Context ctx = nodProgram.getContext();
com.microsoft.z3.Expr lhs = _lhs.toBitVecExpr(nodProgram);
com.microsoft.z3.Expr rhs = _rhs.toBitVecExpr(nodProgram);
BoolExpr result = ctx.mkEq(lhs, rhs);
return result;
}
}