• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
    • Debugging
    • Community
    • Std
    • Proof-automation
    • Macro-libraries
    • ACL2
    • Interfacing-tools
    • Hardware-verification
      • Gl
      • Esim
      • Vl2014
        • Warnings
        • Primitives
        • Use-set
        • Syntax
        • Getting-started
        • Utilities
        • Loader
        • Transforms
          • Expression-sizing
          • Occform
          • Oprewrite
          • Expand-functions
          • Delayredux
          • Unparameterization
          • Caseelim
            • Vl-casezx-stmt-elim
            • Vl-casezx-matchexpr
            • Vl-modulelist-caseelim
            • Vl-casezx-match-any-expr
            • Vl-casestmt-elim
            • Vl-casestmt-size-warnings
            • Vl-casezx-elim-aux
            • Vl-stmt-caseelim
            • Case-statement-problems
            • Vl-casestmt-compare-expr
              • Vl-casestmt-compare-expr1
              • Vl-initiallist-caseelim
              • Vl-alwayslist-caseelim
              • Vl-casestmt-elim-aux
              • Vl-initial-caseelim
              • Vl-always-caseelim
              • Vl-casestmt-sizes-agreep
              • Vl-module-caseelim
              • Vl-design-caseelim
            • Split
            • Selresolve
            • Weirdint-elim
            • Vl-delta
            • Replicate-insts
            • Rangeresolve
            • Propagate
            • Clean-selects
            • Clean-params
            • Blankargs
            • Inline-mods
            • Expr-simp
            • Trunc
            • Always-top
            • Gatesplit
            • Gate-elim
            • Expression-optimization
            • Elim-supplies
            • Wildelim
            • Drop-blankports
            • Clean-warnings
            • Addinstnames
            • Custom-transform-hooks
            • Annotate
            • Latchcode
            • Elim-unused-vars
            • Problem-modules
          • Lint
          • Mlib
          • Server
          • Kit
          • Printer
          • Esim-vl
          • Well-formedness
        • Sv
        • Fgl
        • Vwsim
        • Vl
        • X86isa
        • Svl
        • Rtl
      • Software-verification
      • Math
      • Testing-utilities
    • Vl-casestmt-compare-expr

    Vl-casestmt-compare-expr1

    Creates, e.g., the expression foo === 3'b110, for handling case(foo) ... 3'b110: ... endcase.

    Signature
    (vl-casestmt-compare-expr1 test expr) → compare-expr
    Arguments
    test — The test expression, e.g., foo.
        Guard (vl-expr-p test).
    expr — One match expression, e.g., 3'b110.
        Guard (vl-expr-p expr).
    Returns
    compare-expr — Type (vl-expr-p compare-expr).

    This is mostly dealing with sizing. Recall from 5.5.1 that comparisons always produce unsigned results. Our guard is strong enough to ensure that we'll always have equal-width expressions and that we know their types. We haven't assumed anything about their types agreeing. To make sure that we produce well-typed expressions, we'll coerce anything signed into an unsigned equivalent, by just wrapping it in a one-bit concatenation.

    Definitions and Theorems

    Function: vl-casestmt-compare-expr1

    (defun vl-casestmt-compare-expr1 (test expr)
     (declare (xargs :guard (and (vl-expr-p test)
                                 (vl-expr-p expr))))
     (declare (xargs :guard (and (vl-expr->finaltype test)
                                 (vl-expr->finaltype expr)
                                 (posp (vl-expr->finalwidth test))
                                 (equal (vl-expr->finalwidth test)
                                        (vl-expr->finalwidth expr)))))
     (let ((__function__ 'vl-casestmt-compare-expr1))
      (declare (ignorable __function__))
      (b*
       ((width (vl-expr->finalwidth test))
        (test-fix
            (case (vl-expr->finaltype test)
                  (:vl-unsigned test)
                  (:vl-signed (make-vl-nonatom :op :vl-concat
                                               :args (list test)
                                               :finalwidth width
                                               :finaltype :vl-unsigned))
                  (otherwise (progn$ (impossible) test))))
        (expr-fix
            (case (vl-expr->finaltype expr)
                  (:vl-unsigned expr)
                  (:vl-signed (make-vl-nonatom :op :vl-concat
                                               :args (list expr)
                                               :finalwidth width
                                               :finaltype :vl-unsigned))
                  (otherwise (progn$ (impossible) expr)))))
       (make-vl-nonatom :op :vl-binary-ceq
                        :args (list test-fix expr-fix)
                        :finaltype :vl-unsigned
                        :finalwidth 1))))

    Theorem: vl-expr-p-of-vl-casestmt-compare-expr1

    (defthm vl-expr-p-of-vl-casestmt-compare-expr1
      (b* ((compare-expr (vl-casestmt-compare-expr1 test expr)))
        (vl-expr-p compare-expr))
      :rule-classes :rewrite)

    Theorem: vl-expr->finalwidth-of-vl-casestmt-compare-expr1

    (defthm vl-expr->finalwidth-of-vl-casestmt-compare-expr1
      (b* ((compare-expr (vl-casestmt-compare-expr1 test expr)))
        (equal (vl-expr->finalwidth compare-expr)
               1))
      :rule-classes :rewrite)

    Theorem: vl-expr->finaltype-of-vl-casestmt-compare-expr1

    (defthm vl-expr->finaltype-of-vl-casestmt-compare-expr1
      (b* ((compare-expr (vl-casestmt-compare-expr1 test expr)))
        (equal (vl-expr->finaltype compare-expr)
               :vl-unsigned))
      :rule-classes :rewrite)

    Theorem: vl-expr-welltyped-p-of-vl-casestmt-compare-expr1

    (defthm vl-expr-welltyped-p-of-vl-casestmt-compare-expr1
      (implies
           (and (force (posp (vl-expr->finalwidth test)))
                (force (vl-expr->finaltype test))
                (force (vl-expr->finaltype expr))
                (force (equal (vl-expr->finalwidth test)
                              (vl-expr->finalwidth expr)))
                (force (vl-expr-welltyped-p test))
                (force (vl-expr-welltyped-p expr)))
           (vl-expr-welltyped-p (vl-casestmt-compare-expr1 test expr))))

    Theorem: vl-casestmt-compare-expr1-of-vl-expr-fix-test

    (defthm vl-casestmt-compare-expr1-of-vl-expr-fix-test
      (equal (vl-casestmt-compare-expr1 (vl-expr-fix test)
                                        expr)
             (vl-casestmt-compare-expr1 test expr)))

    Theorem: vl-casestmt-compare-expr1-vl-expr-equiv-congruence-on-test

    (defthm vl-casestmt-compare-expr1-vl-expr-equiv-congruence-on-test
      (implies (vl-expr-equiv test test-equiv)
               (equal (vl-casestmt-compare-expr1 test expr)
                      (vl-casestmt-compare-expr1 test-equiv expr)))
      :rule-classes :congruence)

    Theorem: vl-casestmt-compare-expr1-of-vl-expr-fix-expr

    (defthm vl-casestmt-compare-expr1-of-vl-expr-fix-expr
      (equal (vl-casestmt-compare-expr1 test (vl-expr-fix expr))
             (vl-casestmt-compare-expr1 test expr)))

    Theorem: vl-casestmt-compare-expr1-vl-expr-equiv-congruence-on-expr

    (defthm vl-casestmt-compare-expr1-vl-expr-equiv-congruence-on-expr
      (implies (vl-expr-equiv expr expr-equiv)
               (equal (vl-casestmt-compare-expr1 test expr)
                      (vl-casestmt-compare-expr1 test expr-equiv)))
      :rule-classes :congruence)