我编写了一个FindFile.tcl程序。它将在所有子目录中找到.v,.sv和.vhd并附加到列表($ tb_file)。无论如何它只附加了部分内容。假设它应该附加所有文件。
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
我发现了什么:
$tb_file
在进入第二个foreach语句之前将遗漏列表中的一个元素;
我的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
}
请咨询。万分感激。感谢。
答案 0 :(得分: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
}
(这些全球术语中没有一个实际上需要用双引号。我只是用它来进行语法高亮!)
答案 1 :(得分:0)
我认为你还没有理解进程调用在Tcl中是如何工作的。你有几行像这样
set a $a
只是将变量设置为自己。它看起来好像你试图在嵌套调用中更新proc的参数,并期望结果在父proc中可用。 Tcl proc参数不起作用,您需要返回一个新列表并将其加入到您的结果中。