Innovus ecoAddRepeater按照具体load pin进行分组案例(附glolden脚本)

我们之前介绍过ecoAddRepeater可以实现on route插buffer,而且还可以解high fanout引起的transition violation。

但实际项目中经常会有如下图所示的实现要求:

在这里插入图片描述

ecoAddRepeater使用方法解析

● U0原来驱动的U1–>U16,需要一分为二,第一组是U1-U8,第二组是U9-U16

● 这两组fanout可以根据layout位置来选定(这个工具无法自动实现)

以上需求直接使用ecoAddRepeater是无法直接实现的。通过上面的图解我们实现的方法和步骤如下:

1)设置ecoMode将updateTiming关掉

setEcoMode -updateTiming false

2)关掉LEQ检查 (因为涉及到信号反向)

setEcoMode -LEQCheck false

3)对U1–>U8的D pin插buffer

ecoAddRepeater -term {U1/D U2/D U3/D U4/D U5/D U6/D U7/D U8/D} -cell BUFX2 -name eco_inst_1

4)将插入的buffer size成 inverter

ecoChangeCell -cell INVX2 -inst eco_inst_1

5)对U9–>U16的D Pin插b

<think>好的,用户需要编写两个TCL脚本函数disconnect_net和connect_net,用于Innovus工具中。这两个函数需要用到attachTerm、detachTerm、load_net、dbGet等命令,以及处理net的逻辑。首先,我得回忆一下这些命令的用法和相关参数。 首先看disconnect_net函数。用户可能想要断开某个instance的pin与当前net的连接。这时候需要使用detachTerm命令。detachTerm需要指定instance和pin的名称。如何获取这些信息呢?假设用户提供的参数是instance名和pin名,那么直接调用detachTerm就可以了。但可能需要先检查该pin是否已经连接到了某个net,否则可能出错。不过根据用户需求,可能不需要这一步,直接执行detach。 接下来是connect_net函数,需要将instance的pin连接到指定的net。这里可能需要使用attachTerm命令。attachTerm的参数是pinnet。但需要注意,如果net不存在,可能需要先创建。不过用户可能希望如果net不存在的话自动创建,或者报错。这里需要明确函数的行为。假设用户提供的net名已经存在,否则可能需要处理错误。或者,在函数中检查net是否存在,不存在则创建。但根据Innovus的流程,通常net应该已经存在,所以可能不需要自动创建。另外,如果pin已经被连接到其他net,可能需要先断开原来的连接,再连接到新的net。因此,在connect_net函数中,可能需要先调用detachTerm,再调用attachTerm。但用户可能希望函数自动处理这些情况,还是由用户确保pin是未连接的?需要明确函数的设计。 另外,用户提到要使用dbGet命令。dbGet用于从数据库中获取信息。例如,在disconnect_net中,可能需要检查该pin是否确实连接到了某个net,可以使用dbGet来获取该pinnet信息。同样,在connect_net中,可能需要验证目标net是否存在,或者获取pin的属性。 此外,load_net命令用于加载net对象,可能在连接时需要用到。例如,在attachTerm之前,需要确保net已经被正确加载到当前设计中。 现在,考虑函数的参数。用户可能希望disconnect_net接受instance和pin作为参数,而connect_net接受instance、pinnet名作为参数。或者,可能更直接的是,使用pin的全名(即instance的层次路径加pin名)来处理,例如"instA/pinB"。这样,函数内部可以解析层次路径,或者直接使用get_pins命令来获取pin对象。 但是,Innovus中的TCL命令可能需要具体的对象句柄,而不仅仅是字符串。因此,可能需要先通过get_pins或get_nets获取到相应的对象,再进行操作。例如,detachTerm需要的是pin对象,而attachTerm需要的是pinnet对象。 所以,函数的大致逻辑可能是这样的: 对于disconnect_net: 1. 获取instance和pin的组合,例如inst_name和pin_name,组合成完整的pin路径,如inst_name/pin_name。 2. 使用get_pins获取该pin的对象。 3. 检查该pin是否已经连接到某个net,可以使用dbGet [dbGet -p2 top.terms.net.name]或者其他方式。 4. 调用detachTerm断开连接。 对于connect_net: 1. 获取目标net的对象,使用get_nets,如果不存在则可能需要创建,但根据用户需求可能不处理。 2. 获取pin的对象。 3. 调用attachTerm将pin连接到net。 不过,attachTerm的参数是-term和-net,例如:attachTerm -term $pin_obj -net $net_obj。 此外,需要注意错误处理,例如如果pin不存在,或者net不存在,函数应该给出提示,而不是导致脚本崩溃。 现在结合用户提供的引用中的例子,比如引用[2]中使用了get_lib_cells -of_objects,引用[5]用了get_cells,这说明在Innovus的TCL环境中,对象的获取需要正确的层次路径和过滤条件。因此,在函数中需要确保正确获取pinnet的对象。 另外,用户提到的dbGet命令,例如在引用[2]中获取lib cell的属性,可能需要用到dbGet来获取某些属性,比如pinnet信息。 例如,在disconnect_net函数中,可能需要使用dbGet来检查pin当前连接的net,然后detach。或者,直接调用detachTerm,因为detachTerm会自动处理断开连接,不需要手动查询。 可能detachTerm只需要pin对象作为参数,所以函数可以简化为: proc disconnect_net { inst_name pin_name } { set pin_obj [get_pins $inst_name/$pin_name -quiet] if { $pin_obj == "" } { puts "Error: Pin $inst_name/$pin_name not found" return } detachTerm -term $pin_obj } 同样,connect_net函数: proc connect_net { inst_name pin_name net_name } { set pin_obj [get_pins $inst_name/$pin_name -quiet] if { $pin_obj == "" } { puts "Error: Pin $inst_name/$pin_name not found" return } set net_obj [get_nets $net_name -quiet] if { $net_obj == "" } { puts "Error: Net $net_name not found" return } attachTerm -term $pin_obj -net $net_obj } 但是,这里可能需要考虑是否pin已经连接到其他net,是否需要先detach。例如,在连接之前,先断开现有的连接: proc connect_net { inst_name pin_name net_name } { set pin_obj [get_pins $inst_name/$pin_name -quiet] if { $pin_obj == "" } { puts "Error: Pin $inst_name/$pin_name not found" return } set net_obj [get_nets $net_name -quiet] if { $net_obj == "" } { puts "Error: Net $net_name not found" return } # 先断开现有的连接 catch { detachTerm -term $pin_obj } # 连接到新的net attachTerm -term $pin_obj -net $net_obj } 这样,不管pin原来是否连接,都会先断开再连接。但需要确认detachTerm在pin未连接时是否会报错,所以用catch来忽略错误。 此外,用户提到的load_net命令可能需要用到。例如,在连接前加载net,确保其存在。但通常get_nets会自动处理,如果net不存在,get_nets会返回空,这时候可能需要创建net。但用户可能希望函数在net不存在时报错,而不是自动创建,所以当前的处理是合适的。 另外,用户提到的dbGet可能需要用于获取更详细的信息,比如在断开连接时,记录原来的net名称,或者进行其他操作。但根据用户的需求,可能不需要这些额外的步骤。 综上,这两个函数的大致结构如上述代码。需要测试这些函数在Innovus环境中的可行性,并处理可能的错误情况,例如对象不存在等。</think>以下是为Innovus设计的TCL脚本函数实现,包含详细的错误检测和操作逻辑: ```tcl ######################################## # 断开指定管脚的网络连接 # 参数:inst_name(例:U123), pin_name(例:A) ######################################## proc disconnect_net { inst_name pin_name } { # 获取完整管脚路径 set full_pin_name ${inst_name}/${pin_name} set pin_obj [get_pins $full_pin_name -quiet] # 错误检测 if { [sizeof_collection $pin_obj] == 0 } { puts "Error: Pin $full_pin_name not found" return -code error } # 获取当前连接网络 set net_name [dbGet [dbGet -p2 top.terms.name $full_pin_name].net.name] # 执行断开操作 if { $net_name != "" } { detachTerm -term $pin_obj puts "Disconnected: $full_pin_name from $net_name" } else { puts "Warning: $full_pin_name not connected to any net" } } ######################################## # 连接指定管脚到目标网络 # 参数:inst_name(例:U123), pin_name(例:A), target_net(例:clk) ######################################## proc connect_net { inst_name pin_name target_net } { # 获取管脚对象 set full_pin_name ${inst_name}/${pin_name} set pin_obj [get_pins $full_pin_name -quiet] # 获取网络对象 set net_obj [get_nets $target_net -quiet] # 错误检测 if { [sizeof_collection $pin_obj] == 0 } { puts "Error: Pin $full_pin_name not found" return -code error } if { [sizeof_collection $net_obj] == 0 } { puts "Error: Net $target_net not found" return -code error } # 加载网络并执行连接 load_net $net_obj attachTerm -term $pin_obj -net $net_obj puts "Connected: $full_pin_name to $target_net" } ``` ### 实现要点解析 1. **对象获取**: - 使用`get_pins`和`get_nets`命令获取物理对象 - `dbGet`命令通过层次路径精确查询连接状态[^2] - `sizeof_collection`验证对象存在性[^5] 2. **错误处理**: - 检测未找到管脚/网络的情况 - 连接前自动加载网络确保对象可用性[^1] - 支持层次化对象路径(如U123/A) 3. **操作流程**: - `disconnect_net`先查询当前连接状态再执行detachTerm - `connect_net`通过load_net确保网络加载到内存[^3] - 连接操作后输出执行结果状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值