2012-04-07 16 views
0

私はFindFile.tclの手順を書いています。 .v、.sv、.vhdのすべてのサブディレクトリがすべてリストに追加されます($ tb_file)。とにかくそれはそれらの部分を追加するだけです。おそらく、すべてのファイルを追加する必要があります。FindFiles:lappend issue

 
Result: Test_Plan.sv Test_Plan_Copy.sv sim_driver_2.sv 
Expected Result: Test_Plan.sv Test_Plan_Copy.sv sim_driver_1.sv sim_driver_2.sv 

私はアウトして下さいどのような:それは二foreach文に行く前に $tb_fileは、リスト内の1つの要素を欠場します。

マイFindFile.tcl

proc FindFiles { MY_TB_DIR tb_file } { 
    set pwd [pwd]; 
    # set tb_file $tb_file 
    set tb_file $tb_file 
    # puts "after proc call testbench files are $tb_file" 
    set MY_TB_DIR $MY_TB_DIR 
    puts "after proc call tb_dir $MY_TB_DIR" 
    set dir_file [glob -nocomplain -dir $MY_TB_DIR *]; 
    # puts $dir_file 
    # set dir_file [glob -nocomplain *] 

    foreach item $dir_file { 
    set file [file tail $item]; 
    puts $file; 
    switch -glob -- $file { 
     *.v {lappend tb_file $file 
     puts "Append $tb_file" 
     } 

     *.sv {lappend tb_file $file 
     puts "Append $tb_file" 
     } 

     *.vhd {lappend tb_file $file 
     # puts "Test bench file is $tb_file" 
     } 

     default {} 
    }; 
    set tb_file $tb_file; 
    }; 

    foreach item2 $dir_file { 
    # recurse - go into the sub directory 
    if { [file isdirectory $item2] } { 
     set sub_dir [file join $MY_TB_DIR $item2] ; 
     puts "\n\n before proc call $tb_file"; 
     puts " \n\n sub_dir $sub_dir"; 
     FindFiles $sub_dir $tb_file; 
     # FindFiles $sub_dir 
    } 
    }; 
    # puts "Testbench are $tb_file" 
    cd $pwd 
} 

Plsのアドバイス。本当に感謝します。ありがとう。

+0

アドバイス#1:使用tcllib fileutil :: findByPatternあなたは何をしたいのですか... http://tcllib.sourceforge.net/doc/fileutil.html – schlenk

答えて

0

あなたはプロセスコールがTclでどのように機能するか理解していないと思います。このような行がいくつかあります。

set a $a 

変数を自分自身に設定するだけです。また、ネストされた呼び出しでprocにパラメータを更新しようとしていて、結果が親procで利用可能であると想定しているかのように見えます。 Tcl procのパラメータはそうしないので、新しいリストを返して結果に結びつける必要があります。

+0

私はすべてのセットを削除しました。それでも動作しません。それに加えて、第1のforeachに追加されたリストは、第2のforeachに達したときに失われます。 – user981714

2

あなたの主な問題は、サブディレクトリのファイルを蓄積することですが、実際にはそうしていないことです。また、globの機能も使用していません。ここに私のテイクです:

proc FindFiles {MY_TB_DIR {accumulate_var ""}} { 
    if {$accumulate_var ne ""} { 
     upvar 1 $accumulate_var result 
    } 
    foreach file [glob -nocomplain -dir $MY_TB_DIR -type f "*.{v,sv,vhd}"] { 
     lappend result [file tail $file] 
    } 
    foreach dir [glob -nocomplain -dir $MY_TB_DIR -type d "*"] { 
     FindFiles $dir result 
    } 
    return $result 
} 

(。これらのグロブ用語のどれもが、実際に二重引用符で囲む必要はありません私は構文強調表示のためにそれをやった!)

+0

本当の鍵は 'glob'の力を使うことです。それはあなたのためにたくさんあります。私はそれに '-tails'オプションを使用することもできましたが、私はそれが本当に好きではありません。 :-) –