一种组合电路门级网表转化为AIGER格式文件的方法与流程

文档序号:16898482发布日期:2019-02-19 17:42阅读:747来源:国知局
一种组合电路门级网表转化为AIGER格式文件的方法与流程

本发明涉及集成电路的验证与综合技术领域,具体涉及一种组合电路门级网表转化为aiger格式文件的方法。



背景技术:

与非图(and-invertergraph,aig)是一种有向无环图,其特点是仅包含“与”和“非”两种逻辑,它具有结构简洁、与电路一一对应的优点。

aiger是一种文件格式、一个库,也是集成了一系列插件的工具,它采用与非图的形式呈现,且容易转换成sat求解器可以接受的命题逻辑公式,从而广泛地应用于学术界和工业界解决验证和优化等问题。目前有工具可以直接将基于硬件描述语言的设计综合成aiger格式文件,但是商用eda工具在综合过程中对电路的时序、面积、功耗等性能指标考虑更为周全。直接综合得到的aiger格式文件与由eda工具生成的门级网表相比,在电路结构上存在明显差异,因而对前者进行形式化分析,不能代替对网表进行的分析。tseytin转化方法将组合逻辑电路作为输入,得到一个合取范式形式的布尔表达式,但是在该方法中电路输出是合取范式的一部分,因而不能直接用于aiger格式的转化。

基于以上技术需求,一种比较合理的做法是:将eda工具综合得到的门级网表转化成aiger格式,在充分保留eda工具综合优势的基础上,得到可供sat求解器处理的网表文件。但是,如何实现上述方案,仍然是一项亟待解决的关键技术问题。



技术实现要素:

本发明要解决的技术问题:针对现有技术的上述问题,提供一种组合电路门级网表转化为aiger格式文件的方法,本发明能够将门级网表的标准单元用主合取范式的形式表示出来再进行aiger格式的转化,具有转换快速方式简单、有效的优点,既充分保留了原有电路结构,又生成了可以被sat求解器处理的文件。

为了解决上述技术问题,本发明采用的技术方案为:

一种组合电路门级网表转化为aiger格式文件的方法,实施步骤包括:

1)读取待转化的组合电路门级网表;

2)遍历组合电路门级网表中的初始输入引脚并生成aiger格式的用于存储初始输入引脚信息的文件input.aag,并将所有输入节点nodein的编号插入预设的队列tq中;

3)建立并打开aiger格式的文件and.aag,该文件用于存储电路中节点之间的逻辑关系;获取队列tq头元素并使其出队,同时将其插入预设的队列q中,出队的元素是某个输入节点nodein的编号,将该元素对应的当前输入节点nodein转化为aiger格式并存储到文件and.aag中;遍历当前输入节点nodein的子节点nodein_c,并将表示nodein输出引脚的变量值赋给表示当前子节点nodein_c输入引脚的变量;

4)获取队列q头元素并使其出队,出队的元素是网表中某个节点node的编号;遍历该元素对应的节点node的子节点,如果当前子节点node_c的层级数大于节点node的层级数加1或者该子节点已经转化为aiger格式,则继续寻找node的下一个子节点;否则将当前子节点node_c转化为aiger格式并存储到文件and.aag中,并且将当前子节点node_c的编号插入队列q;接着遍历node_c的子节点node_c_c,并将表示node_c输出引脚的变量值赋给表示当前子节点node_c_c输入引脚的变量;关闭文件and.aag;

5)将文件input.aag、文件and.aag的内容进行整合,最终形成包含组合电路门级网表所有信息的完整aiger文件。

优选地,步骤2)的详细步骤包括:

2.1)设置用于在aiger格式文件中为每个引脚确定唯一的正整数表示的全局变量nvar,该变量的初值为2;定义队列tq,用于存储网表中与初始输入引脚primaryinput相连的输入节点的编号;定义用于存储电路中初始输入引脚primaryinput编号的向量pis;将所有节点层级数初始化为-1;

2.2)建立并打开aiger格式的用于存储初始输入引脚信息的文件input.aag,设置指向向量pis头部的迭代器pi;

2.3)判断迭代器pi是否指向向量pis的尾部,如果是则跳转执行步骤2.9);否则,跳转执行步骤2.4);

2.4)判断与迭代器pi当前指向的初始输入引脚primaryinput相连的输入节点nodein是否被遍历完毕,如果已经结束遍历,则跳转执行步骤2.8);否则,跳转执行步骤2.5);

2.5)继续遍历与当前primaryinput相连的输入节点nodein,判断队列tq中能否找到当前输入节点nodein的编号,如果不能,则将当前输入节点nodein的编号插入队列tq中;

2.6)将表示初始输入引脚primaryinput的全局变量nvar的值赋给当前输入节点nodein的输入引脚;

2.7)调用深度优先搜索函数搜索当前输入节点nodein的所有后续子节点,同时标记这些子节点的层级数,且标记层级数的原则是取按照不同路径计算得到层级数的最大值;跳转执行步骤2.4);

2.8)将全局变量nvar的值写入文件input.aag,然后将全局变量nvar的值自增2,将迭代器pi的值自增1;跳转执行步骤2.3);

2.9)关闭文件input.aag。

优选地,步骤3)的详细步骤包括:

3.1)建立并打开aiger格式的文件and.aag,该文件用于存储电路中节点之间的逻辑关系,预先初始化队列tq,队列tq用于存储与初始输入引脚primaryinput相连的输入节点nodein的编号;

3.2)判断队列tq是否为空,如果队列tq为空则跳转执行步骤4);如果队列tq非空,则跳转执行下一步;

3.3)获取队列tq的头元素并使其出队,出队的元素是某个输入节点nodein的编号;判断该元素对应的当前输入节点nodein的层级数是否为0,如果为0则跳转执行下一步;否则,跳转执行步骤3.2);

3.4)将步骤3.3)获取的元素插入队列q中,将当前输入节点nodein转化为aiger格式并存储到文件and.aag中;

3.5)判断当前输入节点nodein是否存在子节点,如果不存在子节点则跳转执行步骤3.2);否则,跳转执行步骤3.6);

3.6)判断当前输入节点nodein是否存在尚未遍历的子节点,如果不存在尚未遍历的子节点,则跳转执行步骤3.2);否则,跳转执行步骤3.7);

3.7)继续遍历当前输入节点nodein的子节点,对于遍历到的当前子节点nodein_c,将表示当前输入节点nodein输出引脚的变量值赋给当前子节点nodein_c的输入引脚,注意该输入引脚应当与nodein的输出引脚相连;跳转执行步骤3.6)。

优选地,步骤3.4)中将当前输入节点nodein转化为aiger格式并存储到文件and.aag的详细步骤包括:

3.4.1)对于具有m个输入(x1,x2,…,xm)和n个输出(y1,y2,…,yn)的当前输入节点nodein,根据真值表将每一个输出都表示成输入的主合取范式,输出yi的主合取范式表示为yi=m1∧m2∧…∧mk;

3.4.2)主合取范式中的每个极大项mk都是m个命题变元的析取,极大项mk=p1*∨p2*∨…pm*,其中每个pj*都为m个命题变元中的第j个命题变元pj或者命题变元的否定┐pj;

3.4.3)针对共包含m个命题变元的极大项mk,将mk中的析取逐个转换为aiger语句;对于pi*∨pj*,用“或门”表示该项,若pi*和pj*对应的变量为i和j,则该析取式对应的aiger语句为“nvaru(i)u(j)”,其中nvar为全局变量,u(i)和u(j)为函数,当i为奇数时,u(i)的值为i减1,当i为偶数时,u(i)的值为i加1;将全局变量nvar加2,并将aiger语句写入文件and.aag;用pij*替换pi*∨pj*

3.4.4)将主合取范式yi=m1∧m2∧…∧mk中的合取逐个转换为aiger语句,对于mi*∨mj*,用“与门”表示该项,若mi*和mj*对应的变量为i和j,则该合取式对应的aiger语句为“nvarij”,其中nvar为全局变量,将全局变量nvar加2,并将aiger语句写入文件and.aag;用mij替换mi∧mj。

优选地,步骤4)的详细步骤包括:

4.1)判断队列q是否为空,如果队列q为空则跳转执行步骤4.9);如果队列q非空,则跳转执行下一步;

4.2)获取队列tq的头元素并使其出队,出队的元素是网表中某个节点node的编号;判断该元素对应的当前节点node是否存在子节点,如果不存在子节点则跳转执行步骤4.1);否则,跳转执行下一步;

4.3)判断当前节点node的子节点是否已经遍历完毕,如果已经遍历完毕,则跳转执行步骤4.1);否则,跳转执行下一步;

4.4)继续遍历当前节点node的子节点,针对遍历得到的当前子节点node_c,判断当前子节点node_c的层级数大于节点node的层级数加1或者当前子节点node_c已经转化为aiger格式是否成立,如果成立则跳转执行步骤4.3);否则,跳转执行下一步;

4.5)将当前子节点node_c按照与前文所述相同的方法转化为aiger格式并存储到文件and.aag中;

4.6)判断当前子节点node_c是否存在子节点node_c_c,如果当前子节点node_c存在子节点,则跳转执行步骤4.7);否则,跳转执行步骤4.3);

4.7)判断当前子节点node_c的子节点是否已经遍历完毕,如果已经遍历完毕,则跳转执行步骤4.3);否则,跳转执行步骤4.8);

4.8)将表示当前子节点node_c输出引脚的变量值赋给表示其当前子节点node_c_c输入引脚的变量,注意该输入引脚应当与node_c的输出引脚相连;跳转执行步骤4.7);

4.9)关闭文件and.aag。

和现有技术相比,本发明具有下述优点:

1、本发明提出了一种将门级网表转化成aiger格式的新方法。在现有技术条件下,对直接综合得到的aiger格式文件进行形式化分析,不能替代对由eda工具综合生成的门级网表进行分析。而这种新方法保留了门级网表的电路结构,因而能够解决上述技术难题。

2、本发明得到的aiger格式文件很容易转换成sat求解器可接受的命题逻辑公式,因而为解决验证和优化等问题提供了有效途径。

附图说明

图1为本发明实施例中或门及其等价逻辑结构。

图2为本发明实施例方法的基本流程示意图。

图3为本发明实施例步骤2)的详细流程示意图。

图4为本发明实施例步骤3)~步骤5)的详细流程示意图。

图5为本发明实施例中的primaryinput与输入节点引脚的对应关系示意图。

图6为本发明实施例中的电路层级图。

具体实施方式

由eda工具综合得到的门级网表包含大量标准单元,它们是网表的基本组成部分。理论上,组合电路中,任何一种此类标准单元都能够通过“与门”和“非门”的逻辑组合得到等价的逻辑结构。为实现门级网表与aiger格式文件一一对应的要求,首先为上述标准单元建立一个映射表,在映射表中给出与每一种标准单元逻辑等价的“与门”、“非门”逻辑组合。例如图1(a)中的二输入“或门”,其输入引脚为i、j,输出引脚为y,那么逻辑表示为y=i|j。同时,也可以通过一个二输入“与门”和三个“非门”得到等价的“或”逻辑,对于新生成的电路符号,输入引脚仍然是i、j,输出引脚是y,只是在前者基础上增加了若干个中间引脚,其逻辑表示为y=~(~i&~j)。在aiger格式文件中,每个逻辑门的输入引脚和输出引脚都由唯一的正整数来表示,并且要求输入引脚数字一定在前面被定义。如图1(b)中的二输入“或门”,其aiger表示为:

7

635

其中“7”是或逻辑的输出引脚,表示对“与门”输出引脚“6”的取反;“3”和“5”表示对引脚“2”和“4”的取反;“635”表示由引脚“3”“5”输入的信号经过“与”逻辑,从引脚“6”输出。由此可见,使用“与门”和“非门”表示门级网表中的标准单元时,会增加新的输入引脚和输出引脚。

基于上述映射原理,如图2所示,本发明中组合电路门级网表转化为aiger格式文件的方法的实施步骤包括:

1)读取待转化的组合电路门级网表;

2)遍历组合电路门级网表中的初始输入引脚并生成aiger格式的用于存储初始输入引脚信息的文件input.aag,并将所有输入节点nodein的编号插入预设的队列tq中;

3)建立并打开aiger格式的文件and.aag,该文件用于存储电路中节点之间的逻辑关系;获取队列tq头元素并使其出队,同时将其插入预设的队列q中,出队的元素是某个输入节点nodein的编号,将该元素对应的当前输入节点nodein转化为aiger格式并存储到文件and.aag中;遍历当前输入节点nodein的子节点nodein_c,并将表示nodein输出引脚的变量值赋给表示当前子节点nodein_c输入引脚的变量,这是由于该输入引脚与nodein的输出引脚相连;

4)获取队列q头元素并使其出队,出队的元素是网表中某个节点node的编号;遍历该元素对应的节点node的子节点,如果当前子节点node_c的层级数大于节点node的层级数加1或者该子节点已经转化为aiger格式,则继续寻找node的下一个子节点;否则将当前子节点node_c转化为aiger格式并存储到文件and.aag中,将当前子节点node_c的编号插入队列q;接着遍历node_c的子节点node_c_c,并将表示node_c输出引脚的变量值赋给表示当前子节点node_c_c输入引脚的变量,这是由于该输入引脚与node_c的输出引脚相连;关闭文件and.aag;

5)将文件input.aag、文件and.aag的内容进行整合,最终形成包含组合电路门级网表所有信息的完整aiger文件。

如图3所示,步骤2)的详细步骤包括:

2.1)设置用于在aiger格式文件中为每个引脚确定唯一的正整数表示的全局变量nvar,该变量的初值为2;定义队列tq,用于存储网表中与初始输入引脚primaryinput相连的输入节点的编号;定义用于存储电路中初始输入引脚primaryinput编号的向量pis;将所有节点层级数初始化为-1;

2.2)建立并打开aiger格式的用于存储初始输入引脚信息的文件input.aag,设置指向向量pis头部的迭代器pi;在门级网表转化为aiger格式过程中,每个primaryinput都由变量nvar得到唯一的正整数表示,表示primaryinput的变量值nvar将被写入文件input.aag;

2.3)判断迭代器pi是否指向向量pis的尾部,如果是则跳转执行步骤2.9);否则,跳转执行步骤2.4);

2.4)判断与迭代器pi当前指向的初始输入引脚primaryinput相连的输入节点nodein是否被遍历完毕,如果已经结束遍历,则跳转执行步骤2.8);否则,跳转执行步骤2.5);

2.5)继续遍历与当前primaryinput相连的输入节点nodein,判断队列tq中能否找到当前输入节点nodein的编号,如果不能,则将当前输入节点nodein的编号插入队列tq中;

2.6)将表示初始输入引脚primaryinput的变量值赋给表示当前输入节点nodein的输入引脚的变量,这是由于该输入引脚应当与当前primaryinput相连;primaryinput和与其相对应的nodein的输入引脚,在aiger格式中两者的正整数表示相同,如图5所示,因而将表示前者的变量值nvar赋给后者;

2.7)调用深度优先搜索函数搜索当前输入节点nodein的所有后续子节点,同时标记这些子节点的层级数,且标记层级数的原则是取按照不同路径计算得到层级数的最大值;跳转执行步骤2.4);本实施例通过递归调用深度优先搜索函数,搜索当前输入节点nodein的所有后续子节点,同时标记这些子节点的层级数;在递归过程中,当遇到没有子节点的节点时递归结束。标记层级数的原则是取按照不同路径计算得到层级数的最大值,如图6所示。例如在处理过程中,如果nodein_c的层级数小于numlevel(变量numlevel>=0,是当前计算所得的层级数),则将其层级数更新为numlevel,否则nodein_c的层级数保持不变。对当前输入节点nodein完成深度优先搜索后,则跳转执行步骤2.4);

2.8)将全局变量nvar的值写入文件input.aag,然后将全局变量nvar的值自增2,将迭代器pi的值自增1;跳转执行步骤2.3);

2.9)关闭文件input.aag。

如图4所示,步骤3)的详细步骤包括:

3.1)建立并打开aiger格式的文件and.aag,该文件用于存储电路中节点之间的逻辑关系(“与门”和“非门”的逻辑关系),预先初始化队列tq,队列tq用于存储与初始输入引脚primaryinput相连的输入节点nodein的编号;

3.2)判断队列tq是否为空,如果队列tq为空则跳转执行步骤4);如果队列tq非空,则跳转执行下一步;

3.3)获取队列tq的头元素并使其出队,出队的元素是某个输入节点nodein的编号;判断该元素对应的当前输入节点nodein的层级数是否为0,如果为0则跳转执行下一步;否则,跳转执行步骤3.2);

3.4)将步骤3.3)获取的元素插入队列q中,将当前输入节点nodein转化为aiger格式并存储到文件and.aag;

3.5)判断当前输入节点nodein是否存在子节点,如果不存在子节点则跳转执行步骤3.2);否则,跳转执行步骤3.6);

3.6)判断当前输入节点nodein是否存在尚未遍历的子节点,如果不存在尚未遍历的子节点,则跳转执行步骤3.2);否则,跳转执行步骤3.7);

3.7)继续遍历当前输入节点nodein的子节点,对于遍历到的当前子节点nodein_c,将表示当前输入节点nodein的输出引脚的变量值赋给表示当前子节点nodein_c的输入引脚的变量,注意该输入引脚应当与nodein的输出引脚相连;跳转执行步骤3.6)。

如图4所示,步骤3.4)中将当前输入节点nodein转化为aiger格式并存储到文件and.aag的详细步骤包括:

3.4.1)对于具有m个输入(x1,x2,…,xm)和n个输出(y1,y2,…,yn)的当前输入节点nodein,根据真值表将每一个输出都表示成输入的主合取范式,输出yi的主合取范式表示为yi=m1∧m2∧…∧mk;

3.4.2)主合取范式中的每个极大项mk都是m个命题变元的析取,极大项mk=p1*∨p2*∨…pm*,其中每个pj*都为m个命题变元中的第j个命题变元pj或者命题变元的否定┐pj;

3.4.3)针对共包含m个命题变元的极大项mk,将mk中的析取逐个转换为aiger语句;对于pi*∨pj*,用“或门”表示该项,若pi*和pj*对应的变量为i和j,则该析取式对应的aiger语句为“nvaru(i)u(j)”,其中nvar为全局变量,u(i)和u(j)为函数,当i为奇数时,u(i)的值为i减1,当i为偶数时,u(i)的值为i加1;将全局变量nvar加2,并将aiger语句写入文件and.aag;例如,首先处理p1*∨p2*,用“或门”表示该项。当前用于aiger格式的全局变量为nvar,p1*和p2*分别对应的变量为i和j,则p1*∨p2*对应的aiger语句为“nvaru(i)u(j)”,其中nvar为全局变量,u(i)和u(j)为函数,当i为奇数时,u(i)的值为i减1,当i为偶数时,u(i)的值为i加1,这样做一是考虑到用“与门”和“非门”表示“或”逻辑时,原始输入引脚均要取反才能作为“与门”的输入;二是由于“与门”输出引脚对应的变量值一定是偶数,该值加1表示输出信号取反。用p12*替换p1*∨p2*,p12*对应的变量值为nvar+1。鉴于增加一个新的“与门”,nvar应自增2。按照同样的方法处理p12*∨p3*,并将其对应的aiger语句写入文件and.aag中;重复上述步骤,直至极大项mk可以由变量表示出来。

3.4.4)将主合取范式yi=m1∧m2∧…∧mk中的合取逐个转换为aiger语句,对于mi*∨mj*,用“与门”表示该项,若mi*和mj*对应的变量为i和j,则该合取式对应的aiger语句为“nvarij”,其中nvar为全局变量,将全局变量nvar加2,并将aiger语句写入文件and.aag。例如,首先处理m1∧m2,用“与门”表示该项。当前全局变量为nvar,m1和m2对应的变量分别为i和j,则m1∧m2对应的aiger语句为“nvarij”,将该语句写入文件and.aag中,用m12替换m1∧m2,mp12对应的变量为nvar。鉴于增加一个“与门”,nvar应自增2。按照相同方法处理m12∧m3,并将其对应的aiger语句写入文件and.aag中;重复上述步骤,直至yi可以由变量表示。

如图4所示,步骤4)的详细步骤包括:

4.1)判断队列q是否为空,如果队列q为空则跳转执行步骤4.9);如果队列q非空,则跳转执行下一步;

4.2)获取队列tq的头元素并使其出队,该元素是网表中某个节点node的编号;判断该元素对应的当前节点node是否存在子节点,如果不存在子节点则跳转执行步骤4.1);否则,跳转执行下一步;

4.3)判断当前节点node的子节点是否已经遍历完毕,如果已经遍历完毕,则跳转执行步骤4.1);否则,跳转执行下一步;

4.4)继续遍历当前节点node的子节点,针对遍历得到的当前子节点node_c,判断当前子节点node_c的层级数大于节点node的层级数加1或者当前子节点node_c已经转化为aiger格式是否成立,如果成立则跳转执行步骤4.3);否则,跳转执行下一步;

4.5)将当前子节点node_c按照与前文所述相同的方法转化为aiger格式并存储到文件and.aag中;

4.6)判断当前子节点node_c是否存在子节点node_c_c,如果当前子节点node_c存在子节点,则跳转执行步骤4.7);否则,跳转执行步骤4.3);

4.7)判断当前子节点node_c的子节点是否已经遍历完毕,如果已经遍历完毕,则跳转执行步骤4.3);否则,跳转执行步骤4.8);

4.8)将表示当前子节点node_c的输出引脚的变量值赋给表示其当前子节点node_c_c的输入引脚的变量,注意该输入引脚应当与node_c的输出引脚相连;跳转执行步骤4.7);

4.9)关闭文件and.aag。

以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1