表の結果を計算し、結果を表形式で印刷します。

表の結果を計算し、結果を表形式で印刷します。

時計名とデューティサイクルとともに時計周期を示すレポートがあります。次に、クロックサイクルの周波数とデューティサイクルのパーセンテージ(%)を使用またはtcl表示awkするようにしたいと思います。perlどのような方法が最善ですか?どうすればいいですか?

****************************************
Report : clock
Design : abc
Version: some version
Date   : xxx
****************************************

Attributes:
    p - Propagated clock
    G - Generated  clock
    I - Inactive   clock

Clock             Period          Waveform            Attrs     Sources
-----------------------------------------------------------------------
axi_ACLK          1.2500          {0.0000 0.6250}               {axi_ACLK}
xyz
                  1.2500          {0.0000 0.6250}     G         {abc/xyz}

出力が次のようになります(xyzピリオドは次の行にあります)。

Clock             Period          Waveform            Attrs     Sources
-----------------------------------------------------------------------

axi_ACLK          800          50%               {axi_ACLK}
xyz
                  800          50%    G         {abc/xyz}

ありがとう、ラビ

答え1

GNU grep、GNU awkを使用して、問題に対する基本的で迅速で汚い解決策を見つけました。すべての点線の後には空白行がなく、時計の報告は常にすべての点線の後に発生し、そのような行は1つだけ発生すると仮定します。

コメントで議論したように、ピリオドもns単位です。

$ pt_rpt="your_primetime_report_name";

$ fws="$(< "$pt_rpt" grep -m1 -B1 -E '^-+$' | head -n1 | grep -oP '\S+(?:\s+|$)' | awk '{print length()}' | paste -s)" \
awk '
  BEGIN {
    FIELDWIDTHS = ENVIRON["fws"]
    OFS = ""
  }
  /^-+$/,0 {
    if ( /^-+$/ ) { print prev }
    else {
      ### frequency calculation
      Tper = $2+0
      freq = sprintf("%-*s", length($2), sprintf("%g", 1e3/Tper))
      $2 = freq
      ### duty cycle determination
      Ton = $3; sub(/[[:space:]]+$/, "", Ton)
      nf = split(Ton, a, /[}[:space:]]/)
      Ton = a[nf-1]
      D = sprintf("%-*s", length($3), sprintf("%g%%", 1e2*Ton/Tper))
      $3 = D
    }
    print; next
  }
  { prev = $0 }
'  < "$pt_rpt"

出力:

Clock             Period          Waveform            Attrs     Sources
-----------------------------------------------------------------------
axi_ACLK          800             50%                           {axi_AC
xyz               800             50%                 G         {abc/xy

関連情報