Group binary operators into classes.
(vl-odd-binop-class x) → class
This lets us come up with a basic abstraction for an expression, where, e.g., we treat any kind of shift operation as equivalent, etc.
Function:
(defun vl-odd-binop-class (x) (declare (xargs :guard (vl-binaryop-p x))) (let ((__function__ 'vl-odd-binop-class)) (declare (ignorable __function__)) (case (vl-binaryop-fix x) ((:vl-binary-times :vl-binary-div :vl-binary-mod :vl-binary-power) :mult-class) ((:vl-binary-plus) :plus-class) ((:vl-binary-minus) :minus-class) ((:vl-binary-shl :vl-binary-shr :vl-binary-ashl :vl-binary-ashr) :shift-class) ((:vl-binary-lt :vl-binary-lte :vl-binary-gt :vl-binary-gte) :rel-class) ((:vl-binary-eq :vl-binary-neq) :cmp-class) ((:vl-binary-ceq :vl-binary-cne) :ceq-class) ((:vl-binary-bitand) :bitand-class) ((:vl-binary-xor :vl-binary-xnor) :xor-class) ((:vl-binary-bitor) :bitor-class) ((:vl-binary-logand) :logand-class) ((:vl-binary-logor) :logor-class) (otherwise nil))))
Theorem:
(defthm symbolp-of-vl-odd-binop-class (b* ((class (vl-odd-binop-class x))) (symbolp class)) :rule-classes :type-prescription)
Theorem:
(defthm vl-odd-binop-class-of-vl-binaryop-fix-x (equal (vl-odd-binop-class (vl-binaryop-fix x)) (vl-odd-binop-class x)))
Theorem:
(defthm vl-odd-binop-class-vl-binaryop-equiv-congruence-on-x (implies (vl-binaryop-equiv x x-equiv) (equal (vl-odd-binop-class x) (vl-odd-binop-class x-equiv))) :rule-classes :congruence)