如何编写SKILL脚本将.lvs.report格式LVS报告导出为.csv文件?
解决LVS报告转CSV的SKILL脚本方案
首先明确:inPort函数是用于读取Cadence设计数据库中的端口对象,完全不适合读取普通文本格式的LVS报告文件,这是你之前尝试失败的核心原因。下面是用SKILL原生文件操作函数实现的完整解决方案:
完整脚本示例
; 配置文件路径,根据实际情况修改 lvsReportPath = "/path/to/your/design.lvs.report" csvOutputPath = "/path/to/your/output.lvs.errors.csv" ; 打开LVS报告文件,只读模式 lvsFile = open(lvsReportPath "r") unless(lvsFile printf("ERROR: 无法打开LVS报告文件 %s\n" lvsReportPath) exit() ) ; 创建并打开CSV输出文件,写入模式 csvFile = open(csvOutputPath "w") unless(csvFile printf("ERROR: 无法创建CSV输出文件 %s\n" csvOutputPath) close(lvsFile) exit() ) ; 写入CSV表头(根据需要提取的字段修改) fprintf(csvFile "错误类型,布局位置,原理图位置,错误描述\n") ; 标记是否进入错误数据段(以Calibre LVS报告为例,可根据实际报告格式调整) inErrorSection = nil line = fgets(lvsFile) while(line ; 定位到错误区域,比如Calibre报告的"Electrical Errors"部分 if(regexp(line "Electrical Errors") inErrorSection = t ; 跳过后续的分隔标题行,直到看到数据行 line = fgets(lvsFile) while(line && regexp(line "^-+") line = fgets(lvsFile) ) ) ; 如果在错误区域,解析每行数据 if(inErrorSection && !regexp(line "^-+") && !regexp(line "^$") ; 示例解析:假设每行格式为 "类型 布局坐标 原理图坐标 描述",需根据实际报告调整正则 if(match = regexp(line "^([A-Za-z]+)\\s+([0-9./-]+)\\s+([0-9./-]+)\\s+(.*)$") errorType = match[1] layoutLoc = match[2] schematicLoc = match[3] errorDesc = match[4] ; 写入CSV,转义描述中的逗号避免破坏列结构 errorDesc = substitute(errorDesc "," "\\,") fprintf(csvFile "%s,%s,%s,%s\n" errorType layoutLoc schematicLoc errorDesc) ) ) ; 读取下一行 line = fgets(lvsFile) ) ; 关闭文件 close(lvsFile) close(csvFile) printf("LVS报告数据已成功导出至 %s\n" csvOutputPath)
关键说明
- 文件操作逻辑:使用
open打开普通文本文件、fgets逐行读取、fprintf写入内容,是SKILL处理普通文本文件的标准方法。 - 报告格式适配:不同工具(Calibre、Hercules等)生成的LVS报告格式差异较大,你需要根据自己的报告内容调整正则表达式和数据段定位关键字(比如Hercules报告的错误段可能是"Layout vs Schematic Mismatches")。
- 异常处理:脚本加入了文件打开失败的判断,避免无意义崩溃。
- CSV规范兼容:如果导出字段包含逗号,用
substitute转义,防止破坏CSV列结构。
调试技巧
- 先单独读取几行报告内容,用
printf(line)打印确认格式,再调整正则表达式。 - 先提取少量数据测试逻辑,确认正确后再处理完整文件。
内容的提问来源于stack exchange,提问作者shweta tiwari
相关产品推荐
相关产品推荐

