码迷,mamicode.com
首页 > 其他好文 > 详细

Verilog代码自动缩进和对齐Perl脚本

时间:2014-09-16 23:44:31      阅读:539      评论:0      收藏:0      [点我收藏+]

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


Verilog代码自动缩进和对齐Perl脚本

标签:des   blog   os   使用   ar   文件   2014   art   sp   

原文地址:http://blog.csdn.net/congduan/article/details/39325593

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!