通过特定逻辑综合和基于SAT的弱化减小插值公式 电路大小
G. Cabodi, P. E. Camurati, M. Palena, P. Pasini, D. Vendraminetto
自动化与信息学系,都灵理工大学 – 都灵, 意大利
邮箱: {gianpiero.cabodi,paolo.camurati, marco.palena,paolo.pasini,danilo.vendraminetto}@polito.it
摘要
我们解决了在基于SAT的模型检测中减小克雷格插值大小的问题。克雷格插值是由SAT求解器的反驳证明经过后处理生成的与或电路。众所周知,插值公式具有高度冗余性,通常通过简化证明图和/或利用标准逻辑综合技术来压缩其大小。此外,增强和弱化已被研究作为控制插值质量的一种方法。
本文中,我们提出了两种插值公式压缩技术:(1)一组特定逻辑综合函数,这些函数重新审视了已知的逻辑综合方法,并特别针对速度和可扩展性进行了优化。尽管这些技术具有通用性,并不限于插值公式,但它们主要针对插值电路中的冗余来源。(2)一种插值公式弱化技术,其中从额外的SAT查询中提取的UNSAT核心被用于获得插值公式的门级抽象。该抽象在门切割处引入新引入的变量,这些变量必须经过量词消去才能得到有效的插值公式。我们展示了如何通过对电路的NNF表示进行操作,高效地实现这些变量的量词消去。
本文包含一项实验评估,展示了所提出技术在一组源于硬件和软件模型检测问题的基准插值上的优势。
引言
克雷格插值(ITPs)由麦克米伦在无界模型检测(UMC)领域中提出,已被证明在处理困难的验证实例时非常有效。
从硬件模型检测的角度来看,克雷格插值是一种能够计算过近似图像的算子。该方法可被视为基于证明的抽象的迭代精化,以将证明缩小到相关事实上。可达状态的过近似是从类似有界模型检测的不可满足运行的归谬证明中计算得出的,表示为与或电路,并相对于证明在线性时间和空间内生成。
从软件模型检测的角度来看,插值公式则用于加强谓词抽象的结果[3]。当表示程序的归纳不变式不足以证明给定属性时,可以使用插值公式作为谓词来精化此类抽象[4]。
克雷格插值最引人注目的特性是其完备性以及可用作自动抽象机制,而其主要缺点之一是插值电路的固有冗余,以及需要快速且可扩展的技术来压缩它们。为了推进该技术的适用性和可扩展性,文献[5],[6],[7],[8]和[9]中提出了对基础方法[2]的改进。
A. 贡献
本文提出了一种快速且可扩展的逻辑综合方法,以及一种新颖的插值公式弱化(和增强)技术,该技术也涉及电路压缩。因此,主要贡献是两种插值公式压缩技术:
- 一组专门解决速度和可扩展性的特定逻辑综合函数。虽然这些函数具有通用性,并不限于插值公式,但它们针对插值电路中的主要冗余来源;
- 一种插值公式弱化技术,通过执行额外的SAT查询来获得插值公式的门级抽象。尽管在门切割处引入了明显位于共享符号集合之外的新引入的变量,但我们展示了如何通过对电路的NNF编码进行操作,将这些变量消去。
B. 相关工作
插值公式压缩已在[11]和[12]中被讨论。关于[11],我们提出了额外的技术,以通过弱化/增强来解决可扩展性和插值公式压缩问题。插值公式弱化/增强是许多论文的主题,但与我们的工作关联较少。其中,我们认为[13]对插值公式的强化与质量之间关系的讨论颇具启发性。
有向图中节点间的支配关系在此工作中至关重要。支配节点此前已被应用于逻辑综合的上下文中,例如[14],[15]。
C. 概述
第二节介绍了关于布尔电路、克雷格插值、门级抽象和电路压缩技术的背景概念和符号表示。第三节描述了所提出的专用逻辑综合函数,而我们的插值公式弱化技术在第四节中进行了说明。第五节展示并讨论了我们进行的实验。最后,第六节以一些总结性评述结束。
二、背景
A. 组合布尔电路
定义1. 布尔电路(或网络)是一个有向无环图 G=(V, E),其中节点 v ∈ V 表示电路中的一个逻辑门、主输入(PI)或主输出(PO),每条有向边(u, v) ∈ E 表示连接节点 u 的输出到节点 v 的一个输入的信号。一个节点的扇入(扇出)是该节点的入边(出边)的集合。主输入是没有扇入的节点,而主输出是没有扇出的节点。每个逻辑门 v ∈ V 都关联一个布尔函数 fv: B^n → B,其中 n 是其输入的数量。
扇入(扇出)集通常用列表表示。通过记号滥用,我们使用术语扇入和扇出来标识边以及相关的相邻节点集。
给定一个门节点 v,type(v)用于表示与 v 关联的逻辑功能类型(与、或、非等)。
定义2。 给定一个电路 G=(V, E),当从 v 到 G 的任何主输出的所有路径都包含 u 时,称节点 u 支配节点 v。支配节点 u 的节点 v 称为 v 的支配节点。
定义3。 给定一个电路 G=(V, E) 和一个节点 r,以 r 为根的锥 C=(VC, EC) 是 G 的一个子图,由 r 及其某些非主输入前驱节点组成,使得 C 中的任何节点都存在一条完全位于 C 内的通向 r 的路径。锥的扇入(扇出)是指不在 C 中但作为 C 中节点 t 的输入(输出)的节点 u 的数量。
节点 r 被称为锥 C 的根,并记作 root(C),锥中的非根节点称为内部节点,而位于该锥扇入中的节点称为 C 的割点,并记作 cut(C)。在 C 中,其扇入至少包含一个割点 v 的节点被称为 C 中关于 v 的入口点。与锥的根相关联的布尔函数 fv 被称为锥形函数。根据记号滥用的惯例,我们有时使用 v ∈ C 来表示 v ∈ VC。
注意 ,此处定义的支配关系概念对应于图论中后支配的对偶概念。为了简洁起见,本文使用术语“支配关系”,并以上述定义指代实际的后支配概念。
定义4. 一个簇是一个以 r 为根的锥 C,使得对于 C 中的每个节点 v,v 具有单位扇出,并且在 G 中被 r 支配。
注意,簇 C 的割点要么是输入端口(PI),要么是扇出分支,而 C 的根节点 r 要么是输出端口(PO),要么是扇出主干。还请注意,定义簇 C 的电路子图是一棵树。给定一个节点 v ∈ C,在 C 中 v 的每个后继 u 都是 v 在 G 中的支配节点。
定义5。 宏门是一个簇 M,其中 M 中的每个节点 v 表示相同的结合性布尔函数。或宏门(与‐宏门)是由逻辑析取(合取)节点组成的宏门。
对锥的定义自然地扩展到簇和宏门。图1中展示了簇和宏门的一个示例,其中一个簇包含一个或‐宏门和两个与‐宏门。
定义6。 给定一个以 r 为根的锥 C 和一个变量 a ∈ cut(C),变量 a 在 fr 上不可观测当且仅当 fr(X,⊥) ≡ fr(X,⊤),其中 X = cut(C) \ a。
文字是布尔变量或其否定。子句是文字的析取。如果一个布尔公式 F 是子句的合取,则该公式处于合取范式(CNF)。给定一个布尔公式 F,我们用 supp(F) 表示 F 所定义的布尔变量集合。
一个布尔公式 F 如果仅对其变量应用否定算子(¬),且只允许使用合取(∧)和析取(∨)作为其他运算符,则称该布尔公式处于否定范式(NNF)。任何公式都可以通过直接应用德摩根定律和消除双重否定,在线性时间内转换为 NNF。在最坏情况下,当公式 F 被转换为 NNF 时,实现该公式 F 的电路大小可能会加倍。
B. 克雷格插值
设 A 和 B 为两个不一致的布尔公式,即满足 A ∧ B ≡ ⊥。
对于 (A, B) 的克雷格插值 I 是一个公式,使得:(1) A ⇒ I,(2) I ∧ B ≡ ⊥,且 (3) supp(I) ⊆ supp(A) ∩ supp(B)。
我们使用 ITP 表示插值操作。可以从 A ∧ B 的归谬证明中导出一个作为与或电路的插值 I = ITP(A, B)。大多数现代 SAT 求解器能够生成归结证明。归结证明通过一系列应用二元归结推理规则,为合取范式公式 F 的不可满足性提供证据。给定两个子句 C1=(l∨ l1 ∨…∨ ln) 和 C2=(¬l∨ l1′ ∨…∨l′m),使用归结算子计算出一个归结式 C,其定义为:C = Res(C1, C2) = (l1 ∨… ∨ ln ∨ l1′ ∨… ∨ l′m)。从 F 的子句出发,反复应用该规则,直到推导出空子句。
克雷格插值根据归结证明生成,如[2]中所述。所得的 ITP 电路与证明同构:原始子句被转换为或门或常量,归结步骤被转换为与门或或门。介于 A 和 ¬B 之间的插值公式依赖于 SAT 求解器的决策,因此其最终的强化/弱化程度不受用户控制。这推动了事后插值加强/减弱的研究。
C. 组合电路压缩
本小节简要概述了我们的电路压缩方法所基于的一些组合综合技术,不涉及完整性与通用性。
通过结构哈希、基于割的[16], BDD‐based[17]和基于SAT的[18]扫描,去除影响非规范组合电路的冗余。上述方法主要依赖于发现并合并功能等价的电路节点类。其他化简方法则利用了各种分解、重写和平 衡策略。在[19]中首次提出了一种针对工艺无关电路的局部规范变换与感知DAG的重写相结合的方法。[14]引入了一种在工艺映射前对组合逻辑进行预处理的技术。我们沿用了[14]所采用的与非反相图(AIGs),其由双输入与门和反相器构成。所有操作均为局部操作,通过迭代应用局部化简实现全局优化,从而达到可扩展性。结果表明,在质量方面,多次重写步骤的累积效应通常优于传统综合方法。
在考虑节点在电路输出端的可观测性的情况下,基于可观测性不关心条件(ODC)的冗余消除是一种强大的冗余消除变体,其中建立节点等价性。所有基于ODC的方法都依赖于对参与冗余检查的节点计算不关心条件。由于精确计算成本过高,已有研究提出近似技术。在SIS中使用BDD方法计算了兼容的可观测性不关心条件(CODC)集合[21]。文献[22]引入了通过“窗口法”得到的近似ODC,通过将子电路环境限制在局部性范围内实现了可扩展性。结合随机采样的基于SAT的量词消去[23],是进一步利用SAT求解器能力的一次尝试。
D. 门级抽象
抽象技术是模型检测中一个众所周知的研究领域。我们的论文与一种局部化形式相关抽象[24]称为门级抽象[25]。基于局部化的抽象通过移除对证明不必要的电路组件(即剪断连线)来实现。检测不必要部分的方法主要有两种方案:
- 基于反例的抽象精化(CBA)[26],其中初始较弱的抽象根据虚假反例分析被迭代地精化(增强);
- 基于证明的抽象(PBA)利用现代SAT求解器生成不可满足性证明的能力,是一种近期采用的变体,已在独立模式下或与CBA结合使用中得到研究,如[27]所示。
在大多数模型检测工具中,局部化是在寄存器边界上进行的。门级抽象[25] 是一种特定的抽象方案(原则上与CBA和PBA策略兼容),其中局部化在门节点上进行。
III. 基于特定逻辑综合的插值器压缩
在本节中,我们提出了一组基于逻辑综合中局部简化技术的流程,以减小布尔电路的大小。尽管这些方法适用于任何布尔电路,但我们的方法特别针对插值电路的主要冗余来源:可被常量值替代的门,或可合并的功能等价(但拓扑结构不同)的子电路。我们将插值公式视为单输出电路G。从电路的AIG表示出发,我们:
- 识别与门和或门;
- 将Partition G划分为一组最大簇;
- 将与门(或或门)树分组为宏门。
我们的目标是通过快速操作来解决门冗余问题,其中电路变换在簇内进行。将范围限制在簇内的原因在于,扇出主干通过电路图中的不同路径传播共享子公式。影响多个扇出路径的简化既复杂又效果有限。
电路 G 被划分为一个最大簇集,每个簇又进一步被划分为一组宏门。该操作通过从根节点 r 开始对 G 进行深度优先遍历实现。每个节点 v 都关联两条信息:其簇支配者 domC(v) 和其宏门支配者 domG(v)。只要遍历的节点具有单位扇出,就传播簇支配者信息;只要遍历的节点具有单位扇出且类型相同,就传播宏门支配者信息。执行此操作需要 O(|E|) 时间。
因此,我们提出一种基于两种局部化简的流程:
- 基于簇内类似ODC的蕴含进行的冗余消除(等价于常量的门)。
- 通过宏门重构实现子公式共享(等价门合并)的强制执行。
A. ODC蕴含去除
我们提出的第一个简化技术旨在寻找可利用的局部 ODC 蕴含,以将门电路替换为常量。该技术依赖于以下两个恒等式:
f(X, a) = a ∧ g(X, a) ≡ a ∧ g(X,⊤)
f(X, a) = a ∨ g(X, a) ≡ a ∨ g(X,⊥)
让我们考虑一个布尔函数 f(X, a),它表示为变量 a 与函数 g(关于 a)的合取(或析取)。那么 a 可以在 g 中被替换为 ⊤(或 ⊥)常量。注意,在 g 的支撑中,变量 a 的实例在 f 上是不可观测的。从电路图的角度来看,给定实现 f 的电路G,a 是一个输入变量,而 g 是 G 的一个子电路,且 a 在其扇入中。从节点 a 到 f 的输出节点至少存在两条重汇聚路径。
我们将这些情况称为 f 的 ODC 蕴含,因为蕴含 f → a 和 ¬a → ¬f(或 ¬f → ¬a 和 a → f)在各自两种情况下均对偶成立。
我们利用ODC蕴含的概念对布尔电路中的函数进行局部化简。具体方法是检测电路中可表示为 a∧g(X, a) 或 a∨g(X, a) 的锥 C。在这些情况下,可通过断开从 a 到其在 C 中入口点的冗余边并注入一个常量来简化 C。为了规避共享元件带来的问题,ODC 蕴含的检测被限制在宏门和/或簇边界处进行。
我们考虑直接ODC蕴含和传递性ODC蕴含。当函数的输入 f 被 f 直接蕴含时,产生直接ODC蕴含。图2展示了一个直接ODC蕴含的例子。输入 b 是 ft 的直接 ODC 蕴含,因为 ft(a, b, c) = b ∧ g(a, b, c) 且 g(a, b, c) = c ∧ (a ∨ b),因此 ft → b。当函数的输入 f 通过它的另一个输入被 f 传递性地蕴含时,产生传递性ODC蕴含。
图3提供了一个传递性ODC蕴含的例子。输入 b 是 ft 的传递性ODC蕴含,事实上,d 是 ft 的直接ODC蕴含,且 b 是 fd 的直接ODC蕴含,因此 ft → d → b。
DIRECTODCSIMPLIFY 过程(算法1)试图识别被直接 ODC 蕴含所导致冗余的簇输入。给定一个以 r 为根节点的簇 C 及其输入之一 v,该算法尝试在 C 中找到一个节点 d,使得 v 是 fd 的一个直接ODC蕴含。将簇视为宏门的树结构,这对应于在 C 中 v 的两个入口点(称为 u 和 t)找到一个共同后继 d,使得 d 是 u 或 t 的直接后继。由于我们考虑的是宏门构成的树结构,d 是 t 的直接后继意味着 t 通过仅由与门或或门组成的链连接到 d。对于每个簇 Ci,该算法扫描其每一个割点。对于每个 v ∈ cut(Ci),考虑 Ci 中 v 的所有不同入口点对 u、t。为了寻找 u 和 t 的共同后继,首先通过 MARKDOMINATORS 过程标记 u 的每一个宏门支配者。然后,算法检查 t 的宏门支配者是否被标记。如果是,设为 d = domG(t),则存在某个 g,使得 fd(X, v)= v ∧ g(X, v)或 fd(X, v)= v ∨ g(X, v)。因此,v 在 g 上对 fd 不可观测,可通过调用函数 SIMPLIFY 来简化电路。该函数以一对节点和一个门类型作为参数,从电路中移除边(v, u),并在新产生的空闲输入端注入适当的常量值。若传入的门类型为与,则注入的常量为 ⊤;若为或,则为 ⊥。注入常量后,相应地简化电路。否则,如果 domG(t)未被标记,则算法继续处理下一对入口点。DIRECTODCSIMPLIFY 的时间复杂度为 O(|V | max_{C_i ∈ G} {|cut(Ci)|})。
算法1. DIRECTODCSIMPLIFY(G)
1: 对所有簇 Ci ∈ G 执行
2: 对 cut(Ci) 中的所有节点 v 执行
3: 对 fanout(v) 中满足 u ≠ t 的每一对 (u, t) ∩ Ci 执行
4: 标记支配者(u)
5: 如果 domG(t) 被标记,则
6: 简化(v, u, type(t))
7: 取消标记支配者(u)
TRANSITIVEODCSIMPLIFY 过程(算法2)试图识别被传递性ODC蕴含所导致冗余的簇输入。为每个簇维护两个列表:一个直接蕴含列表和一个传递性蕴含列表。给定一个以 r 为根的簇 C,其直接蕴含列表记为 Impl(C),包含所有满足如下条件的簇输入 v:在 C 中 v 的至少一个入口点以 r 作为宏门支配者。因此,对于每个 v ∈ Impl(C),要么 fr → v,如果 type(r) 是与,或 ¬fr → ¬v,如果 type(r) 是或。直接蕴含列表作为参数提供给 TRANSITIVEODCSIMPLIFY。传递性蕴含列表,表示为 Trans(C),用于收集满足以下条件的节点 v:存在一个簇序列 C0,⋯⋯,Cn,使得以下条件成立:
- C0 = C
- Ci+1 ∈ Impl(Ci) 对于每个 0 ≤ i < n;
- type(Ci+1) = type(Ci) 对每个 0 ≤ i < n;
- v ∉ Impl(Ci) 对于 0 ≤ i < n;
- v ∈ Impl(Cn)
在 TRANSITIVEODCSIMPLIFY 运行期间计算传递性蕴含列表,并用于检测相对于每个簇根节点的传递性ODC蕴含。
在 TRANSITIVEODCSIMPLIFY 中,簇按拓扑顺序扫描。对于每个簇 Ci,首先计算其传递蕴含列表。这是通过将当前 Trans(Ci) 与所有位于 Impl(Ci) 中且与 Ci 类型相同的簇的传递或直接蕴含列表中的每一个节点进行与操作实现的。一旦为 Ci 计算出传递蕴含列表,该过程就会扫描位于 Trans(Ci) 中的每个节点 v ∈ cut(Ci)。这些节点是 Ci 的输入,对于这些输入存在通过 Ci 的某些其他输入的传递直接输出控制依赖(ODC)蕴含。因此,可以通过调用 SIMPLIFY 来简化这些节点的每个入口点 u。算法2的时间复杂度取决于传递列表的大小:O(|V | max_{C_i ∈ G} {|Trans(Ci)|})。尽管在最坏情况下这些列表的大小可能达到节点数量的二次方,但实验上可以注意到,在我们的应用背景下,这些列表的大小保持在 O(Ci) 以内。
算法2. TRANSITIVEODCSIMPLIFY(G, Impl)
1: 按拓扑顺序遍历所有簇 Ci ∈ G 执行以下操作 do
2: Trans(Ci) ← ∅
3: 对于 Impl(Ci) 中的所有簇 Ck,执行
4: 对于所有 v ∈ Trans(Ck) 中的 ∪ Impl(Ck)
5: 如果 type(Ck) = type(Ci) 成立,则
6: Trans(Ci) ← Trans(Ci) ∪ {v}
7: 对于 cut(Ci) 中的所有节点 v 执行
8: 如果 v 在 Trans(Ci) 中,则
9: 对于 fanout(v) 中的所有节点 u ∩ Ci 执行
10: 简化(v, u, type(Ci))
B. 宏门重构
我们提出的第二种简化方法试图重构电路中实现相同类型布尔函数的部分,以显式表达出电路中已存在节点所实现的子函数。如果成功,则可通过共享来减少电路的整体大小。该技术应用于宏门,以确保通过重构移除的每个节点都具有单位扇出,从而真正减小电路的大小。例如,考虑图4中的一个与‐宏门,其实现的函数为 ft(a, b, c, d) = (a ∧ b) ∧ (c ∧ d)。其思想是找出一对输入 (i, j),使得实现 i ∧ j 的节点未出现在该宏门中但存在于电路的另一个位置。假设存在一个实现 fm = c ∧ b 的节点 m,则宏门函数 ft 可被重构为 ft(a, b, c, d) = m ∧ (a ∧ d),从而使得门 m 可以被共享。这种重构步骤的最终结果是对原始宏门函数进行重新加括号,其节点数量减少了一个,其中一个节点现在被共享。类似的推理也适用于或‐宏门。
注意,重构宏门可能会改变当前的电路划分,因为之前非共享的节点可能变为共享节点。
MACROGATEREFACTOR 过程(算法3)尝试对电路中的宏门进行重构,以实现更好的共享。对于每个宏门 Mi,首先标记其割点。然后,对于 Mi 的每个输入节点,该过程扫描其扇出列表中所有未出现在 Mi 中但类型相同的节点。这些节点 u 是与 Mi 类型相同且与 Mi 共享一个输入的门。对于这些节点中的每一个,算法通过检测相应节点是否被标记,来检查其另一个输入节点是否与 Mi 共享。如果满足此条件,则可以对 Mi 进行重构,以加强与 u 的共享。函数 REFACTOR 负责处理宏门重构,并更新可能受此重构影响的其他宏门。MACROGATEREFACTOR 的时间复杂度为 O(|V | max_{v ∈ V} {|fanout(v)|})。
算法3. MACROGATEREFACTOR(G)
1: 对所有宏门 Mi ∈ G 执行
2: 标记 cut(Mi) 中的节点
3: 对所有 v 在 cut(Mi) 中执行
4: 对所有 u 在 fanout(v) 中执行
5: 如果 domG(v) ≠ domG(u) 且 type(v) = type(u) then
6: 如果 left(u) ≠ v 与 left(u) 被标记,则
7: REFACTOR(Mi, u, left(u))
8: 否则如果 right(u) ≠ v 与 right(u) 被标记,则
9: REFACTOR(Mi, u, right(u))
10: 取消标记 cut(Mi) 中的节点
IV. 基于SAT的弱化
先前描述的约简遵循了基于电路的快速优化趋势。现在,我们提出一种结合插值公式压缩与弱化思想的新方法。
给定一个插值公式 I = ITP(A, B),一个更弱的(或更强的)插值公式 Iw(或 Is)是另一个插值公式,使得 I → Iw (Is → I)。插值公式的弱化与强化是互为对偶的概念。考虑一个针对 A, B 的插值公式 I,其补集 ¬I 是针对 B, A 的插值公式。对于 A, B 的一个更弱的插值公式对应于 B, A 的一个更强的插值公式。如第一节所述,插值公式的强化和/或弱化可能与其自身质量相关[13]。
当前最先进的插值公式强化/弱化方法基于 SAT 证明变换[28]。插值公式重新计算是压缩插值公式并改变其强度的另一种直接且实用的方法。给定 I = ITP(A, B),我们可以生成一个更弱的插值公式 Iw = ITP(I, B) 或一个更强的插值公式 Is = ITP(A, ¬I)。从经验上看,我们花费额外的时间进行一次额外的插值公式计算,以获得一个更优的插值公式,其中“更优”可能意味着更弱、更强,或者可能更紧凑。遗憾的是,压缩并不能保证,因为最终插值公式的大小取决于 SAT 求解器的运行结果。实验中,我们既观察到插值公式大小的增加,也观察到其减小。
我们的策略是在计算新的插值公式时,通过额外花费时间重新运行 SAT 求解器查询(A ∧ ¬I 或 I ∧ B),并采用一种不同的方法来保证压缩。下文概述了我们弱化方法的主要步骤(增强方法是其对偶):
- I 被编码为 NNF,生成 INNF
- 对 INNF 执行门级抽象,采用 PBA 方法:
- 解决 SAT 查询 INNF ∧ B(保证不可满足),并用于生成 UNSAT 核心 C(INNF ∧ B),无需完整的证明
- 利用 UNSAT 核心,计算 INNF 的基于证明的抽象:Ipba = PBA(INNF, C)
- 由于 PBA,在所有切割(抽象)点引入了新引入的变量 ∆。因此,supp(Ipba) = Γ ∪ ∆,其中 Γ = supp(A) ∩ supp(B)。这些额外变量的存在使得 Ipba 无法成为正确的插值。可以利用 NNF 编码高效地对 ∆ 变量进行存在量化。具体而言,∃∆ Ipba 通过将 ∆ 中的所有变量替换为一个 ⊤ 常量来实现:Iw,NNF = Ipba||∆={⊤,⊤,…⊤}。
- 压缩后的插值公式 Iw,NNF 被转换回(非 NNF)AIG 编码。
将电路编码为 NNF 形式意味着在大小上存在一定代价。然而,我们通过实验观察到(见第五节),对于插值公式而言,这种代价可以忽略不计,因为插值公式最初是纯与或电路,其否定仅限于输入边界。相反,我们获得了通过代换进行量化的优点。给定一个以 NNF 形式表示的布尔函数 f(X, ∆),其中 ∆ 仅以非否定形式出现,则可以通过代换对 ∆ 进行存在量词(或全称)量化:
∃δ f(X,∆) = f(X,⊤)
∀δ f(X,∆) = f(X,⊥)
顶层过程在算法4中描述。给定一个节点 v,函数 CNF(v) 用于检索合取范式 fv 的表示
算法4. ITPWEAKEN(I, B)
1: INNF ← AIG2NNF(I)
2: C ← SATWITHUNSATCORE(INNF ∧ B)
3: 遍历 INNF 中的所有节点 v
4: 如果 CNF(v) ∉ C 那么
5: REPLACE(v,⊤)
6: Iw,NNF ← RECOMPUTECIRCUIT(INNF)
7: Iw ← NNF2AIG(Iw,NNF)
返回 Iw
该算法展示了相对于 B 对 I 的弱化,以及使用 dual 进行的增强。此外,我们采用基于 PBA 的抽象,而基于 CBA 的方法也同样可行。所提出的代码将门级抽象(GLA)与存在量化相结合,因为给定 UNSAT 核心(C) 后,电路中对应 CNF 变量不在 C 中的节点会立即被抽象,并替换为 ⊤ 常量。
V. 实验结果
我们在 PdTRAV 工具[29](一个最先进的验证框架)的基础上实现了一个插值紧致化过程的原型版本。本节中的实验数据对所提出的技术进行了评估。实验在 Intel Core i7−3770 上进行,配备 8 个 CPU,运行频率为 3.40 GHz,16 GB 主内存 DDR III 1333,并搭载 Ubuntu 12.04 LTS Linux 发行版。我们分别将内存限制设为 900 秒(弱化实验为 3600 秒)和 8 GB。
我们在[11]中使用的插值公式的选定子集中进行了广泛的实验。这些插值公式提取自过去 HWMCC[20] 套件中公开可用的基准测试,并以 AIGs 表示。我们还考虑了来自软件验证问题[12]的插值公式。前一组包含 2472 个实例,节点范围从 1.1×10⁵ 到 8.5×10⁶。后一组包含 1872 个实例,节点范围从 4×10² 到 6×10⁴。
我们从第一组插值公式中收集了初始数据,以剔除简单实例。我们将节点数少于 1.5×10⁴ 个且逻辑综合过程能在 150 秒内达到不动点的实例视为简单实例。剔除后的基准测试集包含 87 个实例,节点数范围从 4×10⁵ 到 8.5×10⁶,用于进行更深入的实验。
图5和图6分别显示了逻辑综合紧致化(第三节)和基于 GLA 的弱化(第四节)所获得的结果。紧致化技术是增量式地应用的,即我们总是先应用[11]中描述的简化方法,再应用本文中描述的技术。
A. 通过逻辑综合进行压缩
在我们的实验中,我们通过以下方式评估了第三节中的技术。首先将电路划分为簇和宏门。通过对宏门中每个重复的输入进行移除来执行简单的简化。然后按此顺序迭代执行 DIRECTODCSIMPLIFY、MACROGATEREFACTOR 和 TRANSITIVEODCSIMPLIFY,在每次调用之间重新计算电路划分,直到连续两次迭代使电路大小减少不到 1% 为止。
对于每个基准测试,我们首先应用 ABC 的 AIG 平衡过程,然后再应用前述任何技术。我们将平衡后的插值公式大小视为后续实验的基线。为了测试所提出技术的各自贡献,我们先进行了一次初始运行,启用所有简化方法,称此运行为 ITP 简化(ITPSIMPLIFY),随后进行一系列运行,依次单独禁用其中某一项:NODIRECTODCSIMPLIFY、无宏门重构(NoMacrogateRefactor)和 NOTRANSITIVEODCSIMPLIFY。最后,我们完全禁用了我们的技术,仅使用标准逻辑综合(重写/重构,采用最先进的 ABC[30] 工具)执行 ITP 压缩。
图5a 和 5b 分别展示了在所有基准测试上的累积大小和执行时间。在这两种情况下,线条越接近 x 轴,结果越好。
这两个图清楚地说明了在执行时间与潜在的大小缩减之间所做的权衡。一方面,完全基于 ABC 的简化性能最佳,但它需要大量的时间。通过采用不那么激进的方法,可以在计算量较小的情况下实现不同的压缩率。我们从可视化表示中排除了超时情况。
如第二节-D 所述,蕴含列表的大小也可能成为所提出方法可扩展性的一个限制因素。尽管这些列表在理论上可能随着节点数量呈二次增长,但在实验中我们注意到最坏情况下仅为 20 倍的乘法因子。
B. 通过削弱进行压缩
为了表征通过基于 SAT 的削弱/增强所能达到的 ITP 压缩率,我们将时间限制提高到 3600 秒。这种方法旨在用于 ITP 大小缩减至关重要的场景,和/或削弱/增强本身就是目标的情况,这证明在总执行时间上投入更多是合理的。
所有提出技术的初步步骤都需要将给定的插值公式转换为 NNF 形式。一般情况下,此步骤可能导致电路大小最多增加一倍。但考虑到插值公式本身的性质和结构,其尺寸增长几乎可以忽略不计。综合所有进行的实验,观察到的最大增长低于 0.5%,这证实了第四节中的直观论点。
我们进行了一组实验,考虑了相同的 87 个插值公式子集,迭代了削弱(标记为 B)和/或增强(标记为 A)步骤序列的不同模式。我们提出了对六种不同序列的实验评估:A、B、AB、BA、ABAB 和 BABA。我们在任何弱化/增强尝试之前运行逻辑综合压缩过程(基线)。图6a 和 6b 分别展示了在所有基准测试上的累积大小和执行时间。
可以明显看出所选择的第一种压缩方式的影响:以 B 开始往往会产生更好的结果,这与大多数提出的插值公式更易于进行弱化而非增强的事实相关。
总体而言,基于 SAT 的抽象显然带来了显著的压缩效果,尽管这是以时间为代价的。
VI. 结论
我们研究了基于 SAT 的 UMC 中优化插值公式大小的问题。我们的主要贡献是提供了一种集成化的方法,针对插值公式的压缩,在时间和内存之间根据具体应用场景提供不同的权衡。我们在逻辑综合和 SAT 层面同时开展工作,提出了多种旨在缩减插值公式大小的技术。总体而言,我们的主要目标是提高现有 UMC 方法的可扩展性,同时考虑资源限制,并在最优结果与所提方法的适用性之间取得平衡。我们通过实验观察到,所提出的优化措施对基于插值的现有可达性方案是有益的。
VII. 致谢
我们感谢来自瑞士意大利语区大学(USI)的娜塔莎·沙雷吉娜教授、Antti E. J. Hyvärinen 博士和莱昂纳多·阿尔特提供的由软件验证问题生成的基准测试。
901

被折叠的 条评论
为什么被折叠?



