我有一个非常长的端口映射,我想要替换一堆
SignalName[i],
带
.SignalName(SignalName[i]),
我想我可以用正则表达式轻松地做到这一点,但我不能为我的生活弄清楚如何。有什么想法吗?
答案 0 :(得分:3)
假设SignalData是包含您的端口映射信息的文件,以下内容将按您的要求执行。
sed -si 's/\([a-zA-Z]\+\)\(\[[^\]]*\]\)/\.\1(\1\2)/g' SignalData
在sed中代表替换,第一对//之间的正则表达式用于匹配每一行。如果找到匹配,则表示直到下一个/之间的表达式以替换匹配的表达式。
正则表达式的解释
\([a-zA-Z]\+\) - Matches a series of alphabets (like SignalName) and captures it into
\1. If you want only the SignalName string to match, replace [a-zA-Z]\+ with SignalName.
\(\[[^\]]*\]\) - Matches the [some character] part and captures it into \2
最后,我们使用这些捕获的字符串来构造所需的字符串。
如果您想在运行文件之前尝试使用sed -s而不是sed -si。这将显示stdout转换的结果,而不实际更改文件
答案 1 :(得分:1)
迟到3年,但我强烈推荐emacs的verilog模式。它简化了这种实例化模块的操作。例如,如果您有这样的模块:
module submodule(
input [1:0] ina,
input inb,
input inc,
output outa);
/*some stuff*/
endmodule
您可以使用verilog模式实例化它:
module mymodule(
/*AUTOOUTPUT*/
/*AUTOINPUT*/);
submodule submod(/*AUTOINST*/);
endmodule
当您在emacs(C-c C-a)中展开AUTO时,您会得到:
module mymodule(
input [1:0] ina,
input inb,
input inc,
output outa);
submodule submod(
.ina (ina),
.inb (inb),
.inc (inc),
.outa (outa));
endmodule
您可以使用简化的正则表达式和lisp方程扩展它,以进行复杂的连接。将一堆模块连接在一起或通过层次结构更改信号名称时,可节省大量时间。
此处有更多信息: http://www.veripool.org/wiki/verilog-mode/Verilog-mode_veritedium