sed -e 's://.*$::' | awk 'BEGIN{d=0} /end *$/{d--} {print d"\t"$0} /begin *$/{d++}'
冒頭の sed はコメントを削除するためで、コメントはスラッシュ2つ(//)という想定です。
例えば、下記のコードを例にします。
ii.v
module test;
integer ii;
initial begin
ii = 0;
while (ii < 5)
begin // while-loop
$display("ii == %0d", ii);
if (ii < 4) begin
if (ii == 1 || ii == 3) begin
$display("\todd %0d", ii);
if (ii == 1) begin
$display("\t\tone %0d", ii);
end
else begin
$display("\t\tthree %0d", ii);
end
end
else begin
$display("\teven %0d", ii);
if (ii == 0) begin
$display("\t\tzero %0d", ii);
end
else begin
$display("\t\ttwo %0d", ii);
end
end
end
else begin
$display("\telse %0d", ii);
end
ii = ii + 1;
end // while-loop
end // initial block
endmodule
ワンライナーをこんな感じで適用します。
cat ii.v | sed -e 's://.*$::' | awk 'BEGIN{d=0} /end *$/{d--} {print d"\t"$0} /begin *$/{d++}' > ii_depth.v
結果はこんな感じです。
ii_depth.v
0 module test;
0 integer ii;
0 initial begin
1 ii = 0;
1 while (ii < 5)
1 begin
2 $display("ii == %0d", ii);
2 if (ii < 4) begin
3 if (ii == 1 || ii == 3) begin
4 $display("\todd %0d", ii);
4 if (ii == 1) begin
5 $display("\t\tone %0d", ii);
4 end
4 else begin
5 $display("\t\tthree %0d", ii);
4 end
3 end
3 else begin
4 $display("\teven %0d", ii);
4 if (ii == 0) begin
5 $display("\t\tzero %0d", ii);
4 end
4 else begin
5 $display("\t\ttwo %0d", ii);
4 end
3 end
2 end
2 else begin
3 $display("\telse %0d", ii);
2 end
2 ii = ii + 1;
1 end
0 end
0 endmodule
なお、begin や end が行末に配置される書き方である必要があります。
たとえば、下記のように記述されると、end を認識できずに数がずれます (泣)
end else begin
たまたま、そういう書き方にはなっていない対象だったので、これで済みました。
最後に、余談ですが、ii.v は Verilog という言語で以下の実行結果になります。
ii == 0
even 0
zero 0
ii == 1
odd 1
one 1
ii == 2
even 2
two 2
ii == 3
odd 3
three 3
ii == 4
else 4