作者虽然遇到过“
摧毁垄断…… ”一文,尽管离
EDA很远,但天生好奇心强,但他并不懒惰地跟随链接,并且不由自主地陷入困境,以为自己的主要技术解决方案之一是使用成排的标准单元格(
标准单元格)。版式)-看起来很有争议。
是的,这种排列是直观的,因为我们以类似的方式进行读写,此外,将单元按行排列在技术上很简单,连接VDD和GND总线非常方便。 另一方面,出现了复杂的组合问题,有必要将电路切成线性部分,并以这样的方式布置这些部分,以(大致)最小化接头的总长度。
当然,问题在于是否存在替代解决方案,如果...
图1标准单元格的典型行( 从此处开始 )如果呢
从减少总键长的角度来看,将标准单元沿着
扫掠前
曲线之一排列是很有用的:Peano或Hilbert。
这些曲线由各种“圆角和缝隙”组成,以确保存在一种配置,在该配置中,连接的标准单元平均彼此靠近。
或者它可以用作零迭代以进行进一步优化。
图2 Hilbert曲线,字段8X8和64X64- 扫描曲线是自相似的,非常适合整个概念。
- 他们有很高的地理位置,即 位于曲线附近某处的点最有可能在空间中。
- 包含按层次结构组织的渠道网络。
- 对于逻辑电路,您可以选择一个合适的正方形或矩形1x2,2x1,将其放置在多余的位置,然后沿扫掠曲线“移动”(参见图3)以选择最佳几何形状,因为这只是一个自由度,而且成本函数相当便宜。
- 轮胎(VDD / GND)的连接便利性仍然存在。
- ...
图3希尔伯特曲线的三段不同的位移。因此:
- 我们将用希尔伯特曲线进行实验
- 我们将在64X64的正方形中进行实验(图3)
- 在曲线的基本步骤中,可以有几个标准单元格和空间- 实验参数的数量和顺序是多少
- 所有基本步骤均按相同顺序排列
- 基本步骤是重叠的,即 如果步骤以标准单元格开始,则其末尾必须有一个空格,反之亦然
- 所有空格和标准单元格大小相同-1X1
- 所有单元以某种顺序序列化,该顺序也是一个参数
- 另外一个参数是从曲线起点(点(0,0))开始的偏移,从该起点开始,我们将按一定顺序排列标准像元
- 标准单元之间的键长根据L1(曼哈顿距离)计算
- 所有键的长度之和为所需值,确定了最小数量后,我们将找到最佳位置
作为实验兔子,让我们采用8位加法器。 它很简单,但并不琐碎。 里面有很多元素和联系,可以感觉到潜在的利弊。 同时,没有足够的人能够“在膝盖上”进行实验。
累加器
图4是完整的一位加法器的示意图图5因此可以从graphwiz看到这个图实用程序Neato6 8位带符号加法器, 在这里但是我们将只使用整数,而没有错误标志W。
图7因此8位加法器看到了graphwiz的点实用程序。它看起来像小天鹅的舞蹈。
图8是使用neato优化后的同一图。点数有向图sum8 {
a_0;
a_1;
a_2;
a_3;
a_4;
a_5;
a_6;
a_7;
b_0;
b_1;
b_2;
b_3;
b_4;
b_5;
b_6;
b_7;
s_0;
s_1;
s_2;
s_3;
s_4;
s_5;
s_6;
s_7;
p0;
p1;
和1_0;
和1_1;
和1_2;
和1_3;
和1_4;
和1_5;
和1_6;
和1_7;
and2_0;
and2_1;
和2_2;
and2_3;
and2_4;
and2_5;
and2_6;
and2_7;
and3_0;
和3_1;
和3_2;
and3_3;
and3_4;
and3_5;
and3_6;
and3_7;
and4_0;
and4_1;
和4_2;
and4_3;
and4_4;
and4_5;
and4_6;
and4_7;
或1_0;
或1_1;
或1_2;
或1_3;
或1_4;
或1_5;
或1_6;
或1_7;
or2_0;
or2_1;
或2_2;
or2_3;
or2_4;
or2_5;
or2_6;
or2_7;
或3_0;
或3_1;
或3_2;
or3_3;
or3_4;
or3_5;
or3_6;
or3_7;
或4_0;
或4_1;
或4_2;
or4_3;
or4_4;
or4_5;
or4_6;
or4_7;
not1_0;
not1_1;
not1_2;
not1_3;
not1_4;
not1_5;
not1_6;
not1_7;
a_0-> and1_0;
a_1-> and1_1;
a_2-> and1_2;
a_3-> and1_3;
a_4-> and1_4;
a_5-> and1_5;
a_6-> and1_6;
a_7-> and1_7;
b_0-> and1_0;
b_1-> and1_1;
b_2-> and1_2;
b_3-> and1_3;
b_4-> and1_4;
b_5-> and1_5;
b_6-> and1_6;
b_7-> and1_7;
a_0-> or1_0;
a_1-> or1_1;
a_2-> or1_2;
a_3-> or1_3;
a_4-> or1_4;
a_5-> or1_5;
a_6-> or1_6;
a_7-> or1_7;
b_0-> or1_0;
b_1-> or1_1;
b_2-> or1_2;
b_3-> or1_3;
b_4-> or1_4;
b_5-> or1_5;
b_6-> or1_6;
b_7-> or1_7;
and1_0-> or3_0;
and1_1-> or3_1;
和1_2-> or3_2;
and1_3-> or3_3;
and1_4-> or3_4;
and1_5-> or3_5;
and1_6-> or3_6;
and1_7-> or3_7;
and1_0-> and3_0;
and1_1-> and3_1;
and1_2-> and3_2;
and1_3-> and3_3;
and1_4-> and3_4;
and1_5-> and3_5;
and1_6-> and3_6;
and1_7-> and3_7;
or1_0-> and2_0;
or1_1-> and2_1;
or1_2-> and2_2;
or1_3-> and2_3;
or1_4-> and2_4;
or1_5-> and2_5;
or1_6-> and2_6;
or1_7-> and2_7;
or1_0-> or2_0;
or1_1-> or2_1;
or1_2-> or2_2;
or1_3-> or2_3;
or1_4-> or2_4;
or1_5-> or2_5;
or1_6-> or2_6;
or1_7-> or2_7;
and2_0-> or3_0;
and2_1-> or3_1;
and2_2-> or3_2;
and2_3-> or3_3;
and2_4-> or3_4;
and2_5-> or3_5;
and2_6-> or3_6;
and2_7-> or3_7;
or2_0-> and4_0;
or2_1-> and4_1;
or2_2-> and4_2;
or2_3-> and4_3;
or2_4-> and4_4;
or2_5-> and4_5;
or2_6-> and4_6;
or2_7-> and4_7;
and3_0-> or4_0;
and3_1-> or4_1;
and3_2-> or4_2;
and3_3-> or4_3;
and3_4-> or4_4;
and3_5-> or4_5;
and3_6-> or4_6;
and3_7-> or4_7;
or3_0-> not1_0;
or3_1-> not1_1;
or3_2-> not1_2;
or3_3-> not1_3;
or3_4-> not1_4;
or3_5-> not1_5;
or3_6-> not1_6;
or3_7-> not1_7;
not1_0-> and4_0;
not1_1-> and4_1;
not1_2-> and4_2;
not1_3-> and4_3;
not1_4-> and4_4;
not1_5-> and4_5;
not1_6-> and4_6;
not1_7-> and4_7;
and4_0-> or4_0;
and4_1-> or4_1;
and4_2-> or4_2;
and4_3-> or4_3;
and4_4-> or4_4;
and4_5-> or4_5;
and4_6-> or4_6;
and4_7-> or4_7;
or4_0-> s_0;
or4_1-> s_1;
or4_2-> s_2;
or4_3-> s_3;
or4_4-> s_4;
or4_5-> s_5;
or4_6-> s_6;
or4_7-> s_7;
p0-> and2_0;
p0-> or2_0;
p0-> and3_0;
or3_0-> and2_1;
or3_0-> or2_1;
or3_0-> and3_1;
or3_1-> and2_2;
or3_1-> or2_2;
or3_1-> and3_2;
or3_2-> and2_3;
or3_2-> or2_3;
or3_2-> and3_3;
or3_3-> and2_4;
or3_3-> or2_4;
or3_3-> and3_4;
or3_4-> and2_5;
or3_4-> or2_5;
or3_4-> and3_5;
or3_5-> and2_6;
or3_5-> or2_6;
or3_5-> and3_6;
or3_6-> and2_7;
or3_6-> or2_7;
or3_6-> and3_7;
or3_7-> p1;
}
实验1
- 希尔伯特曲线的基本步骤-(通过,单元,单元,通过)
- 图顶点(单位单元)按字母顺序排序
图9 X-从头开始移动,Y-所有路径的长度移位207(所有键的总长度为1968)时的最小距离(第一个),让我们看看这种最佳排列是什么样的。
图10是移位207的最佳曲线,它看起来不是很好。实验2
- 希尔伯特曲线的基本步骤-(通过,单元,单元,通过)
- 图的顶点(单位单元格)的自然顺序(如在图的说明中所述,请参见上面的图的说明)-
X上的11-从起点开始的位移,Y上的-所有路径的长度图12剪力11长度750的最佳曲线实验3
- 希尔伯特曲线的基本步骤-(通过,单元,单元,通过)
- 顶点的顺序是通过遍历图的宽度确定的,列表开头没有链接的顶点,周末是末尾的链接
图13 X表示从头开始移动,Y表示所有路径的长度图14最佳布置-换档3,总长度1451
将所有输入顶点放在开始处,而输出放在末尾不是很好
一个想法。实验4
- 希尔伯特曲线的基本步骤-(通过,单元,单元) Sic!
- 顶点顺序是自然的,如实验2所示
图15 X-从头开始偏移,Y-所有路径的长度图16最佳布置-换档10,总长度503实验5
我们需要对IO做一些事情,我们在后期处理中定义它们,即 每班
建立没有IO顶点的排列,然后在图形周围构造一个吸收性范围框架,将IO顶点应用于框架的最近未占用点并计算最终长度
- 希尔伯特曲线的基本步骤-(跳过,单元格,单元格)
- 顶点的顺序取决于宽度,但没有IO顶点
图17 X表示从起点开始的位移,Y表示所有路径的长度图18最佳位置是移位607,总长度484,平均值3.33793它看起来不错,但是如果我们不优化路径的总长度,而是优化它与占用矩形区域的总和,该怎么办。 它们的尺寸不同,因此我们假设我们不是计算路径的长度,而是计算路径下的面积。
实验6
参数与实验5相同,我们优化了面积。
图19 X-从头开始偏移,Y-所有路径的长度图20最佳布置-变速966,总长度639,平均3.30345矩形变长了。 但是,如果我们不考虑矩形的面积,而是考虑斜边的正方形,将我们推向更多正方形,该怎么办?
实验7
参数与实验5相同,我们优化了斜边的平方。
图21 X表示从起点开始的位移,Y表示所有路径的长度图22最佳布置-班次70,总长702,平均值3.46207实验8
- 希尔伯特曲线的基本步骤-(单元格,跳过) Sic!
- 顶点的顺序取决于宽度,但没有IO顶点
我们假设在Y中行走的成本是在X中行走的成本的两倍,这更接近实际。
图23 X表示从起点开始的位移,Y表示所有路径的长度图24最佳布局-班次344,全长650,平均3.8结论
初步的“编辑选择”-实验6。
最好布置IO顶点,但这需要从侧面给出提示,
此类顶点应确切地位于(方向)上。
但是首先,我想听听专家的意见。
PS :感谢
YuriPanchul和
andy_p缺乏反射阴性反应。
UPD (11/02/2019):添加了“实验8”,其中标准单元格位于希尔伯特曲线的节点处,即 严格在正方形格子上。 此外,一方面,它们被组合成传统的行,另一方面,它们沿希尔伯特曲线定位。