在z3py中检索Extract节点的边界

时间:2013-06-18 16:04:11

标签: z3 z3py

我正在使用z3py。我的问题是,如何检索Extract节点的边界?我认为Extract将是一个arity为3的函数,但它不是:

>>> x = BitVecVal(3, 32)
>>> e = Extract(15, 0, x)
>>> e.decl()
Extract
>>> e.decl().arity()
1
>>> e2 = Extract(7, 0, x)
>>> e2.decl()
Extract
>>> e.decl() == e2.decl()
False

每个Extract操作都由前两个参数键入(显然)(我推断这是因为decls不相等)。

如果我给BitVecRef这是一个Extract操作,我该如何判断操作的界限?因此,对于Extract(i, j, x),我想要一个让我回到ij的函数。

1 个答案:

答案 0 :(得分:2)

边界与术语一起编码为“参数”。这些参数不会作为常规参数传递。 python API不公开对参数的访问,但是C API会这样做,你可以从Python调用这些函数(这只是一点点工作)。

您需要的功能是Z3_get_decl_int_parameter。

以下是使用函数的示例:http://rise4fun.com/Z3Py/Rsl8

x = BitVec('x',32)
t = Extract(10,5,x)

f = t.decl()
print Z3_get_decl_int_parameter(t.ctx.ref(), f.ast, 0)
print Z3_get_decl_int_parameter(t.ctx.ref(), f.ast, 1)