0

我写了一个 FindFile.tcl 的程序。它会在所有子目录中找到 .v、.sv 和 .vhd 并附加到一个列表($tb_file)。无论如何,它只附加其中的一部分。假设它应该附加所有文件。

结果:Test_Plan.sv Test_Plan_Copy.sv sim_driver_2.sv
预期结果: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
}

请建议。非常感谢。谢谢。

4

2 回答 2

2

您的主要问题是您想从子目录中累积文件,但实际上并没有这样做。您也没有使用globwell 的功能。这是我的看法:

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
}

(这些全局术语实际上都不需要用双引号括起来。我只是为了语法突出显示!)

于 2012-04-08T11:31:06.667 回答
0

我想你还没有理解进程调用在 Tcl 中是如何工作的。你有几行这样的

set a $a

它只是将变量设置为其自身。看起来好像您正在尝试将参数更新到嵌套调用中的 proc 并期望结果在父 proc 中可用。Tcl proc 参数不能那样工作,您需要返回一个新列表并将其加入您的结果。

于 2012-04-08T06:50:08.087 回答