在SMT中实现浮点运算的钻头爆破

时间:2017-01-03 14:23:43

标签: z3 smt cvc4

我想知道人们如何实施爆破 SMT求解器中的浮点算术结构。在那儿 任何现有的图书馆或设施(VHDL,...),或 它们是从头开始实施的吗?这代表了多少 (C?C ++?)代码行?

提前致谢。

2 个答案:

答案 0 :(得分:3)

据我所知,存在以下实现:

CBMC(不严格和SMT求解器,但包含必要的位)

https://github.com/diffblue/cbmc/blob/master/src/solvers/floatbv/float_utils.cpp

C ++中大约2KLoC(但是建立在所有位向量操作的实用函数之上,这是另一个2KLoC)。我相信它最初是出自穆勒和保罗的书。 ESBMC包含此代码早期版本的分支。

Z3

请参阅Christoph的上述答案。在Z3中有一个早期的原型实现,其受到#34;的启发。 CBMC的实施,但这已经失去了时间的迷雾。

MathSAT

来源不可用,实施是"受到" CBMC一个,因此大小相似等。

CVC4

我的一个CVC4分支机构:

https://github.com/martin-cs/CVC4/tree/floating-point-symfpu

有一个爆破点的浮点引擎。它被写成一个独立的'库(请参阅src / symfpu - 我会给出完整的链接,但github会阻止每个帖子超过两个链接...),这将单独发布......很快。它在'后端'中进行了参数化。因此它可以用作任意精度浮点库,为不同的求解器生成位向量表达式等。它大约是3.5KLoC的代码,但确实包含一些操作的多个实现。它是从头开始写的(尽管我已经阅读了浮点手册)。

SONOLAR

来源不可用,我相信它是用C ++实现的,并且有人告诉我这是基于Mueller和Paul的书。

请注意,已经有多项严肃的独立工作(交叉)验证和验证这些实施。我不会声称一切都很完美(我们仍然试图对剩余部分和FMA充满信心),但你应该发现它们没有明显的错误。

你可以使用VHDL或Verilog设计,但是...一个好的可合成FPU的原因并不是(必然)能够产生良好编码的东西。我知道有些人使用SoftFloat作为实现的来源,但类似的评论仍然存在。

答案 1 :(得分:1)

没有"很多"在SMT求解器中的实现,但Z3是实现一切的那些之一。代码位于fpa2bv_converter.cpp,并且相当不言自明。对于大部分代码,我从Mueller和Paul"计算机体系结构"中获得灵感。本书,其中有一章介绍浮点电路。 "浮点运算手册" (Muller等人)也提供了大量的信息/程序/电路。