시계 이름 및 듀티 사이클과 함께 시계 주기를 보여주는 보고서가 있습니다. 이제 클럭 사이클의 주파수와 듀티 사이클의 백분율(%)을 사용 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