OpenLS-DGF:开源逻辑综合数据集生成框架,赋能EDA机器学习研究
1. 项目概述与核心价值
在芯片设计的漫长流水线中,逻辑综合(Logic Synthesis)扮演着承上启下的关键角色。它负责将工程师用硬件描述语言(如Verilog)编写的、描述电路功能的“高级蓝图”,翻译并优化成由具体逻辑门(如与门、或门)组成的“施工图纸”——门级网表。这个过程的优化质量,直接决定了最终芯片的面积、速度和功耗。传统上,这个过程高度依赖EDA工具内置的启发式算法和工程师的经验,是一个反复迭代、耗时费力的“手艺活”。
近年来,机器学习(ML),特别是擅长处理图结构数据的图神经网络(GNN),为这个领域带来了新的曙光。想象一下,如果我们能训练一个模型,让它像一位经验丰富的电路设计师一样,“看懂”电路的结构,并预测不同优化策略的效果,甚至自动生成更优的电路,这无疑将极大提升设计效率。然而,这个美好愿景面临一个根本性挑战:数据。机器学习模型不是凭空学会技能的,它需要大量、高质量、多样化的“习题集”进行训练。在逻辑综合领域,现有的数据集要么是商业工具内部的中间文件,难以获取和复用;要么是针对单一任务(如面积预测)定制的,缺乏通用性。这就好比你想训练一个全能运动员,却只给他跑步的训练数据,结果他可能跑得很快,但完全不会跳高或投掷。
OpenLS-DGF(Open Logic Synthesis - Dataset Generation Framework)正是为了解决这个“数据荒”问题而生的一个自适应开源数据集生成框架。它的核心目标非常明确:为逻辑综合领域的机器学习研究,提供一个标准化、多样化且可扩展的“数据工厂”。这个框架的价值,不仅在于它一次性生成了包含超过96.6万个布尔电路的海量数据集(OpenLS-D-v1),更在于其背后一整套可复现、可定制、可适配不同下游任务的数据生成与管理哲学。
1.1 框架设计的核心思路:从“专用数据集”到“自适应数据源”
在深入技术细节之前,我们有必要理解OpenLS-DGF设计理念上的根本转变。传统的数据集生成,往往是“任务驱动”的:我需要做电路延迟预测,那我就跑一遍综合流程,把电路结构和对应的延迟值记录下来,形成一个“电路-延迟”配对的数据集。这个数据集对于延迟预测任务可能是完美的,但如果你想用它来做电路结构分类,或者评估不同优化序列的优劣,就会非常吃力,因为数据中缺乏必要的标签或多样性。
OpenLS-DGF采用了另一种思路,我称之为“流程驱动,全景记录”。它不再为某个特定任务生成最终答案,而是完整地封装了逻辑综合的标准流程——从布尔表示、逻辑优化到技术映射。在这个过程中,它像一个尽职的档案管理员,将每一个步骤产生的中间结果(不同结构的布尔电路、不同工艺库映射后的网表、对应的时序面积信息)都原原本本地保存下来,并以两种格式存储:人类工程师熟悉的Verilog,和机器学习模型友好的GraphML。
这种做法的精妙之处在于解耦与复用。数据生成流程(How)与下游任务需求(What)被解耦了。框架只负责高质量、标准化地生产“原料”(各种中间表示电路及其属性),而研究人员可以根据自己的任务(分类、预测、排序等),像在超市选购食材一样,从这个统一的“原料库”(OpenLS-D-v1数据集)中,提取并组合出自己需要的“子数据集”。这种自适应能力,使得同一份基础数据能支撑起逻辑综合领域内纷繁复杂的机器学习应用场景,极大地提升了数据的利用率和研究效率。
2. OpenLS-DGF框架深度解析
理解了框架的设计哲学,我们再来拆解它的具体实现。OpenLS-DGF不是一个简单的脚本集合,而是一个高度工程化、模块化的系统。它的完整工作流如图2所示,涵盖了从原始设计输入到最终数据集打包的七个核心步骤。下面,我将结合自己处理类似电路数据的经验,逐一剖析每个步骤的技术要点与设计考量。
2.1 数据生成七步法:从RTL到机器学习就绪数据
整个流程始于一个用Verilog等语言描述的寄存器传输级(RTL)设计。框架的目标是将这个“高级描述”转化为一系列可供机器学习模型消费的图数据。
第一步:通用工艺电路生成这是所有后续处理的起点。输入的设计可能格式不一(Verilog, AIG, BLIF),为了统一处理,框架首先使用开源综合工具Yosys,将这些设计全部“翻译”成一种中间表示——通用工艺电路(Generic Technology Circuit, GTG)。你可以把GTG理解为一个“最大公约数”的电路表示,它包含了一组功能完备的基本逻辑单元(如表I所示,从简单的与门、非门到复杂的AOI21、MUX21等)。选择GTG作为起点的好处是,它抹平了不同输入源的差异,为后续步骤提供了一个稳定、统一的起跑线。同时,它保留了RTL设计中一些粗粒度的结构信息,这些信息在后期优化中可能具有价值。这里生成的结果会同时保存为Verilog和GraphML文件,后者直接就是一张图(节点是逻辑门,边是连接线),为后续的图学习做好了准备。
实操心得:格式统一的重要性在实际研究中,数据格式混乱是浪费时间的头号杀手。OpenLS-DGF第一步就强制进行格式标准化,这个设计非常明智。它保证了无论你从哪个基准测试集拿来电路,进入流程后都变成了同一种“语言”,极大简化了后续工具链的开发和数据处理脚本的编写。我们在内部项目中也曾深受其害,后来强制规定所有输入必须先用一个统一前端处理,效率提升立竿见影。
第二步:与-非图生成GTG虽然统一,但并非逻辑优化算法最“喜欢”的格式。在逻辑综合领域,绝大多数先进的优化算法(如重写、重构、替换)都是在一种称为“与-非图”(And-Inverter Graph, AIG)的表示上开发的。AIG极其简单,只包含两种节点:二输入与门(AND2)和反相器(NOT)。这种极简主义使得算法设计和分析变得非常高效。因此,框架利用其内置的转换工具,将GTG转换为AIG。这是整个流程中一个关键的“归一化”步骤,为后续应用丰富的ABC优化命令集铺平了道路。
第三步:逻辑优化配方生成这是产生数据多样性的核心环节。对于一个给定的AIG,应用不同的优化命令序列(比如先做平衡再做重写,或者先做替换再做重构),会产生结构不同但功能等价的电路。这些不同的结构,在经过后续的技术映射后,会产生面积、时序各不相同的最终网表。OpenLS-DGF在这里模拟了工程师在探索设计空间时的行为:它从一个包含常用ABC优化命令(如balance,rewrite,refactor,resub等)的“命令池”中,为每个原始设计随机生成了1000条长度为10的优化序列。
技术细节:为什么是1000条序列?这个数字是权衡了数据覆盖度和生成成本后的结果。理论上,可能的序列组合是巨大的。1000条随机序列可以在可接受的时间内,为每个设计提供一个足够丰富的“优化策略采样空间”,从而捕捉到QoR(质量结果)的大致分布。这对于训练预测模型或进行排序学习至关重要。在内部测试中,我们发现对于大多数中等规模的设计,1000个样本已经能够较好地反映其优化空间的特性。
��四步:逻辑“爆破”AIG虽好,但并非唯一。不同的布尔表示形式(如或-非图OIG、异或-与图XAG、多数表决图MIG等)各有其特点,在某些特定场景或工艺库下可能映射出更优的结果。逻辑“爆破”步骤,就是将上一步得到的每一个AIG,通过“覆盖”算法,转换到其他五种布尔表示形式(OIG, XAG, MIG, PRIMARY, GTG)。这个过程有点像用不同的“乐高基础零件套装”去拼搭同一个模型。例如,PRIMARY套装包含{NOT, AND2, NAND2, OR2, NOR2, XOR2, XNOR2}这七种基础零件。框架会优先使用面积更大的零件进行覆盖,以模拟一种面积优化的倾向。
这里有一个技术难点:MIG的基元集合是{NOT, MAJ3},它无法直接通过覆盖算法生成基本的与门/非门,因此框架采用了一种基于拓扑的节点级转换方法。这一步极大地扩展了数据的维度,使得数据集不仅包含同一电路的不同优化版本,还包含同一电路的不同布尔表示版本,为研究“布尔表示问题”提供了丰富素材。
第五步:技术映射逻辑优化后的布尔网络(无论哪种形式)还是技术无关的,它只描述了逻辑功能。技术映射则负责将这个功能描述,映射到目标工艺库(如ASIC的sky130标准单元库或FPGA的LUT6查找表)的具体物理单元上。框架使用LSILS工具进行映射,同时也支持ABC的映射算法作为对比。这一步产生了最终的、可制造的网表,并附带了面积、时序(对于ASIC)或电路深度(对于FPGA)等关键物理信息。这些QoR数据正是许多机器学习任务想要预测的目标。
第六步:静态时序分析对于ASIC网表,为了获得精确的时序信息,框架调用了开源物理设计工具iEDA中的静态时序分析(STA)引擎。STA会计算信号在网表中传播的最长路径延迟(即关键路径)。这个时序信息与面积一起,构成了评估一个综合结果好坏的核心指标。所有QoR数据都以JSON格式保存,便于程序解析。
第七步:数据集打包与管理经过前面六步,我们已经为每个原始设计生成了海量的中间文件:原始设计、GTG、AIG、6种布尔表示各1000个版本、对应的ASIC/FPGA网表、以及每个网表的QoR JSON文件。如果散乱存放,管理和使用将是噩梦。OpenLS-DGF引入了电路引擎和一套聪明的打包策略。
如图3所示,所有文件按设计组织,并打包成PyTorch的.pt文件。例如,一个设计的所有数据会打包成8个.pt文件:raw.pt(原始文件)、abc.aig.pt(ABC优化的AIG及相关数据)、以及lsils.xxx.pt(LSILS生成的其他五种布尔表示数据)。这种按需加载的方式非常高效,研究者只需要加载与任务相关的.pt文件即可。
2.2 核心组件:电路引擎——数据与模型的桥梁
如果说前六步是“数据生产线”,那么电路引擎就是这条生产线的“智能仓储和配送中心”。它是OpenLS-DGF框架的灵魂,实现了从原始电路文件到机器学习张量数据的无缝转换。
如图4的UML图所示,电路引擎的核心是一个Circuit类。这个类封装了一个电路网表的所有关键信息:输入输出端口、内部节点列表、节点间的连接关系、每个节点的类型(如AND2、AOI21或工艺库中的具体单元名)和真值表。更重要的是,它提供了一系列操作方法。
最核心的操作之一是to_torch_geometric(circuit: Circuit)。这个方法能将一个Circuit对象转换成PyTorch Geometric(一个流行的图神经网络库)所需的Data对象。如图5所示,这个过程保持了节点索引的一致性,意味着你在Circuit对象上计算的任何特征(如节点的逻辑深度、扇入扇出数),都可以毫无损失地传递到GNN的输入图中。这解决了图学习领域一个常见痛点:特征工程与模型输入之间的对齐问题。
另一个关键操作是load_graphml(path:str) -> Circuit。它负责将GraphML格式的电路文件加载到内存中,构建成Circuit对象。GraphML是一种标准的图描述格式,易于被其他工具解析。框架选择同时保存Verilog和GraphML,兼顾了人类可读性和机器可处理性。
避坑指南:节点索引的映射在图5所示的转换过程中,维护节点索引的对应关系至关重要。原始布尔电路文件(如Verilog)中的节点索引、
Circuit类内部管理的索引、以及最终torch_geometric图数据中的节点索引,这三者必须建立精确的映射。OpenLS-DGF通过在Circuit类中同时保存原始索引(index_ori)和内部索引(index)来实现这一点。在开发自己的电路处理工具时,如果忽略这一点,很容易导致特征错位,让模型学到错误的关联,这一点我深有体会。
电路引擎的抽象设计带来了巨大的灵活性。研究人员可以轻松地继承Circuit类,添加自定义的特征提取函数(例如,计算每个节点的可控性/可观测性、信号概率等),然后利用现有的to_torch_geometric方法快速构建出适用于自己任务的数据集。这种设计模式,将数据生成的复杂性封装起来,为上层研究提供了简洁而强大的接口。
3. OpenLS-D-v1数据集全景与应用实践
基于上述框架,团队生成了第一个版本的数据集——OpenLS-D-v1。这个数据集是框架能力的集中体现,也是我们评估其价值的依据。
3.1 数据集构成与多样性分析
OpenLS-D-v1包含了从IWLS2005、IWLS2015和OpenCores等经典基准测试中精选的46个组合逻辑设计。这些设计涵盖了从微小的控制单元(如ctrl,仅112个与门)到复杂的IP核(如jpeg编码器,近12万个与门),类型包括算术运算器、控制器、通信协议处理器等,确保了数据源的多样性。
如表III所示,设计的规模差异巨大,这有助于训练出对不同电路尺度都具有鲁棒性的模型。为了量化这种多样性,论文采用了余弦相似度来分析不同设计在图嵌入空间中的距离。如图6所示,通过结合启发式特征(如PI/PO数量、门数、深度)和基于Graph2Vec的结构嵌入特征,计算出的设计间相似度平均在0.44左右,且矩阵图显示出了明显的区块差异,这表明数据集确实包含了结构特征各异的电路,而非同质化设计。
整个数据集最终包含了超过96.6万个布尔电路。具体来说,每个原始设计产生了1000个优化序列,每个序列对应7种布尔表示(AIG from ABC, AIG/OIG/XAG/MIG/PRIMARY/GTG from LSILS),每种表示又对应ASIC和FPGA两种映射结果。因此,每个设计贡献了1000 * 7 * 2 = 14,000个数据点(严格来说是电路网表及其QoR)。46个设计总计约64.4万个网表,再加上优化前的中间表示,总数超过了96.6万。所有数据经过zstandard高效压缩后,原始文件大小约410GB,在服务器上生成耗时约141个CPU小时。
3.2 下游任务验证:数据集的“实战演练”
一个数据集好不好,关键在于它能否支撑起有意义的任务。OpenLS-D-v1论文中展示了四个典型的下游机器学习任务,这就像用四场“考试”来全面检验数据集的“教学质量”。
任务一:电路分类
- 目标:给定一个布尔电路(如AIG),判断它来源于46个原始设计中的哪一个。
- 数据构建:从数据��中提取所有优化序列产生的AIG电路,每个电路以其原始设计ID作为标签。由于同一设计的不同优化版本功能相同但结构不同,这要求模型学习到超越具体优化痕迹的、更深层次的设计“指纹”特征。
- 意义:这测试了数据集在“��示学习”上的能力。成功的分类意味着模型捕捉到了不同电路架构的本质区别,这种能力可以迁移到设计溯源、知识产权保护或电路聚类等应用。
任务二:电路排序
- 目标:对于一个给定的原始设计,对其对应的1000个不同优化版本的电路(根据最终QoR,如延迟)进行优劣排序。
- 数据构建:针对每个设计,将其1000个优化版本(例如,基于GTG表示经ASIC映射后的网表)根据其关键路径延迟(或面积)进行排序,形成排序对(电路A优于电路B)作为训练数据。
- 意义:这是一个较新的任务,它不要求模型精确预测QoR的绝对值,而是学习判断相对优劣。这更贴近实际优化场景——工程师往往不需要知道一个电路延迟的精确纳秒数,只需要知道在A和B两个方案中哪个更快。排序学习可以用于构建高效的优化策略推荐系统。
任务三:质量结果预测
- 目标:预测一个给定布尔电路经过技术映射后,其网表的关键QoR指标(如面积、时序)。
- 数据构建:输入是技术映射前的布尔电路(如PRIMARY图),输出是对应的ASIC网表的面积和时序值。这是一个标准的回归问题。
- 意义:这是逻辑综合中ML应用最直接的方向。如果能在耗时漫长的技术映射和STA之前,快速、准确地预测出QoR,就能在庞大的设计空间中快速筛选出有潜力的优化方向,实现“先知先觉”,极大加速设计探索。
任务四:概率预测
- 目标:预测布尔电路中各个节点具有逻辑“1”值的概率。
- 数据构建:通过逻辑模拟,为电路中的每个内部节点计算其信号概率,作为监督学习的标签。
- 意义:信号概率是许多逻辑优化算法(如冗余移除、功耗估算)的关键输入。准确快速的概率预测模型可以替代耗时的仿真,加速综合流程。这个任务考验模型对电路逻辑功能的推理能力。
实验结果表明,基于OpenLS-D-v1数据集训练的模型,在这四个任务上都取得了良好的表现,证明了数据集包含的丰富信息足以支撑不同类型、不同目标的学习任务。这种“一数据集多用”的能力,正是其自适应性的最佳证明。
4. 实操指南:如何利用OpenLS-DGF开展研究
对于想要利用OpenLS-DGF进行研究的同行,这里提供一些具体的操作思路和注意事项。
4.1 快速开始:数据获取与子集提取
所有代码和数据集已在GitHub开源。第一步是克隆仓库并熟悉其结构。数据集很可能以分卷压缩或云盘链接的形式提供,下载后需要解压。
假设你想进行电路分类研究,你不需要下载全部的410GB数据。你可以写一个简单的Python脚本,利用框架提供的dataset_manager工具,只加载每个设计对应的abc.aig.pt文件。这个文件里已经包含了1000个AIG电路及其对应的设计标签。电路引擎的load_graphml和to_torch_geometric方法可以帮你轻松地将这些电路转换成GNN需要的批处理数据。
# 伪代码示例:加载单个设计的AIG数据用于分类 import torch from circuit_engine import Circuit, load_graphml, to_torch_geometric # 假设数据集结构为 /openls-d-v1/design_name/abc.aig.pt design_data = torch.load('/path/to/openls-d-v1/adder/abc.aig.pt') aig_graphml_paths = design_data['aig_graphml_list'] # 包含1000个AIG文件路径的列表 labels = [design_id] * 1000 # 为该设计生成1000个相同标签 graph_data_list = [] for path in aig_graphml_paths: circuit = load_graphml(path) graph_data = to_torch_geometric(circuit) # 可以在这里为graph_data添加自定义特征,如 circuit.calculate_depth() graph_data.y = torch.tensor([design_id], dtype=torch.long) # 添加标签 graph_data_list.append(graph_data) # 现在 graph_data_list 包含了1000个图数据样本,可用于训练分类模型4.2 自定义特征工程
电路引擎的Circuit类是你进行特征工程的游乐场。除了节点类型(type)和连接关系(fanins)这些基础特征,你可以轻松添加更多对任务有帮助的特征。
例如,对于QoR预测任务,你可以在将Circuit转换为图数据之前,为每个节点计算一些图论特征:
- 逻辑深度:从原始输入到该节点的最长路径长度。
- 扇入/扇出数:节点的前驱和后继数量。
- 可观测性/可控性近似值:虽然精确计算复杂,但可以用基于拓扑的启发式方法估算。
- 节点功能复杂度:根据其真值表(
truth table)计算,比如支持向量机的输出。
这些特征可以作为节点特征(graph_data.x)的一部分,与原始的节点类型编码一起输入GNN。我们的经验是,结合了手工特征和GNN学习到的结构特征,模型性能通常比纯端到端学习更稳定、收敛更快。
4.3 构建新的下游任务
OpenLS-D-v1的潜力远不止论文中展示的四个任务。它的自适应特性鼓励创新。以下是一些可能的新方向:
- 优化序列推荐:将任务二(排序)扩展为序列生成问题。输入是原始AIG,输出是一个优化命令序列(如
[‘balance’, ‘rewrite’, ‘refactor’])。这可以建模为一个强化学习问题,其中状态是当前电路图,动作是优化命令,奖励是最终QoR的改进程度。数据集提供了大量的(初始电路,序列,最终电路,QoR)四元组作为训练数据。 - 跨表示迁移学习:研究同一个电路在不同布尔表示(AIG, MIG, XAG)下的QoR是否存在相关性。能否训练一个模型,在AIG上预测其在MIG表示下经过映射后的性能?这可以探索不同电路表示之间的“语义”关联。
- 设计空间探索加速:结合分类和预测模型。首先用分类模型快速识别一个新设计与数据集中哪个已知设计最相似,然后直接调用该相似设计下表现最好的若干优化序列进行综合,从而跳过大量无效探索,实现冷启动优化。
4.4 常见问题与排查
在实际使用中,你可能会遇到以下问题:
- 内存不足:一次性加载整个设计的所有图数据(如1000个大型电路的图)可能导致内存溢出。
- 解决方案:使用PyTorch的
DataLoader配合自定义的数据集类,实现按需加载和批处理。只将当前训练批次的数据留在GPU内存中。
- 解决方案:使用PyTorch的
- 特征维度不一致:不同电路的节点数、边数差异巨大,导致无法组成规则的张量进行批处理。
- 解决方案:这是图数据的固有特性。务必使用PyTorch Geometric等支持“不规则图批处理”的库。它们会将多个小图打包成一个“大图”,并通过
batch向量来区分节点属于哪个样本。
- 解决方案:这是图数据的固有特性。务必使用PyTorch Geometric等支持“不规则图批处理”的库。它们会将多个小图打包成一个“大图”,并通过
- 模型过拟合:由于数据来自有限的46个设计,模型可能只是记住了这些设计的特征,而无法泛化到全新的设计。
- 解决方案:在数据划分时,务必按“设计”进行划分,而不是随机打乱所有电路。例如,用40个设计的数据做训练集,用6个未见过的设计做测试集。这样才能真正测试模型的泛化能力。此外,可以尝试使用图数据增强技术,如随机边丢弃、节点特征掩码等。
- 任务定义不清:例如,在QoR预测任务中,输入是技术映射前的布尔电路,但该电路的图结构已经包含了优化序列的信息。要确保你的任务定义是合理的,避免数据泄露。
- 解决方案:仔细审视数据生成流程。对于QoR预测,正确的设定是:用逻辑优化后、技术映射前的布尔电路(如PRIMARY图)来预测映射后的QoR。因为技术映射过程是确定的(使用相同工艺库和映射算法),所以QoR的差异主要来源于���入布尔电路的结构差异,这正是模型需要学习的映射关系。
5. 总结与展望
OpenLS-DGF框架及其产出的OpenLS-D-v1数据集,为逻辑综合与机器学习的交叉研究领域打下了一块坚实的数据基石。它通过系统化的流程,将复杂的芯片设计中间状态转化为结构化的、机器学习友好的图数据,并巧妙地通过电路引擎和灵活的打包方式,实现了数据的“一次生成,多处复用”。
从我个人的工程视角来看,这个框架最值得称道的三点是:
- 流程的完整性与可复现性:它完整覆盖了从RTL到GDSII之前的关键步骤,并且每个步骤都基于开源工具,确保了整个数据生成过程的可复现、可审计。这对于学术研究至关重要。
- 设计的自适应性与灵活性:它不是一个大而僵化的“黑箱”数据集,而是一个“数据工厂”加“零件仓库”。研究者可以根据任务需要,自由提取、组合甚至扩展数据。电路引擎的抽象设计,使得集成新的特征提取方法或自定义操作变得非常容易。
- 对现实问题的紧密贴合:它生成的数据不是凭空捏造的,而是源于真实的综合流程和经典的基准电路。这意味着在上面训练得到的模型,有更大的潜力迁移到真实的工业设计场景中。
当然,作为一个初始版本,OpenLS-D-v1也有其局限性和未来的扩展方向。目前数据集全部是组合逻辑电路,而实际芯片中大量存在时序逻辑(寄存器、状态机)。引入时序电路,并包含时序路径、时钟域等信息,将是下一个重要的挑战。此外,当前的数据集主要关注面积和时序,功耗也是一个关键指标,未来可以集成功耗分析流程来丰富QoR维度。
对于正在或计划进入这个领域的研究者和工程师,我的建议是:不要仅仅把OpenLS-D-v1当作一个静态的数据集来下载和使用。更重要的是,理解并利用好OpenLS-DGF这个框架。你可以用它来为自己的特定工艺库生成数据,可以添加新的优化算法步骤来扩展数据多样性,甚至可以借鉴其电路引擎的设计,构建自己领域的数据处理管道。它提供的不仅是一池“鱼”,更是一套优秀的“渔具”和“捕鱼方法”。在EDA迈向智能化的道路上,这样的开源基础设施,其价值会随着社区的使用和贡献而不断放大。
