blob: 8b645d3eab6e01fee4da4695f135b5484f96ff8e [file] [log] [blame]
#Usage:
# perl vcd2act.pl <vcd file> <blif file for circuit> > <Output act file name>
open vcd , $ARGV[0] or die $!;
open blif , $ARGV[1] or die $!;
$reached = 0;
while(<vcd>)
{
#print "1\n";
@tokens = split(/ +/);
#print "$tokens[0]\n";
if($tokens[0] eq "\$var")
{
$signal_name{$tokens[3]} = $tokens[4];
$TC{($signal_name{$tokens[3]})}=0;
#print "$signal_code{$tokens[4]}\n";
push(@codes , $tokens[3]);
}
elsif($tokens[0] eq "\$dumpvars\n")
{
$reached = 1;
while(<vcd>)
{
if($_ ne "\$end\n")
{
chomp($_);
@chars = split(//);
$initial_val = $chars[0];
for($i=1 ; $i<=$#chars ; $i++)
{
#print "pushing: $chars[$i] - ";
push(@code , $chars[$i]);
}
$sig_code = join('' , @code[0..$#code]);
print "initial => $sig_code -> $initial_val\n";
$current_val{$sig_code} = $initial_val;
$newstring = "";
@code = "";
}
else{
last;
}
}
for($i=0 ; $i<=$#codes ; $i++)
{
$following_transition{$codes[$i]} = $current_val{$codes[$i]};
$T1{( $signal_name{$codes[$i]} )} = 0;
$logic_1_time_count_start{$codes[$i]} = 0;
}
$sim_time = 0;
$prev_sim_time = 0;
}
else{
chomp($_);
if($reached == 1){
@check = split(//);
if($check[0] ne "#" && $check[0] ne "\$")
{
@chars = split(//);
$val = $chars[0];
for($i=1 ; $i<=$#chars ; $i++)
{
#print "pushing: $chars[$i] - ";
push(@code , $chars[$i]);
}
$sig_code = join('' , @code[0..$#code]);
#print "$sig_code -> $val\n";
if($is_first_toggle_in_timestep{$sig_code} == 1)
{
$state_at_start{$sig_code} = $val;
#$TC{($signal_name{$sig_code})}++;
print "$signal_name{$sig_code} TC: $TC{($signal_name{$sig_code})}\n";
$following_transition{$sig_code} = $val;
$is_first_toggle_in_timestep{$sig_code} = 0;
}
elsif($is_first_toggle_in_timestep{$sig_code} == 0)
{
$following_transition{$sig_code} = $val;
}
$newstring = "";
@code = "";
}
elsif($check[0] eq "#")
{
for($i=0 ; $i<=$#codes ; $i++)
{
#print "\t\t$signal_name{$codes[$i]} : $following_transition{$codes[$i]} vs. $current_val{$codes[$i]}\n";
if($following_transition{$codes[$i]} ne $current_val{$codes[$i]})
{
$TC{ ( $signal_name{$codes[$i]} ) }++;
#print "\t\t\t$signal_name{$codes[$i]} TC: $TC{($signal_name{$codes[$i]})}\n";
if($following_transition{$codes[$i]} eq "1")
{
#print "\t\t\t\t$signal_name{$codes[$i]} : going to logic 1 at $sim_time\n";
$logic_1_time_count_start{$codes[$i]} = $sim_time;
}
elsif($current_val{$codes[$i]} eq "1")
{
$T1{( $signal_name{$codes[$i]} )} += ($sim_time - $logic_1_time_count_start{$codes[$i]});
#print "\t\t\t\t$signal_name{$codes[$i]} : moving from logic 1 at $sim_time\n";
}
#print "\t\t\t$signal_name{$codes[$i]} T1: $T1{( $signal_name{$codes[$i]} )}\n";
$current_val{$codes[$i]} = $following_transition{$codes[$i]};
}
}
$temp_time = $prev_sim_time;
$sig_time = "";
@time_lapse = "";
for($i=1 ; $i<=$#check ; $i++)
{
push(@time_lapse , $check[$i]);
}
$prev_sim_time = $sim_time;
$sim_time = join('' , @time_lapse[0..$#time_lapse]);
for($i=0 ; $i<=$#codes ; $i++)
{
$is_first_toggle_in_timestep{$codes[$i]} = 1;
}
}
}
}
}
for($i=0 ; $i<=$#codes ; $i++)
{
if($current_val{$codes[$i]} eq "1")
{
$T1{( $signal_name{$codes[$i]} )} += ($sim_time - $logic_1_time_count_start{$codes[$i]});
#print "\n$signal_name{$codes[$i]} T1 final: $T1{( $signal_name{$codes[$i]} )}\n";
}
}
while(<blif>)
{
@tokens = split(/ +/);
if($tokens[0] eq ".inputs")
{
chop($tokens[$#tokens]);
for($i=1 ; $i<=$#tokens ; $i++)
{
$fixed_name = $tokens[$i];
$fixed_name =~ s/\^/\_/g;
$fixed_name =~ s/\+/\_/g;
$fixed_name =~ s/\~/\_/g;
$fixed_name =~ s/\[/\_/g;
$fixed_name =~ s/\]/\_/g;
$stat_prob = $T1{$fixed_name} / $sim_time ;
$activity = $TC{$fixed_name} / ($sim_time / 20000) ;
print "$tokens[$i] $stat_prob $activity\n";
}
}
elsif($tokens[0] eq ".names")
{
chop($tokens[$#tokens]);
$fixed_name = $tokens[$#tokens];
$fixed_name =~ s/\^/\_/g;
$fixed_name =~ s/\+/\_/g;
$fixed_name =~ s/\~/\_/g;
$fixed_name =~ s/\[/\_/g;
$fixed_name =~ s/\]/\_/g;
$vcd_name= $fixed_name . "_output_0_0";
#print "$fixed_name $vcd_name $T1{$vcd_name} $TC{$vcd_name} \n";
$stat_prob = $T1{$vcd_name} / $sim_time ;
$activity =$TC{$vcd_name} / ($sim_time / 20000);
print "$tokens[$#tokens] $stat_prob $activity\n";
}
elsif($tokens[0] eq ".latch")
{
$fixed_name = $tokens[2];
$fixed_name =~ s/\^/\_/g;
$fixed_name =~ s/\+/\_/g;
$fixed_name =~ s/\~/\_/g;
$fixed_name =~ s/\[/\_/g;
$fixed_name =~ s/\]/\_/g;
$vcd_name= $fixed_name . "_output_0_0";
#print "$fixed_name $vcd_name $T1{$vcd_name} $TC{$vcd_name} \n";
$stat_prob = $T1{$vcd_name} / $sim_time ;
$activity =$TC{$vcd_name} / ($sim_time / 20000);
print "$tokens[2] $stat_prob $activity\n";
}
}