ucs_filter_report

从一个或多个 timing report 中按完整 path block、正则表达式和 slack 条件筛选

Program
ucs_filter_report
Version
UCS-1.1.0
Platform
RHEL 7 / RHEL 8;标准输出可直接进入文件或 Unix pipeline
Input
普通文本或 .gz timing reports
Output
命中的完整 path blocks 写到 stdout
Support
support@universalchipstudio.com

1. Quick Start

# 所有 path block 中必须出现 CLK
ucs_filter_report -r CLK timing.rpt > clk_paths.rpt

# 排除 scan,只保留负 slack 且小于 -0.2 的 path
ucs_filter_report -e 'scan|SCAN' --slack_less -0.2 \
  timing.rpt.gz > severe_non_scan.rpt

# 同时处理多个报告
ucs_filter_report -r CORE report_a.rpt report_b.rpt.gz \
  > core_paths.rpt

工具按 完整 timing path block 匹配,不是逐行 grep。输出保留原始 block 内容和顺序,便于继续交给其他 timing 工具或人工检查。

2. 筛选模型与组合逻辑

Require · AND每一个 -r 都必须命中。
Exclude · NOT任一个 -e 命中即排除。
Any · OR存在 -o 时,至少一个必须命中。
NAND全部 -n 同时命中才排除。

最终规则可以理解为:

KEEP =
  (all REQUIRE match)
  AND (no EXCLUDE matches)
  AND (ANY is empty OR at least one ANY matches)
  AND (NAND is empty OR not all NAND patterns match)
  AND (all configured slack conditions pass)

2.1 Repeatable options

# path 必须同时包含 Startpoint: 和 Endpoint:
ucs_filter_report -r '^Startpoint:' -r '^Endpoint:' timing.rpt

# CLK 或 DATA 任一出现即可
ucs_filter_report -o CLK -o DATA timing.rpt

# 只有 scan 与 false_path 同时出现时才排除
ucs_filter_report -n scan -n false_path timing.rpt
NAND 不是普通 exclude:-n A -n B 只排除同时含 A 与 B 的 block;只含 A 或只含 B 的 block 仍保留。若要分别排除 A、B,请使用 -e A -e B。

3. Command-Line Options

Option可重复说明
-r REGEX是Require。所有 require pattern 必须命中。
-e REGEX是Exclude。任一个命中即排除。
-o REGEX是Any/OR。至少一个 any pattern 命中。
-n REGEX是NAND。所有 nand pattern 同时命中时排除。
-f FILE否Mixed filter file;用行首前缀定义模式。
--anyfile FILE否文件中每个有效行作为一个 Any/OR regex。
--antifile FILE否文件中每个有效行作为一个 Exclude regex。
--sep REGEX否自定义每个 path block 的起始 separator regex。
--slack_less N否只保留 slack 严格小于 N 的 block。
--slack_more N否只保留 slack 严格大于 N 的 block。
--slack_between A,B否只保留闭区间 [A, B] 内的 slack;A 必须 ≤ B。
REPORT...是一个或多个必填报告路径,支持普通文本与 gzip。

兼容旧拼写:-slack_less、-slack_more、-slack_between、-anyfile、-antifile、-sep 会自动转换为对应的双横线选项。

3.1 Slack 语义

命令保留范围边界
--slack_less -0.2slack < −0.2−0.2 不保留
--slack_more 0slack > 00 不保留
--slack_between -1,-0.2−1 ≤ slack ≤ −0.2两端都保留

一个 block 没有可识别的 slack 时,只要配置了任一 slack 条件,该 block 就不会输出。

4. Filter File

4.1 Mixed filter file (-f)

# filters.txt
# 无前缀:Require
Path Group:\s+REG2REG

# !:Exclude
!scan_enable

# *:Any / OR
*GC_GFXCLK
*GC_SYSCLK

# @:NAND
@false_path
@test_mode
ucs_filter_report -f filters.txt timing.rpt.gz > selected.rpt
行首模式含义
无Require该行 regex 必须命中。
!Exclude该行 regex 命中即排除。
*Any所有 * 行中至少一个命中。
@NAND所有 @ 行同时命中时排除。

空行与以 # 开头的注释行忽略。文件模式与 CLI 的 -r/-e/-o/-n 会合并使用。

4.2 anyfile / antifile

# clocks.txt:每行一个 OR pattern
GC_GFXCLK
GC_SYSCLK
GC_AONCLK

# ignored.txt:每行一个 exclude pattern
scan
test_mode

ucs_filter_report --anyfile clocks.txt --antifile ignored.txt timing.rpt

5. Timing Path 分块与自定义 Separator

默认按顺序检测以下常见 report header,第一个能匹配报告的模式会被采用:

  1. Startpoint:
  2. Path N:
  3. Path #: N
  4. Possibility N:
  5. ### Path / ### This path
  6. Timing Path to

若报告格式不在此列表中,使用 --sep 指定每个 block 起始行的正则表达式:

ucs_filter_report --sep '(?m)^BEGIN_TIMING_PATH\b' custom_report.rpt
正则提示:--sep 要匹配每个 block 的开头,不是 block 之间的分隔线。建议使用 (?m)^... 锚定行首,避免正文误匹配。

6. 完整示例

6.1 GFX clock 严重违例

ucs_filter_report \
  -r 'GC_GFXCLK' \
  -e 'scan|test' \
  --slack_less -1.0 \
  GC_GFXCLK_min.rpt \
  > GC_GFXCLK_min.severe.rpt

每个输出 block 必须包含 GFX clock,不含 scan/test,且 slack 严格小于 −1.0。

6.2 指定 startpoint / endpoint 类别

ucs_filter_report \
  -r '^Startpoint:\s+CORE/' \
  -r '^Endpoint:\s+MEM/' \
  timing.rpt.gz > core_to_mem.rpt

因为两个 -r 是 AND,只有 CORE launch 到 MEM capture 的 path 被保留。

6.3 Slack window

ucs_filter_report --slack_between=-0.5,-0.1 timing.rpt > review_window.rpt

负数参数建议使用 = 形式,或按当前 shell 正确引用,避免参数解析器把负号当作新 option。

6.4 多报告合并筛选

ucs_filter_report -o REG2REG -o CLK2REG \
  corner_ss.max.rpt.gz corner_ff.max.rpt.gz \
  > selected_corners.rpt

输出按命令行中的报告顺序拼接;每个报告内部保留原 path block 顺序。

6.5 只统计命中 path 数量

ucs_filter_report --slack_less 0 timing.rpt.gz \
  | grep -c '^Startpoint:'

7. Pipeline 与输出约定

正常结果只写 stdout,错误信息写 stderr,因此适合重定向与 pipeline:

# 输出报告,错误另存
ucs_filter_report -f filters.txt timing.rpt.gz \
  > filtered.rpt 2> filter.err

# 先筛选再压缩
ucs_filter_report --slack_less -0.2 timing.rpt \
  | gzip -c > filtered.rpt.gz

# 检查退出状态
if ucs_filter_report -r CLK timing.rpt > out.rpt; then
  echo "filter completed"
else
  echo "filter failed" >&2
fi
Exit code含义
0命令成功完成;即使没有 block 命中也属于成功。
1License 检查失败。
2报告读取、gzip、regex、range 或其他运行错误。

8. Troubleshooting

现象处理
输出为空先只运行一个最简单条件;确认 path block 内确实有 slack;检查多个 require 是否错误地当成 OR。
整份报告像一个 block默认 separator 未识别该格式;用 --sep 指定真正的 path header。
Invalid regex命令行 regex 用单引号保护;检查未配对的括号、方括号或反斜线。
负数被识别为 option使用 --slack_less=-0.2、--slack_between=-1,-0.2。
Gzip 读取失败用 gzip -t report.rpt.gz 验证文件完整性;扩展名为 .gz 时工具会按 gzip 解码。
NAND 结果与预期不同NAND 只在全部 nand pattern 同时命中时排除;逐项排除应使用多个 -e。
没有命中也返回 0这是正常行为。需要强制检查时,对输出文件计数或检测是否为空。

9. Command Synopsis

Usage: ucs_filter_report [OPTIONS] <REPORT>...

Options:
  -e <EXCLUDE>                       Exclude regex; repeatable
  -r <REQUIRE>                       Require regex; repeatable
  -o <ANY>                           Any/OR regex; repeatable
  -n <NAND>                          NAND regex; repeatable
  -f <FILTER_FILE>                   Mixed filter file
      --anyfile <ANY_FILE>           One Any regex per line
      --antifile <ANTI_FILE>         One Exclude regex per line
      --sep <SEPARATOR>              Path-start separator regex
      --slack_less <SLACK_LESS>
      --slack_more <SLACK_MORE>
      --slack_between <MIN,MAX>
  -h, --help
  -V, --version
文档与实现一致性:本页按 UCS-1.1.0 最新源码、CLI help 和 GFX full timing report 验证编写,替代旧页面中的过期元数据与空白 option 描述。