Verilogの内部信号宣言生成

Verilogの内部信号宣言生成用スクリプトです。


#!/usr/bin/perl

# 実行方法
# ./実行ファイル モジュール名.txt <- 内部信号

# 内部信号のフォーマットは以下の通り
# w_hoge
# w_hoge[MSB:LSB]
# r_hoge
# r_hoge[MSB:LSB]

use strict;
use warnings;
use File::Basename;

sub addstr(@);

if (@ARGV != 1) {
print "Usage:$0 [signal_list_file]\n";
exit;
}

# 入出力ファイル名決定
my $in_file_name = "./$ARGV[0]";
my @extlist = qw /.txt/;
my $name, my $dir, my $ext;
($name, $dir, $ext) = fileparse($in_file_name, @extlist);
my $out_file_name = "./$name" . ".v";

# 入出力ファイルハンドル確保
open (INFILE, "<$in_file_name") || die "$in_file_name: $!";
open (OUTFILE, ">$out_file_name") || die "$out_file_name: $!";

# 入力ファイル内を走査
my @signal = ();
my @msb = ();
my @lsb = ();
my @wr = ();
while (<INFILE>) {
chomp;

s/ //g; # スペースを削除
s/\t//g; # タブを削除
s/\/\///g; # コメントを削除

my @line = split(/[\[:\]]/, $_); # 信号名、MSB、LSBに分解

push(@signal, $line[0]); # 信号名格納
push(@msb, $line[1]); # MSB格納
push(@lsb, $line[2]); # LSB格納

# wire, reg決定
if ($line[0] =~ /^w_/) { push(@wr, "wire"); }
elsif ($line[0] =~ /^r_/) { push(@wr, "reg"); }

}

# 出力ファイル生成
my $idx = 0;
my $str;
foreach (@signal) {
$str = " ";

addstr($wr[$idx], 8);
if (defined($msb[$idx]) && $msb[$idx] ne "") { addstr("[$msb[$idx]:$lsb[$idx]]", 14); }
else { addstr("", 14); }
addstr("$signal[$idx]", 35);

print OUTFILE $str . ";\n";
$idx++;
}

close INFILE;
close OUTFILE;

sub addstr(@) {
my $tmp = $_[0];
my $num = $_[1];
$str .= $tmp;
$str .= " " x ($num - length($tmp));
}

テーマ : プログラミング
ジャンル : コンピュータ

2009-10-26 : Work-Linux-Perl : コメント : 0 : トラックバック : 0
Pagetop
コメントの投稿
非公開コメント

Pagetop
« next  ホーム  prev »

プロフィール

zive

Author:zive
大阪在住、男

ブログ検索

月別アーカイブ

FC2カウンター