@Override
 public int hashCode() {
   if (hashCache != null) return hashCache;
   int result = super.hashCode();
   final int prime = 31;
   result = (prime * result) + ((type == null) ? 0 : type.hashCode());
   hashCache = result;
   return result;
 }
 @Override
 public boolean equals(Object obj) {
   if (this == obj) return true;
   if (obj == null) return false;
   if (!(obj instanceof AbstractHDLEqualityOp)) return false;
   if (!super.equals(obj)) return false;
   final AbstractHDLEqualityOp other = (AbstractHDLEqualityOp) obj;
   if (type == null) {
     if (other.type != null) return false;
   } else if (!type.equals(other.type)) return false;
   return true;
 }
 @Override
 public String toConstructionString(String spacing) {
   final boolean first = true;
   final StringBuilder sb = new StringBuilder();
   sb.append('\n').append(spacing).append("new HDLEqualityOp()");
   if (left != null) {
     sb.append(".setLeft(").append(left.toConstructionString(spacing + "\t")).append(")");
   }
   if (right != null) {
     sb.append(".setRight(").append(right.toConstructionString(spacing + "\t")).append(")");
   }
   if (type != null) {
     sb.append("\n")
         .append(spacing + "\t")
         .append(".setType(HDLEqualityOpType.")
         .append(type.name() + ")");
   }
   return sb.toString();
 }