2. 文件批量重命名与整理

任务说明

在数字IC项目中,RTL文件常需按新规范批量重命名(如添加模块前缀或版本后缀),并移动到按功能分类的目录结构中。手工操作效率低且易错,本案例用Python脚本实现自动化处理。

实现方案

脚本读取源目录下所有.v/.sv文件,根据文件名中的模块名添加前缀rtl_,同时将文件按功能关键字(ctrl/datapath/mem)分类移动到目标目录的对应子文件夹中。若目标文件已存在则自动重命名避免覆盖。

完整代码

import os
import shutil
import re

def classify_module(filename):
    """根据文件名中的关键字返回目标子目录名"""
    name_lower = filename.lower()
    if 'ctrl' in name_lower:
        return 'controller'
    elif 'datapath' in name_lower or 'alu' in name_lower:
        return 'datapath'
    elif 'mem' in name_lower or 'ram' in name_lower:
        return 'memory'
    else:
        return 'other'

def batch_rename_and_organize(src_dir, dst_root, prefix='rtl_'):
    """
    批量重命名并整理RTL文件
    src_dir: 源目录(含.v/.sv文件)
    dst_root: 目标根目录(自动创建子目录)
    """
    if not os.path.isdir(src_dir):
        raise ValueError(f"源目录不存在: {src_dir}")
    os.makedirs(dst_root, exist_ok=True)

    # 收集所有RTL文件
    rtl_files = [f for f in os.listdir(src_dir)
                 if f.endswith(('.v', '.sv')) and os.path.isfile(os.path.join(src_dir, f))]
    if not rtl_files:
        print("未找到任何 .v/.sv 文件")
        return

    renamed_count = 0
    for fname in sorted(rtl_files):
        # 1. 生成新文件名:添加前缀
        new_name = prefix + fname

        # 2. 确定目标子目录
        sub_dir = classify_module(fname)
        dest_dir = os.path.join(dst_root, sub_dir)
        os.makedirs(dest_dir, exist_ok=True)

        # 3. 处理目标路径冲突(自动加序号)
        dest_path = os.path.join(dest_dir, new_name)
        base, ext = os.path.splitext(new_name)
        counter = 1
        while os.path.exists(dest_path):
            dest_path = os.path.join(dest_dir, f"{base}_{counter}{ext}")
            counter += 1

        # 4. 执行移动(重命名)
        src_path = os.path.join(src_dir, fname)
        shutil.move(src_path, dest_path)
        renamed_count += 1
        print(f"[OK] {fname} → {os.path.relpath(dest_path, dst_root)}")

    print(f"\n完成:共处理 {renamed_count} 个文件")

if __name__ == "__main__":
    # 使用示例:将 ./rtl_src 下文件整理到 ./rtl_organized
    batch_rename_and_organize(
        src_dir="./rtl_src",
        dst_root="./rtl_organized",
        prefix="rtl_"
    )

运行方式

  1. 创建测试目录结构:mkdir -p rtl_src,放入若干.v/.sv文件,例如:top_ctrl.v、alu_datapath.sv、ram_mem.v、uart.v
  2. 执行脚本:python3 rename_rtl.py

验证方法

运行后检查:

  • 源目录rtl_src应为空(所有文件已移走);
  • 目标目录rtl_organized下生成controller/、datapath/、memory/、other/四个子目录;
  • 每个文件名均带rtl_前缀,且位于正确分类目录中(如top_ctrl.v → rtl_organized/controller/rtl_top_ctrl.v);
  • 若目标目录已有同名文件,新文件自动以_1、_2后缀区分,无覆盖丢失。

满足以上条件即判定脚本功能正常。

关键说明

分类规则通过classify_module()中的关键字匹配实现,实际项目中可按需修改关键字与子目录映射。脚本使用shutil.move完成跨目录重命名,若需保留源文件副本,可将move改为copy2。