まとまってきた。※module直後の改行がある場合には非対応
※「module」直後の改行に続けての「モジュール名」や
「MODULE名直後に改行してのインスタンス名」
となっている場合には、まだまだ非対応。
<解説>
test13.pl では、
[a-zA-Z0-9_]+
や
[a-zA-Z0-9\\\.\/_]+
という表現をやめて、
[^ \t\n\r\f]+ :[^ \t\n\r\f] は「空白文字以外の文字」なので、
こちらが意識して「この文字とこの文字と・・・」と指定しなくても
空白以外なら何でも表してくれるので好都合。
を積極的に使ってみた。
→思いのほか、いい感じに仕上がったかもしれない。
【その他】
10 $line =~ s#\(# \(#;
も新しく導入したもので、
module MODULE名(
と
module MODULE名 (
など、MODULE名やインスタンス名との境界に「空白」を必ず入れる処理を
予め施してから、マッチングを実施するようにして、
分かり易くした。
※一応 \s* (0個以上の空白)で正規表現入れてはいるが、
今回やりたいのは、
置換とかではなく
MODULE名と
や
INSTANCE名
の取得
が主なので元のテキストに操作を加えたものが表示されようが構わない。
※元のテキストにも書き込むわけでもない(open処理などしてない)
test13.pl
----------------------------------------------
1 #!usr/bin/env perl
2
3
4 $i= 0;
5
6
7 while($line = <>){
8
9 $i=$i+1;
10 $line =~ s#\(# \(#;
11
12 # if ( $line =~ m/^\s*module\s*([a-zA-Z0-9_]+)/ ) {
13 if ( $line =~ m/^\s*module\s*([^ \t\n\r\f]+)\b/ ) {
14 printf ("%4d ", $i);
15 print "module : ";
16 print $line;
17 $modulename = $1; #()内をキャプチャして変数へ
18 # } elsif ( $line =~ m/^\s*([a-zA-Z0-9_]+)\s+([a-zA-Z0-9\\\.\/_]+)\s*\(/ && $line !~ m/^\s*module/) {
19 } elsif ( $line =~ m/^\s*([^ \t\n\r\f]+)\s+([^ \t\n\r\f]+)\s*\(/ && $line !~ m/^\s*module/) {
20 printf ("%4d ", $i);
21 print "instance: ";
22 print "$modulename,";
23 print $line;
24 }
25
26 }
-----------------------------------------------
<実行結果>
---------------------------------------------
shin@ubuntu:~/TEXToperation$ perl5.10.1 test13.pl test001.v
1 module : module HOGEMODULE ( // No space
16 instance: HOGEMODULE,DUMMY Instance ();
18 instance: HOGEMODULE,INST instance1 ( );
19 instance: HOGEMODULE,INST instance2 ( );
20 instance: HOGEMODULE,INST \instance3 ( );
21 instance: HOGEMODULE,INST \insta/nce4 ( );
22 instance: HOGEMODULE,INST \insta_nce5 ( );
23 instance: HOGEMODULE,INST \insta7nce6 ( );
24 instance: HOGEMODULE,INST insta.7nce7 ( );
29 instance: HOGEMODULE,INST instance9 ( )
30 instance: HOGEMODULE, INST insta10 ( );
32 instance: HOGEMODULE,INSTout inStance01 ( );
38 module : module HOGE2 ( // space x 1
46 module : module HOGE3 ( // tab x 1
48 instance: HOGE3, INST instance1 ( );
49 instance: HOGE3, INST instance2 ( );
50 instance: HOGE3, INST \instance3 ( );
51 instance: HOGE3, INST \insta/nce4 ( );
52 instance: HOGE3, INST \insta_nce5 ( );
53 instance: HOGE3, INST \insta7nce6 ( );
58 module : module HOGE4 ( // tab x 1 + space x 2
60 instance: HOGE4, INST \insta/nce4 ( );
61 instance: HOGE4, INST \insta_nce5 ( );
66 module : module HOGEreg001 (
69 instance: HOGEreg001, INST \insta/nce4 ( );
70 instance: HOGEreg001, INST \insta_nce5 ( );
--------------------------------------------------------
<test001.v>
**********************************
module HOGEMODULE ( // No space
input hoge ;
output hogege;
reg aaa ;
reg aaa ; // hoge hoge hoge
for ( i=0 ; i<0 ; i++ ) begin
end
DUMMY Instance ();
INST instance1 ( );
INST instance2( );
INST \instance3 ( );
INST \insta/nce4 ( );
INST \insta_nce5 ( );
INST \insta7nce6 ( );
INST insta.7nce7 ( );
INST
instance8 ( );
INST instance9 ( )
INST insta10 ( );
INSTout inStance01 ( );
**********************************
参考文献)
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_k08.htm
ちょっと改善(output hoge などの宣言にヒットしない工夫(とも言えない程度の工夫)
以前掲載した内容では
output , input , reg 宣言なども
インスタンスのパターンとしてマッチしてしまっていたので、
「(」を加えてみた。
#( の前に改行するようなRTL書かれたらアウトだが。
※モジュール側のパターンには「module」が入っているので心配無用
testj11.pl
--------------------
#!usr/bin/env perl
#input, output, regなどにかからないように「(」を入れた
$i= 0;
while($line = <>){
$i=$i+1;
# if ( $line =~ m/^\s*module\s*([a-zA-Z0-9_]+)/ ) {
#if ( $line =~ m/\bmodule\b\s*(.+)\(/ ) { # NG .+使うと最後の空白も含んでしまう
if ( $line =~ m/\bmodule\b\s*([a-zA-Z0-9_]+)/ ) { # (も要らない。moduleはこれが一番シンプルで最適かも。(ただしmodule直後の改行には非対応(要対策)
print $i;
print $line;
$modulename = $1; #()内をキャプチャして変数へ
}
# if ( $line =~ m/^\s*[A-Z0-9_]+\s+[a-z0-9]+\s*/ ) {
# if ( $line =~ m/^\s*[A-Z0-9_]+\s+[a-z0-9]+/ ) {
# if ( $line =~ m/^\s*[A-Z0-9_]+\s+[\\a-z0-9]+/ ) {
# 再度moduleでマッチしないように
if ( $line =~ m/^\s*([a-zA-Z0-9_])+\s+([a-zA-Z0-9\\\.\/]+)\s*\(/ && $line !~ m/^\s*module/) {
print $i;
print "$modulename,";
print $line;
# } elsif ( $line =~ m/^\s*[A-Z0-9_] && $line =~ m/
#
#
}
}
--------------------
<実行結果>
(修正後): if ( $line =~ m/\bmodule\b\s*([a-zA-Z0-9_]+)/ ) {
※モジュール名後にスペース入らず(良♪)
shin@ubuntu:~/TEXToperation$ perl5.10.1 test11.pl test001.v
1module HOGEMODULE ( // No space
16HOGEMODULE,DUMMY Instance ();
18HOGEMODULE,INST instance1 ( );
19HOGEMODULE,INST instance2( );
20HOGEMODULE,INST \instance3 ( );
21HOGEMODULE,INST \insta/nce4 ( );
23HOGEMODULE,INST \insta7nce6 ( );
24HOGEMODULE,INST insta.7nce7 ( );
29HOGEMODULE,INST instance9 ( )
30HOGEMODULE, INST insta10 ( );
32HOGEMODULE,INSTout inStance01 ( );
38 module HOGE2 ( // space x 1
46 module HOGE3 ( // tab x 1
52 module HOGE3 ( // tab x 1 + space x 2
58module HOGEreg001 (
(修正後):if ( $line =~ m/\bmodule\b\s*(.+)\(/ ) { #NG を使用時
16行目以降のモジュール名直後に、スペースが一つ入ってしまってる。
shin@ubuntu:~/TEXToperation$ perl5.10.1 test11.pl test001.v
1module HOGEMODULE ( // No space
16HOGEMODULE ,DUMMY Instance ();
18HOGEMODULE ,INST instance1 ( );
19HOGEMODULE ,INST instance2( );
20HOGEMODULE ,INST \instance3 ( );
21HOGEMODULE ,INST \insta/nce4 ( );
23HOGEMODULE ,INST \insta7nce6 ( );
24HOGEMODULE ,INST insta.7nce7 ( );
29HOGEMODULE ,INST instance9 ( )
30HOGEMODULE , INST insta10 ( );
32HOGEMODULE ,INSTout inStance01 ( );
38 module HOGE2 ( // space x 1
46 module HOGE3 ( // tab x 1
52 module HOGE3 ( // tab x 1 + space x 2
58module HOGEreg001 (
(修正前)
shin@ubuntu:~/TEXToperation$ perl5.10.1 test11.pl test001.v
1module HOGEMODULE ( // No space
3HOGEMODULE ,input hoge ;
5HOGEMODULE ,output hogege;
7HOGEMODULE ,reg aaa ;
8HOGEMODULE ,reg aaa ; // hoge hoge hoge
16HOGEMODULE ,DUMMY Instance ();
18HOGEMODULE ,INST instance1 ( );
19HOGEMODULE ,INST instance2( );
20HOGEMODULE ,INST \instance3 ( );
21HOGEMODULE ,INST \insta/nce4 ( );
22HOGEMODULE ,INST \insta_nce5 ( );
23HOGEMODULE ,INST \insta7nce6 ( );
24HOGEMODULE ,INST insta.7nce7 ( );
29HOGEMODULE ,INST instance9 ( )
30HOGEMODULE , INST insta10 ( );
32HOGEMODULE ,INSTout inStance01 ( );
38 module HOGE2 ( // space x 1
46 module HOGE3 ( // tab x 1
52 module HOGE3 ( // tab x 1 + space x 2
58module HOGEreg001 (
キャプチャつかってみた&module重複認識防止
#!usr/bin/env perl
$i= 0;
while($line = <>){
$i=$i+1;
if ( $line =~ m/^\s*module\s*([a-zA-Z0-9_]+)/ ) {
# print $_;
print $i;
print $line;
$modulename = $1; #()内をキャプチャして変数へ
}
# if ( $line =~ m/^\s*[A-Z0-9_]+\s+[a-z0-9]+\s*/ ) {
# if ( $line =~ m/^\s*[A-Z0-9_]+\s+[a-z0-9]+/ ) {
# if ( $line =~ m/^\s*[A-Z0-9_]+\s+[\\a-z0-9]+/ ) {
# 再度moduleでマッチしないように
if ( $line =~ m/^\s*[a-zA-Z0-9_]+\s+[a-zA-Z0-9\\\.\/]+/ && $line !~ m/^\s*module/) {
print $i;
print "$modulename,";
print $line;
# } elsif ( $line =~ m/^\s*[A-Z0-9_] && $line =~ m/
#
#
}
}
<サンプルテキスト>
module HOGEMODULE ( // No space
input hoge ;
output hogege;
reg aaa ;
reg aaa ; // hoge hoge hoge
for ( i=0 ; i<0 ; i++ ) begin
end
DUMMY Instance (); //インスタンスに大文字あり
INST instance1 ( ); //インスタンス後半角sp
INST instance2( ); //半角spなし
INST \instance3 ( ); //インスタンス名先頭に \ あり
INST \insta/nce4 ( ); //インスタンス名中に / あり
INST \insta_nce5 ( ); //インスタンス名に _ あり
INST \insta7nce6 ( ); //インスタンス名の間に数字あり
INST insta.7nce7 ( ); //インスタンス名に . あり
INST
instance8 ( ); //改行あり
INST instance9 ( ) // ;記号なし
INST insta10 ( ); //忘れたw
INSTout inStance01 ( ); //モジュール名、インスタンス名に小/大文字混在
endmodule
module HOGE2 ( // space x 1
);
endmodule
module HOGE3 ( // tab x 1
);
endmodule
module HOGE3 ( // tab x 1 + space x 2
);
endmodule
module HOGEreg001 ( //モジュール名に小文字あり
);
endmodule
マッチしないとき~~ を表現するには?
<Perlの話>
これがマッチするとき
$line =~ m/^\s*module/
これがマッチしないとき
$line !~ m/^\s*module/
記憶に残りにくいなぁ。これは。
俺は天才、俺は天才、覚えられるさ。。大丈夫さ。。
できてないw
#!usr/bin/env perl
#moduleで区切ってファイル出力を目指す
$i= 0;
while($line = <>){
$i=$i+1;
if ( $line =~ m/^\s*module/ ) {
# print $_;
print $i;
print $line;
}
# if ( $line =~ m/^\s*[A-Z0-9_]+\s+[a-z0-9]+\s*/ ) {
# if ( $line =~ m/^\s*[A-Z0-9_]+\s+[a-z0-9]+/ ) {
# if ( $line =~ m/^\s*[A-Z0-9_]+\s+[\\a-z0-9]+/ ) {
if ( $line =~ m/^\s*[A-Z0-9_]+\s+[a-z0-9\\\.\/]+/) {
print $i;
print $line;
# } elsif ( $line =~ m/^\s*[A-Z0-9_] && $line =~ m/
#
#
}
}
~