基于UltraEdit的大型真值表信号跳变标记方案
问题背景
在数字电路验证中,我们常需分析真值表信号跳变。当前面临一个特殊场景:
- 文件规模:近1万列(每列代表一路信号)、10万行时序数据
- 需求:在任意列中,若出现H(高电平)→ L(低电平)连续跳变,需将跳变点标记为"X"以屏蔽检测
- 核心难点:传统人工检查效率极低,且UltraEdit旧版本存在列操作限制
初始方案与瓶颈
- 列复制+正则匹配方案
- 操作步骤:选中单列→复制到新文件→通过正则表达式
H\nL
定位跳变 - 失败原因:
- 列选择异常:10万行的大列复制时,UltraEdit旧版会错误选中前列(疑似列模式内存溢出)
- 性能限制:频繁复制粘贴导致内存占用激增,操作卡顿5
- 操作步骤:选中单列→复制到新文件→通过正则表达式
- 正则表达式直接匹配方案
- 尝试使用
H.*\n.*L
等模式匹配同一列的连续跳变 - 失败原因:
- 列定位缺失:旧版正则引擎无法约束匹配范围到特定列(仅能匹配内容,无法限定列边界)
- 分组限制:无法通过捕获组动态计算列位置偏移量
- 尝试使用
最终解决方案:逐列遍历检测法
核心思路:放弃全局查找,改为按列垂直扫描,逐行检测相邻信号跳变(H→L),通过替换实现标记。
实现步骤
- 启用列编辑模式
- 快捷键
Alt+C
开启列模式(Column Mode),确保操作仅影响当前列 - 注:UltraEdit列模式支持对选定列进行独立编辑,避免跨列干扰
- 快捷键
- 逐列遍历逻辑javascript
for (var col = 1; col <= 10000; col++) { // 遍历所有列 UltraEdit.columnModeOn(); UltraEdit.gotoLine(1, col); // 定位到当前列首行 for (var row = 1; row < 100000; row++) { // 逐行扫描 var currentChar = UltraEdit.activeDocument.getCurChar(); UltraEdit.activeDocument.gotoLine(row+1, col); var nextChar = UltraEdit.activeDocument.getCurChar(); if (currentChar == "H" && nextChar == "L") { UltraEdit.activeDocument.gotoLine(row, col); UltraEdit.activeDocument.write("X"); // 标记跳变点 } } }
注:实际脚本需加入性能优化(如分批处理)与异常处理 - 排除干扰项
- 增加条件判断:若当前字符为"X",跳过检测(避免X→H/L误判)
- 使用
UltraEdit.activeDocument.isColSel()
验证列选择状态,防止跨列错误
for (var col = 1; col <= 10000; col++) { // 遍历所有列
UltraEdit.columnModeOn();
UltraEdit.gotoLine(1, col); // 定位到当前列首行
for (var row = 1; row < 100000; row++) { // 逐行扫描
var currentChar = UltraEdit.activeDocument.getCurChar();
UltraEdit.activeDocument.gotoLine(row+1, col);
var nextChar = UltraEdit.activeDocument.getCurChar();
if (currentChar == "H" && nextChar == "L") {
UltraEdit.activeDocument.gotoLine(row, col);
UltraEdit.activeDocument.write("X"); // 标记跳变点
}
}
}
Comments | NOTHING