• 用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"中出现的命令被注释掉了。

  • 相关阅读:
    [LeetCode] Same Tree, Solution
    图搜索
    1 sec on Large Judge (java): https://github.com/l...
    [LeetCode] Path Sum, Solution
    嗯哪
    海量数据处理总结
    [LeetCode] Unique Binary Search Trees II, Solution
    [Interview] Serialize and Deserialize a tree
    设计题
    [LeetCode] Convert Sorted Array to Binary Search Tree, Solution
  • 原文地址:https://www.cnblogs.com/lelin/p/12698233.html
Copyright © 2020-2023  润新知