• 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-foreverstmt-rewrite

    Convert forever statements into while loops.

    Signature
    (vl-foreverstmt-rewrite body atts) → stmt
    Arguments
    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:

    forever body
      -->
    while(1)
      body

    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 forever statement, simplifying the target language for later transforms to implement.

    Definitions and Theorems

    Function: vl-foreverstmt-rewrite

    (defun vl-foreverstmt-rewrite (body atts)
     (declare (xargs :guard (and (vl-stmt-p body)
                                 (vl-atts-p atts))))
     (let ((__function__ 'vl-foreverstmt-rewrite))
      (declare (ignorable __function__))
      (b*
       ((const-one (make-vl-constint :origwidth 1
                                     :origtype :vl-unsigned
                                     :value 1))
        (atom-one (make-vl-atom :guts const-one))
        (while (make-vl-whilestmt :condition atom-one
                                  :body body
                                  :atts (acons "VL_FOREVER" nil atts))))
       while)))

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

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