1. 简介
Strash (Structural Hash) 是一种基于哈希表的逻辑综合算法,用于减少逻辑电路中重复的子电路。
Strash 算法通过将逻辑电路中的每个门表示为一个节点,并将这些节点哈希到哈希表中,以识别相同的节点并将它们合并为一个节点。这样可以减少电路中的节点数量,从而减少电路的延迟和功耗。
2. 算法实现
Strash 算法的实现需要定义一个哈希函数来将节点映射到哈希表中的桶。一般来说,哈希函数应该满足以下条件:
- 相同的节点应该映射到同一个桶中。
- 不同的节点应该尽可能映射到不同的桶中。
- 哈希函数应该快速计算。
哈希表中的每个桶都包含一个链表,其中存储了哈希函数将同一节点映射到该桶的所有节点。当算法需要插入新节点时,它首先计算节点的哈希值,并在哈希表中查找与该哈希值相同的桶。如果桶中已经有与新节点相同的节点,则直接使用该节点,否则将新节点插入到桶的链表中。
以下是 Strash 算法的基本流程:
- 为输入电路中的每个门创建一个节点。
- 将每个节点哈希到哈希表中。
- 对于每对逻辑门 A 和 B,检查它们是否等价。如果它们等价,则将它们合并为一个节点。
- 删除重复节点,并将电路重新连接。
Strash 算法通常用于先进的逻辑综合工具中,以减少电路的规模和功耗
3. 示例
Strash hash是一种逻辑综合算法,它可以利用相邻的门之间的共同输入将它们合并成一个门,假设有以下Verilog代码描述的逻辑电路:
module example(a, b, c, d, f);
input a, b, c, d;
output f;
wire w1, w2, w3, w4;
assign w1 = ~(a & b);
assign w2 = ~(a & c);
assign w3 = ~(b & c & d);
assign w4 = ~(w1 | w2 | w3);
assign f = ~(a & b & c & d) & w4;
endmodule
可以看到,该电路包含了多个逻辑门,其中包括与门、或门、非门等等。如果使用传统的布尔运算进行化简,这个电路将非常复杂。但是,通过Strash算法进行优化,可以将其简化为如下所示的形式:
module example(a, b, c, d, f);
input a, b, c, d;
output f;
wire w1, w2, w3;
assign w1 = ~(a & b);
assign w2 = ~(a & c);
assign w3 = ~(b & c & d);
assign f = ~(a & b & c & d) & ~(w1 | w2 | w3);
endmodule
可以看到,使用Strash算法进行优化之后,电路变得更加简洁,只有三个逻辑门,比原来的电路少了很多。这种优化方法可以极大地减少逻辑门的数量,从而降低了电路的面积和功耗,提高了电路的性能和可靠性。
相关论文:
- Brayton, R.K., Hachtel, G.D., Sangiovanni-Vincentelli, A.L.: A survey of optimization techniques for integrated circuit design. Proceedings of the IEEE 69(10), 1349–1363 (1981).
- Somenzi, F.: Binary decision diagrams: Theory and implementation. Springer (2011).
- Brayton, R.K., Hachtel, G.D., Sangiovanni-Vincentelli, A.L.: Logic Minimization Algorithms for VLSI Synthesis. Springer (1984).