# AST 波形调试核心代码

## 文件说明

| 文件 | 作用 | 核心函数 | TS重写需要 |
|------|------|----------|------------|
| `ast_node.py` | AST节点定义，遍历建图 | `toplogic_tree_traverse()` | ✅ 已完成 |
| `graph_builder.py` | 入口函数，调用解析器 | `generate_top_logic_graph()` | ✅ 已完成 |
| `debug_graph_analyzer.py` | BFS回溯控制信号 | `get_k_control_signals()` | ⚠️ 需重写 |
| `vcd_waveform_analyzer.py` | VCD波形文件解析 | `parse_mismatch()`, `get_tabular()` | ⚠️ 需重写 |
| `waveform_trace_tool.py` | 完整追踪工具封装 | `waveform_trace_tool()` | ⚠️ 需重写 |

---

## 调用流程

```
Verilog代码文件
       │
       ▼
┌─────────────────────────────────────┐
│ graph_builder.py                    │
│ generate_top_logic_graph(filelist)  │
│       │                             │
│       ▼                             │
│ PyVerilog.parse() → AST             │
│       │                             │
│       ▼                             │
│ ast.toplogic_tree_traverse()        │
│       │                             │
│       ▼                             │
│ NetworkX 有向图（信号依赖图）       │
└─────────────────────────────────────┘
       │
       ▼
┌─────────────────────────────────────┐
│ debug_graph_analyzer.py             │
│ DebugGraph.get_k_control_signals()  │
│       │                             │
│       ▼                             │
│ BFS回溯K层，找到控制信号链          │
└─────────────────────────────────────┘
       │
       ▼
┌─────────────────────────────────────┐
│ vcd_waveform_analyzer.py            │
│ parse_mismatch() + get_tabular()    │
│       │                             │
│       ▼                             │
│ 提取相关信号的波形表                │
└─────────────────────────────────────┘
```

---

## 核心代码位置

### 1. AST遍历建图 (ast_node.py:32-137)

```python
def toplogic_tree_traverse(self, network_G, rvalue=False, lvalue=False, offset=0):
    """
    递归遍历AST，提取信号依赖关系，填充到NetworkX图中

    关键逻辑：
    1. 识别 Rvalue（右值）和 Lvalue（左值）
    2. 递归收集子节点的信号
    3. 建立边：右值信号 → 左值信号（控制关系）
    """
```

### 2. 图构建入口 (graph_builder.py:89-99)

```python
def generate_top_logic_graph(filelist: list[str]):
    # 1. PyVerilog解析Verilog代码
    ast, directives = parse(filelist, preprocess_include=[], preprocess_define=[])
    # 2. 遍历AST，构建信号依赖图
    return create_graph_from_ast(ast, display=False, display_signal_only=False)
```

### 3. BFS回溯 (debug_graph_analyzer.py:20-66)

```python
def get_k_control_signals(self, target_signals: list[str], k: int, signal_only: bool = False):
    """
    从出错信号出发，BFS回溯K层，找到所有控制信号

    输入：target_signals = ['out']  # 出错的信号
    输出：control_signals = {'out': (10,10), 'state': (5,8), 'clk': (1,1)}
          signal_level_tracer = [['clk->state', 'reset->state'], ['state->out']]
    """
```

---

## 依赖库

```
pyverilog    # Verilog解析，生成AST
networkx     # 图数据结构
pandas       # 波形数据处理（可选）
```

---

## 如果要用JavaScript重写

需要重写的核心逻辑：

1. **Verilog解析器** → 用 ANTLR4 + Verilog.g4 或 tree-sitter-verilog
2. **AST遍历建图** → 约100行，参考 ast_node.py:32-137
3. **BFS回溯** → 约70行，参考 debug_graph_analyzer.py

总计约 **200行核心逻辑**（不含解析器）
