get_cell 怎么抓取hier 层次为一级的module
时间: 2025-08-08 11:10:39 AIGC 浏览: 33
<think>我们正在处理一个关于如何使用get_cell命令抓取层次为一级的module的问题。
根据引用[1]:get_cells检索最顶层一级的module和leaf cell,检索得到的full_name必然是不带/的。
引用[2]和[3]也提供了一些使用get_cells的例子,特别是使用-hierarchical(或简写为-hier)选项和-filter选项。
用户需求:抓取层次为一级的module(即最顶层的module,其full_name中不包含斜杠/)。
根据引用[1]的描述,最顶层一级的module的full_name是不带/的。因此,我们可以通过过滤full_name中不包含斜杠的cell来获取这些module。
但是,注意:get_cells命令返回的可能是module也可能是leaf cell(即最底层的单元)。而用户只想要module(即层次化单元,非leaf cell)。
因此,我们需要两个条件:
1. full_name中不包含斜杠(即没有层次分隔符),这表示它位于顶层。
2. 该对象是一个module(即层次化单元,而不是leaf cell)。根据引用[3]中提到的属性,我们可以使用`is_hierarchical`属性来判断。如果是module,则`is_hierarchical`为true;如果是leaf cell,则为false。
所以,我们可以这样写命令:
get_cells -filter "full_name !~ /*/ && is_hierarchical==true"
但是注意:引用[1]指出顶层module的full_name不带/,所以我们可以用`full_name !~ /*/`来匹配不包含斜杠的名称。然而,实际上,顶层模块的full_name就是模块名,不包含任何斜杠。
另外,我们也可以使用更直接的方法:由于顶层模块的层次路径就是它自己的名字(没有父模块),所以我们可以用`-hierarchical`选项来搜索整个设计,然后过滤出层次为顶层的模块。
但是,引用[2]中有一个例子:`get_cells -hier -filter "full_name =~ xx/xx/A*"`,这里使用了通配符和正则匹配。我们也可以利用类似的方法。
然而,用户只想要一级层次(顶层)的module。因此,我们可以这样:
方法1:直接获取顶层模块,因为顶层模块的full_name中没有斜杠,所以我们可以用:
get_cells -filter "full_name !~ /*/" # 但是这样可能会包含顶层的一些leaf cell
所以我们需要同时过滤leaf cell和module,只保留module。因此加上`is_hierarchical==true`。
完整命令:
get_cells -filter "full_name !~ /*/ && is_hierarchical==true"
但是,注意:在Tcl中,斜杠/是特殊字符,在正则表达式中需要转义吗?实际上,在-filter选项中的匹配模式是支持通配符和正则表达式的(取决于工具的具体实现)。通常,我们可以使用通配符*,也可以使用正则表达式。
另外,引用[3]中有一个例子:`get_cells -hierarchical $pattern/* -filter "is_hierarchical==false"`,这里使用了-hierarchical选项,并且用$pattern/*来限定模式。
如果我们只想要顶层的module,我们也可以不使用-hierarchical,因为顶层模块可以直接通过名字获取,不需要递归。但是,为了确保我们只获取顶层,我们可以不使用-hierarchical,因为默认情况下get_cells只在当前作用域中查找。
但是,当前作用域可能是顶层,也可能不是。所以我们需要先设置当前作用域为顶层(top),然后再执行get_cells。
或者,我们可以使用-hierarchical选项,然后过滤出那些full_name中不包含斜杠的module。
方法2:
get_cells -hier -filter "full_name !~ /*/ && is_hierarchical==true"
这个命令会递归地查找所有层级的cell,然后过滤出full_name不包含斜杠的(即顶层)且是模块的单元。
注意:在正则表达式中,匹配斜杠可以用`\/`,但是根据工具的不同,也可能直接用`/`。在Tcl中,字符串匹配支持通配符(glob风格)和正则表达式(regexp风格),具体取决于命令的实现。在PT/ICC2中,-filter后面的表达式通常使用类似Tcl的字符串匹配(glob)或正则表达式(regexp)?需要查看工具文档。
实际上,引用[2]中使用了`=~`操作符,这表示后面的模式是正则表达式。而`!~`表示不匹配正则表达式。
因此,我们使用`!~ /*/`可能不正确,因为`/*/`是一个正则表达式,它匹配任何包含至少一个斜杠的字符串。而顶层模块的full_name不包含斜杠,所以我们可以用:
full_name !~ /.*\/.*/ # 这个正则表达式表示字符串中包含斜杠(即任何字符后跟一个斜杠再跟任何字符)
但是,更简单的写法是:`full_name !~ */*` 这里使用通配符风格(注意:在-filter中,有些工具支持通配符,有些支持正则表达式,需要看具体工具)
根据引用[2]中的例子,他们使用了`=~ xx/xx/A*`,这里使用的是通配符风格(因为*是通配符)。所以我们可以推断,在ICC2/PT中,-filter的匹配模式支持通配符。
因此,我们可以这样写:
get_cells -hier -filter "full_name !~ */* && is_hierarchical==true"
这个命令会匹配所有full_name中不包含斜杠(即没有层次分隔)的module。
但是,注意:顶层模块的full_name就是模块名,所以不会包含斜杠。而其他层级的模块的full_name会包含斜杠(例如top/sub/mod)。
所以这个命令可以获取到所有顶层的module。
另外,我们也可以不递归,直接在顶层作用域中获取:
current_instance top # 先切换到顶层
get_cells -filter "is_hierarchical==true" # 这样获取的是顶层作用域中的所有module(注意:顶层作用域中可能包含多个顶层模块,如果设计有多个顶层的话?一般只有一个顶层模块,但可能有多个顶层实例)
但是,通常设计只有一个顶层模块,但可能有多个顶层实例(在层次化设计中,顶层可能由多个模块实例化而成)。所以,我们通常认为顶层模块就是位于设计最顶层的那些模块实例。
因此,如果当前已经在顶层作用域,那么直接使用`get_cells * -filter "is_hierarchical==true"`就可以获取顶层模块(实例)。
但是,为了避免当前作用域的影响,使用-hierarchical选项并过滤full_name可能是更可靠的方法。
总结:推荐使用以下命令获取层次为一级的module(即顶层模块实例):
get_cells -hierarchical -filter "full_name !~ */* && is_hierarchical==true"
注意:这个命令会遍历整个设计,然后过滤出full_name中不包含斜杠(即没有层次路径)且是模块(非leaf cell)的单元。
另外,根据引用[1],get_cells默认就会检索最顶层的module和leaf cell,所以如果我们不指定-filter,那么返回的就是顶层模块和顶层leaf cell。因此,我们通过-filter来筛选出其中的模块。
所以,我们也可以先获取顶层所有cell,然后再过滤出模块:
get_cells -hierarchical -filter "is_hierarchical==true" # 这样会得到所有层次的模块
# 然后我们还需要过滤出顶层的模块,所以还是需要full_name的条件
因此,还是推荐使用full_name的条件。
另外,引用[5]提到了get_object命令,但这里我们使用get_cells。
因此,回答如下:</think>在集成电路设计工具(如Synopsys的ICC2或PrimeTime)中,使用 `get_cells` 命令抓取层次为一级的模块(module)时,需结合 `-hierarchical` 和 `-filter` 选项进行精确筛选。以下是具体方法及原理:
### 命令语法
```tcl
get_cells -hierarchical -filter "is_hierarchical==true && full_name !~ /*/*"
```
或简化版本:
```tcl
get_cells -hier -filter "is_hierarchical && full_name !~ /*/*"
```
### 关键参数解析
1. **`-hierarchical`**
启用层次化搜索,递归遍历所有子模块(默认仅搜索当前层级)[^1][^3]。
2. **`-filter` 条件**
- **`is_hierarchical==true`**
仅选择模块(module),排除底层单元(leaf cell)[^1][^3]。
*注:`is_hierarchical` 是工具内置属性,用于区分模块与底层单元。*
- **`full_name !~ /*/*`**
通过正则表达式限定模块路径:
- `!~` 表示"不匹配"后续模式;
- `/*/*` 匹配所有包含至少一个层级分隔符(`/`)的名称,如 `top/sub/mod`;
- 因此 `!~ /*/*` 仅选择**无父层级**的顶层模块(如 `top`)[^1][^2]。
### 示例说明
假设设计层次为:
```
top (顶层模块)
├── sub_module_A (子模块)
└── sub_module_B (子模块)
```
- **目标**:抓取 `top`
- **命令结果**:
- `full_name = "top"` → 匹配(无 `/` 符号)
- `full_name = "top/sub_module_A"` → 被排除(含 `/`)
### 注意事项
1. **避免误选底层单元**
若省略 `is_hierarchical==true`,可能混入底层单元(如门级电路)[^1][^3]。
2. **正则表达式灵活性**
若需匹配特定顶层模块(如 `top_a`、`top_b`),可修改为:
```tcl
get_cells -hier -filter "is_hierarchical && full_name =~ top_*"
```
### 对比其他方法
- **`get_flat_cells`**:在 ICC2 中可直接展平层级抓取,但 **PrimeTime 不支持此命令**(需依赖 `get_cells`)[^2]。
- **作用域切换**:通过 `current_instance top` 切换至顶层后直接 `get_cells *`,但需额外步骤且可能遗漏跨层级模块。
---
阅读全文
相关推荐




















