Function: verilog-make-width-expression
verilog-make-width-expression is a byte-compiled function defined in
verilog-mode.el.gz.
Signature
(verilog-make-width-expression RANGE-EXP)
Documentation
Return an expression calculating the length of a range [x:y] in RANGE-EXP.
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/verilog-mode.el.gz
(defun verilog-make-width-expression (range-exp)
"Return an expression calculating the length of a range [x:y] in RANGE-EXP."
;; strip off the []
(cond ((not range-exp)
"1")
(t
(if (string-match "^\\[\\(.*\\)\\]$" range-exp)
(setq range-exp (match-string 1 range-exp)))
(cond ((not range-exp)
"1")
;; [#:#] We can compute a numeric result
((string-match "^\\s *\\([0-9]+\\)\\s *:\\s *\\([0-9]+\\)\\s *$"
range-exp)
(int-to-string
(1+ (abs (- (string-to-number (match-string 1 range-exp))
(string-to-number (match-string 2 range-exp)))))))
;; [PARAM-1:0] can just return PARAM
((string-match "^\\s *\\([a-zA-Z_][a-zA-Z0-9_]*\\)\\s *-\\s *1\\s *:\\s *0\\s *$" range-exp)
(match-string 1 range-exp))
;; [arbitrary] need math
((string-match "^\\(.*\\)\\s *:\\s *\\(.*\\)\\s *$" range-exp)
(concat "(1+(" (match-string 1 range-exp) ")"
(if (equal "0" (match-string 2 range-exp))
"" ; Don't bother with -(0)
(concat "-(" (match-string 2 range-exp) ")"))
")"))
(t nil)))))