你指出得非常对!在我们抽取通用函数的过程中,确实**遗漏了 `get_timing_path` 函数调用的上下文处理**,尤其是在 A93K8 的实现中,它使用了一个临时缓存变量 `timingAllPathDict` 来**缓存 `get_timing_path` 的结果**,以避免重复调用。
---
### ✅ 问题分析:
在原始 A93K8 函数中:
```python
timingAllPathDict = {}
...
timingPath = get_timing_path(wgl, ezconvOutputFolder, timingAllPathDict)
```
我们使用了一个字典 `timingAllPathDict` 来缓存 `get_timing_path` 的结果,以提升性能。但在抽取的通用函数 `_get_common_test_suite_info` 中,我们**没有传递这个缓存字典**,也没有在 `get_timing_path` 调用中使用它。
---
### ✅ 解决方案:
我们需要:
1. 在 `_get_common_test_suite_info` 函数中添加一个参数 `use_timing_cache=True`。
2. 如果启用缓存,则在函数内部创建一个 `timingAllPathDict = {}`。
3. 将这个缓存传给 `get_timing_path` 函数。
---
### ✅ 修改后的通用函数(含缓存支持):
```python
def _get_common_test_suite_info(
category,
hwName,
module,
patInfos,
isRetWglInBurst=False,
AcutalIPName='',
setorder='',
needPattern=True,
include_final_rule_name=False,
get_pat_func=None,
timing_handler=None,
use_timing_cache=False,
ezconv_folder=None,
get_wgl_func=None,
get_burst_func=None
):
testSuiteInfos = []
IPName = AcutalIPName if AcutalIPName else category
lstAllWgl = get_wgl_func(patInfos, IPName, module, hwName)
lstAllBurst = get_burst_func(patInfos, IPName, module)
# timing 缓存
timingAllPathDict = {} if use_timing_cache and timing_handler else None
# 处理 Burst 中的 TestSuite
for testSuite in lstAllBurst:
for patternBurst in testSuite.get("PatBurst", []):
wglList = getWglListBySetOrder(patternBurst["WglList"], setorder)
if not wglList:
continue
for wgl in wglList:
testSuiteInfo = {
"testSuiteName": testSuite["Name"],
"wglOrBurstName": patternBurst["Name"],
"wglOrBurstNameAfterRemoveField": patternBurst.get("BurstNameAfterRemoveField", ""),
"lvl": patternBurst.get("Lvl", ""),
"Pinmapset": wgl.get("pinmapset", ""),
"RowId": wgl.get("RowId", ""),
"patBurst": True,
"pat": get_pat_func(wgl["atePatFiles"]).split('.')[0],
"flowCtrlOfBining": wgl['TestSuiteRule']["FlowCtrl"].get('Bining', []),
"testSuiteNameOfWithDCCategory": wgl['TestSuiteRule']["FlowCtrl"].get('TestSuiteName', {}).get('WithDCCategory', ""),
"testSuiteNameOfStrMode": wgl['TestSuiteRule']["FlowCtrl"].get('TestSuiteName', {}).get('StrMode', ""),
"flowCtrlOfSubGroup": wgl['TestSuiteRule']["FlowCtrl"].get('SubGroup') or [],
"flowCtrlOfTimSpecNameKeyReplace": wgl['TestSuiteRule']["FlowCtrl"].get("TimSpecNameKeyReplace", {}),
"onlyUsedForMainFlow": False
}
if timing_handler:
if use_timing_cache and timingAllPathDict is not None:
key = wgl.get("finalRuleName", "") or wgl.get("wgl_name", "")
if key in timingAllPathDict:
testSuiteInfo["timing"] = timingAllPathDict[key]
else:
timing = timing_handler(wgl, ezconv_folder)
timingAllPathDict[key] = timing
testSuiteInfo["timing"] = timing
else:
testSuiteInfo["timing"] = timing_handler(wgl, ezconv_folder)
else:
testSuiteInfo["timing"] = ""
if include_final_rule_name:
testSuiteInfo["finalRuleName"] = wgl.get("finalRuleName", "")
testSuiteInfos.append(testSuiteInfo)
if isRetWglInBurst:
for wgl in wglList:
testSuiteInfo = {
"testSuiteName": testSuite["Name"],
"wglOrBurstName": wgl["wgl_name"],
"wglOrBurstNameAfterRemoveField": wgl.get("WglNameAfterRemoveField", ""),
"lvl": wgl.get("Lvl", ""),
"Pinmapset": wgl.get("pinmapset", ""),
"RowId": wgl.get("RowId", ""),
"patBurst": False,
"pat": get_pat_func(wgl["atePatFiles"]).split('.')[0],
"flowCtrlOfBining": wgl['TestSuiteRule']["FlowCtrl"].get('Bining', []),
"testSuiteNameOfWithDCCategory": wgl['TestSuiteRule']["FlowCtrl"].get('TestSuiteName', {}).get('WithDCCategory', ""),
"testSuiteNameOfStrMode": wgl['TestSuiteRule']["FlowCtrl"].get('TestSuiteName', {}).get('StrMode', ""),
"flowCtrlOfSubGroup": wgl['TestSuiteRule']["FlowCtrl"].get('SubGroup') or [],
"onlyUsedForMainFlow": True
}
if timing_handler:
if use_timing_cache and timingAllPathDict is not None:
key = wgl.get("finalRuleName", "") or wgl.get("wgl_name", "")
if key in timingAllPathDict:
testSuiteInfo["timing"] = timingAllPathDict[key]
else:
timing = timing_handler(wgl, ezconv_folder)
timingAllPathDict[key] = timing
testSuiteInfo["timing"] = timing
else:
testSuiteInfo["timing"] = timing_handler(wgl, ezconv_folder)
else:
testSuiteInfo["timing"] = ""
if include_final_rule_name:
testSuiteInfo["finalRuleName"] = wgl.get("finalRuleName", "")
testSuiteInfos.append(testSuiteInfo)
# 处理普通 WGL
for testSuite in lstAllWgl:
wglList = getWglListBySetOrder(testSuite["WglList"], setorder) if needPattern else testSuite["WglList"]
if not wglList:
continue
for wgl in wglList:
testSuiteInfo = {
"testSuiteName": testSuite["Name"],
"wglOrBurstName": wgl["wgl_name"],
"wglOrBurstNameAfterRemoveField": wgl.get("WglNameAfterRemoveField", ""),
"lvl": wgl.get("Lvl", ""),
"Pinmapset": wgl.get("pinmapset", ""),
"RowId": wgl.get("RowId", ""),
"patBurst": False,
"pat": get_pat_func(wgl["atePatFiles"]).split('.')[0],
"flowCtrlOfBining": wgl['TestSuiteRule']["FlowCtrl"].get('Bining', []),
"testSuiteNameOfWithDCCategory": wgl['TestSuiteRule']["FlowCtrl"].get('TestSuiteName', {}).get('WithDCCategory', ""),
"testSuiteNameOfStrMode": wgl['TestSuiteRule']["FlowCtrl"].get('TestSuiteName', {}).get('StrMode', ""),
"flowCtrlOfSubGroup": wgl['TestSuiteRule']["FlowCtrl"].get('SubGroup') or [],
"flowCtrlOfTimSpecNameKeyReplace": wgl['TestSuiteRule']["FlowCtrl"].get("TimSpecNameKeyReplace", {}),
"onlyUsedForMainFlow": False
}
if timing_handler:
if use_timing_cache and timingAllPathDict is not None:
key = wgl.get("finalRuleName", "") or wgl.get("wgl_name", "")
if key in timingAllPathDict:
testSuiteInfo["timing"] = timingAllPathDict[key]
else:
timing = timing_handler(wgl, ezconv_folder)
timingAllPathDict[key] = timing
testSuiteInfo["timing"] = timing
else:
testSuiteInfo["timing"] = timing_handler(wgl, ezconv_folder)
else:
testSuiteInfo["timing"] = ""
if include_final_rule_name:
testSuiteInfo["finalRuleName"] = wgl.get("finalRuleName", "")
testSuiteInfos.append(testSuiteInfo)
return testSuiteInfos
```
---
### ✅ 修改后的 A93K8 调用方式(启用缓存):
```python
def getA93K8TestSuiteInfoFromPatInfo(category, ezconvOutputFolder, hwName, module, patInfos, isRetWglInBurst=False,
AcutalIPName='', setorder='', needPattern=True):
return _get_common_test_suite_info(
category=category,
hwName=hwName,
module=module,
patInfos=patInfos,
isRetWglInBurst=isRetWglInBurst,
AcutalIPName=AcutalIPName,
setorder=setorder,
needPattern=needPattern,
include_final_rule_name=True,
get_pat_func=getPatFileFromAtePatFiles,
timing_handler=get_timing_path,
use_timing_cache=True, # 启用缓存
ezconv_folder=ezconvOutputFolder,
get_wgl_func=getA93K8TestSuiteInfoOfPat,
get_burst_func=getA93K8TestSuiteInfoOfBurstPat
)
```
---
### ✅ 修改后的 A93K7 调用方式(不启用缓存):
```python
def getA93K7TestSuiteInfoFromPatInfo(category, hwName, module, patInfos, isRetWglInBurst=False, AcutalIPName='', setorder = '', needPattern = True):
return _get_common_test_suite_info(
category=category,
hwName=hwName,
module=module,
patInfos=patInfos,
isRetWglInBurst=isRetWglInBurst,
AcutalIPName=AcutalIPName,
setorder=setorder,
needPattern=needPattern,
include_final_rule_name=False,
get_pat_func=getBurstFileFromAtePatFiles,
timing_handler=None,
use_timing_cache=False, # 不启用缓存
get_wgl_func=getA93K7TestSuiteInfoOfPat,
get_burst_func=getA93K7TestSuiteInfoOfBurstPat
)
```
---
### ✅ 总结
| 改进点 | 说明 |
|--------|------|
| ✅ **恢复了 `get_timing_path` 的调用逻辑** | 包括缓存支持 |
| ✅ **保留了 A93K7 和 A93K8 的差异处理** | 如缓存机制 |
| ✅ **保持原函数接口不变** | 无侵入式重构 |
---