• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
    • Debugging
    • 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
          • Split
          • Selresolve
          • Weirdint-elim
          • Vl-delta
          • Replicate-insts
          • Rangeresolve
          • Propagate
          • Clean-selects
          • Clean-params
          • Blankargs
          • Inline-mods
          • Expr-simp
          • Trunc
          • Always-top
            • Edgesynth
            • Stmtrewrite
              • Vl-modulelist-stmtrewrite
              • Vl-blockstmt-rewrite
              • Vl-repeatstmt-rewrite
              • Vl-flatten-blocks
              • Vl-stmt-rewrite-top
              • Vl-casestmt-rewrite
              • Vl-stmt-rewrite
              • Vl-waitstmt-rewrite
                • Vl-ifstmt-combine-rewrite
                • Vl-forstmt-rewrite
                • Vl-initiallist-stmtrewrite
                • Vl-alwayslist-stmtrewrite
                • Vl-initial-stmtrewrite
                • Vl-foreverstmt-rewrite
                • Vl-always-stmtrewrite
                • Vl-module-stmtrewrite
                • Vl-design-stmtrewrite
                • Vl-remove-null-statements
                • Vl-$vcover-stmt-p
                • Vl-$display-stmt-p
                • Vl-caselist-all-null-p
              • Cblock
              • Vl-always-convert-regports
              • Vl-always-convert-regs
              • Stmttemps
              • Edgesplit
              • Vl-always-check-reg
              • Vl-convert-regs
              • Latchsynth
              • Vl-always-check-regs
              • Vl-match-always-at-some-edges
              • Unelse
              • Vl-always-convert-reg
              • Vl-design-always-backend
              • Vl-stmt-guts
              • Vl-always-convert-regport
              • Vl-always-scary-regs
              • Eliminitial
              • Ifmerge
              • Vl-edge-control-p
              • Elimalways
            • 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
    • Stmtrewrite

    Vl-waitstmt-rewrite

    Convert wait statements into empty while loops.

    Signature
    (vl-waitstmt-rewrite condition body atts) → stmt
    Arguments
    condition — Guard (vl-expr-p condition).
    body — Guard (vl-stmt-p body).
    atts — Guard (vl-atts-p atts).
    Returns
    stmt — Type (vl-stmt-p stmt), given the guard.

    The basic rewrite this performs is:

    wait (condition) body
      -->
    begin
      while(condition)
        ; // this is just a null statement
      body
    end

    This might not be a very useful thing to do. It seems hard to synthesize arbitrary while loops. On the other hand, it does eliminate any wait statement, perhaps simplifying the target language for later transforms to implement.

    BOZO is this sound? Can we come up with some tests that establish it is valid? What if the condition is X/Z?

    Definitions and Theorems

    Function: vl-waitstmt-rewrite

    (defun vl-waitstmt-rewrite (condition body atts)
     (declare (xargs :guard (and (vl-expr-p condition)
                                 (vl-stmt-p body)
                                 (vl-atts-p atts))))
     (let ((__function__ 'vl-waitstmt-rewrite))
       (declare (ignorable __function__))
       (b* ((null (make-vl-nullstmt))
            (while (make-vl-whilestmt :condition condition
                                      :body null
                                      :atts (acons "VL_WAIT" nil atts)))
            (block (make-vl-blockstmt :sequentialp t
                                      :stmts (list while body))))
         block)))

    Theorem: vl-stmt-p-of-vl-waitstmt-rewrite

    (defthm vl-stmt-p-of-vl-waitstmt-rewrite
      (implies (and (force (vl-expr-p condition))
                    (force (vl-stmt-p body))
                    (force (vl-atts-p atts)))
               (b* ((stmt (vl-waitstmt-rewrite condition body atts)))
                 (vl-stmt-p stmt)))
      :rule-classes :rewrite)