표 결과를 계산하고 결과를 표 형식으로 인쇄합니다.

표 결과를 계산하고 결과를 표 형식으로 인쇄합니다.

시계 이름 및 듀티 사이클과 함께 시계 주기를 보여주는 보고서가 있습니다. 이제 클럭 사이클의 주파수와 듀티 사이클의 백분율(%)을 사용 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를 사용하여 문제에 대한 기본적이고 빠르고 더러운 해결책을 찾았습니다. 모든 점선 뒤에는 빈 줄이 없으며 시계 보고는 항상 모든 점선 다음에 발생하며 그러한 줄은 하나만 발생한다고 가정합니다.

의견에서 논의한 것처럼 마침표도 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

관련 정보