基于UltraEdit的大型真值表信号跳变标记方案

发布于 28 天前  133 次阅读


基于UltraEdit的大型真值表信号跳变标记方案

问题背景

在数字电路验证中,我们常需分析真值表信号跳变。当前面临一个特殊场景:

  • 文件规模:近1万列​(每列代表一路信号)、10万行时序数据
  • 需求:在任意列中,若出现H(高电平)→ L(低电平)连续跳变,需将跳变点标记为"X"以屏蔽检测
  • 核心难点:传统人工检查效率极低,且UltraEdit旧版本存在列操作限制

初始方案与瓶颈

  1. 列复制+正则匹配方案
    • 操作步骤:选中单列→复制到新文件→通过正则表达式H\nL定位跳变
    • 失败原因:
      • 列选择异常:10万行的大列复制时,UltraEdit旧版会错误选中前列(疑似列模式内存溢出)
      • 性能限制:频繁复制粘贴导致内存占用激增,操作卡顿5
  2. 正则表达式直接匹配方案
    • 尝试使用H.*\n.*L等模式匹配同一列的连续跳变
    • 失败原因:
      • 列定位缺失:旧版正则引擎无法约束匹配范围到特定列(仅能匹配内容,无法限定列边界)
      • 分组限制:无法通过捕获组动态计算列位置偏移量

最终解决方案:逐列遍历检测法

核心思路:放弃全局查找,改为按列垂直扫描,逐行检测相邻信号跳变(H→L),通过替换实现标记。

实现步骤
  1. 启用列编辑模式
    • 快捷键Alt+C开启列模式(Column Mode),确保操作仅影响当前列
    • 注:UltraEdit列模式支持对选定列进行独立编辑,避免跨列干扰
  2. 逐列遍历逻辑javascriptfor (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"); // 标记跳变点 } } }注:实际脚本需加入性能优化(如分批处理)与异常处理
  3. 排除干扰项
    • 增加条件判断:若当前字符为"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"); // 标记跳变点
        }
    }
}

走过的路,都会留下痕迹,以供借鉴。