在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 10330|回复: 13

[原创] VCD2VEC perl 脚本

[复制链接]
发表于 2012-4-3 17:24:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
可以把VCD文件转成VEC文件用于spice仿真
 楼主| 发表于 2012-4-3 17:27:31 | 显示全部楼层
#!/usr/bin/perl

if(@ARGV == 0)
{
    printf ("********************************\n");
    printf ("* Usage: ./vcd2vec.pl VCD_NAME *\n");
    printf ("********************************\n");
    exit;
}

$vcd_name = $ARGV[0];
open(VCD, $vcd_name);
$vec_name = $vcd_name.".vec";
open(VEC, ">$vec_name");

my %signal_width;
my %signal_fname;
my %signal_value;
my @sarray;
my @array;
my @sub_array;
my $item;
my $sub_item;
my $line;
my $full_name;
my $dump_beg;
my $unit = 1;
my $ts_en;

while($line = <VCD>)
{
    if($line =~ /^\$timescale$/)
    {
        $ts_en = 1;
    }
    if($line =~ /^\$end$/)
    {
        $ts_en = 0;
    }
    if($ts_en == 1 && $line =~ /^\s*(\d+)ps$/)
    {
        $unit = 1000/$1;
    }
    if($line =~ /^\$scope\s+(\S+)\s+(\S+)\s+\$end\s*$/)
    {
        push(@array, $2);
       #printf("@array\n");
    }
    if($line =~ /^\$upscope\s+\$end\s*$/)
    {
        pop(@array);
       #printf("@array\n");
    }
    if($line =~ /^^\$var\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+\$end$/)
    {
        $full_name = &array2hir(@array)."$4";
       #printf ("$full_name\n");
        $signal_fname{$3} = $full_name;
        $signal_width{$3} = $2;
    }
    if($line =~ /^\$dumpvars$/)
    {
        $dump_beg = 1;
        @sarray = &Sig2Arr(%signal_width);
        &prt_hdr_vec(VEC, %signal_fname);
        $str = "0 ";
        &myprt(VEC, $str, 16);
    }
    if($dump_beg==1)
    {
        if ($line =~ /^#(\d+)$/)
        {
            foreach $item (@sarray)
            {
                if(!exists($signal_value{$item}))
                {
                    printf ("Signal names Wrong\n");
                    exit;
                }
                if($signal_width{$item} == 1)
                {
                    printf VEC (" $signal_value{$item}");
                }else
                {
                    @sub_array = split("", $signal_value{$item});
                    foreach $sub_item (@sub_array)
                    {
                        printf VEC (" $sub_item");
                    }
                }
            }
            printf VEC ("\n");
            $str = $1/$unit." " ;
            &myprt(VEC, $str, 16);
        }
        if ($line =~ /^([01xz])(\S+)$/)
        {
             $signal_value{$2} = $1;
        }
        if ($line =~ /^b(\S+)\s+(\S+)$/)
        {
             $signal_value{$2} = $1
        }
    }
}

foreach $item (@sarray)
{
    if(!exists($signal_value{$item}))
    {
        printf ("Signal names Wrong\n");
        exit;
    }
    if($signal_width{$item} == 1)
    {
        printf VEC (" $signal_value{$item}");
    }else
    {
        @sub_array = split("", $signal_value{$item});
        foreach $sub_item (@sub_array)
        {
            printf VEC (" $sub_item");
        }
    }
}

close(VCD);
close(VEC);
printf ("Output File: $vec_name\n");

sub array2hir
{
    my @array = @_;
    my $hir;
    my $len = @array;
    for $i(0..$len-1)
    {
        $hir .= "$array[$i]/";
    }
    return $hir;
}

sub get_name
{
    my $src_name = @_;
    my @array = split(".", $src_name);
    my $len = @array;
    my $name;
    foreach my $i (0 .. $len-2)
    {
        $name .= "$array[$i]";
    }
    return $name;
}

sub myprt
{
    my ($FHANDLE, $str, $len) = @_;
    $len = $len-1-length($str);
    foreach $i (0..$len)
    {
        printf $FHANDLE (" ");
    }
    printf $FHANDLE ("$str");
}

sub Sig2Arr
{
    my (%signal_width) = @_;
    my @sarray;
    foreach my $item (keys(%signal_width))
    {
        push(@sarray, $item);
    }
    return @sarray;
}

sub prt_hdr_vec
{
    my ($FHANDLE, %signal_fname) = @_;
    printf $FHANDLE ("logichv 1\n");
    printf $FHANDLE ("logichv 0\n");
    my $str;
    my $len;

    $str = "signal  ";
    printf $FHANDLE ("$str");
    foreach $item(keys(%signal_fname))
    {
        $str = $signal_fname{$item};
        $len = length($str) + 1;
        &myprt($FHANDLE, $str, $len);
    }

    $str = "\nradix   ";
    printf $FHANDLE ("$str");
    foreach $item(keys(%signal_fname))
    {
        $str = $signal_fname{$item};
        $len = length($str) + 1;
        $str = "1";
        &myprt($FHANDLE, $str, $len);
    }

    $str = "\nio      ";
    printf $FHANDLE ("$str");
    foreach $item(keys(%signal_fname))
    {
        $str = $signal_fname{$item};
        $len = length($str) + 1;
        $str = "b";
        &myprt($FHANDLE, $str, $len);
    }

    printf $FHANDLE ("\n");
   
}
发表于 2012-6-1 09:44:20 | 显示全部楼层
what a nice person! thank you very much
发表于 2013-7-29 16:01:37 | 显示全部楼层
good guy !!!!!!!!
发表于 2013-12-11 22:25:56 | 显示全部楼层
怎么用呀
发表于 2018-10-15 22:52:20 | 显示全部楼层
good job!nice~
发表于 2018-10-16 23:21:04 | 显示全部楼层
总线信号转换不了
发表于 2018-11-28 09:05:39 | 显示全部楼层
学习一下!
发表于 2018-11-28 09:06:16 | 显示全部楼层
看看先!
发表于 2018-11-28 12:49:29 | 显示全部楼层
Nice guy
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-18 00:20 , Processed in 0.036714 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表