Quartus® II Tcl 示例:列出时序组中的节点

author-image

作者

时序组是进行时序赋值的有效方法。可以指定包含组中模式匹配节点的通配符,也可以指定排除组中模式匹配节点的通配符。您可能需要查看时序组中所有节点的列表,以便验证指定的通配符模式是否正确。

这些脚本列出了设计的时序组中的所有节点。此脚本对设计中的每个时序节点进行迭代,将时序节点名称与每个时间组包含模式进行比较,然后与每个时序组排除模式进行比较。

此脚本存在一定的限制;它无法处理嵌套时序组。包含或排除一个时序组可以有效地作为另一个时序组的元素,但此脚本并不支持。

要在时序组中包含总线的所有位,请在 Quartus II 软件 4.2 版或更低版本的总线名称后使用星号。从 5.0 版开始,无需使用星号即可指定总线名称。此脚本包含根据软件版本号对此行为进行的检查。

global quartus
load_package advanced_timing
load_package project

# 确定脚本是在 4.2 版或更低版本还是 5.0 版或
# 更高版本中运行。5.0 及更高版本将 <bus name> 识别为
# 有效时序组输入,而 4.2 版及更低版本需要将
# <bus name>* 作为时序组输入。
regexp {^Version (\d)} $quartus(version) match qver
if { $qver < 5 } {
    set need_asterisk 1
} else {
    set need_asterisk 0
}

project_open [lindex $quartus(args) 0]

create_timing_netlist

set tg_name [lindex $quartus(args) 1]

post_message "The following nodes are members of the timegroup $tg_name:"

set tg_name [escape_brackets $tg_name]
set tg_members [timegroup -get_members $tg_name]
set tg_exceptions [timegroup -get_exceptions $tg_name]

# 此循环对设计中的每个时序节点进行遍历
foreach_in_collection node_id [get_timing_nodes -type all] {

    set node_name [get_timing_node_info -info name $node_id]

    # 如果节点名称不在总线中,则清除 bus_name。
    # 否则,设置 bus_name。
    if { ! [regexp {(.*?)\[\d+\]} $node_name match bus_name] } {
        set bus_name ""
    }
    
    # 检查节点名称是否与指定时序组中的
    # 任何模式匹配
    set matches 0  
    foreach_in_collection member $tg_members {

        set esc_name [escape_brackets [lindex $member 2]]
        if { [string match $esc_name $node_name] } {
            set matches 1
        } elseif { ! $need_asterisk && \
            [string match $esc_name $bus_name] } {
            set matches 1
        }
    }

    # 如果此处的 $matches 是 1,表明时序节点与时序组中的
    # 一个成员名称匹配。但是,它也可能与异常匹配。  
    # 在此处进行检查。
    if { $matches } {
        
        foreach_in_collection exception $tg_exceptions {
            
            set esc_name [escape_brackets [lindex $exception 2]]
            if { [string match $esc_name $node_name] } {
                set matches 0
            } elseif { ! $need_asterisk && \
                [string match $esc_name $bus_name] } {
                set matches 0
            }
        }
    }

    # 我们已检查了所有异常。如果 $matches 仍然是 1,
    # 表明节点名称与成员模式匹配,
    # 而非与异常模式匹配,可打印节点名称。
    if { $matches } {
        post_message $node_name
    }
}

project_close