Verilog/System Verilog ファイルからモジュール名とインスタンス名を抽出する

Verilog/System Verilog ファイルからモジュール名とインスタンス名を抽出する

module_nameとinstance_nameを抽出したいVerilog / System Verilogファイルがあります。

次の1行から:

module_name#(.ANY_PARAMETER(.ANY_PARAMETER)、.ANY_PARAMETER_1(.ANY_PARAMETER_1))インスタンス名(.any_connection(any_connection));

出力は次のようになります。

モジュール名インスタンス名

どうすればいいですか?

答え1

私たちはバランスをとり、中かっこが入れ子になった状況に対処する必要がありますrecursive regex

最初に角かっこ「(」で始まる正規表現を作成し、角かっこでは$rないコンテンツ(*のために存在しない可能性があります)を見つけて、角かっこではないコンテンツをもう一度繰り返し、最後に閉じる角かっこのバランスをとります。

$ perl -lne '
    $r = qr/\( [^()]* (?:(??{ $r }) [^()]*)* \)/x;
    print $1 =~ y/\t #//dr while /\G([^()]*) $r/xg;
' file.sv

結果:

module_name
instance_name

答え2

注文する。

awk '{for(i=1;i<=NF;i++){if (($i ~ /module/)||($i ~ /instance/)) print $i}}' filename

出力

module_name
instance_name

答え3

あなたのファイルは次の規則に従うようです。

  • 各行には正確に3つのスペースが含まれています。
  • モジュール名は、最初のスペースの前の名前です。
  • インスタンス名は、2番目と3番目のスペースの間の名前です。

これが間違っている場合は、より良い説明とより良い例を提供するように質問を編集してください。

sed

使うsed Substitute( s) コマンドを使用すると、行の先頭から最初の空白まで実行される 1 つのキャプチャグループと、2 番目の空白から 3 番目の空白 (エンドポイントを除く) まで実行される 2 番目のキャプチャグループを使用して行全体を一致させることができますあります。次に、キャプチャされた2つの文字列を出力します。

sed 's/^\([^ ]* \)[^ ]* \([^ ]*\) .*/\1\2/'

PS実際に3つ以上のスペースがあり、インスタンス名が2番目から最後と最後の間にある場合は、代わりに次のようにします。

sed 's/^\([^ ]* \).* \([^ ]*\) .*/\1\2/'

pcregrep

同じロジック、異なるツール:

pcregrep -o1 -o2 '^([^ ]* )[^ ]* ([^ ]*) .*'

-o1 -o2\1\2.

同じPSが適用されます。

関連情報