zoukankan      html  css  js  c++  java
  • 用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_areaset_max_fanouitset_ideal_networkset_timing_derateset_clock_latency);

    此处为需要处理的关键词,可以根据情况进行修改。

    my $content;

    open my $fh, "<", $file or die "$!";

    {local $/;

    $content=<$fh>;

    }

    close $fh;

    将整个文件读入到变量中。

    这一步是关键:

    my @lines = split /(?<!) /, $content;

    将文本用非转义换行符进行分割, 并赋值给了@lines;

    之后就可以很方便的对每一行进行处理,而不用担心烦人的”“了。

    for my $line (@lines) {

    my $prefix = "";

    for my word (@keywords) {

    if (line =~ /$word/) { prefix = "#"; }

    }

    print "prefix"."$line ";}

    至此,就可以根据需要,将需要注释的关键词添加到脚本当中了。处理之后的sdc将与原来的sdc完全一致,不同的仅仅是变量"@keywords"中出现的命令被注释掉了。

  • 相关阅读:
    python 并发编程 多线程 event
    python 并发编程 多线程 定时器
    python 并发编程 多线程 信号量
    linux top 查看CPU命令
    python 并发编程 多线程 GIL与多线程
    python 并发编程 多线程 死锁现象与递归锁
    python 并发编程 多线程 GIL与Lock
    python GIL全局解释器锁与互斥锁 目录
    python 并发编程 多线程 GIL全局解释器锁基本概念
    执行python程序 出现三部曲
  • 原文地址:https://www.cnblogs.com/lelin/p/12698233.html
Copyright © 2011-2022 走看看