本项目针对 VLSI 物理设计中的超网表划分(Hypergraph Partitioning) 问题,实现了一个高效、并行的多路划分求解器。本系统不仅支持经典的多路划分与不平衡度控制,还深度融合了 FPGA 拓扑约束(Topology Constraints,支持 MFS1 和 MFS2 拓扑) 以及 节点固定约束(Fixed Constraints)。
通过结合 Candidate Propagation(候选传播机制)、Iterated Local Search (ILS) 以及 多线程并行优化,在保证 100% 满足拓扑和物理约束的前提下,极大地降低了网表切割代价(Cut Cost)。
-
多路划分 (Multi-way Partitioning)
- 支持将网表划分为任意
$k$ 路(对应拓扑图的节点数)。 - 引入平衡参数
$r \in [0, 1/n]$ ,严格保证各分区元件数量的平衡性,且支持非整除情况下的动态对齐,确保程序在高负载或极端参数(如$r \times n = 1$ )下稳定运行。
- 支持将网表划分为任意
-
拓扑约束求解 (Topological Constraints)
- 内置针对 FPGA 拓扑图(如 MFS1, MFS2)的合法性检查器。
- 实现 Candidate Propagator(候选路径传播算法),在划分初始化与移动(Refinement)阶段,通过前向/后向约束传播,从源头上消除了拓扑冲突(Topology Violations)。
-
固定约束解析 (Fixed Constraints)
- 解析并严格执行网表底部的固定节点信息(如将指定 Cell 固定在特定的拓扑 Node 上)。
- 支持 MFS1 自动裁切(忽略末尾 35 行固定信息)及 MFS2 完整固定约束。
-
多线程并行加速与时限控制
- 采用多线程并行框架进行状态搜索与 FM 细化(Refinement)。
- 引入基于时间预算的控制机制(
TOPO_BUDGET_MS),在规定时间内最大化迭代质量。
-
算法稳定性与 100% 复现性
- 严格固定随机数种子,在相同配置与线程数下,算法运行结果 100% 稳定可复现。
├── CMakeLists.txt # CMake 构建配置文件
├── Makefile # 基于 Make 的编译配置文件
├── main.cpp # 程序主入口,处理命令行参数与流程控制
├── Types.hpp # 全局类型定义(如 PartId, Netlist 等)
├── TopologyGraph.h/.cpp # 拓扑图解析与约束管理(MFS1/MFS2 拓扑)
├── Netlist.h/.cpp # 超网表及固定约束解析器
├── Node.h/.cpp & Net.h/.cpp # 网表基础元件与超边的数据结构
├── CandidatePropagator.hpp # 核心:拓扑可行路径计算与状态传播器
├── Partitioner.h/.cpp # 划分核心算法(初始划分、FM 优化、ILS)
├── solution.h/.cpp # 划分方案表示与合法性验证机制
├── run_all.sh # 自动化评测与复现脚本
└── benchmark/ # 测试数据集存放目录(ICCAD2021-TopoPart-Benchmarks)
- 操作系统: Linux / WSL (Ubuntu 22.04)
- 编译器: 支持 C++17 或更高标准的
g++ - 构建工具:
CMake(>= 3.15) 或Make
在项目根目录下打开终端,运行以下命令进行编译:
# 使用 CMake 进行多线程编译
cmake -B build
cmake --build build -j$(nproc)编译成功后,将在 build/ 目录下生成可执行程序。
我们提供了完整的复现流程,你可以通过脚本一键运行,或通过手动传参进行精细调试。
直接运行根目录下的自动化脚本:
bash run_all.sh该脚本会自动读取 benchmark 目录下的测试集,并依次运行不同的拓扑和平衡度配置。
你可以通过命令行环境变量和参数控制程序的执行。
# 开启 Debug 输出,运行 MFS1 拓扑,无不平衡容忍度
TOPO_DEBUG=1 ./build/partitioner --netlist ./benchmark/case1 --topo ./benchmark/MFS1 --threads 8TOPO_DEBUG=1 ./build/partitioner --netlist ./benchmark/case1 --topo ./benchmark/MFS1 --balance 0.005 --threads 8对于规模较大的 MFS2 拓扑,使用 8 线程并行,并设置 15000 毫秒的时间预算限制:
TOPO_DEBUG=1 TOPO_BUDGET_MS=15000 ./build/partitioner --netlist ./benchmark/case1 --topo ./benchmark/MFS2 --balance 0.01 --threads 8由于存在严格的拓扑依赖(例如某些元件只能放入能与相邻节点通信的区域),传统的随机初始化或盲目 FM 移动会导致大量的“非可行解”(Infeasible)。
我们在 CandidatePropagator.hpp 中实现了前向兼容性剪枝:
- 在分配 Cell 时,
pair_compatible会动态评估物理节点之间的连通性。 initialize_and_propagate算法利用广度优先搜索(BFS)队列将确定性约束进行链式传播,防止局部决策导致全局拓扑死锁。
- 初始划分: 基于
balance_fill策略优先满足固定约束和拓扑约束,生成一个初始合法的 Feasible 状态。 - 细化(Refinement): 扩展了传统的二路 FM 算法至多路。在移动 Cell 时,不仅计算 Cut Cost 的 Gain,还会通过
CandidatePropagator实时否决任何违背拓扑约束的移动。 - ILS 扰动: 引入带有 Budget 控制的抖动(Kick)机制,打破局部最优,在时限(
TOPO_BUDGET_MS)内反复迭代逼近最优 Cut。
- 采用 并行状态探索 (Parallel State Exploration):每个线程分配独立的随机种子,并行尝试不同的初始划分与局部搜索路径。
- 在规定时间内,各线程定时上报当前找到的最优 Feasible State,最后汇总并输出全局最优的划分结果,实现近乎线性的多核加速比,同时维持了算法的完全确定性(Deterministic)。