まとまってきた。※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

 

あ!思いついたかも 文字列( と文字列 ( <半角space+(>のうまい処理

 

module HOGE (  → 半角スペースあけてからカッコ

module HOGE(  → 直でカッコ

 

の区別がつかないから、単語境界を表す \b が使いづらく感じていたが、、

 

1行読み込んだ直後に

$line =~ s#\(#\s(#;

と入れてからマッチに入ればいいのでは?

(\bが使いやすくなるのでは?)

仮に、

module HOGE

と改行されていても(それが許される文法かは不明だが)

HOGEの両サイドに境界は出来てるだろうし。

 

module 改行

HOGE ( );

とかの処理はまだ考え中・・・・。

 

 

ちょっと改善(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/

 

記憶に残りにくいなぁ。これは。

 

俺は天才、俺は天才、覚えられるさ。。大丈夫さ。。

単純に。。。

module

に出会ったら

$flag=1;

 

$flag=1の間

テキストの内容をファイルに出力

endmoduleに出会ったらそのループぬけると同時にflag=0にする。

 

その続きからまたmoduleを探し、

moduleに出会ったら

$flag=1;

。。。と繰り返す。

どうよ。

 

 

できてない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/
#
#
}

}
~