非常に長いポート マップがあり、多数のポート マップを置き換えたい
SignalName[i],
と
.SignalName(SignalName[i]),
これは正規表現で簡単にできると思いますが、どうすればよいかわかりません。何か案は?
SignalData がポート マップ情報を含むファイルであると仮定すると、次のように実行できます。
sed -si 's/\([a-zA-Z]\+\)\(\[[^\]]*\]\)/\.\1(\1\2)/g' SignalData
sed では、s は置換を表し、// の最初のペアの間の正規表現は、各行との照合に使用されます。一致が見つかった場合、次の / までの間の式が、一致したものを置き換えるために作成されます。
正規表現の説明
\([a-zA-Z]\+\) - Matches a series of alphabets (like SignalName) and captures it into
\1. If you want only the SignalName string to match, replace [a-zA-Z]\+ with SignalName.
\(\[[^\]]*\]\) - Matches the [some character] part and captures it into \2
最後に、これらのキャプチャされた文字列を使用して、目的の文字列を構築します。
ファイルで実行する前にこれを試してみたい場合は、sed -si の代わりに sed -s を使用してください。実際にファイルを変更せずに、stdout に変換の結果が表示されます。
3年遅れでチャーミングですが、emacsにはverilogモードを強くお勧めします。モジュールをインスタンス化するためのこの種の操作を簡素化します。たとえば、次のようなモジュールがあるとします。
module submodule(
input [1:0] ina,
input inb,
input inc,
output outa);
/*some stuff*/
endmodule
Verilog モードを使用してこれをインスタンス化できます。
module mymodule(
/*AUTOOUTPUT*/
/*AUTOINPUT*/);
submodule submod(/*AUTOINST*/);
endmodule
emacs (Cc Ca) で AUTO を展開すると、次のようになります。
module mymodule(
input [1:0] ina,
input inb,
input inc,
output outa);
submodule submod(
.ina (ina),
.inb (inb),
.inc (inc),
.outa (outa));
endmodule
単純化された正規表現と Lisp 方程式を使用してこれを拡張し、複雑な接続を行うことができます。多数のモジュールを配線したり、階層を介して信号名を変更したりする際の時間を大幅に節約できます。
詳細はこちら: http://www.veripool.org/wiki/verilog-mode/Verilog-mode_veritedium