BTree + 模拟退火算法

B*Tree + 模拟退火算法

  1. github:https://github.com/NewmiLeou/Fixed-outline-Floorplan-Design.git

  2. 解析文件,终端有位置,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是连续的

  3. 生成初始化B*Tree

    • 有一个记录是否插入树的insert:vector,用0,1标记是否插入,一个queue bfs用来知道那些没有左右节点的节点。
    • root:0~99
    • bstar_tree[root]
    • i:记录未插入节点的数量
    • 最后生成的B*Tree是记录0~99索引下,每个的parent,leftchild,rightchild
  4. B*Tree转为图

    • 子节点的x坐标可根据父节点来定
    • 子节点的y坐标根据父节点和contour来定,找到子节点的x_left,x_right,再找到这个范围最高的边界y_max,y_max就是子节点的y坐标
    • 确定了子节点放的位置后,更新contour
  5. 计算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

  6. 模拟退火的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的孩子
  7. 模拟退火

    • 初始温度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_hardhardblock的数量
num_terminalterminal的数量
hardblocksvectorHardblock:id,x,y,w,h,rotate
total_block_areahardblocks的面积之和
fixed_outline_area边界面积fixed_outline_area = total_block_area * (1 + dead_space_ratio);
Wsqrt(fixed_outline_area)
num_net
num_pin
netsvector<vector>sb0对应的id是0,p1对应的是hardblock+1
terminalsvectorTerminal:id,x,y
bstar_treevectorNode:parent,leftchild,rightchild
contourvector(5*W,0);记录边界
r温度衰减系数
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值