标签: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