perl实现verilog ifdef所在域的判断
程序员文章站
2022-04-24 09:41:30
...
功能描述
perl实现verilog ifdef所在域的判断。
1. emacs verilog-mode用于实例化很方便;但是常见项目,均存在大量ifdef的预编译命令。而emacs verilog-mode不支持ifdef。
2. 手动实例化,往往带来不可预料的错误。
功能演示
代码
#!/usr/bin/perl
use strict;
use warnings;
open my $ifile,"<",$ARGV[0] or die;
my $ifile_num=0;
my @tag;
my @state=("ifdef_DEFF","ifndef_DEFG");
while(<$ifile>){
#print "========like verilog fsm state=========================\n";
$ifile_num=$ifile_num+1;
if($_ =~ /\s*\`ifdef\s+([0-9a-zA-Z_]+)/){
push @tag,"ifdef_$1";
}
if($_ =~ /\s*\`ifndef\s+([0-9a-zA-Z_]+)/){
push @tag,"ifndef_$1";
}
if($_ =~ /\s*\`else/){
my $current_tag = pop @tag;
if($current_tag =~ /ifndef_([0-9a-zA-Z_]+)/){
push @tag,"ifdef_$1";
}
if($current_tag =~ /ifdef_([0-9a-zA-Z_]+)/){
push @tag,"ifndef_$1";
}
}
if($_ =~ /\s*\`endif/){
pop @tag;
}
#print "========debug information=========================\n";
print "$ifile_num:\@tag=@tag";
print "\n";
#print "========action by debug information=========================\n";
if(&compare(\@tag,\@state)){
print "$_";
}
}
close $ifile;
sub compare()
{
my $flag=0;
my ($first,$second)=@_;
if (@$first==@$second) # the number of the array , don't use length()
{
for(my $i=0;$i<@$first;$i++)
{
#if($first->[$i]!=$second->[$i])
if($first->[$i] ne $second->[$i])
{
$flag=1;
#print "$first->[$i] ne $second->[$i]\n";
}
}
}
else
{
$flag=1;
}
if( $flag==1)
{
#print "two arrays are not equal\n";
return 0;
}
else
{
#print "two arrays are equal\n";
return 1;
}
}
代码小结
利用数组,作为状态
利用数组匹配,作为状态判断,并执行相应任务
数组匹配,子函数compare
上一篇: ajax GET请求参数莫名丢失问题
下一篇: Android 实现文件上传功能