如何将c代码转换为布尔表达式?

How to convert c code to boolean expressions?

提问人:PeterMacGonagan 提问时间:12/21/2021 最后编辑:ProgmanPeterMacGonagan 更新时间:12/28/2021 访问量:264

问:

我想在等效的布尔公式/表达式中导出一个简单的 c 代码。 举个例子:

int main(void) {
   int i, a, b, c, r;

   a=1; b=2;
   c=a+b; %ADD operator
   c=c*b;

   c=c>>1; %RSHIFT operator

   r=10;
   for(i=0;i<5;i++) { //... need to unwind the loop
      r=r+1; //r++;
   }

   return 0; 
}

第 1 阶段:循序渐进和展开循环

int main(void) {
   int I0, A0, B0, C0, R0;

   A0=1; B0=2;
   C0=A0 + B0; %ADD operator
   C1 = C0 * B0;

   C2 = C1 >> 1; %RSHIFT operator

   R0=10;
   //for(i=0;i<5;i++) { //... need to unwind the loop
   //   r=r+1; //r++;
   //}
   R1=R0+1;
   R2=R1+1;
   R3=R2+1;
   R4=R3+1;
   R5=R4+1;

   return 0; 
}

第 2 阶段:“二元等价”

%int I0, A0, B0, C0, R0; //suppose int=8bits in this case (simplification)

I = [i7 i6 i5 ... i0]; %binary register
A = [a7 a6 a5 ... a0];
B = [b7 b6 b5 ... b0];
C = [c7 c6 c5 ... c0];
R = [r7 r6 r5 ... r0];

%A0=1; B0=2;
A0 = [0 0 0 0 0 0 0 1]; //a0=1 
B0 = [0 0 0 0 0 0 1 0]; //b1=1

%C0=A0 + B0; %ADD operator  
C0 = binADD(A0,B0); %use only logic function (example: multiple full adder XOR(XOR(...),...))

%C1 = C0 * B0;
C1 = binMULTIPLY(C0, B0); %use only logic function

%C2 = C1 >> 1; %RSHIFT operator
=> C2 = SHIFTR(C1,1);
C2_0 = C1_1;
C2_1 = C1_2;
C2_2 = C1_3;
C2_3 = C1_4;
C2_4 = C1_5;
C2_5 = C1_6;
C2_6 = C1_7;
C2_7 = 0;

%R0=10;
%R1=R0+1;
%R2=R1+1;
%R3=R2+1;
%R4=R3+1;
%R5=R4+1;

...

最后,我想得到一个变量的表达式。

以 C 为例: C = f(A,B) = f(a7,a6,...A0,B7,B6,...b0)

假设 a 或 b 可以是介于 0 和 255 之间的值 (a=k1; b=k2;)

我看到了很多软件:CMBC、NuSMV 等。但是我找不到如何导出等效的布尔表达式(以 CNF - 二进制形式为例)。

注意:我的目标是在逻辑电路中转换这些表达式。

C 布尔逻辑 转换器

评论

1赞 12/21/2021
boolean, CNF好的,一些带有真/假值和逻辑运算符的公式...... 什么是“2”?b=2
0赞 PeterMacGonagan 12/22/2021
我希望 b 以二进制形式“表达”。所以,b=(10)_2 = (b1,b0) = (1,0) = (b1 2^1 + b0)。可能是 8 位或 16 位数字的格式。你有能够做到这一点的软件吗?我认为,这种转换必须在 FPGA 软件中进行......
0赞 12/22/2021
我试图了解你首先要实现的目标。CNF 中的布尔公式将有一些输入和一个真/假输出。您的程序具有...没有输入,并且始终返回零。不,不明白。也许您应该手动进行示例转换并显示您想要得到的内容。

答:

1赞 alias 12/28/2021 #1

您可以使用 SMT 求解器的位爆破策略来实现您正在尝试执行的一些操作。请注意,结果既不容易阅读,也不容易被其他程序剖析。有关提示,请参阅此问题/答案:https://stackoverflow.com/a/56819837/936310