跳至主要內容

iPL-布局工具

iEDA大约 10 分钟

iPL布局工具介绍

1 背景简介

1、布局问题:给定有连接线关系(线网)的单元集合以及布局区域,布局对单元进行放置。一般布局目标是最小化线网总线长/时序/功耗,要求单元满足合法性(在布局区域内、对齐Row/Site、单元相互不重叠等)的规定。

  • 线网:单条线网可连接多个Pin点(Pin点位置在单元上或者是在IO处);线网走线方向只有横纵方向。
  • 单元:形状通常是矩形。单元类型有宏单元、标准单元(时序单元、逻辑单元)等;单元状态有已固定、待放置等。

图1 iPL主要流程图

2 主要实现

2.1 功能实现

图5 iPL中实现的主要布局流程,一步到位求解大规模布局问题是NP难的,因此一般划分为三个阶段:全局布局、合法化和详细布局。

  • Place std cell into proper location
    • satisfy layer poly, well, contact, and metal 1 design rule
    • optimize wirelength, timing, congestion
  • Place macro cell location automatically
  • Incremental placement
  • Timing-driven placement (coming soon)
  • Congestion-driven placement (coming soon)

图6 布局示意图

2.2 工具API实现

方法名子方法类型参数列表返回值方法描述
initAPI*actionpl_json_path, idb_builderself初始化iPL
runFlowrunGPactionvoidself运行全局布局
runFlowrunBufferInsertionactionvoidself运行Buffer插入
runFlowrunLGactionvoidself运行合法化
runFlowrunDPactionvoidself运行详细布局
runFlowwriteBackSourceDataBaseactionvoidself布局数据写回数据源
runIncrLG*actioninst_listself运行增量式合法化
updatePlacerDB*actionvoid/inst_listself从数据源更新(指定)数据
obtainAvailable WhiteSpaceList*actionrow_range,site_rangerectanglelist获取指定区域下的可用布局空间(供插入单元使用)
checkLegality*accessorvoidbool检查当前布局结果的合法性
isSTAStarted*accessorvoidbool检查是否已启动STA
isPlacerDBStarted*accessorvoidbool检查是否已初始化PlacerDB
isAbucasLGStarted*accessorvoidbool检查是否已启动Abucas合法器
reportPLInforeportHPWLInfoaccessorfeedself报告HPWL信息
reportPLInforeportSTWLInfoaccessorfeedself报告STWL信息
reportPLInforeportLongNetInfoaccessorfeedself报告长线网信息
reportPLInforeportLayoutInfoaccessorfeedself报告版图违例信息
reportPLInforeportPeakBinDensityaccessorfeedself报告Bin区域的峰值密度
reportPLInforeportTimingInfoaccessorfeedself报告布局时序信息
reportPLInforeportCongestionInfoaccessorfeedself报告布局拥塞信息
obtainTimingInfoobtainPinEarly(Late)Slackactionpin_namevalue获取Pin上的Slack信息
obtainTimingInfoobtainPinEarly(Late)ArrivalTimeactionpin_namevalue获取Pin上的ArrivalTime信息
obtainTimingInfoobtainPinEarly(Late)RequiredTimeactionpin_namevalue获取Pin上的RequiredTime信息
obtainTimingInfoobtainWNS/TNSactionclk_namevalue获取WNS/TNS信息
obtainTimingInfoupdateTimingactionvoidself更新时序评估
obtainCongesionInfoobtainPinDensactionvoidvalue获取Pin Density信息
obtainCongesionInfoobtainNetCongactionrudy_typevalue获取线网拥塞信息
obtainCongesionInfoevalGRCongactionvoidvalue更新拥塞评估

3 关键技术

3.1 模块设计

图7 iPL模块划分

  • PlacerDB模块:封装并维护布局所需的版图数据(layout)和设计数据(Design)
  • Operator模块:提取布局数据进行操作,期间调用solver模块进行求解,evaluator模块评估指标,checker模块检查布局结果
  • Solver模块:集合一些成熟的求解工具辅助布局
  • Checker模块:对当前布局进行违例检查、功能检测、报告输出Evaluator模块:评估当前布局指标
  • Wrapper模块:从数据源读取布局数据,布局结果写回数据源
  • API:iPL与外部的交互接口

3.2 可布线性方案

  • 线长梯度:WA 线长光滑模型
  • 密度梯度:e-Density 静电场模型
  • 优化算法:Nesterov梯度下降算法
  • 拥塞评估方法(由iEDA evaluator提供API):
    • LUT-RUDY(Look Up Table-based RUDY)
    • Early-GR
  • 细粒度单元膨胀:
    • 选择峰值拥塞网格的单元进行膨胀
    • H/V双方向独立膨胀
    • 动态膨胀率调整
    • 超线性膨胀指数修正

当全局布局所有单元足够散开(density overflow < 0.2),开始进行可布线性评估和优化

图8 iPL可布线性方案流程

4 输入输出

输入

  • 网表优化def文件 ./result/iTO_fix_fanout_result.def

输出

  • ./result/iPL_result.def
  • ./result/iPL_result.v

评测和报告

  • ./result/report/pl_db.rpt

iPL工具的中间报告默认存放在目录:./scripts/design/sky130_gcd/result/pl/

图9 当前的布局结果是否存在违例的检查,详细违例情况在同级目录下文件violation_record.txt

图10 布局优化的线长指标报告,长线网的详细报告在同级目录下文件wirelength_record.txt;单元分布的密度信息,详细报告在同级目录下文件density_record.txt;布局结果的时序信息,详细报告在同级目录下文件timing_record.txt;布局结果的可布线性信息,详细报告在同级目录下文件congestion_record.txt

  • report/violation_record.txt :布局违例的单元

  • report/wirelength_record.txt :布局的HPWL线长、STWL线长以及长线线长统计

  • report/density_record.txt :布局的峰值bin密度

  • report/timing_record.txt :布局的时序信息(wns、tns),调用Flute进行简易绕线

  • report/congestion_record.txt:布局的可布线性信息

5 参数说明

参考iEDA_config/pl_default_config.json: ./scripts/design/sky130_gcd/iEDA_config/pl_default_config.json

参数名称功能说明参数范围默认值
is_max_length_opt是否开启最大线长优化[0,1]0
max_length_constraint指定最大线长[0-1000000]1000000
is_timing_aware_mode是否开启时序模式[0,1]0
ignore_net_degree忽略超过指定pin个数的线网[10-10000]100
num_threads指定的CPU线程数[1-64]8
[GP-Wirelength] init_wirelength_coef设置初始线长系数[0.0-1.0]0.25
[GP-Wirelength] reference_hpwl调整密度惩罚的参考线长[100-1000000]446000000
[GP-Wirelength] min_wirelength_force_bar控制线长边界[-1000-0]-300
[GP-Density] target_density指定的目标密度[0.0-1.0]0.8
[GP-Density] bin_cnt_x指定水平方向上Bin的个数[16,32,64,128,256,512,1024]512
[GP-Density] bin_cnt_y指定垂直方向上Bin的个数[16,32,64,128,256,512,1024]512
[GP-Nesterov] max_iter指定最大的迭代次数[50-2000]2000
[GP-Nesterov] max_backtrack指定最大的回溯次数[0-100]10
[GP-Nesterov] init_density_penalty指定初始状态的密度惩罚[0.0-1.0]0.00008
[GP-Nesterov] target_overflow指定目标的溢出值[0.0-1.0]0.1
[GP-Nesterov] initial_prev_coordi_update_coef初始扰动坐标时的系数[10-10000]100
[GP-Nesterov] min_precondition设置precondition的最小值[1-100]1
[GP-Nesterov] min_phi_coef设置最小的phi参数[0.0-1.0]0.95
[GP-Nesterov] max_phi_coef设置最大的phi参数[0.0-1.0]1.05
[BUFFER] max_buffer_num指定限制最大buffer插入个数[0-1000000]35000
[BUFFER] buffer_type指定可插入的buffer类型名字工艺相关列表[...,...]
[LG] max_displacement指定单元的最大移动量[10000-1000000]50000
[LG] global_right_padding指定单元间的间距(以Site为单位)[0,1,2,3,4...]1
[DP] max_displacement指定单元的最大移动量[10000-1000000]50000
[DP] global_right_padding指定单元间的间距(以Site为单位)[0,1,2,3,4...]1
[Filler] first_iter指定第一轮迭代使用的Filler工艺相关列表[...,...]
[Filler] second_iter指定第二轮迭代使用的Filler工艺相关列表[...,...]
[Filler] min_filler_width指定Filler的最小宽度(以Site为单位)工艺相关1
[MP] fixed_macro指定固定的宏单元 (string macro_name)设计相关列表[...,...]
[MP] fixed_macro_coordinate指定固定宏单元的位置坐标(int location_x, int location_y)设计相关列表[...,...]
[MP] blockage指定宏单元阻塞矩形区域,宏单元应该避免摆放在该区域(int left_bottom_x, int left_bottom_y, int right_top_x, int right_top_y)设计相关列表[...,...]
[MP] guidance_macro指定指导摆放宏单元,每个宏单元可以设置期望摆放的区域 (string macro_name)设计相关列表[...,...]
[MP] guidance指定对应宏单元的指导摆放区域(int left_bottom_x, int left_bottom_y, int right_top_x, int right_top_y)设计相关列表[...,...]
[MP] solution_type指定解的表示方式["BStarTree","SequencePair"]"BStarTree"
[MP] perturb_per_step指定模拟退火每步扰动次数[10-1000]100
[MP] cool_rate指定模拟退火温度冷却率[0.0-1.0]0.92
[MP] parts指定标准单元划分数(int)[10-100]66
[MP] ufactor指定标准单元划分不平衡值 (int)[10-1000]100
[MP] new_macro_density指定虚拟宏单元密度[0.0-1.0]0.6
[MP] halo_x指定宏单元的halo(横向)[0-1000000]0
[MP] halo_y指定宏单元的halo(纵向)[0-1000000]0
[MP] output_path指定输出文件路径"./result/pl"

支持功能

  • 支持标准单元的全局布局、合法化、详细布局;
  • 支持对布局结果进行违例检查、报告布局阶段线长、密度、时序、拥塞
  • 支持在布局阶段插入buffer进行长线优化;
  • 支持增量式合法化;
  • 时序优化与拥塞优化进一步完善中;

iPL使用示例

通过tcl启动

参考iPL_script/run_iPL.tcl: <ieda_path>/scripts/design/sky130_gcd/script/iPL_script/run_iPL.tcl

iPL支持使用的tcl命令

run_placer -conifg <config_path> // 完整运行整个iPL
run_filler -conifg <config_path> // 对布局的空白区域进行单元填充
run_incremental_flow -conifg <config_path> // 对改变单元位置的结果进行重新合法化
run_incremental_lg // 进行增量式合法化,需保证iPL已运行
placer_check_legality // 检查当前布局的合法性
placer_report // 对当前布局的状态进行report
init_pl -conifg <config_path> // 对布局器进行初始化
destroy_pl // 销毁布局器
placer_run_mp // 进行宏单元布局
placer_run_gp // 进行标准单元全局布局
placer_run_lg // 进行标准单元合法化
placer_run_dp // 进行标准单元详细布局

Config配置文件

参考iEDA_config/pl_default_config.json: <ieda_path>/scripts/design/sky130_gcd/iEDA_config/pl_default_config.json

JSON参数功能说明参数范围默认值
is_max_length_opt是否开启最大线长优化[0,1]0
max_length_constraint指定最大线长[0-1000000]1000000
is_timing_effort是否开启时序优化模式[0,1]0
is_congestion_effort是否开启可布线性优化模式
ignore_net_degree忽略超过指定pin个数的线网[10-10000]100
num_threads指定的CPU线程数[1-64]8
[GP-Wirelength] init_wirelength_coef设置初始线长系数[0.0-1.0]0.25
[GP-Wirelength] reference_hpwl调整密度惩罚的参考线长[100-1000000]446000000
[GP-Wirelength] min_wirelength_force_bar控制线长边界[-1000-0]-300
[GP-Density] target_density指定的目标密度[0.0-1.0]0.8
[GP-Density] bin_cnt_x指定水平方向上Bin的个数[16,32,64,128,256,512,1024]512
[GP-Density] bin_cnt_y指定垂直方向上Bin的个数[16,32,64,128,256,512,1024]512
[GP-Nesterov] max_iter指定最大的迭代次数[50-2000]2000
[GP-Nesterov] max_backtrack指定最大的回溯次数[0-100]10
[GP-Nesterov] init_density_penalty指定初始状态的密度惩罚[0.0-1.0]0.00008
[GP-Nesterov] target_overflow指定目标的溢出值[0.0-1.0]0.1
[GP-Nesterov] initial_prev_coordi_update_coef初始扰动坐标时的系数[10-10000]100
[GP-Nesterov] min_precondition设置precondition的最小值[1-100]1
[GP-Nesterov] min_phi_coef设置最小的phi参数[0.0-1.0]0.95
[GP-Nesterov] max_phi_coef设置最大的phi参数[0.0-1.0]1.05
[BUFFER] max_buffer_num指定限制最大buffer插入个数[0-1000000]35000
[BUFFER] buffer_type指定可插入的buffer类型名字工艺相关列表[...,...]
[LG] max_displacement指定单元的最大移动量[10000-1000000]50000
[LG] global_right_padding指定单元间的间距(以Site为单位)[0,1,2,3,4...]1
[DP] max_displacement指定单元的最大移动量[10000-1000000]50000
[DP] global_right_padding指定单元间的间距(以Site为单位)[0,1,2,3,4...]1
[Filler] first_iter指定第一轮迭代使用的Filler工艺相关列表[...,...]
[Filler] second_iter指定第二轮迭代使用的Filler工艺相关列表[...,...]
[Filler] min_filler_width指定Filler的最小宽度(以Site为单位)工艺相关1
[MP] fixed_macro指定固定的宏单元 (string macro_name)设计相关列表[...,...]
[MP] fixed_macro_coordinate指定固定宏单元的位置坐标(int location_x, int location_y)设计相关列表[...,...]
[MP] blockage指定宏单元阻塞矩形区域,宏单元应该避免摆放在该区域(int left_bottom_x, int left_bottom_y, int right_top_x, int right_top_y)设计相关列表[...,...]
[MP] guidance_macro指定指导摆放宏单元,每个宏单元可以设置期望摆放的区域 (string macro_name)设计相关列表[...,...]
[MP] guidance指定对应宏单元的指导摆放区域(int left_bottom_x, int left_bottom_y, int right_top_x, int right_top_y)设计相关列表[...,...]
[MP] solution_type指定解的表示方式["BStarTree","SequencePair"]"BStarTree"
[MP] perturb_per_step指定模拟退火每步扰动次数[10-1000]100
[MP] cool_rate指定模拟退火温度冷却率[0.0-1.0]0.92
[MP] parts指定标准单元划分数(int)[10-100]66
[MP] ufactor指定标准单元划分不平衡值 (int)[10-1000]100
[MP] new_macro_density指定虚拟宏单元密度[0.0-1.0]0.6
[MP] halo_x指定宏单元的halo(横向)[0-1000000]0
[MP] halo_y指定宏单元的halo(纵向)[0-1000000]0

运行的Log、Report

默认存放在目录:<ieda_path>/scripts/design/sky130_gcd/result/pl/

  • report/violation_record.txt :布局违例的单元
  • report/wirelength_record.txt :布局的HPWL线长、STWL线长以及长线线长统计
  • report/density_record.txt :布局的峰值bin密度
  • report/timing_record.txt :布局的时序信息(wns、tns),调用Flute进行简易绕线