Transform an assignment of a reduction operation into an equivalent module instance.
(vl-unary-reduction-op-occform x nf mod ialist warnings) → (mv new-warnings new-modules new-modinsts new-assigns new-nf)
Function:
(defun vl-unary-reduction-op-occform (x nf mod ialist warnings) (declare (xargs :guard (and (vl-assign-p x) (vl-namefactory-p nf) (vl-module-p mod) (vl-warninglist-p warnings) (equal ialist (vl-make-moditem-alist mod))))) (declare (xargs :guard (and (not (vl-atom-p (vl-assign->expr x))) (member (vl-nonatom->op (vl-assign->expr x)) '(:vl-unary-bitand :vl-unary-bitor :vl-unary-xor)) t))) (let ((__function__ 'vl-unary-reduction-op-occform)) (declare (ignorable __function__)) (b* ((x (vl-assign-fix x)) (warnings (vl-warninglist-fix warnings)) (nf (vl-namefactory-fix nf))) (b* (((vl-assign x) x) (op (vl-nonatom->op x.expr)) (arg (first (vl-nonatom->args x.expr))) ((unless (and (equal (vl-expr->finalwidth x.expr) 1) (equal (vl-expr->finaltype x.expr) :vl-unsigned) (equal (vl-expr->finalwidth x.lvalue) 1) (vl-expr->finaltype x.lvalue) (posp (vl-expr->finalwidth arg)) (vl-expr->finaltype arg))) (occform-return :assigns (list x) :warnings (fatal :type :vl-programming-error :msg "~a0: bad widths/types for assignment of reduction op." :args (list x)))) ((mv warnings arg) (vl-occform-argfix arg mod ialist warnings)) (basename (case op (:vl-unary-bitand "vl_uand") (:vl-unary-bitor "vl_uor") (:vl-unary-xor "vl_uxor"))) ((mv instname nf) (vl-namefactory-indexed-name basename nf)) (mods (vl-make-n-bit-reduction-op op (vl-expr->finalwidth arg))) (modinst (vl-simple-instantiate (car mods) instname (list x.lvalue arg) :loc x.loc))) (occform-return :mods mods :modinsts (list modinst))))))
Theorem:
(defthm vl-warninglist-p-of-vl-unary-reduction-op-occform.new-warnings (b* (((mv ?new-warnings ?new-modules ?new-modinsts ?new-assigns ?new-nf) (vl-unary-reduction-op-occform x nf mod ialist warnings))) (vl-warninglist-p new-warnings)) :rule-classes :rewrite)
Theorem:
(defthm vl-modulelist-p-of-vl-unary-reduction-op-occform.new-modules (b* (((mv ?new-warnings ?new-modules ?new-modinsts ?new-assigns ?new-nf) (vl-unary-reduction-op-occform x nf mod ialist warnings))) (vl-modulelist-p new-modules)) :rule-classes :rewrite)
Theorem:
(defthm vl-modinstlist-p-of-vl-unary-reduction-op-occform.new-modinsts (b* (((mv ?new-warnings ?new-modules ?new-modinsts ?new-assigns ?new-nf) (vl-unary-reduction-op-occform x nf mod ialist warnings))) (vl-modinstlist-p new-modinsts)) :rule-classes :rewrite)
Theorem:
(defthm vl-assignlist-p-of-vl-unary-reduction-op-occform.new-assigns (b* (((mv ?new-warnings ?new-modules ?new-modinsts ?new-assigns ?new-nf) (vl-unary-reduction-op-occform x nf mod ialist warnings))) (vl-assignlist-p new-assigns)) :rule-classes :rewrite)
Theorem:
(defthm vl-namefactory-p-of-vl-unary-reduction-op-occform.new-nf (b* (((mv ?new-warnings ?new-modules ?new-modinsts ?new-assigns ?new-nf) (vl-unary-reduction-op-occform x nf mod ialist warnings))) (vl-namefactory-p new-nf)) :rule-classes :rewrite)
Theorem:
(defthm vl-unary-reduction-op-occform-mvtypes-1 (true-listp (mv-nth 1 (vl-unary-reduction-op-occform x nf mod ialist warnings))) :rule-classes :type-prescription)
Theorem:
(defthm vl-unary-reduction-op-occform-mvtypes-2 (true-listp (mv-nth 2 (vl-unary-reduction-op-occform x nf mod ialist warnings))) :rule-classes :type-prescription)
Theorem:
(defthm vl-unary-reduction-op-occform-mvtypes-3 (true-listp (mv-nth 3 (vl-unary-reduction-op-occform x nf mod ialist warnings))) :rule-classes :type-prescription)
Theorem:
(defthm vl-unary-reduction-op-occform-of-vl-assign-fix-x (equal (vl-unary-reduction-op-occform (vl-assign-fix x) nf mod ialist warnings) (vl-unary-reduction-op-occform x nf mod ialist warnings)))
Theorem:
(defthm vl-unary-reduction-op-occform-vl-assign-equiv-congruence-on-x (implies (vl-assign-equiv x x-equiv) (equal (vl-unary-reduction-op-occform x nf mod ialist warnings) (vl-unary-reduction-op-occform x-equiv nf mod ialist warnings))) :rule-classes :congruence)
Theorem:
(defthm vl-unary-reduction-op-occform-of-vl-namefactory-fix-nf (equal (vl-unary-reduction-op-occform x (vl-namefactory-fix nf) mod ialist warnings) (vl-unary-reduction-op-occform x nf mod ialist warnings)))
Theorem:
(defthm vl-unary-reduction-op-occform-vl-namefactory-equiv-congruence-on-nf (implies (vl-namefactory-equiv nf nf-equiv) (equal (vl-unary-reduction-op-occform x nf mod ialist warnings) (vl-unary-reduction-op-occform x nf-equiv mod ialist warnings))) :rule-classes :congruence)
Theorem:
(defthm vl-unary-reduction-op-occform-of-vl-module-fix-mod (equal (vl-unary-reduction-op-occform x nf (vl-module-fix mod) ialist warnings) (vl-unary-reduction-op-occform x nf mod ialist warnings)))
Theorem:
(defthm vl-unary-reduction-op-occform-vl-module-equiv-congruence-on-mod (implies (vl-module-equiv mod mod-equiv) (equal (vl-unary-reduction-op-occform x nf mod ialist warnings) (vl-unary-reduction-op-occform x nf mod-equiv ialist warnings))) :rule-classes :congruence)
Theorem:
(defthm vl-unary-reduction-op-occform-of-vl-warninglist-fix-warnings (equal (vl-unary-reduction-op-occform x nf mod ialist (vl-warninglist-fix warnings)) (vl-unary-reduction-op-occform x nf mod ialist warnings)))
Theorem:
(defthm vl-unary-reduction-op-occform-vl-warninglist-equiv-congruence-on-warnings (implies (vl-warninglist-equiv warnings warnings-equiv) (equal (vl-unary-reduction-op-occform x nf mod ialist warnings) (vl-unary-reduction-op-occform x nf mod ialist warnings-equiv))) :rule-classes :congruence)