ABC: A System for Sequential Synthesis and Verification
ABC是一个不断发展的软件系统,用于合成和验证同步硬件设计中出现的二进制时序逻辑电路。ABC结合了基于And Inverter Graphs(AIG)的可扩展逻辑优化、用于查找表和标准单元的基于最佳延迟DAG的技术映射,以及用于顺序合成和验证的创新算法。
ABC提供了这些算法的实验实现以及用于构建类似应用程序的编程环境。未来的开发将集中在改进算法和使大多数包独立。这将允许用户根据自己的需求定制ABC,就好像它是一个工具箱而不是一个完整的工具一样。
Introduction
作为软件系统核心的数据结构和算法决定了其处理数据的能力以及作为构建新应用程序的编程环境的效率。开发和使用SIS、VIS和MVSIS的丰富经验表明,这些系统不能提供灵活的编程环境来实现最新的创新,例如技术映射和重定时的集成。具体而言,SIS环境已经过时,在处理大型电路时效率相当低。VIS作为多值规范的形式化验证工具,并没有为二值综合提供足够的灵活性。MVSIS是近年来开发并广泛应用于实现多值和二值网络的新的综合算法。最后,我们确信:(a)通过假设二进制网络,可以使MVSIS的基本数据结构和算法变得相当简单和易于使用;(b)新系统中的中心位置应赋予新数据结构AIGs(由两个输入and和逆变器组成的多级逻辑网络),这保证了合成和验证的质量和运行时的改进。
这种理解促使我们重新开发MVSIS的核心包,从而产生一个名为ABC的新编程环境。顾名思义,主要目标是使数据结构保持简单和灵活,适用于各种应用程序。“ABC哲学”有几个基本前提。其中之一是允许各种功能表示,如BDD和SOP,以解决专门的任务,而默认为AIG的主流网络操作。使用AIGs表示逻辑,可以实现计算上的显著一致性,并与基于CNF的SAT求解器有效地接口,以处理布尔推理问题。ABC的另一个基本前提是在AIG上使用有效的基于SAT的布尔推理进行组合和顺序等价性检查,从而实现合成和验证之间的协同。
ABC项目的目标是提供最先进的组合和顺序合成算法的公共领域实现,同时创建一个开放源代码环境,在其中可以开发和比较此类应用程序。当前版本的ABC可以优化/映射/重定时工业门级设计,具有100K门和10K序列元素,以在现代计算机上大约一分钟的CPU时间内实现最佳延迟和启发式最小化面积。组合合成、映射和验证的运行时通常更快。
Highlights
以多种方式表示和操作组合和顺序技术独立网络的基本数据结构:作为网表、具有由SOP(SIS类型网络)或BDDs(BDS类型网络)表示的节点的逻辑网络、作为技术映射网络、作为AIG、作为顺序AIG等。
二进制BLIF、二进制PLA、BENCH格式、EDIF子集(用于读取ISCAS基准)、Synopsys方程格式子集和结构化Verilog子集(用于读取IWLS 2005基准)的输入文件解析器。
用于二进制BLIF(技术独立和映射)、二进制PLA(仅限折叠网络)、BENCH格式、Synopsys方程格式、CNF(仅限组合斜接)的输出文件编写器,以及电路图的两种表示形式:点格式(用于图形可视化包GraphViz)和GML格式(用于某些图形编辑器,如yWorks的免费产品yEd)。
一种专用格式BAF(二进制Aig格式),用于将大型Aig读写到二进制文件中。使用BAF,可以在几秒钟内读取和写入具有数百万个和节点的AIG。与BLIF和Verilog相比,内存需求也减少了近一个数量级。
表示概念上与SIS中使用的逻辑网络相似的逻辑网络的数据结构,以及在逻辑网络上执行多用途操作的程序,如技术独立扫描、逻辑共享、不相交支持分解、AIG的结构散列和平衡、创建组合和顺序斜接(产品机),展开多个时间段的时序电路等。
基于AIG平衡、重写和重构的高效组合合成流,使用受Per-Bjesse和Arne Boralv启发的DAG感知转换,“用于形式验证的DAG认知电路压缩”(ICCAD 2004,第42-49页)。这些命令仅适用于组合网络。它们可以用来积累结构选择,从而在技术映射和顺序合成中获得额外的自由。
检测和积累布尔函数结构不同表示的过程(FRAIG包)。
使用同一网络的多个快照的过程。这些过程实现了无损合成的思想,无损合成包括累积逻辑变换过程中出现的逻辑函数的全部或部分功能等效的结构不同的表示。对多个结构进行映射有助于克服结构偏差,并有助于改善延迟和面积。
用于可变LUT大小FPGA和标准单元的技术映射器,适用于传统逻辑网络和具有结构选择的逻辑网络。最近添加的基于优先级划分的映射器改进了内存和运行时间。
用于LUT映射的几个面向区域的重新合成命令,如imfs和lutpack。
基于SAT扫描的组合等价性检查是模拟和SAT的一种资源感知组合
o A.Kuehlmann等人,“基于电路的布尔推理”,DAC 2001。
o F.Lu等人,“信号相关性引导的ATPG解算器及其在解决困难工业案例中的应用”,DAC 2003)。
o A.Mishchenko、S.Chatterjee、R.Jiang和R.K.Brayton,“FRAIGs:逻辑综合和验证的统一表示”。ERL技术报告,EECS部门,加州大学伯克利分校,2005年3月。
时序综合的基本数据结构(sequential AIG)和集成时序优化的实验实现,它结合了标准单元和FPGA的逻辑合成、技术映射和重定时。这项工作受到以下论文的启发:潘,“连续重定时:算法和应用”,ICCD 1997。潘,林,“基于LUT的FPGA的一种新的基于重定时的技术映射算法”,FPGA 1998。重新定时后电路的初始状态是通过公式化和求解SAT问题来计算的。
MiniSat的可编程接口,这是Niklas Eén和Niklas Sörensson开发的可扩展SAT求解器。解算器的C版本包含在当前版本的ABC中。
使用Fabio Somenzi的CUDD包构建网络主要输出功能的全局BDD的过程。CUDD版本2.3.1的代码包含在当前版本的ABC中。
简单的有界序列等价检查,它在给定数量的时间帧内展开序列电路,并对得到的组合电路执行组合等价。
顺序综合命令lcorr和ssw用于检测和合并顺序等效寄存器和内部节点。这些命令可以被视为对SAT扫描(命令fraig)概念的顺序域的扩展。
适用于两个待验证等效网络的无边界顺序等效性检查命令dsec(及其对应命令,在顺序斜接上工作的命令dprove)。
Next steps
使用外部无关项进行逻辑重组(在时序电路中,可以有效地计算无法到达的状态的子集并将其用作外部无关项)。
支持AIG最小化和“白盒”技术映射。这些是设计层次中的多输入多输出节点,其延迟参数和逻辑函数是已知的(因此可用于延迟跟踪、模拟、不小心计算等)。“白盒”不应该像围绕它们的其他逻辑一样被扁平化、优化和映射,因为用户可能更喜欢使用预定义的实现来实现它们。例如,不应该映射大型加法器,因为它们可以使用FGPA架构中可用的专用硬件来实现。
ABC目前正在开发的另一个创新功能是记录合成历史,并将其作为一组提示,以加快大型设计的顺序验证。
Basic
基本命令与SIS、VIS和MVSIS中执行的命令类似。
alias–创建字符或短单词与可用命令的关联。例如,在命令行中输入别名ps print_stats后,在提示符处键入ps将调用print_stats。标准别名的列表在文件abc.rc中给出,该文件包含在发行版中。当ABC运行时文件在当前方向上时,会自动加载。或者,可以通过运行命令source<path_to_the_resource_file>/abc.rc来加载它。该文件在程序启动时自动加载。
echo–将消息打印到标准输出。用于将可读注释添加到脚本文件生成的打印输出中。消息应该用引号括起来。例如,脚本中包含的行echo“Synthesis”会导致屏幕上打印单词Synthesis。
empty–释放当前存储在内存中的所有网络。
help–打印当前执行的所有命令的列表。
history–打印用户最近输入的给定数量的命令行。
ls–(仅限Windows。)打印当前目录中存在的文件列表。
recall–在最近的某个优化步骤中返回网络。最近存储的网络数由参数savesteps控制。要更改此参数,请运行set savesteps n,其中n是要存储的最近网络的所需数量。默认值为1(只存储一个以前的网络)。在使用大型网络时,为了加快处理速度并减少内存消耗,禁用存储最近的网络可能很方便。这可以通过在命令行上运行未设置的备份来实现。要再次启用备份,请键入set backup。
quit–退出程序。
set–在命令行上设置参数。
source–执行脚本。例如,给定一个脚本文件optimize.scr,行源optimize.shr将执行该脚本。行source–x optimize.scr将执行脚本并将命令回显到屏幕。
time–打印两个时间测量值:(a)自上次调用命令时间以来,程序花费的计算时间;(b)自启动以来,程序耗费的计算时间。
unalias–删除以前由命令别名设置的别名。
undo–将当前网络设置为执行上一个合成命令之前保存的网络,该命令已更改当前网络。例如,命令print_stats不会更改网络。因此,在print_stats之后运行undo会将当前网络设置为更改它的最后一个命令之前的网络。例如,如果print_stats之前的最后一条命令是映射的,则undo之后的当前网络将与映射之前一样。
unset–使用命令集删除上一个参数集。
Input
read–使用可用的文件读取器之一分析输入文件。文件扩展名用于确定要调用的文件解析器。可识别的文件扩展名为:aig、baf、bench、blif、eqn、pla、verilog。
read_aiger–以Armin Biere开发的二进制aiger格式读取组合AIG。这种格式非常紧凑,大大减少了读/写时间。
read_baf–以二进制AIG格式(baf)读取组合AIG。有关BAF的描述,请参阅源代码文件src/base/io/ioWriteBaf.c。此格式已被AIGER格式取代,并保留为与早期版本的ABC向后兼容。
read_bench–以bench(ISCAS)格式分析输入文件。
read_blif–分析blif中的输入文件。该命令还可以读取带有黑框的分层BLIF,如本文所述。
read_blif_mv–分析blif-mv中的输入文件。读取时层次结构变平。MV变量使用对数编码进行编码。由此产生的网络是一个结构混乱的AIG。要写入匹配的BLIF-MV输出,请使用命令write_hie。
read_dsd–使用表示其不相交支持分解的公式读取单个输出布尔函数。此命令可用于通过在命令行上键入函数的公式来快速读取函数。例如,请尝试read_dsd(ab)+(cd);clp-r;pk。
read_eqn–以Synopsys方程格式解析输入文件,该格式也可以由SIS生成(命令write_eqn)。支持公式格式的子集,它使用布尔AND(*)、OR(+)和补码(!)。当前版本的解析器允许使用嵌套括号。
read_pla–分析pla中的输入文件,假设pla是最常用的“fd”类型(在输出部分,“1”表示多维数据集属于on集,“-”表示多维集属于don’t-care集,“0”表示该多维数据集对给定输出没有意义)。在结果网络中,每个输出由一个逻辑节点表示。目前只支持二进制PLA;不小心的多维数据集当前被忽略。
read_truth–读取一个布尔函数,该函数表示为由0和1组成的真值表。此命令可用于快速输入和可视化小函数。例如,read_truth 10000000;bdd;print_kmap打印三个输入AND门的Karnaugh映射。
read_verilog–在结构verilog的一个非常有限的子集中解析输入文件,其中包括阅读IWLS 2002 Benchmarks和IWLS 2005 Benchmark所需的所有关键字和指令。在读取后者之前,请确保使用命令read_library Cadence.genlib将Cadence库加载到ABC中。加载库时,请使用命令r–m<file.v>
Output
write–使用可用的文件写入程序之一写入输出文件。文件扩展名用于确定要调用的文件编写器。可识别的文件扩展名为:aig、baf、bench、blif、cnf、dot、eqn、gml、pla、verilog。
write_aiger–以Armin Biere开发的二进制aiger格式写入组合AIG。这种格式非常紧凑,大大减少了读/写时间。(当为具有非0初始状态的顺序电路写入AIGER时,使用命令0来规范寄存器初始状态。)
write_baf–以二进制AIG格式(baf)写入组合AIG。有关BAF的描述,请参阅源代码文件src/base/io/ioWriteBaf.c。此格式已被AIGER格式取代,并保留为与早期版本的ABC向后兼容。
write_bench–将当前网络输出到一个bench文件中。
write_blif–将当前网络输出到blif文件中。如果使用标准单元库映射当前网络,则将当前网络输出到与SIS和其他工具兼容的BLIF文件中。(在读取生成的文件之前,必须在SIS中选择相同的genlib库。)当前映射程序不映射寄存器。因此,为顺序电路生成的映射BLIF文件包含未映射的锁存器。此外,带有命令行开关-l的命令write_blif写出当前网络的一部分,该部分包含不带锁存器的组合逻辑。
write_blif_mv–将当前网络输出到blif-mv文件中。两个写入分层BLIF-MV输出,使用命令write_hie。
write_cnf–将当前网络输出到cnf文件中,该文件可与各种SAT解算器一起使用。此命令仅适用于组合斜接电路(斜接电路只有一个输出,在所有输入组合下都应为零)。
write_counter–使用命令sat、proof或iprove解决可满足的斜接后输出反例。
write_dot–将当前网络的结构输出到可以由图形可视化包GraphViz处理的dot文件中。目前只有当当前网络是AIG时才有效。
write_eqn–以Synopsys方程格式输出当前网络的组合部分。
write_hie–如果原始设计包含黑框,则将包含黑框的层次结构输出到文件中。原始文件应作为此命令中的参数之一提供。
write_gml–将当前网络的结构输出到一些图形编辑器使用的gml文件中,例如yWorks的免费产品yEd。
write_pla–将当前网络输出到pla文件中。应折叠当前网络(每个PO由FANIN为PIs的节点表示)。仅适用于组合网络。
write_verilog–使用独立于技术的verilog输出网络。
Printing
print_auto–打印有关函数自动对称性的信息。
print_exdc–打印exdc网络(外部don’t-care网络)的统计信息。
print_factor–打印当前网络中节点的系数形式。
print_fanio–按扇入和扇出的数量打印节点的分布。
print_gates–打印技术映射后使用的门的统计信息。对于技术独立的网络,打印有多少节点具有给定类型的逻辑功能。
print_io–打印网络的主要输入(PI)、主要输出(PO)和锁存器的列表。当调用节点(由命令行上的名称给定)时,将打印其扇出和扇出。
print_kmap–打印节点逻辑函数的卡诺图。
print_latch–打印有关当前网络锁存器的信息。
print_level–按逻辑锥中的级别数打印CO的分布。如果映射了网络,则打印CO的延迟配置文件。
print_mffc–打印网络中每个节点的最大扇出自由锥(mffc)。
print_sharing–打印当前网络中每对CO共享的节点数。
print_stats–打印当前网络的重要统计信息。打印的统计信息取决于当前的网络表示。
print_supp–根据PI变量打印有关PO函数支持的信息。
print_symm–根据PI变量打印有关PO函数的经典双变量对称性的信息。
print_unate–根据PI变量打印PO函数的无人性信息。
show–可视化当前网络的结构。
show_cut–可视化AIG中的节点子集。
show_bdd–可视化一个节点的bdd的结构。
Synthesis
Combinational synthesis
本节列出了在当前版本中实现的组合合成命令。通过对AIG的DAG感知重写,实现了快速高效的合成。重写使用预先计算的四个输入AIG库(命令重写;标准别名rw)执行,或者使用10-20个输入折叠和重构逻辑锥(命令重构;标准别名rf)。实验表明,迭代这两个转换并将它们与AIG平衡(command balance;standard alias b)交错,可显著减小AIG大小并趋向于减少AIG级别的数量。
目前提供的逻辑合成脚本有resyn、resyn2和resyn2rs。它们在资源文件abc.rc中定义为别名。尽管这些脚本不包含用于提取公共逻辑的专用命令,但由于重写的DAG感知特性,逻辑正在共享。只有当AIG节点数量减少时,它才接受更改,这是通过重构当前AIG并最大限度地共享当前网络中可用的其他节点来实现的。如果将rewrite和refactor与启用零成本替换的开关一起使用,则尤其如此,如上面的脚本(命令rewrite–z和refactor–z;分别使用标准别名rwz和rfz)。在这种情况下,即使重写没有立即减少AIG的大小,结构也会被重塑,并为将来的重写迭代创建新的逻辑共享机会。
使用结构散列(命令strash;标准别名st)和从AIG重建SOP逻辑网络(命令renode;标准别名ren),可以使用其他合成命令将初始SOP逻辑网络转换为AIG。传统的快速提取(命令fx)可以应用于SOP逻辑网络,以及基于DSD的共享提取(分别是脚本share和sharedsd)。根据我们的经验,在减少节点数量(面积)和逻辑电平数量(延迟)方面,这些命令的性能不如AIG重写。
与SIS中的script.rugged或script.algebrec和mvsis中的mvsis.ruggeed相比,使用resyn和resyn2的ABC中的组合逻辑合成通常快10-100倍,但在所得网络中AIG节点的数量和级别方面给出了可比的质量。尽管与SIS/MVSIS相比,分解后的形式文字的数量通常更大,但生成的AIG网络可以更好地进行映射调整,与这些工具相比,这会产生更好的延迟和面积。
可以注意到,所提出的组合逻辑综合不同于在SIS和MVSIS中实现的经典方法。在这些系统中,在对单个节点进行优化时,节点边界始终保持不变(SIS命令简化并完全简化),或者节点边界逐渐改变(SIS命令消除并恢复)。在ABC中,节点边界最初被结构散列(命令散列)破坏,该散列将逻辑网络转换为AIG。边界可以根据需要使用renode命令重新创建,这可以被视为SIS命令消除的反面。在上面给出的合成流程(脚本resyn和resyn2)中,在不创建节点的情况下在AIG级别上转换逻辑。从某种意义上说,ABC在一个完全消除的网络上工作,其中不存在节点边界,而其他工具保留节点边界。
balance–假设输入为AIG,并创建具有最小延迟的等效AIG,使用两个输入和门的逻辑电平进行测量。逆变器不计入逻辑电平数。由此产生的AIG是由代数平衡的多输入和门包含在原来的AIG。在拓扑序中应用平衡,选择每个多输入与门的最小延迟树分解。平衡考虑主要输入的到达时间,可以用BLIF表示。
cleanup–删除当前逻辑网络中的悬挂节点,即未扇出到PO和锁存器中的逻辑节点。
collapse–将扇入节点递归组合为扇出节点,从而形成一个网络,其中每个CO由一个节点生成,该节点的扇入是CI。折叠是通过使用BDD构建全局函数来执行的,因此仅限于相对较小的电路。折叠后,使用BDD表示节点功能。
dsd–使用Bertacco/Damiani(ICCAD’97)的算法应用不相交支持分解。
fx–通过使用Rajski/Vasudevamurthi(TCAD’92)的算法提取两个立方体除数和两个文字单立方体除数来检测逻辑共享。
multi–将双输入门AIG扩展为多输入AND门网络。
refract–对AIG中的逻辑锥执行迭代折叠和重构,试图减少AIG节点的数量和逻辑级别的数量。
renode–假设输入是AIG。在此AIG中创建节点边界,并折叠中间逻辑以形成更大的节点。
rewrite–对AIG执行DAG感知重写,试图减少AIG节点的数量和逻辑级别的数量。
rr–执行AIG的冗余删除。
strash–通过一级结构哈希将当前网络转换为AIG。由此产生的AIG是一个由两个输入AND门和反相器组成的逻辑网络,反相器表示为边缘上的互补属性。结构散列是一种纯粹的组合变换,它不修改锁存器的数量和位置。
sweep–适用于产生逻辑网络的当前逻辑网络的经典扫频。Sweep执行以下任务:删除悬挂节点(没有扇出的节点),将缓冲区和反相器折叠到扇出中,传播常量,并删除重复的扇出。扫描不能应用于AIG,因为AIG在结构上是散列的,因此没有缓冲区、反相器和未公开的常量节点。要删除逻辑网络中的数据传输节点,请使用cleanup。
Sequential synthesis
时序综合通过修改当前网络的逻辑以及存储器元件(锁存器或触发器)(如果存在)来转换当前网络。与原始网络相比,得到的网络可能具有不同的状态编码和可达状态空间,但这两个网络在顺序上是等价的(即,从初始状态开始,对于相同的输入向量序列,它们产生相同的输出向量序列)。
最简单的顺序转换是重定时。重定时使网络结构保持不变,但以每个PI/PO路径和每个环路上的锁存器数量不变的方式移动锁存器。更复杂的顺序变换修改了锁存器的逻辑结构和位置。集成时序优化在时序变换中占有特殊的地位,它可以通过执行一系列简单的局部变换来实现电路的全局最优延迟,例如局部重构和重定时单个节点。在ABC中,集成顺序优化是当前通过命令if-s执行的。该命令通过探索逻辑合成过程中看到的所有逻辑结构、所有可能的技术映射和所有可能的重定时的组合空间,找到电路的最小延迟。
目前,在命令if-s中只实现了一个简单的延迟优化版本的顺序积分,而没有太多的努力来最小化寄存器的数量和结果映射的面积。时钟周期平均比仅使用组合映射计算的时钟周期小25%,并且比使用组合映射然后重定时计算的时钟时段小20%。然而,产生的面积往往更大。这是当前实现的已知限制。在未来的工作中,将通过开发基于时序松弛概念的有效锁存最小化和区域恢复技术来解决这一问题。
cycle–模拟具有随机输入的顺序网络,并更新其当前状态。
init–重置当前网络的所有锁存器的初始状态。(请注意一个有用的命令print_latch,它可以用来查看当前网络中所有锁存器的初始状态。)
lcorr–使用简单归纳法对寄存器对应关系进行分区实现。检测并按顺序合并等效寄存器。
retime–实现几种形式的重定时:最前向、最后向、最小寄存器、启发式最小延迟、延迟优化重定时,载于潘培辰,“连续重定时:算法和应用”,ICCD 1997,pp.116-121。当电路从顺序AIG转换为逻辑网络时,锁存器在扇出杆之间最佳共享。重定时后初始状态的计算简化为SAT问题,该问题使用MiniSat解决。已知的问题包括在使用锁存器重新定时后不进行验证,而锁存器具有不可验证的初始状态。(目前,不要在意的初始状态可以用init命令替换为固定的初始状态。)
scleanup–执行顺序清理(删除未扇出到PO中的节点和锁存器)。当与开关–l(例如scl–l)一起使用时,执行“寄存器扫描”,即(i)将具有相同驱动程序的寄存器合并,以及(ii)用常数替换固定寄存器。
ssw–使用K阶感应实现信号对应。检测并按顺序合并等效节点。
undc–在运行顺序验证之前使用此命令,通过添加由一个特殊寄存器控制的新PI和MUX,将初始状态为“不卡”的寄存器转换为初始状态为恒定0的寄存器,该寄存器在第一帧中产生0,随后产生1。
xsim–对当前序列网络执行X值模拟。
zero–在编写AIGER格式(要求所有寄存器都具有常数-0初始状态)之前使用此命令,将具有常数-1初始状态的寄存器转换为具有常数-0原始状态的寄存器。通过在寄存器的输出端添加一对反相器并在第一反相器上正向重定时寄存器来变换寄存器。如果一个寄存器有一个“不要卡”初始状态,它将被一个常数为0的初始状态所取代。
请注意,这些命令中的一些适用于AIG,而一些适用于逻辑网络。要在两者之间转换,请使用strash和logic。打印统计信息(print_stats)可用于查看当前网络的类型。要查看有多少寄存器的init状态等于0、1,并且不等于,请使用print_latch。
Technology mapping
LUT-mapping
FGPA映射选项目前仅限于可变LUT大小映射,其中每个大小的LUT都以面积和延迟为特征。LUT的最大允许大小是6个输入(未来版本将允许8个输入LUT)。该程序使用基于DAG的技术映射的经典算法来映射电路以实现最佳延迟,然后进行启发式区域恢复。所执行的映射是不考虑特定FPGA架构的通用LUT映射,该架构除了可编程LUT之外,还可以包含由门组成的可编程宏单元。宏单元可以包含与MUX和其他门混合的LUT。针对特定架构对映射过程进行微调可以显著提高映射质量。未来,可能会开发FPGA映射器的改进版本,该版本将考虑特定的宏小区架构。
有时,通过反复运行“choice;fpga;ps”,可以在没有延迟退化的情况下实现显著的面积改进。通常需要10次以上的迭代才能收敛,并且面积不断提高。这证实了(a)AIG重写寻找良好电路结构的能力,(b)捕获结构灵活性的选择能力,以及(c)映射器进行良好面积恢复的能力。
if–基于优先级削减概念的全新集成FPGA映射器。该映射器中使用的一些基本思想在最近的技术报告中进行了描述。命令行开关与命令fpga的命令行开关类似。
ffpga–技术报告中介绍的无割映射的简单实现。
fpga–使用当前网络的当前选定LUT库执行fpga映射。如果当前网络是AIG或有选择的AIG,则按原样进行映射。如果当前网络为逻辑网络,则在映射之前,该命令将对节点的分解形式进行结构散列(产生AIG),然后进行平衡,通过代数方法重新构造AIG,以获得使用AND门的逻辑电平数量测量的最佳延迟。平衡和映射都考虑了PI的到达时间,可以用BLIF表示。Switch–a禁用区域恢复,并在延迟优化映射后按原样输出网络。
mfs–一个面向区域的再合成引擎,用于映射到本文中描述的K-LUT中的网络。
lutpack–一个面向区域的重新合成引擎,用于映射到本文中描述的K-LUT中的网络。
print_lut–打印当前选定的lut库。每个LUT大小由三个数字表示(输入数量、面积和延迟)。默认的LUT库是5个输入LUT的库。
read_lut–从文件中读取lut库,并将其设置为当前lut库。有关表示LUT库的简单示例,请运行print_LUT。打印输出的格式与输入文件的格式相同。
Standard cell mapping
当前版本中实现的标准单元格映射具有几个显著的特性。它是一种基于k可行割的最优延迟DAG映射,与基于LUT的FPGA的经典最优延迟DAG映射非常相似。映射算法是“基于增益”的,也就是说,它们假设负载无关的延迟模型。这种假设是“假设-保证”方法的一部分:恒定的门延迟由映射器假设,并由后端合成工具保证,该工具执行扇出优化和门大小调整以满足时序假设。使用负载无关模型的优点是,它可以产生快速的映射算法,该算法具有全局延迟视图,并允许有效的启发式区域恢复。未来,我们计划通过对基于增益的映射器的输出进行后处理来实现负载相关映射器。
有时,通过反复运行“choice;map;ps”,可以在没有延迟退化的情况下实现显著的区域改进。通常需要10次以上的迭代才能收敛,并且面积不断提高。这证实了(a)AIG重写寻找良好电路结构的能力,(b)捕获结构灵活性的选择能力,以及(c)映射器进行良好面积恢复的能力。
attach–假设当前网络已映射,但有关门分配和引脚到输入绑定的信息丢失。此命令尝试将当前库中的门连接到逻辑节点,以保留节点的功能。此操作的结果不是唯一的。如果门对于对应于门的对称变量的引脚具有不同的延迟参数,则所得网络的延迟特性可以不同于原始映射网络。例如,如果NAND2的两个引脚具有不同的延迟参数,而引脚与节点输入的绑定是任意选择的,则延迟特性将不会被保留。
map–使用当前库执行当前网络的标准单元映射。如果当前网络是AIG或有选择的AIG,则按原样进行映射。如果当前网络为逻辑网络,则在映射之前,该命令将对节点的分解形式进行结构散列(生成AIG),然后进行平衡(生成延迟平衡良好的AIG)。平衡和映射都考虑了可以在BLIF中表示的主要输入的到达时间。Switch–a禁用区域恢复,并在延迟优化映射后按原样输出网络。另一个有用的命令fraig_sweep在映射后默认应用(使用开关-s禁用),以合并功能等效的节点,从而节省额外的面积。
print_library–打印当前选定的标准单元格库。
read_library–从GENLIB格式的文件中读取标准单元库。
read_super–使用超级门库格式从文件中读取超级门库。
super–为给定的标准单元库生成超级门。
unmap–通过将每个门替换为功能与门的功能相等的逻辑节点,擦除当前网络的映射。
Fraiging
FRAIG是一个用于为布尔函数构造AIG的包,同时强制每个AIG节点的函数唯一性。在生成的图中,没有两个节点具有相同或互补的布尔函数。从外部来看,FRAIG包暴露了与BDD包类似的API,但在内部它使用模拟和SAT。“脆弱网络”表示“使用FRAIG包构建网络中所有节点的全局功能的功能简化的AIG”。fraiging的另一个名字是“SAT横扫”。FRAIG包构建功能减少型AIG的能力远远超过BDD包构建BDD的能力。这使得功能减少的AIG在合成和验证的各种应用中非常有用。本节中的命令提供了对当前版本中包含的FRAIG包的访问。
在资源文件中定义了一个有用的别名选择。该别名组合了从当前网络的三个不同版本派生的结构选择(原始网络和通过运行两个AIG重写脚本获得的两个功能等效的网络)。在技术映射之前立即在当前网络上调用该别名可以改善所产生网络的面积和延迟。
fraig–将当前网络转变为功能缩减的AIG。此命令附带的各种命令行选项允许选择模拟模式的数量、SAT解算器回溯的数量等。命令行开关-r禁用功能缩减。开关–s防止将函数归约应用于具有稀疏函数的节点(函数,其模拟信息由所有0或所有1组成)。开关–c在执行函数归约时切换记录替代逻辑结构。
fraig_trust–假设当前网络是通过解析文件派生的,其中选择节点(表示逻辑函数结构等效实现的节点)表示为(多输入)OR门,而所有其他节点都是双输入AND门。OR和and都可以具有互补输入。该命令在不调用FRAIG包的情况下,将满足上述限制的网络转换为“信任模式”(语法上)下的功能减少的AIG。
fraig_store–将当前网络作为一个“合成快照”存储在AIG内部数据库中,以便稍后恢复并用于技术映射。
fraig_restore–将当前存储的AIG快照转换为fraig,并将其设置为当前网络,现在可以对其应用技术映射。通过调用此命令可以重置AIG数据库。
fraig_clean–重置AIG数据库而不进行恢复。
fraig_sweep–检测逻辑网络中功能等效的节点。与将网络转换为功能简化的AIG的fraig不同,该命令保留了网络结构,只合并功能等效的节点。此命令可以应用于映射的网络。生成的网络仍然被映射,但被缩减了。
dress–此命令将节点名称从外部网络传输到当前网络。为此,FRAIG包用于检测两个网络的节点之间的功能等效性。如果当前网络中的某个节点与外部网络中的节点具有相同的功能,则名称将被转移。如果节点等效到互补,则会转移名称,并在其后面附加后缀_inv。这很有用,因为ABC(在保留PI、PO和锁存器输出名称的同时)在处理逻辑网络和AIG时不会保留内部节点名称。使用此命令,如果需要内部名称,则可以在网络处理结束后,即将生成的网络写入文件之前,恢复这些名称。请注意,如果在调用命令dress后,网络没有立即写入文件,则内部节点名称可能会再次丢失。
Verification commands
目前实现了几个等价性检查选项。
cec–比较两个网络的PI/PO行为的cec引擎。如果存在锁存器,则在锁存器边界处切断网络,将锁存器输入添加到主输出,将锁存器输出添加到主输入,并且根据所得到的PI来比较所得到的PO的行为。默认情况下,使用基于脆弱性和SAT求解的混合方法来求解斜接。Switch–s实现了一种只使用SAT的方法,而不会出现问题。
debug–此命令用于调试内部过程。
dprove–应用于顺序斜接的无边界SEC(内部使用与dsec相同的SEC引擎)
dsec–在顺序合成(命令retime、scl、lcorr、ssw等)之前和之后,检查两个网络等效性的无边界SEC
iprove–适用于组合斜接的CEC引擎(内部依赖于作为CEC的代码)。
证明–适用于组合斜接的旧CEC引擎的实现。
sat–假设当前网络是一个组合斜接。将电路转换为CNF,并在内部应用最新版本的MiniSat来解决此斜接问题。或者,斜接可以用CNF(命令write_CNF)写出,并由外部SAT解算器求解。
sec–实现两个序列网络的有界序列等价性检查。使用开关–F在命令行上指定的给定数量的时间帧内展开这两个网络的乘积机,从而产生组合斜接。默认情况下,使用基于脆弱性和SAT的混合方法来解决斜接问题。Switch–s实现了一种只使用SAT的方法,而不会出现问题。
Unsorted
aig–将节点的本地函数转换为aig。
append–在当前网络之上附加一个新网络。结果网络的主要输入是两个网络的主要输出的并集。
bdd–将节点的本地函数转换为bdd。
cascade–LUT级联分解的原始实现。
capo——称外部仿真器为capo,由密歇根大学的Igor Markov团队开发。
comb–如果当前网络是顺序的,则通过移除寄存器并为每个寄存器输出和寄存器输入添加新的PI和PO,将其转换为组合网络。
cone–将当前网络替换为从中提取的一个逻辑锥。
cut–k-可行切割计算的独立实现,用于技术映射。
demiter–假设网络是由两个逻辑锥XORing导出的单个输出斜接器。将斜接分解为两个原始圆锥体,作为主输出添加到当前网络。
double–通过创建两个并行副本复制当前网络。PI、POs和寄存器的数量增加了一倍。
espresso–通过应用SOP minimizer espresso MV最小化节点的当前本地功能。
exdc_free–删除当前网络的exdc网络。
exdc_get–使当前网络等于当前网络的exdc。
exdc_set–将给定网络(从文件)设置为当前网络的exdc。
ext_seq_dcs–计算小型时序电路的不可到达状态,并将其作为EXDC添加到当前网络中。此命令可作为Do-cares for逻辑优化的来源。
frames–在给定数量的时间帧内展开顺序电路。Switch–i使用锁存器的重置值切换初始化时间帧。如果选择了初始化选项,则生成的网络是组合的。如果选择了未初始化选项,则生成的网络是具有相同锁存器的顺序电路,并且组合逻辑被原始逻辑的多个副本所取代。
gen–逻辑电路的生成器。
logic–将AIG转换为具有两个输入AND门的SOP表示的逻辑网络。
miter–计算在命令行上指定的两个网络的斜接。如果只指定了一个文件名,则会计算该网络与当前网络的斜接。如果在命令行上未指定网络,则创建当前网络及其规范(用作合成起点的网络)的斜接。如果当前网络是连续的,则计算连续斜接(产品机器)。斜接只有一个主要输出,当且仅当网络的行为不同时,该输出等于1。调用斜接计算的网络应该具有相同的PI、PO和锁存器的数量和顺序。当计算顺序斜接时,网络中锁存器的数量和顺序没有限制。
muxes–此命令适用于具有BDD表示的节点的逻辑网络(此类网络是通过在多级网络上运行renode或collapse,或通过使用命令dsd应用不相交的支持分解而产生的)。它通过一组与节点的本地BDD一一对应的多路复用器来替换每个节点。
mvsis–调用mvsis的外部二进制文件,以执行当前ABC网络的命令或脚本。
node–通过从当前网络中提取一个节点来创建网络。
order–为BDD构造计算一个良好的静态变量顺序。
orpos–用一个逻辑函数等于原始PO的布尔OR的PO替换当前网络的PO。
reorder–使用变量筛选对当前网络中所有节点的本地BDD进行重新排序。仅当当前网络是BDD逻辑网络时才有效。
short_names–用简短的字母数字字符串替换PI/PO/锁存器名称。
sis–调用sis的外部二进制文件来执行当前ABC网络的命令或脚本。
sop–将节点的本地函数转换为sop。
test–用于测试实验代码的占位符命令。