B*Tree + 模拟退火算法
-
github:https://github.com/NewmiLeou/Fixed-outline-Floorplan-Design.git
-
解析文件,终端有位置,block有长宽,还有net信息
NumHardRectilinearBlocks : 100
NumTerminals : 334
NumNets : 885
NumPins : 1873
说明:sb0对应的id是0,p1对应的是id是1,但在net中,p1对应的id是hardblock+1
这样处理,导致terminals[0]没用到,因为没有p0,但是id是连续的
-
生成初始化B*Tree
- 有一个记录是否插入树的insert:vector,用0,1标记是否插入,一个queue bfs用来知道那些没有左右节点的节点。
- root:0~99
- bstar_tree[root]
- i:记录未插入节点的数量
- 最后生成的B*Tree是记录0~99索引下,每个的parent,leftchild,rightchild
-
B*Tree转为图
- 子节点的x坐标可根据父节点来定
- 子节点的y坐标根据父节点和contour来定,找到子节点的x_left,x_right,再找到这个范围最高的边界y_max,y_max就是子节点的y坐标
- 确定了子节点放的位置后,更新contour
-
计算cost
-
遍历hardblocks,计算出最大长宽
-
double floorplan_area = width * height;
-
double R = (double)height / width;
-
遍历nets中的net,用block中心作为该block的pin的位置,使用HPWL算法计算方法线长
-
将初始化B*Tree对应的布图的面积和线长分别设置为area_normal,wl_normal
-
double area_cost = c.area / area_normal; double wl_cost = c.wirelength / wl_normal; double R_cost = (1-R) * (1-R); if(width > W) width_penalty = (double)width / W; if(height > W) height_penalty = (double)height / W;
-
c.cost = area_cost + wl_cost + 0.6*R_cost + width_penalty + height_penalty
-
-
模拟退火的move
- 三种操作,一种是rotate,一种是两节点交换位置,一种是move
- 两节点交换位置可能有特殊情况:
- 如交换位置的两节点是父子节点,那么需要纠正,只需纠正自选的情况,例如:交换后的n1的父节点仍是n1
- 如果交换的节点有root,给root重新赋值
- move的两个节点,一个是from,一个是to,from的父节点不能是to,不然move后没意义
- move的第一步,现将from改为无孩子状态,操作如下:
- 如果move的from无孩子,该from的父亲的该位置孩子为-1
- 如果move的from有两个孩子,随机,要么交换from和from的左孩子,要么交换from和from的右孩子,让move的from与其孩子交换到没有孩子为止
- 如果move的from只有一个孩子,也是直接让from的孩子作为from的父亲的孩子
- move后,from作为to的(左/右)孩子,to的(左/右)孩子作为from的孩子
-
模拟退火
- 初始温度T0 = -min_cost.cost*num_hard / log§; P=0.95,cost越高,num_hard越高,T0越高
- 改变一次,MT++,计算delta_cost,new-old
- 当delta_cost<0,或者随机数<exp(-delta_cost/T)温度越高,跳的概率越大,delta_cost正的越多,跳的概率越小
- 记录过程中new_cost能in_fixed_outline,且最小cost的
- 记录过程中最下cost的
- 如果delta_cost<0,uphill++
- 如果拒绝,reject++
- uphill<=N && MT<=2*N; N = k * num_hard; k=20
- 如果处理时间太久,且没有在fixed范围的,就显示超时,且让温度重新回复初始温度
- 如果已经有fixed范围的,且单次操作时间超过范围,或者运行时间超过范围,则停止运行
变量名 | 描述1 | 描述2 |
---|---|---|
num_hard | hardblock的数量 | |
num_terminal | terminal的数量 | |
hardblocks | vector | Hardblock:id,x,y,w,h,rotate |
total_block_area | hardblocks的面积之和 | |
fixed_outline_area | 边界面积 | fixed_outline_area = total_block_area * (1 + dead_space_ratio); |
W | sqrt(fixed_outline_area) | |
num_net | ||
num_pin | ||
nets | vector<vector> | sb0对应的id是0,p1对应的是hardblock+1 |
terminals | vector | Terminal:id,x,y |
bstar_tree | vector | Node:parent,leftchild,rightchild |
contour | vector(5*W,0); | 记录边界 |
r | 温度衰减系数 |