時計名とデューティサイクルとともに時計周期を示すレポートがあります。次に、クロックサイクルの周波数とデューティサイクルのパーセンテージ(%)を使用または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