CUDD包的分析与应用论文.docx
- 文档编号:29744424
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:26
- 大小:131.31KB
CUDD包的分析与应用论文.docx
《CUDD包的分析与应用论文.docx》由会员分享,可在线阅读,更多相关《CUDD包的分析与应用论文.docx(26页珍藏版)》请在冰豆网上搜索。
CUDD包的分析与应用论文
摘要
近几年来,模型检验技术在保证设计正确性的验证上得到了工业界的普遍认可。
但随着电路规模的增大,状态数目将呈指数增加而引起组合爆炸,这就限制了模型检验的应用。
使用二元决策图BDD表示布尔函数,可以减小布尔函数在计算机内部的存储空间。
将BDD引入模型检验中,可以比较有效地缓解模型检验中状态爆炸的问题,极大地提高了模型检验所能验证的系统的规模。
本论文就是基于CUDD(ColoradoUniversityDecisionDiagram)包在BDD方面的研究与应用。
CUDD是一个操纵决策图的软件开发包,它已成为了BDD应用的一个通用模板。
论文首先介绍二元决策图的理论基础上,阐述布尔函数,二元决策图,有序二元决策图,精简有序二元决策图等基本概念;然后介绍CUDD软件包,论述了CUDD包整体的基础架构,并着重对其采用的数据结构和关键算法进行的分析和说明;最后以一个半加器程序为实例来展示CUDD在BDD方面的具体应用。
关键字:
模型检验;布尔函数;CUDD;BDD;算法
Abstract
Inrecentyears,modelcheckingtechnologytoensurethecorrectnessoftheverificationonthedesignindustryhasbeengenerallyrecognized.However,ascircuitsizeincreases,thenumberofstatesincreasedexponentiallycombinatorialexplosioncaused,whichlimitstheapplicationofmodelchecking.UsingbinarydecisiondiagramBDD,saidBooleanfunction,Booleanfunctioncanreducethestoragespaceinsidethecomputer.BDDmodelcheckingwillbeintroduced,youcanmoreeffectivelyalleviatethemodelcheckingprobleminthestateexplosion,whichgreatlyimprovedthemodelcheckingcanverifythesystemsize.
ThispaperisbasedontheCUDD(ColoradoUniversityDecisionDiagram)packageofresearchandapplicationofBDD.CUDDdecisiondiagramisamanipulationofthesoftwaredevelopmentkit,ithasbecomeacommontemplateBDDapplications.
PaperfirstintroducesthetheoryofbinarydecisiondiagrambasedonthesetofBooleanfunctions,binarydecisiondiagram,orderedbinarydecisiondiagram,orderedbinarydecisiondiagramtostreamlinethebasicconcept;thenintroducedCUDDpackage,discussestheCUDDpackageasawholeinfrastructure,andfocusonitsuseofdatastructuresandkeyalgorithmsoftheanalysisanddescription;thelastoneandahalfadderprogramasanexampletodemonstratetheCUDDBDDofthespecificapplicationin.
Keywords:
Modelchecking;Booleanfunction;CUDD;BDD;Algorithm
第一章绪论
1.1本选题的实际意义
在数字控制系统,计算机辅助设计CAD(ComputerAidedDesign),计算机辅助测试CAT(ComputerAidedTest),人工智能AI(ArtificialIntelligence)以及可编程控制器等领域的许多问题都可以表示成一系列关于布尔函数的运算,这些运算有赖于布尔函数的符号表示和算法的有效性。
一般而言,我们通常采用布尔函数表达式或真值表来描述数字逻辑函数。
布尔函数是一种可以精确地描述数字逻辑函数的方法。
但随着大规模和超大规模集成电路的迅速发展,数字逻辑函数的运算变得日益复杂,上述的传统方法逐渐暴露出一些缺点,比如使用布尔函数来表示数字逻辑函数的话,表达式往往会变得庞大和复杂,使得函数处理时间过长;而使用真值表方式的话,则需要占用大量的存储空间,只能用在一些特殊的领域。
鉴于上述的情况,研究人员不断的探索,试图找到描述更加简洁、操作更加方便的数字逻辑函数表达方式。
1986年,E.R.Bryant提出了用二元决策图BDD(BinaryDecisionDiagram)来表示布尔函数,和其他表示法相比BDD在人们寻找大型数字系统的有效分析,测试和计算方法中,由于其固有的优越性能而日益受到重视。
综合来说,BDD具有如下的优点:
(1)直观,明了,便于逻辑电路的分析。
(2)能反映数字电路的逻辑描述的细节,这点对电路的分析和测试非常重要。
(3)便于计算机的存储,编写的程序比布尔代数方法编写的程序更短。
(4)便于使用人工智能的方法,启发式进行求解空间搜索。
(5)不管是硬件还是软件实现,都能获得比布尔代数算法更高的执行速度。
模型检测主要是验证某一模型生成的有限状态系统是否满足模型所要求的属性。
模型检测技术可以抽象地描述为:
给定一个模型M和逻辑描述的性质P,检查模型M中性质P是否成立。
模型检测主要是验证某一模型生成的有限状态系统是否满足模型所要求的属性。
模型检测中最大的挑战就是状态空间的爆炸问题。
这个问题源于系统中有许多不同部件的交互,或者系统中有取值范围很大的复杂数据结构,在这种情况下系统状态的规模将变得非常庞大。
由于BDD所用的存储空间较少,因此研究人员将BDD引入到了模型检验中,使得模型检验所能验证的系统规模得到了很大的提高。
时态逻辑在模型检测中占有非常重要的地位,模型检测是基于时态逻辑,时态逻辑的模型可能由几个状态构成。
时态逻辑公式可能在一些状态为真,在其它为假。
因此,该公式的值随着状态的变化而变化。
依据对系统状态的时间路径的不同刻画,时态逻辑可以分成两大类:
计算树时态逻辑和线性时态逻辑。
计算树时态逻辑CTL(ComputationTreeTemporalLogic)是由Clarke和Emerson提出的。
它的运算符具有简单的性质,可以有效地计算某一公式在有穷状态模型处于某一状态时是否满足。
它是一种时间模型采用树的方式、具有多个分支的不确定状态路径构成。
在模型检测过程中采用BDD的主要原因是:
采用BDD表达的两个谓词公式时,两个BDD范式逻辑相等当且仅当这两个BDD范式是语法相等,即两个BDD范式逻辑相等,当且仅当这两个BDD范式是同一个BDD范式。
目前,利用BDD来对规划问题求解的基本思想是:
先将规划问题的状态和动作表示为BDD范式,再将其输入到BDD的求解器,然后将求解得到的结果转化为一般规划问题的表示。
1.2本论文的主要工作
本论文是基于CUDD包在BDD方面的研究与应用。
它主要由二元决策图的理论基础,CUDD包和一个半加器实例3个模块构成。
在BDD的理论基础中重点阐述了布尔函数,二元决策图,有序二元决策图,精简有序二元决策图的基本概念;关于CUDD包,主要论述的是CUDD的简介,CUDD的获取、编译、链接,以及CUDD的基础架构;最后的半加器程序主要针对BDD的创建,重排,限制,打印作了尽可能详细的解释。
第二章二元决策图的理论基础
2.1布尔函数
布尔函数的定义:
设〈B,∨,∧,′,0,1〉是一个布尔代数,一个从Bn到B的函数,如果能够用该布尔代数上的n元布尔表达式表示,那么这个函数就称为布尔函数。
布尔表达式是由0,1以及变量、布尔运算(与,或,非)构成的符号串,与逻辑公式定义是一致,即:
设有布尔代数及其上的n个变元x1,x2,…,xn,则布尔表达式可归纳地定义为:
(1)0,1和x1,x2,…,xn均是布尔表达式;
(2)如果a1和a2是布尔表达式,则a1∨a2,a1∧a2,a1′也都是布尔表达式;
(3)此外,再没有其它的字符串是布尔表达式。
本文所提出的实现布尔函数运算的方法:
其布尔函数由有向无环图表示。
这种布尔函数的表示方法以二元决策图BDD(BinaryDecisionDiagram)为基础,且对图中节点的变量的编序作了进一步的限制,从而使本文所用的这种表示方法在表示布尔函数并实现其运算的算法上更加有效。
2.2二元决策图
二元决策图BDD(BinaryDecisionDiagram)是有限个节点构成的有向无环图
。
其中,V是G的所有节点的集合,E是G的所有边的集合。
V中的结点分为端节点(用方框表示)和非端节点(用圆框表示)。
每个端节点用0或1标识,无出边(outgoingedge);每个非端节点用变量
标识,并且有两条出边(outgoingedge):
指向右孩子
的then边(用实线表示,表示变量
被赋值为1),指向左孩子
的else边(用虚线表示,表示变量
被赋值为0)。
2.3二元决策图的构造
使用香农展开式
将布尔函数转化为BDD的形式。
2.3.1使用香农展开式转化布尔函数
以
为例,进行香农展开:
步骤一:
生成
:
将
代入
,得到
;
步骤二:
生成
:
将e=1代入
,得到
;
步骤三:
将
和
分别与
与e相乘,得到
;
步骤四:
重复执行步骤一到三,对
和
分别进行展开,依次递归,直到没有变量可以替换为止。
最终的展开结果为:
。
2.3.2构造矩阵
以2.3.1节中的展开式
为例。
构造矩阵:
我们按照从左到右的顺序来依次遍历展开式中的每一个变量,如果遇到的一对变量是以
的形式出现。
则在矩阵中(X,Y)处填入1;如果遇到的一对变量以
的形式出现,则在矩阵中(X,Y)处填人0。
Y
X
e
b
d
1
0
e
0
1
b
1
0
d
1
0
表2.3.2矩阵图
2.3.3构造BDD
通过矩阵来构造BDD:
对于矩阵中的某一项(X,Y),如果该项的值为1,则在BDD中有从节点X到节点Y的一条1边;如果该项的值为0。
则表示在BDD中有从节点X到节点Y的一条0边(1边用实线描述,0线用虚线描述)。
构造的BDD如下图:
图2.3.3二元决策图
2.3.4BDD的简化
布尔表达式转化为BDD之后。
生成的BDD可能会有重复出现的节点,因此最后还需要对生成的BDD进行简化。
按照以下三个原则对BDD进行简化:
(1)保证图中只有一对终节点;
(2)删除0边与1边重合的非终节点,并将指向该节点的边直接指向其后继节点,即该节点满足:
;
(3)如果两个非终节点满足:
,
,
,则只保留其左节点。
2.4有序二元决策图
有序二元决策图OBDD(OrderedBinaryDecisionDiagram)是Bryant提出的一种布尔函数表示法。
它通过在二元决策图BDD(BinaryDecisionDiagram)表示法的基础上引入适当的约束,使之在形式上规范,且能更简单、方便地处理布尔变量间的运算。
满足下面条件的BDD称为有序二元决策图:
(1)有序性条件。
对任意2个相邻变量节点v和u,若u为v的子节点,即
或者
,则有
代表的布尔变量的序号在
之前。
(2)简约性条件。
①无重复的节点:
不存在同时满足
,
和
的2个节点u和v。
若满足,则称u和v为“重复的”节点;②无冗余节点:
不存在满足
的变量节点u。
若满足,则称u为“冗余的”节点。
精简有序二元决策图ROBDD(ReducedOrderedBinaryDecisionDiagram)是一个满足以下条件的OBDD:
对于任意节点
,不会存在
;对于由任意两个节点
作为根节点构成的BDD子图,不存在同构。
2.5其它相关理论
2.5.1零压缩二元决策图
对从
到
的布尔函数
和给定的变量序
(即
是有顺序的),有序二元决策图OBDD是用于表示布尔函数
的一个有向无环图。
零压缩二元决策图ZBDD(Zero-suppressedBinaryDecisionDiagram)是一种特殊的OBDD,是日本学者Minato为了克服OBDD表示组合集合存在的不足而提出的,进一步降低了组合集合表示的空间需求,从而可更为有效地处理组合集合相关的问题。
2.5.2代数决策图
一个代数决策图ADD(AlgebraicDecisionDiagram)就是表示一簇伪布尔函数
(整数集合)的有一个直接根结点的有向无环图。
所有的有限个节点被分为终端节点和非终端节点两类。
在图中一般用圆圈表示非终端节点,用方框表示终端节点。
每个终端节点都被标有Z中的一个元素,并且没有出边。
而每个非终端节点都有两条出边,即0边和1边。
0边是指非终端节点取值0后的分支,在图中一般用虚线表示。
1边是指非终端节点取值1后的分支,在图中一般用实线表示。
对于变量的一组赋值,所得到的函数值由根节点到一个终端节点的一条路径决定。
这条路径所对应的分支由变量的这组赋值来决定,该分支的终端节点所标识的值就是变量在这组赋值下所对应的函数值。
不同的变量序的选择对于ADD的规模有着极大的影响,因此在求伪布尔函数的ADD时,必须说明变量的顺序。
图2.4.2(a)为伪布尔函数
的完全二叉表示,图2.4.2(b)为f在变量序P:
x1 图2.4.2伪布尔函数的两种表示 ADD极大地改善了伪布尔函数和有限域取值函数的描述能力。 目前,ADD数据结构在矩阵乘、最短路径计算、组合电路的时间分析、网络最大流等领域得到了广泛的应用。 第三章CUDD包 3.1CUDD包的简介 CUDD(ColoradoUniversityDecisionDiagram)是一个操纵决策图的软件开发包,它提供函数来操纵二元决策图(BDDs),代数决策图(ADDs)和零压缩二元决策图(ZDDs)。 它的作者是卡罗拉多州立大学电气工程学院的FabioSomenzi。 CUDD包定义了决策图的数据结构和操作决策图的一系列算法: 决策图的建立,遍历,排序,相互转换,决策图上通用算法,ite算法以及节点存储管理等。 这个软件包可以从三个方面来加以利用: 1作为一个黑盒。 在这种情况下,应用程序,需要操作的决策图只需要用软件包导出的函数即可。 CUDD包中包含的丰富函数集合使许多应用程序能够以这种方式编写。 在包的导出功能上编写的应用程序无须关心内部变量重排的细节。 2作为一个白盒。 当基于决策图编写一个复杂的应用程序时,由于效率的原因,函数往往直接作为图的递归操作而不是在现有的原始功能上写。 所以就必须深入软件包的内部,了解其运行的细节,自己为CUDD包增加新的功能,以满足需求。 3通过一个接口。 对于面向对象语言,如C++,能使程序员更自由的管理内存。 一个基于C++的接口已经被包含在CUDD包的分配中了。 它会自动释放决策图,不再由应用程序和重载函数所使用。 几乎所有的功能都是CUDD的导出函数所提供,通过C++接口来利用。 这种方式经常被用在快速原型方案。 3.2CUDD包的安装 CUDD包可以用匿名的方式通过FTP从vlsi.colorado.edu获得。 当前版本为cudd-2.4.2。 cudd-2.4.2包含决策图包,以及基于决策图包的几个应用程序和库,它们可以用ANSIC和C++编译器编译得到。 CUDD可以在linux,Cygwin和OSX下编译通过。 具体步骤可以参看makefile文件。 以下是各平台编译CUDD所要注意的地方。 所有平台 需要修改makefile中的如下行: XCFLAGS=-mcpu=pentiumpro-malign-double-DHAVE_IEEE_754–DBSD -mcpu标记是不需要的,只需要删除它使之变成: XCFLAGS=-malign-double-DHAVE_IEEE_754–DBSD Linux平台 如果用的是32位的OS,那么现在就可以准备编译了。 如果用的是64位的,那么就要用如下行的XCFLAGS代替上面的: XCFLAGS=-ansi-DBSD-DHAVE_IEEE_754-DSIZEOF_VOID_P=8-DSIZEOF_LONG=8 Cygwin和OSX 在$CUDDROOT/util/cpu_stats.c文件下的voidutil_print_cpu_stats(FILE*fp)函数可能会引起错误。 修复的方法是禁止这个函数。 为了禁止这个函数我们需要改动两行。 首先在文件头部找到如下代码: #ifdefined(_IBMR2) #defineetext_etext #defineedata_edata #defineend_end #endif 然后替换第一行(#ifdefined(IBMR2))为: #if0 下一步替换voidutil_print_cpu_stats(FILE*fp)函数中的第一行: #ifdefBSD 为 #if0 最后开始编译。 如果编译成功,将会在$CUDD_ROOT(CUDD根目录)中生成一个include目录,里面链接了所有的外部的头文件。 我们将用到如下已经存在的头文件: $CUDD_ROOT/include/cuddObj.hh 还有如下6个文件被创建了: $CUDD_ROOT/cudd/libcudd.a $CUDD_ROOT/util/libutil.a $CUDD_ROOT/epd/libepd.a $CUDD_ROOT/mtr/libmtr.a $CUDD_ROOT/st/libst.a $CUDD_ROOT/obj/libobj.a 根据这些信息,如下就是一个利用CUDD的应用程序的一个简单的makefile。 SamplemakefileofC++programutilizingCUDD CC=g++ CUDDINCLUDE=cudd/cudd/libcudd.acudd/util/libutil.acudd/epd/libepd.a\ cudd/mtr/libmtr.acudd/st/libst.acudd/obj/libobj.a cuddtest: cudd_example.cpp $(CC)$(CUDDINCLUDE)cudd_example.cpp−ocudd_example 3.3CUDD各模块的功能分析 CUDD包含有cudd,dddmp,epd,mnemosyne,mtr,nanotrav,st,sis,util,obj,include几个文件包。 cudd提供函数来操纵二元决策图(BDDs),代数决策图(ADDs)和零压缩二元决策图(ZDDs)。 其它是辅助包,提供各种相关的辅助功能。 dddmp包用作图的输出格式描述;epd包提供带有扩展双精度算术功能;mnemosyne包用作内存检测和检查内存泄露等。 mnem_malloc(),mnem_calloc(),mnem_realloc(),mnem_free(),mnem_recording(),mnem_setrecording(),mnem_setlog(),mnem_writestats()是其主要声明的函数;mtr这个包提供了两个层次的功能。 低层次的功能操纵多路分支树,根据每个节点指向的第一个孩子节点和兄弟节点的位置来实施。 高层次的功能处理一组树,这些树通过筛选分组来表示分组变量;nanotrav是个可达性的检验包;st包提供函数用来创建,保持,查询符号表;sis提供与VISSIS的接口;util包提供一些通用函数,如计算cpu时间的util_cpu_time(void)函数,搜索文件的util_file_search(charconst*,char*,charconst*)函数等;obj提供c++接口,以便c++程序使用。 3.4CUDD的基本结构 3.4.1垃圾回收 CUDD有一个垃圾回收系统。 当建立BDDs时,是由自底向上的方式。 在进程中,建立了许多已归纳好的小的BDDs来遍历我们的树。 当一个BDDs被归入,它的内存是可以被回收的。 为了使垃圾回收器更方便,需要保证BDD中的每个节点的引用。 为了引用一个节点,用Cudd_Ref(DdNode*)函数,为了释放引用调用Cudd_RecursiveDeref(DdNode*)。 我将在论文的后面更深入的讨论。 3.4.2唯一表 虽然唯一表是不直接运行的,但我们必须知道它的存在。 特别是在检查CUDD源的时候,它是很有必要的。 这个表用来保证指定节点的唯一性,也就是说如果两个节点包含了相同的孩子和相同的变量,那么它就会合成一个节点。 3.4.3数据结构 CUDD中两个最重要的数据结构是DdManager和DdNode。 下面将分别论述。 DdManager DdManager是个CUDD的中央结构体。 创建这个结构体是在写一个CUDD程序首先要做的事情,并且几乎所有的CUDDapi函数都是需要它。 它不需要直接操作和检测结构,只需调用CUDDapi即可。 为了初始化DdManager,调用用如下函数: DdManager*Cudd_Init( unsignedintnumVars,//BDD变量的初始数目 unsignedintnumVarsZ,//ZDD变量的初始数目 unsignedintnumSlots,//唯一表的初始数目 unsignedintcacheSize,//初始化的缓存大小 unsignedlongmaxMemory//最大操作内存 ); 在程序中,可以这样调用: Cudd_Init(0,0,CUDD_UNIQUE_SLOTS,CUDD_CACHE_SLOTS,0); 有用的DdManager函数: intCudd_ReadSize(DdManager*dd);返回管理器中的变量数目 intCudd_ReadNod
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CUDD 分析 应用 论文
![提示](https://static.bdocx.com/images/bang_tan.gif)