手动修改Gtkwave 工程文件, 快速设置波形颜色和数据显示格式

修改gtkwave 配置文件, 来修改显示进制格式 (format)

进制表示

@22 @23 十六进制

@24 @25 十进制

@420 @421 有符号十进制

@28 @29 二进制

@30 @31 八进制

@820 @821 ASCII

@80000024 @80000025 Time

@100000028 @100000029 Enum 枚举

👿注意:

每一种进制有两种表示方法, 如 @22 和 @23 都表示十进制,
初始工程的初始配置里面的@XX 都是偶数, 修改后会自动变成单数

修改gtkwave 工程文件, 总线数值显示成有符号的十进制数

vim xxx.gtkw
把总线信号的上面的 @XX 替换成 @420, 如果没有声明 @XX, 则手动加上@420 即可

编写 elisp 函数(my/gtkwave-change-format-to-signed-decimal) 来自动把所有总线显示成有符号的十进制数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
(defun my/gtkwave-change-format-to-signed-decimal ()
  (interactive)
  (save-excursion
    (goto-char (point-min))  ; 从buffer的开始位置开始
    (while (re-search-forward "^[[:alpha:]].*\\[\\([0-9]+\\):\\([0-9]+\\)\\]$" nil t)
      ;; 当前行符合以字母开头并以 [x:y] 结尾的格式
      (message "line : %s" (thing-at-point 'line))

      (let* ((line-start (line-beginning-position)))
        (forward-line -1)  ; 移动到前一行
        (if (looking-at "@")
            (progn
              (kill-whole-line)  ; 删除以@开头的行
              (insert "@421\n"))  ; 插入@421
          (if (looking-at "^\\[color\\]")
              (progn
                (let* ((color-line-start (point)))
                  (forward-line -1)  ; 检查[color]行的上一行
                  (if (looking-at "@")
                      (progn
                        (kill-whole-line)  ; 如果是以@开头,则删除
                        (goto-char color-line-start))  ; 返回[color]行位置
                    (goto-char line-start)))  ; 如果不是,则返回原始匹配行
                (beginning-of-line)
                (insert "@421\n")
                (forward-line 1)
                )  ; 在原始匹配行之前插入新行
            (progn
              (forward-line 1)
              (beginning-of-line)
              (insert "@421\n"))))  ; 在原始匹配行之前插入新行
        (forward-line 1)))))  ; 继续处理下一行

修改gtkwave 配置文件来修改波形颜色

只需要在波形上加上一行 [color] X 即可
其中 X 是十进制数字

颜色的表示

1 红色

2 Orange 橘色

3 黄色

4 绿色

5 蓝色

6 Indigo 靛青

7 Violet 紫色

8 Cycle 虽然字面意思是周期, 但是看起来是一直是红色

使用elisp 函数 (my/gtkw-reset-color, my/gtkw-auto-set-color) 来自动设置颜色

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
(defun my/gtkw-reset-color ()
  " 复位gtkw 中的颜色设置 "
  (interactive)
  (my/color-gtkw-waves nil))

(defun my/gtkw-auto-set-color ()
  " 自动设备 gtkw 文件中的信号的颜色, 按顺序颜色从1 到8 交替 "
  (interactive)
  (my/color-gtkw-waves t))

(defun my/color-gtkw-waves (auto)
  (save-excursion
    ;; First pass: remove all lines starting with [color]
    (goto-char (point-min))
    (while (not (eobp))
      (if (looking-at "^\\[color\\]")
          (progn
            (message "line %d" (current-line))
            (delete-region (point) (progn (forward-line 1) (point))))
        (forward-line 1)))
    (when auto
      ;; Second pass: insert [color] x before lines starting with a letter
      (let* ((color-counter 1))
        (goto-char (point-min))
        (while (not (eobp))
          (when (looking-at "^[[:alpha:]]")
            (insert (format "[color] %d\n" color-counter))
            (setq color-counter (if (= color-counter 8) 1 (1+ color-counter))))
          (forward-line 1))))))

效果

Licensed under CC BY-NC-SA 4.0