Tcl 使用脚本确定库中是否存在设计元素

Tcl 使用脚本确定库中是否存在设计元素,tcl,modelsim,Tcl,Modelsim,我想使用Tcl确定ModelSim(我正在使用10.3c PE)中的给定库中是否存在(已编译)设计元素,但似乎找不到合适的函数。类似这样的理论代码: if {[design_object exists $lib.$entity]} { ... 虽然不理想,但我可以使用以下工具检查某些自定义库: if {[file exists $lib_path]} { ... 当然,这使用文件系统访问,虽然理想情况下我希望检查一个逻辑名称,但对于我目前有限的用途来说,这种解决方法已经足够好了 不幸

我想使用Tcl确定ModelSim(我正在使用10.3c PE)中的给定库中是否存在(已编译)设计元素,但似乎找不到合适的函数。类似这样的理论代码:

if {[design_object exists $lib.$entity]} {
  ...
虽然不理想,但我可以使用以下工具检查某些自定义库:

if {[file exists $lib_path]} {
  ...
当然,这使用文件系统访问,虽然理想情况下我希望检查一个逻辑名称,但对于我目前有限的用途来说,这种解决方法已经足够好了


不幸的是,对于设计实体似乎没有一个精确的等价物,因为ModelSim不会为编译的实体创建单独的文件。我考虑过为实体名称解析库的
\u info
文件,但这可能是一个相对较长的操作。有没有一种内在的方法可以做到这一点?ModelSim的Tcl扩展是否甚至提供了对逻辑名称的访问(在模拟上下文之外)?

看起来,要以编程方式检查ModelSim库的内容,需要使用
vdir
命令。它返回一个多行字符串,其中每行都有一个对象类型,后跟对象的名称。可以使用以下方法提取实体:

proc get_vdir_entities {lib_name} {
  set contents [split [vdir -lib $lib_name] "\n"]
  set rval {}
  foreach c $contents {
    if [regexp "^ENTITY" $c] {
      lappend rval [lindex $c 1]
    }
  }
  return $rval
}

set entities [get_vdir_entities "work"]
proc get_modelsim_entities {info_file} {
  set fh [open $info_file r]
  fconfigure $fh -translation binary
  set fields [split [read $fh] "\n"]
  close $fh

  set rval {}
  foreach f $fields {
    if [regexp -nocase "^E\[a-z0-9_\]+$" $f] {
      lappend rval [string range $f 1 end]
    }
  }

  return $rval
}


set entities [get_modelsim_entities "path/to/your/_info"]
早期解决方案

查看_info文件可以发现,所有编译的实体都记录为字符串,名称前加上“E”。在外壳中进行快速测试后,我得到了一份全面的清单:

strings _info | sed -n -e "/^E/ p"
看起来在这些“62 20 31 0a”十六进制字符串之前有一个一致的前缀,它们以0a十六进制结尾。您可以使用以下方法在纯Tcl中进行提取:

proc get_vdir_entities {lib_name} {
  set contents [split [vdir -lib $lib_name] "\n"]
  set rval {}
  foreach c $contents {
    if [regexp "^ENTITY" $c] {
      lappend rval [lindex $c 1]
    }
  }
  return $rval
}

set entities [get_vdir_entities "work"]
proc get_modelsim_entities {info_file} {
  set fh [open $info_file r]
  fconfigure $fh -translation binary
  set fields [split [read $fh] "\n"]
  close $fh

  set rval {}
  foreach f $fields {
    if [regexp -nocase "^E\[a-z0-9_\]+$" $f] {
      lappend rval [string range $f 1 end]
    }
  }

  return $rval
}


set entities [get_modelsim_entities "path/to/your/_info"]

Modelsim实体是否映射到命令?如果是这样,我们可以做一些检查。否则,在通用Tcl中并没有什么真正的帮助;这将是Modelsim必须提供的一项功能(因为它可以理解其自定义句柄…),我注意到-我真的希望避免解析文件,但是,特别是如果我想随机且频繁地执行检查。进一步查看
vdir
,它似乎还可以使用
参数,这使得检查单个实体的调用更加容易。谢谢