LoginSignup
1
1

More than 5 years have passed since last update.

begin - end 階層の深さを数えるワンライナー

Last updated at Posted at 2017-04-01
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
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1