用perl对sdc进行预处理
有时候PD会用综合工具写出的sdc进行PR和时序收敛。而综合工具会不可避免的会把专门为综合而加的sdc命令一起写出来。所以一定要对sdc进行处理后才能进入PR阶段。
例如:
set_operating_condition
set_max_area
set_uncertainty
set_max_transition
set_clock_latency
... ...
而对这些命令的删除或者注释的操作通常是手工进行,非常容易遗漏。而且通常由于sdc的更新迭代,这些动作会重复多次。这就需要用脚本对sdc进行预处理,我们只需要维护一个脚本即可, 而sdc处理自动完成。
难点
sdc采用的是tcl语法。对于tcl来说,一行的末端并不意味着一行的结束。因为tcl是可以通过反斜线对换行符进行转义。这带来了美观的同时,也给脚本处理带来了一些难度。
思路1
解决思路之一就是先将所有的转义后的换行符删除。这样的结果就是,所有的sdc命令,都只占用一行。然后再对sdc命令进行替换。
这个思路的问题就是sdc处理后面目全非。行与行完全不对应,对后续的小幅迭代和debug带来困难。
思路2
完全按照tcl的语义,将文件进行重新分割,分割时排除转移后的换行符。
下面是是实现后的脚本:
#!/usr/bin/perl
my @files = @ARGV;
my @keywords = qw(
set_max_area
set_max_fanouit
set_ideal_network
set_timing_derate
set_clock_latency
);
此处为需要处理的关键词,可以根据情况进行修改。
my $content;
open my $fh, "<", $file or die "$!";
{
local $/;
$content=<$fh>;
}
close $fh;
将整个文件读入到变量中。
这一步是关键:
my @lines = split /(?<!\)\n/, $content;
将文本用非转义换行符进行分割, 并赋值给了@lines;
之后就可以很方便的对每一行进行处理,而不用担心烦人的”\“了。
for my $line (@lines)
{
my $prefix = "";
for my word (@keywords)
{
if (line =~ /$word/) { prefix = "#"; }
}
print "prefix"."$line\n";
}
至此,就可以根据需要,将需要注释的关键词添加到脚本当中了。处理之后的sdc将与原来的sdc完全一致,不同的仅仅是变量"@keywords"中出现的命令被注释掉了。
原文地址:https://www.cnblogs.com/lelin/p/12698233.html
- SNA中:中心度及中心势诠释(不完整代码)
- 教程 | 基于计算机视觉使用Python和OpenCV计算道路交通
- 干货 | MVP模式在携程酒店的应用和扩展
- memlock过低导致的数据库性能问题(r6笔记第10天)
- OpenCV和SVM分类器在自动驾驶中的车辆检测
- 自动驾驶的模型预测控制
- 【专业技术】使用html5的十大原因
- 第五课:推理结果的可视化
- 第四课:模型的使用
- 【Java概念学习】--数组的初始化
- linux下重命名文件或文件夹使用mv既可实现。
- 第三课:把tensorflow,模型和测试数据导入Android工程
- D-Link 路由器信息泄露和远程命令执行漏洞分析及全球数据分析报告
- Wordpress安全架构分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Result Maps collection does not contain value for XXX 错误
- 当端口被占用如何kill占用端口的进程
- 将本地仓库同步到Github上的远程仓库
- 毫不留情地揭开 ArrayList 和 LinkedList 之间的神秘面纱
- 关于void QProcess::start参数问题的解决
- Python格式化输出
- 多线程 - 生产者消费者模式
- TCP的三次握手和四次挥手
- Springboot异常处理
- Excel实战技巧84: 让形状生动起来
- 利用Python进行组合数计算
- Docker下解决mysql出现"the table is full"的问题
- unity3d 5.0中Renderer后面没有了material
- 在windows下检查应用程序是否为兼容模式启动及使用Qt输出系统信息
- Qt5.5.1版本中QString().arg()和qss在处理路径及文件名需要注意的地方