ワイルドカード・パターンにマッチするトップレベル・インスタンス名

author-image

投稿者:

このデザイン例では、ワイルドカード・パターンにマッチするトップレベル・インスタンス名を返す Tcl プロシージャーを紹介します。プロシージャーをコピーして Tcl スクリプトに貼り付けて、プロシージャーを呼び出します。
このプロシージャーは、インスタンス名をリストで返します。ワイルドカード・パターンにマッチするトップレベル・インスタンス名がない場合、このプロシージャーは空のリストを返します。インスタンス名は、任意の順序で返されます。インスタンス名のリストをアルファベット順など特定の順序で返したい場合は、lsort コマンドで適宜ソートしてください。
例えば、デザイン内のトップレベル・インスタンス名が foo1、foo2、foo3、bar1、bar2bar3 の場合、

get_top_level_instances_matching *2 のプロシージャー・コールは { foo2 bar2 } を返します。

proc get_top_level_instances_matching { wildcard } {

    # ワイルドカードにマッチするトップレベル・インスタンスを保持する変数を作成します
    catch { array unset names_to_return }
    array set names_to_return [list]
    
    # 名前のコレクションは、デザイン内のすべての階層です
    foreach_in_collection name_id [get_names -filter * -node_type hierarchy] {
    
        # short_full_path オプションが名前を取得する形式は
        # instance|instance|...
        # [ノード名用のエンティティー名をディスプレイ] の設定が
        # オンかオフかに関わらず、インスタンスのみを使用します
        set short_full_name [get_name_info -info short_full_path $name_id]
        
        # 階層をリストに分割し、
        # 階層セパレーター | で分割します
        set short_full_pieces [split $short_full_name "|"]
        
        # トップレベル・インスタンス名 (リストの最初のインスタンス) を取得します
        set top_level_instance [lindex $short_full_pieces 0]
        
        # トップレベル・インスタンス名がワイルドカードにマッチした場合は、
        # 保存してプロシージャーの最後に返します
        if { [string match $wildcard $top_level_instance] } {
            set names_to_return($top_level_instance) 1
        }
    }
    
    return [array names names_to_return]
}