将容器添加到z3中的解算器时出错

将容器添加到z3中的解算器时出错,z3,smt,Z3,Smt,对于上面verilog中的assign语句,我在z3中实现它时遇到了错误 我的代码: assign wfwe = wb_acc & (adr_i == 2'b10) & ack_o & we_i; 我在上面的add语句中遇到错误: 错误:类上下文中的方法mkBVAND无法应用于给定类型; 必需:BitVecExpr,BitVecExpr 找到:BitVecExpr、BoolExpr 这是真的。有人能建议我变通一下吗。我是否执行不正确请让我知道 报告此错误是因为mkBV

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

我的代码:

assign wfwe = wb_acc & (adr_i == 2'b10) & ack_o &  we_i;
我在上面的add语句中遇到错误: 错误:类上下文中的方法mkBVAND无法应用于给定类型; 必需:BitVecExpr,BitVecExpr 找到:BitVecExpr、BoolExpr


这是真的。有人能建议我变通一下吗。我是否执行不正确请让我知道

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

以下是此示例的问题:

1)
ctx.mknumeric(“2”,2)
不正确。我猜目的是创建一个2位的bv数字,值为2;最简单的方法是
ctx.mkBV(2,2)

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

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]));
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));
e
作为结果

3)
ctx.mkBVAND
只接受两个参数,不多也不少。因此,需要重写BVAND表达式,例如,如下所示:

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]));
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));
4) 结果需要再次转换为布尔表达式,例如

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

其中
q
是BVAND的结果。

这确实有道理。我将修改解析器脚本以包含这些更改。你的建议真的像往常一样有用。