标签:des blog os 使用 ar 文件 2014 art sp
实验室做FPGA开发时经常用到Verilog,代码规范成为一个问题,于是乎写了一个Perl脚本对代码进行规范化,主要是进行自动缩进和对齐。
代码原理很简单,主要是使用了正则表达式进行匹配和替换。
代码如下,初学Perl,请读者赐教:
#####################################################
# 代码缩进对齐脚本
# 功能:对Verilog代码进行自动缩进和对齐处理,
# 该版本目前还没有对case语句进行处理
# 更改:增加了对assign的缩进
# 运行环境:perl
# 运行方式:perl code_indent.pl
# 作者:段聪
# 日期:2014/9/16 22:16
#####################################################
my $filename = ‘C:\Users\CvCv\Desktop\Perl_tmp\code.v‘;#输入文件名
my $outfilename = ‘C:\Users\CvCv\Desktop\Perl_tmp\out.v‘;#输出文件名
#----------------------------------------------------------
#测试文件存在
die "文件$filename不存在!\n" unless -e $filename;
#打开文件
open(VFILE,"<",$filename) || die "打开文件失败!\n";
open(OFILE,">",$outfilename) || die "打开文件失败!\n";
#----------------------------------------------------------
#变量定义
$begin_cnt = 0;
$if_cnt = 0;
$autoindent_space = " "x4;#自动缩进的空格数(Tab宽度)
$last_line = "";
$assign_start = 0;
#----------------------------------------------------------
#读取并处理文件
while(<VFILE>){
$line = $_;
if(/\s*\b(input|output|reg|wire)\b/i){
$line =~ s/^\s+//;
my @result = ($line =~ /\s*(input|output|reg|wire|(?:output\s+reg))\s*(\[\d+\:\d+\])?\s*((?!reg|wire)\w+)([,;]?)/ig);
#print length($result[0]),"--@result\n";
if($#result>0){
$line = $result[0]." "x(20-length($result[0]));
$line .= $result[1]." "x(20-length($result[1]));
$line .= $result[2]." "x(20-length($result[2]));
$line .= $result[3]."\n";
}
$last_line = $_;
}
elsif(/(parameter)?\s*(\w+)\s*\=\s*(\d+\‘[hbHB][0-9a-fA-F_]+)\s*([,;]?)/i){
$line =~ s/^\s+//;
my @result = ($line =~ /(parameter)?\s*(\w+)\s*\=\s*(\d+\‘[hbHB][0-9a-fA-F_]+)\s*([,;]?)/ig);
#print $#result."--@result\n";
if($#result>0){
$line = $result[0]." "x(20-length($result[0]));
$line .= $result[1]." "x(35-length($result[1]));
$line .= "= ".$result[2]." "x(18-length($result[2]));
$line .= $result[3]."\n";
}
$last_line = $_;
}
elsif(/\s*\b(module|endmodule|always|assign)\b/i){#匹配到module|always|assign
$line =~ s/^\s+//;
if(/\s*\bassign\b\s+\w/i){#匹配到assign
$line =~ s/\s*\bassign\b\s+(\w)/assign $1/i;
$assign_start = 1;
#print;
}
$last_line = $_;
}
elsif(/\bbegin\b/i){#匹配到begin
$begin_cnt++;
my $tmp_space = $autoindent_space x $begin_cnt;
$line =~ s/^\s*/$tmp_space/;
$last_line = $_;
}
elsif(/\bend\b/i){#匹配到end
if($if_cnt>0){
$if_cnt--;
}
my $tmp_space = $autoindent_space x $begin_cnt;
$begin_cnt--;
$line =~ s/^\s*/$tmp_space/;
$last_line = $_;
}
elsif(/\bif\s*\(/i){#匹配到if
$if_cnt++;
my $tmp_space = $autoindent_space x ($begin_cnt>0?($begin_cnt+1):$begin_cnt);
$line =~ s/^\s*/$tmp_space/;
$last_line = $_;
}
elsif(/\belse\s*/i){#匹配到else
my $tmp_space = $autoindent_space x ($begin_cnt>0?($begin_cnt+1):$begin_cnt);
$line =~ s/^\s*/$tmp_space/;
$last_line = $_;
}
elsif(/^\s*$/){#匹配到空行
$line = "\n";
}
else{
#print $if_cnt,"--",$_;
if($assign_start){
my $tmp_space = $autoindent_space x2;
$line =~ s/^\s*/$tmp_space/;
if(/".*;\s*$"/){
$assign_start = 0;
}
}
elsif($last_line =~ /(\bif\s*\()|(\belse\s*)/){
$if_cnt--;
my $tmp_space = $begin_cnt>0 ? ($begin_cnt+2):$autoindent_space;
$line =~ s/^\s*/$tmp_space/;
}
else{
my $tmp_space = $begin_cnt>0 ? $autoindent_space x ($begin_cnt+1):"";
$line =~ s/^\s*/$tmp_space/;
}
$last_line = $_;
}
$text.=$line;
}
#关闭文件
close VFILE;
select OFILE;
print $text;
close OFILE;
select STDOUT;
print "处理完毕,文件输出到$outfilename\n";标签:des blog os 使用 ar 文件 2014 art sp
原文地址:http://blog.csdn.net/congduan/article/details/39325593