• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
    • Debugging
    • Std
    • Community
    • 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
            • Vl-mux-occform
            • Vl-basic-binary-op-occform
            • Vl-occform-mkports
            • Vl-unary-reduction-op-occform
            • Vl-make-n-bit-mux
            • Vl-bitselect-occform
            • Vl-assign-occform
            • Vl-plusminus-occform
            • Vl-shift-occform
            • Vl-gte-occform
            • Vl-plain-occform
            • Vl-unary-not-occform
            • Vl-rem-occform
            • Vl-div-occform
            • Vl-ceq-occform
            • Vl-mult-occform
            • Vl-make-n-bit-dynamic-bitselect-m
            • Vl-simple-instantiate
            • Vl-occform-mkwires
            • Vl-assignlist-occform
            • Vl-occform-argfix
            • Vl-make-n-bit-unsigned-gte
            • Vl-make-2^n-bit-dynamic-bitselect
            • Vl-make-n-bit-div-rem
            • Vl-make-n-bit-plusminus
            • Vl-make-n-bit-signed-gte
            • Vl-make-n-bit-shr-by-m-bits
            • Vl-make-n-bit-shl-by-m-bits
            • Vl-occform-mkport
            • Vl-make-n-bit-dynamic-bitselect
            • Vl-make-n-bit-reduction-op
            • Vl-make-n-bit-adder-core
            • Vl-make-n-bit-xdetect
            • Vl-make-n-bit-x-propagator
            • Vl-make-n-bit-shl-place-p
            • Vl-make-n-bit-shr-place-p
            • Vl-make-n-bit-mult
            • Vl-occform-mkwire
            • Vl-make-nedgeflop-vec
              • Vl-make-n-bit-binary-op
              • Vl-make-list-of-netdecls
              • Vl-make-n-bit-delay-1
              • Vl-make-n-bit-zmux
              • *vl-2-bit-dynamic-bitselect*
              • Vl-make-n-bit-unsigned-rem
              • Vl-make-n-bit-unsigned-div
              • Vl-make-n-bit-shr-place-ps
              • Vl-make-n-bit-shl-place-ps
              • Vl-make-n-bit-assign
              • Vl-make-n-bit-x
              • Vl-make-n-bit-ceq
              • Vl-make-n-bit-xor-each
              • Vl-make-n-bit-not
              • Vl-make-1-bit-delay-m
              • Vl-make-n-bit-delay-m
              • *vl-1-bit-signed-gte*
              • *vl-1-bit-div-rem*
              • *vl-1-bit-adder-core*
              • Vl-make-nedgeflop
              • *vl-1-bit-mult*
              • *vl-1-bit-dynamic-bitselect*
            • 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
            • 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
    • Occform

    Vl-make-nedgeflop-vec

    Generate a w-bit wide, n-edge flop with output delay d

    Signature
    (vl-make-nedgeflop-vec width nedges delay) → mods
    Returns
    mods — A non-empty module list. The first module in the list is the desired module; the other modules are any necessary supporting modules.
        Type (vl-modulelist-p mods).

    Definitions and Theorems

    Function: vl-make-nedgeflop-vec

    (defun vl-make-nedgeflop-vec (width nedges delay)
     (declare (xargs :guard (and (posp width)
                                 (posp nedges)
                                 (natp delay))))
     (let ((__function__ 'vl-make-nedgeflop-vec))
      (declare (ignorable __function__))
      (b*
       ((width (lposfix width))
        (nedges (lposfix nedges))
        (delay (lnfix delay))
        (name (if (zp delay)
                  (cat "VL_" (natstr width)
                       "_BIT_" (natstr nedges)
                       "_EDGE_FLOP")
                (cat "VL_" (natstr width)
                     "_BIT_" (natstr nedges)
                     "_EDGE_" (natstr delay)
                     "_TICK_FLOP")))
        ((mv qexpr qport qportdecl qvardecl)
         (vl-occform-mkport "q"
                            :vl-output width))
        ((mv dexprs dports dportdecls dvardecls)
         (vl-occform-mkports "d" 0 nedges
                             :dir :vl-input
                             :width width))
        ((mv clkexprs
             clkports clkportdecls clkvardecls)
         (vl-occform-mkports "clk" 0 nedges
                             :dir :vl-input
                             :width 1))
        ((mv qregexpr qregdecls qregassigns)
         (b*
          (((when (zp delay)) (mv qexpr nil nil))
           ((mv qregexpr qregdecl)
            (vl-occform-mkwire "qreg" width))
           (ddelassign (make-vl-assign :lvalue qexpr
                                       :expr qregexpr
                                       :delay (vl-make-constdelay delay)
                                       :loc *vl-fakeloc*)))
          (mv qregexpr (list qregdecl)
              (list ddelassign))))
        (clkconcat (make-vl-nonatom :op :vl-concat
                                    :args clkexprs
                                    :finalwidth nedges
                                    :finaltype :vl-unsigned))
        (atts (list (cons "VL_NON_PROP_TRIGGERS" clkconcat)
                    (cons "VL_NON_PROP_BOUND" qregexpr)
                    (list "VL_STATE_DELAY")))
        ((mv clkdelexprs clkdeldecls)
         (vl-occform-mkwires "clkdel" 0 nedges
                             :width 1))
        (clkdel-assigns
             (vl-make-delay-assigns clkdelexprs clkexprs 1 atts))
        ((mv ddelexprs ddeldecls)
         (vl-occform-mkwires "ddel" 0 nedges
                             :width width))
        (ddel-assigns (vl-make-delay-assigns ddelexprs dexprs 1 atts))
        ((mv qdelexpr qdeldecl)
         (vl-occform-mkwire "qdel" width))
        (qdel-assigns
             (list (make-vl-assign :lvalue qdelexpr
                                   :expr qregexpr
                                   :delay (vl-make-constdelay 1)
                                   :loc *vl-fakeloc*
                                   :atts atts)))
        ((mv clkedgeexprs clkedgedecls)
         (vl-occform-mkwires "clkedge" 0 nedges
                             :width 1))
        (clkedge-assigns (vl-nedgeflop-clkedge-assigns
                              clkedgeexprs clkexprs clkdelexprs))
        (anyedge-rhs (vl-nedgeflop-or-edges clkedgeexprs))
        ((mv anyedgeexpr anyedgedecl)
         (vl-occform-mkwire "anyedge" 1))
        (anyedge-assign (make-vl-assign :lvalue anyedgeexpr
                                        :expr anyedge-rhs
                                        :loc *vl-fakeloc*))
        ((mv dfullexpr dfulldecl)
         (vl-occform-mkwire "dfull" width))
        (dfull-rhs (vl-nedgeflop-data-mux clkexprs ddelexprs width))
        (dfull-assign (make-vl-assign :lvalue dfullexpr
                                      :expr dfull-rhs
                                      :loc *vl-fakeloc*))
        (qassign
         (make-vl-assign
            :lvalue qregexpr
            :expr
            (make-vl-nonatom :op :vl-qmark
                             :args (list anyedgeexpr dfullexpr qdelexpr)
                             :finalwidth width
                             :finaltype :vl-unsigned
                             :atts (list (list "VL_LATCH_MUX")))
            :loc *vl-fakeloc*))
        (mod
         (make-vl-module
          :name name
          :origname name
          :ports (cons qport (append dports clkports))
          :portdecls (cons qportdecl
                           (append dportdecls clkportdecls))
          :vardecls
          (cons
           qvardecl
           (append
            dvardecls
            (append
             clkvardecls
             (append
              clkdeldecls
              (append
                 ddeldecls
                 (append
                      qregdecls
                      (cons qdeldecl
                            (append clkedgedecls
                                    (cons anyedgedecl
                                          (cons dfulldecl 'nil))))))))))
          :assigns
          (append
           qregassigns
           (append
            clkdel-assigns
            (append
             ddel-assigns
             (append
                qdel-assigns
                (append
                     clkedge-assigns
                     (cons anyedge-assign
                           (cons dfull-assign (cons qassign 'nil))))))))
          :minloc *vl-fakeloc*
          :maxloc *vl-fakeloc*)))
       (list mod))))

    Theorem: vl-modulelist-p-of-vl-make-nedgeflop-vec

    (defthm vl-modulelist-p-of-vl-make-nedgeflop-vec
      (b* ((mods (vl-make-nedgeflop-vec width nedges delay)))
        (vl-modulelist-p mods))
      :rule-classes :rewrite)

    Theorem: type-of-vl-make-nedgeflop-vec

    (defthm type-of-vl-make-nedgeflop-vec
      (and (true-listp (vl-make-nedgeflop-vec width nedges delay))
           (consp (vl-make-nedgeflop-vec width nedges delay)))
      :rule-classes :type-prescription)