将符号添加到z3中的求解器时出错

时间:2015-08-05 20:07:14

标签: z3 smt

assign wfwe = wb_acc & (adr_i == 2'b10) & ack_o &  we_i;

对于verilog中的上述assign语句,我在z3中实现它时遇到错误

我的代码:

BitVecExpr[] wfwe = new BitVecExpr[1];
BitVecExpr[] wb_acc = new BitVecExpr[1];
BitVecExpr[] adr_i = new BitVecExpr[1];
BitVecExpr[] ack_o = new BitVecExpr[1];
BitVecExpr[] we_i = new BitVecExpr[1];

wfwe[0] = ctx.mkBVConst("wfwe",1);
wb_acc[0] = ctx.mkBVConst("wb_acc",1);
adr_i[0] = ctx.mkBVConst("adr_i",2);
ack_o[0] = ctx.mkBVConst("ack_o",1);
we_i[0] = ctx.mkBVConst("we_i",1);

Solver s = ctx.mkSolver();

s.add(ctx.mkBVAND(wb_acc[0],ctx.mkEq(adr_i[0],ctx.mkNumeral("2",2)),ack_o[0],we_i[0]));

我在上面的add语句中遇到错误: 错误:类Context中的方法mkBVAND不能应用于给定的类型; 必需:BitVecExpr,BitVecExpr 发现:BitVecExpr,BoolExpr

这是真的。任何人都可以建议我解决方法。我实施不正确请告诉我。

1 个答案:

答案 0 :(得分:1)

报告此错误是因为mkBVAND的第二个参数是布尔表达式(ctx.mkEq ...)。请注意,大小为1的布尔值和BitVectors不是一回事,它们不会自动转换。在它们之间进行转换的最简单方法是使用if-then-else选择正确的值。

这是这个例子的问题:

1)$location = 'https://mywebsite.com/abc/'; $params = '?a=xyz'; // set your parameters in variable header("Location: $location.$params"); // double-quote there 不正确。我想这是为了创建一个2位的bv数字,值为2;最简单的方法是ctx.mkNumeral("2",2)

2)mkBVAND的第二个参数需要从Bool转换为BitVector,例如:

ctx.mkBV(2, 2)

BoolExpr c = ctx.mkEq(adr_i[0], ctx.mkBV(2, 2)); BitVecExpr e = (BitVecExpr) ctx.mkITE(c, ctx.mkBV(1, 1), ctx.mkBV(0, 1)); 是结果。

3)e只需要2个参数,不多也不少。因此,需要重写BVAND表达式,例如:

ctx.mkBVAND

4)结果需要再次转换为布尔表达式,例如

ctx.mkBVAND(ctx.mkBVAND(wb_acc[0], e), ctx.mkBVAND(ack_o[0], we_i[0])))

其中ctx.mkEq(q, ctx.mkBV(1, 1)) 是BVAND的结果。