使用sed为Verilog模块端口行添加逗号(排除最后一行)
用sed修复Verilog实例端口的逗号格式化问题
输入文件内容
my_instance_name ( .port1 (port1 ) .port2 (port2 ) // comment for port line 2 .port3 (port3 ) .port4 (port4 ) // comment for port line 4 );
期望输出(优先格式)
my_instance_name ( .port1 (port1 ), .port2 (port2 ), // comment for port line 2 .port3 (port3 ), .port4 (port4 ) // comment for port line 4 );
可选替代格式(若优先格式实现复杂)
my_instance_name ( .port1 (port1 ) ,.port2 (port2 ) // comment for port line 2 ,.port3 (port3 ) ,.port4 (port4 ) // comment for port line 4 );
具体要求
- 优先格式:给除最后一行外的所有端口行的右括号后添加逗号
- 替代格式:给除第一行外的所有端口行的点号前添加逗号
- 必须保留行尾的双斜杠注释
- 空白仅为可读性,不影响逻辑处理
- 最后一行端口后允许存在多个换行
当前实现的局限
目前能通过以下两行sed代码给所有端口行添加逗号,但无法排除最后一行端口:
sed -i /^\s*my_instance_name.*/,/);/{s/^\(\s*\..*)\)\(\s*\/\/.*\)/\1,\2/} my_verilog.txt sed -i /^\s*my_instance_name.*/,/);/{s/^\(\s*\..*)\)\s*\$/\1,/} my_verilog.txt
解决方案
方案1:实现优先格式
核心思路是先给所有符合条件的端口行加逗号,再定位到实例块结尾的);,回删上一行的末尾逗号:
sed -i ' /^\s*my_instance_name/,/);/{ # 给带注释的端口行添加逗号 s/^\(\s*\..*)\)\(\s*\/\/.*\)/\1,\2/ # 给不带注释的端口行添加逗号 s/^\(\s*\..*)\)\s*$/\1,/ # 遇到实例结尾时,修正最后一行端口的逗号 /);/{ x # 处理带注释的最后一行端口 s/,\(\s*\/\/.*\)$/\1/ # 处理不带注释的最后一行端口 s/,$// x } # 缓存当前行到保持空间,供后续修正使用 h } ' my_verilog.txt
方案2:实现替代格式
这种方式逻辑更简单,只需给实例块内的非首行端口前加逗号:
sed -i ' /^\s*my_instance_name/,/);/{ /^\s*\./{ # 标记第一个端口行,跳过处理 /FIRST_PORT/!{ x s/^/FIRST_PORT/ x b } # 非首行端口,在点号前插入逗号 s/^\s*\./ ,&/ } h } ' my_verilog.txt
或者更简洁的版本:
sed -i '/^\s*my_instance_name/,/);/{ /^\s*\./{N;/\n\s*\./s/\n\s*/\n ,/;P;D} }' my_verilog.txt
内容的提问来源于stack exchange,提问作者hskim__
相关产品推荐
相关产品推荐

