Function: verilog-auto

verilog-auto is an interactive and byte-compiled function defined in verilog-mode.el.gz.

Signature

(verilog-auto &optional INJECT)

Documentation

Expand AUTO statements.

Look for any /*AUTO...*/ commands in the code, as used in instantiations or argument headers. Update the list of signals following the /*AUTO...*/ command.

Use M-x verilog-delete-auto (verilog-delete-auto) to remove the AUTOs.

Use M-x verilog-diff-auto (verilog-diff-auto) to see differences in AUTO expansion.

Use M-x verilog-inject-auto (verilog-inject-auto) to insert AUTOs for the first time.

Use M-x verilog-faq (verilog-faq) for a pointer to frequently asked questions.

For new users, we recommend setting verilog-case-fold to nil and verilog-auto-arg-sort to t.

The hooks verilog-before-auto-hook and verilog-auto-hook are called before and after this function, respectively.

For example:
        module ExampModule (/*AUTOARG*/);
            /*AUTOINPUT*/
            /*AUTOOUTPUT*/
            /*AUTOWIRE*/
            /*AUTOREG*/
            InstMod instName #(/*AUTOINSTPARAM*/) (/*AUTOINST*/);
        endmodule

You can also update the AUTOs from the shell using:
        emacs --batch <filenames.v> -f verilog-batch-auto
Or fix indentation with:
        emacs --batch <filenames.v> -f verilog-batch-indent
Likewise, you can delete or inject AUTOs with:
        emacs --batch <filenames.v> -f verilog-batch-delete-auto
        emacs --batch <filenames.v> -f verilog-batch-inject-auto
Or check if AUTOs have the same expansion
        emacs --batch <filenames.v> -f verilog-batch-diff-auto

Using C-h f (describe-function), see also:
    verilog-auto-arg for AUTOARG module instantiations
    verilog-auto-ascii-enum for AUTOASCIIENUM enumeration decoding
    verilog-auto-assign-modport for AUTOASSIGNMODPORT assignment to/from modport
    verilog-auto-inout for AUTOINOUT making hierarchy inouts
    verilog-auto-inout-comp for AUTOINOUTCOMP copy complemented i/o
    verilog-auto-inout-in for AUTOINOUTIN inputs for all i/o
    verilog-auto-inout-modport for AUTOINOUTMODPORT i/o from an interface modport
    verilog-auto-inout-module for AUTOINOUTMODULE copying i/o from elsewhere
    verilog-auto-inout-param for AUTOINOUTPARAM copying params from elsewhere
    verilog-auto-input for AUTOINPUT making hierarchy inputs
    verilog-auto-insert-lisp for AUTOINSERTLISP insert code from lisp function
    verilog-auto-insert-last for AUTOINSERTLAST insert code from lisp function
    verilog-auto-inst for AUTOINST instantiation pins
    verilog-auto-star for AUTOINST .* SystemVerilog pins
    verilog-auto-inst-param for AUTOINSTPARAM instantiation params
    verilog-auto-logic for AUTOLOGIC declaring logic signals
    verilog-auto-output for AUTOOUTPUT making hierarchy outputs
    verilog-auto-output-every for AUTOOUTPUTEVERY making all outputs
    verilog-auto-reg for AUTOREG registers
    verilog-auto-reg-input for AUTOREGINPUT instantiation registers
    verilog-auto-reset for AUTORESET flop resets
    verilog-auto-sense for AUTOSENSE or AS always sensitivity lists
    verilog-auto-tieoff for AUTOTIEOFF output tieoffs
    verilog-auto-undef for AUTOUNDEF `undef of local `defines
    verilog-auto-unused for AUTOUNUSED unused inputs/inouts
    verilog-auto-wire for AUTOWIRE instantiation wires

    verilog-read-defines for reading `define values
    verilog-read-includes for reading `includes

If you have bugs with these autos, please file an issue at URL https://www.veripool.org/verilog-mode or contact the AUTOAUTHOR Wilson Snyder (wsnyder@wsnyder.org).

Key Bindings

Source Code

;; Defined in /usr/src/emacs/lisp/progmodes/verilog-mode.el.gz
;;; Auto top level:
;;

(defun verilog-auto (&optional inject)  ; Use verilog-inject-auto instead of passing an arg
  "Expand AUTO statements.
Look for any /*AUTO...*/ commands in the code, as used in
instantiations or argument headers.  Update the list of signals
following the /*AUTO...*/ command.

Use \\[verilog-delete-auto] to remove the AUTOs.

Use \\[verilog-diff-auto] to see differences in AUTO expansion.

Use \\[verilog-inject-auto] to insert AUTOs for the first time.

Use \\[verilog-faq] for a pointer to frequently asked questions.

For new users, we recommend setting `verilog-case-fold' to nil
and `verilog-auto-arg-sort' to t.

The hooks `verilog-before-auto-hook' and `verilog-auto-hook' are
called before and after this function, respectively.

For example:
        module ExampModule (/*AUTOARG*/);
            /*AUTOINPUT*/
            /*AUTOOUTPUT*/
            /*AUTOWIRE*/
            /*AUTOREG*/
            InstMod instName #(/*AUTOINSTPARAM*/) (/*AUTOINST*/);
        endmodule

You can also update the AUTOs from the shell using:
        emacs --batch  <filenames.v>  -f verilog-batch-auto
Or fix indentation with:
        emacs --batch  <filenames.v>  -f verilog-batch-indent
Likewise, you can delete or inject AUTOs with:
        emacs --batch  <filenames.v>  -f verilog-batch-delete-auto
        emacs --batch  <filenames.v>  -f verilog-batch-inject-auto
Or check if AUTOs have the same expansion
        emacs --batch  <filenames.v>  -f verilog-batch-diff-auto

Using \\[describe-function], see also:
    `verilog-auto-arg'          for AUTOARG module instantiations
    `verilog-auto-ascii-enum'   for AUTOASCIIENUM enumeration decoding
    `verilog-auto-assign-modport' for AUTOASSIGNMODPORT assignment to/from modport
    `verilog-auto-inout'        for AUTOINOUT making hierarchy inouts
    `verilog-auto-inout-comp'   for AUTOINOUTCOMP copy complemented i/o
    `verilog-auto-inout-in'     for AUTOINOUTIN inputs for all i/o
    `verilog-auto-inout-modport'  for AUTOINOUTMODPORT i/o from an interface modport
    `verilog-auto-inout-module' for AUTOINOUTMODULE copying i/o from elsewhere
    `verilog-auto-inout-param'  for AUTOINOUTPARAM copying params from elsewhere
    `verilog-auto-input'        for AUTOINPUT making hierarchy inputs
    `verilog-auto-insert-lisp'  for AUTOINSERTLISP insert code from lisp function
    `verilog-auto-insert-last'  for AUTOINSERTLAST insert code from lisp function
    `verilog-auto-inst'         for AUTOINST instantiation pins
    `verilog-auto-star'         for AUTOINST .* SystemVerilog pins
    `verilog-auto-inst-param'   for AUTOINSTPARAM instantiation params
    `verilog-auto-logic'        for AUTOLOGIC declaring logic signals
    `verilog-auto-output'       for AUTOOUTPUT making hierarchy outputs
    `verilog-auto-output-every' for AUTOOUTPUTEVERY making all outputs
    `verilog-auto-reg'          for AUTOREG registers
    `verilog-auto-reg-input'    for AUTOREGINPUT instantiation registers
    `verilog-auto-reset'        for AUTORESET flop resets
    `verilog-auto-sense'        for AUTOSENSE or AS always sensitivity lists
    `verilog-auto-tieoff'       for AUTOTIEOFF output tieoffs
    `verilog-auto-undef'        for AUTOUNDEF \\=`undef of local \\=`defines
    `verilog-auto-unused'       for AUTOUNUSED unused inputs/inouts
    `verilog-auto-wire'         for AUTOWIRE instantiation wires

    `verilog-read-defines'      for reading \\=`define values
    `verilog-read-includes'     for reading \\=`includes

If you have bugs with these autos, please file an issue at
URL `https://www.veripool.org/verilog-mode' or contact the AUTOAUTHOR
Wilson Snyder (wsnyder@wsnyder.org)."
  (interactive)
  (unless noninteractive (message "Updating AUTOs..."))
  (if (fboundp 'dinotrace-unannotate-all)
      (dinotrace-unannotate-all))
  ;; Disable change hooks for speed
  ;; This let can't be part of above let; must restore
  ;; after-change-functions before font-lock resumes
  (verilog-save-font-no-change-functions
   (let ((oldbuf (if (not (buffer-modified-p))
                     (buffer-string)))
         (case-fold-search verilog-case-fold)
         ;; Cache directories; we don't write new files, so can't change
         (verilog-dir-cache-preserving t)
         ;; Cache current module
         (verilog-modi-cache-current-enable t)
         (verilog-modi-cache-current-max (point-min)) ; IE it's invalid
         verilog-modi-cache-current)
     (verilog-save-scan-cache
      (save-excursion
        ;; Wipe cache; otherwise if we AUTOed a block above this one,
        ;; we'll misremember we have generated IOs, confusing AUTOOUTPUT
        (setq verilog-modi-cache-list nil)
        ;; Local state
        (verilog-read-auto-template-init)
        ;; If we're not in verilog-mode, change syntax table so parsing works right
        (unless (eq major-mode 'verilog-mode) (verilog-mode))
        ;; Allow user to customize
        (verilog-run-hooks 'verilog-before-auto-hook)
        ;; Try to save the user from needing to revert-file to reread file local-variables
        (verilog-auto-reeval-locals)
        (verilog-read-auto-lisp-present)
        (verilog-read-auto-lisp (point-min) (point-max))
        (verilog-getopt-flags)
        ;; From here on out, we can cache anything we read from disk
        (verilog-preserve-dir-cache
         ;; These two may seem obvious to do always, but on large includes it can be way too slow
         (when verilog-auto-read-includes
           (verilog-read-includes)
           (verilog-read-defines nil nil t))
         ;; Setup variables due to SystemVerilog expansion
         (verilog-auto-re-search-do "/\\*AUTOLOGIC\\*/" 'verilog-auto-logic-setup)
         ;; This particular ordering is important
         ;; INST: Lower modules correct, no internal dependencies, FIRST
         (verilog-preserve-modi-cache
          ;; Clear existing autos else we'll be screwed by existing ones
          (verilog-delete-auto-buffer)
          ;; Injection if appropriate
          (when inject
            (verilog-inject-inst)
            (verilog-inject-sense)
            (verilog-inject-arg))
          ;;
          ;; Do user inserts first, so their code can insert AUTOs
          (verilog-auto-re-search-do "/\\*AUTOINSERTLISP(.*?)\\*/"
                                     'verilog-auto-insert-lisp)
          ;; Expand instances before need the signals the instances input/output
          (verilog-auto-re-search-do "/\\*AUTOINSTPARAM\\((.*?)\\)?\\*/" 'verilog-auto-inst-param)
          (verilog-auto-re-search-do "/\\*AUTOINST\\((.*?)\\)?\\*/" 'verilog-auto-inst)
          (verilog-auto-re-search-do "\\.\\*" 'verilog-auto-star)
          ;; Must be done before autoin/out as creates a reg
          (verilog-auto-re-search-do "/\\*AUTOASCIIENUM(.*?)\\*/" 'verilog-auto-ascii-enum)
          ;;
          ;; first in/outs from other files
          (verilog-auto-re-search-do "/\\*AUTOINOUTMODPORT(.*?)\\*/" 'verilog-auto-inout-modport)
          (verilog-auto-re-search-do "/\\*AUTOINOUTMODULE(.*?)\\*/" 'verilog-auto-inout-module)
          (verilog-auto-re-search-do "/\\*AUTOINOUTCOMP(.*?)\\*/" 'verilog-auto-inout-comp)
          (verilog-auto-re-search-do "/\\*AUTOINOUTIN(.*?)\\*/" 'verilog-auto-inout-in)
          (verilog-auto-re-search-do "/\\*AUTOINOUTPARAM(.*?)\\*/" 'verilog-auto-inout-param)
          ;; next in/outs which need previous sucked inputs first
          (verilog-auto-re-search-do "/\\*AUTOOUTPUT\\((.*?)\\)?\\*/" 'verilog-auto-output)
          (verilog-auto-re-search-do "/\\*AUTOINPUT\\((.*?)\\)?\\*/" 'verilog-auto-input)
          (verilog-auto-re-search-do "/\\*AUTOINOUT\\((.*?)\\)?\\*/" 'verilog-auto-inout)
          ;; Then tie off those in/outs
          (verilog-auto-re-search-do "/\\*AUTOTIEOFF\\*/" 'verilog-auto-tieoff)
          ;; These can be anywhere after AUTOINSERTLISP
          (verilog-auto-re-search-do "/\\*AUTOUNDEF\\((.*?)\\)?\\*/" 'verilog-auto-undef)
          ;; Wires/regs must be after inputs/outputs
          (verilog-auto-re-search-do "/\\*AUTOASSIGNMODPORT(.*?)\\*/" 'verilog-auto-assign-modport)
          (verilog-auto-re-search-do "/\\*AUTOLOGIC\\*/" 'verilog-auto-logic)
          (verilog-auto-re-search-do "/\\*AUTOWIRE\\*/" 'verilog-auto-wire)
          (verilog-auto-re-search-do "/\\*AUTOREG\\*/" 'verilog-auto-reg)
          (verilog-auto-re-search-do "/\\*AUTOREGINPUT\\*/" 'verilog-auto-reg-input)
          ;; outputevery needs AUTOOUTPUTs done first
          (verilog-auto-re-search-do "/\\*AUTOOUTPUTEVERY\\((.*?)\\)?\\*/" 'verilog-auto-output-every)
          ;; Doesn't matter when done, but combine it with a common changer
          (verilog-auto-re-search-do "/\\*\\(AUTOSENSE\\|AS\\)\\*/" 'verilog-auto-sense)
          ;; After AUTOREG*, as they may have set signal widths
          (verilog-auto-re-search-do "/\\*AUTORESET\\*/" 'verilog-auto-reset)
          ;; After we've created all new variables
          (verilog-auto-re-search-do "/\\*AUTOUNUSED\\*/" 'verilog-auto-unused)
          ;; Must be after all inputs outputs are generated
          (verilog-auto-re-search-do "/\\*AUTOARG\\*/" 'verilog-auto-arg)
          ;; User inserts
          (verilog-auto-re-search-do "/\\*AUTOINSERTLAST(.*?)\\*/" 'verilog-auto-insert-last)
          ;; Fix line numbers (comments only)
          (when verilog-auto-inst-template-numbers
            (verilog-auto-templated-rel))
          (when verilog-auto-template-warn-unused
            (verilog-auto-template-lint))))
        ;;
        (verilog-run-hooks 'verilog-auto-hook)
        ;;
        (when verilog-auto-delete-trailing-whitespace
          (verilog-delete-trailing-whitespace))
        ;;
        (set (make-local-variable 'verilog-auto-update-tick) (buffer-chars-modified-tick))
        ;;
        ;; If end result is same as when started, clear modified flag
        (cond ((and oldbuf (equal oldbuf (buffer-string)))
               (verilog-restore-buffer-modified-p nil)
               (unless noninteractive (message "Updating AUTOs...done (no changes)")))
              (t (unless noninteractive (message "Updating AUTOs...done"))))
        ;; End of save-cache
        )))))