Verilog网表的Perl查找和替换(regex)的用法

时间:2018-10-23 07:06:46

标签: perl verilog

我正在尝试开发一个脚本,该脚本接受Verilog网表的输入并为此创建一个测试平台,因此,当我们通过名称将测试平台连接到主模块时,我们会做类似的事情,

.a(a); .ext(ext);    etc etc.

现在我有120个输入,可用于更大的块

 `in1, in2... and some arrays like [31:0] ext; etc

我想匹配.in1的模式;并将其替换为.in1(in1);

我正在尝试

 s/^\s+\.(.*)/\.$1\($1\)/g;

,它将检查以空格字符开头的字符串,然后是单个“。”。字符,然后是所有字符,并将其替换为语句行中显示的模式,

完整的代码如下:

use strict;
use warnings;

my $filename = shift;
open (my $fh , "<" , $filename) or die $!; 
open (my $pr , ">" , "D:/dump/testbench.v") or die $!; 

my @code;
while (my $line = <$fh>)
{   
    chomp $line;
    @code = (@code, $line);
}   
#foreach my $i (0..$#code)
#{  
#print "$code[$i]\n";
#}  
#   

foreach my $j (0..$#code)
{   
    if ($code[$j] =~ /^\s+\..*/)
    {   
        print "$code[$j]\n";
        $code[$j] =~ s/^\s+\.(.*)/\.$1\($1\)/g;
        print "$code[$j]\n";
    }   
}   

foreach my $k (0..$#code)
{   
    print $pr "$code[$k]\n";
}   
close $pr;

替换模式的作用类似于.in1;(in1;),而不是.in1(in1);.[31:0] ext;([31:0] ext;)

如何以更好的方式做到这一点?

0 个答案:

没有答案