我有一份报告,其中显示时钟周期以及时钟名称和占空比。现在,我想使用tcl
orawk
或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