2012-01-03 356 views
1

我的工作通过包含ifdef块的long verilog代码浏览。我的主要编辑是emacs。下面是一个典型的例子:使用emacs在verilog代码中折叠/识别当前的`ifdef块

module Foo(
... 
... 
); 

// Inputs, Outputs 
... 

`ifdef CONDITION_1 
... 
...  
`else // CONDITION_1 
... 
...  
`ifdef CONDITION_2 
... 
... 
`endif //CONDITION_2 
... 
... 
    foo <= 1'b1; 
... 
... 
`endif // CONDITION_1 

正如你可以看到foo <= 1'b1;是在IFDEF CONDITION_1假设我的观点是上线foo <= 1'b1;其他块有没有办法让我可以直接移动到该行ifdef CONDITION_1或折叠代码,以便我可以看到CONDITION1?我尝试使用后向增量搜索,但在这种情况下,我最终在ifdef CONDITION_2 我试着使用hide-ifdef模式,但它标识#ifdef而不是`ifdef。这些块不使用括号。所以使用C-M-u并没有帮助

回答

2

这将做到这一点,虽然你上面的例子,将在

`else // CONDITION_1 

声明停止,因为这是被包围foo分配:

(defun my-verilog-up-ifdef() 
    "Go up `ifdef/`ifndef/`else/`endif macros until an enclosing one is found." 
    (interactive) 
    (let ((pos (point)) (depth 0) done) 
    (while (and (not done) 
      (re-search-backward "^\\s-*`\\(ifdef\\|ifndef\\|else\\|endif\\)" nil t)) 
     (if (looking-at "\\s-*`endif") 
      (setq depth (1+ depth)) 
     (if (= depth 0) 
      (setq done t) 
      (when (looking-at "\\s-*`if") 
      (setq depth (1- depth)))))) 
    (unless done 
     (goto-char pos) 
     (error "Not inside an `ifdef construct")))) 
+0

感谢百万兄弟...所有'别的已被评论与相应的条件,所以它确定,即使它停在'其他。:) – Pulimon 2012-01-04 04:45:47

+1

我想你会想要的,否则你怎么知道它是否在'如果def部分或'else部分:) – scottfrazer 2012-01-04 12:55:58

+0

另外如果不是很明显:如果'else没有被评论,只需从那里再次执行命令,它将跳转到'ifdef。 – scottfrazer 2012-01-04 13:38:28

2

elisp常量hif-cpp-prefix控制着hide-ifdef-mode使用的基本语法。我猜想,你可以将它定义为如下所示。 (警告,这是未经测试,因为我不使用Verilog的自己。)

(setq hif-cpp-prefix "\\(^\\|\r\\)[ \t]*\\(#\\|`\\)[ \t]*") 

注意,这是使用defconst而不是defvar定义,所以hide-ifdef-mode编译版本可能仍然使用原来的值。将未编译的文件加载到Emacs中可能会解决这个问题。

+0

我试了一下,但对于一些理由它没有工作:( – Pulimon 2012-01-04 04:46:07