Shell スクリプトで IC Compilerの create_floorplan のパラメータを変更していき設計が最後まで到達できたか調べれば良いのだが,面積制約を満たさない場合は DRC 違反が大量に出る中 ICC は(100%設計完了できないにもかかわらず)延々と頑張って設計改良をするので時間がかかる.一方で一度面積制約を満たしたら処理は終了したい.
そこで
(0) Shell スクリプトで tcl ファイルの create_floorplan のパラメータを変える
(1) 処理の要素要素で Utilization を調べて既定値以下なら終了する
(2) 一度最後まで到達したらフラグを出力し for ループをブレイクする
(0) はこんなコード
- echo "--------------" > _b01_.log
- for ((row=%%START%%; row<%%END%%;row=row+%%INC%%))do
- sed -e "s/%%row%%/${row}/g" tcl/b01.tcl > _b01_.tcl
- icc_shell -64 -shared_license -f _b01_.tcl
- echo "--------------" >> _b01_.log
- echo ${row} >> _b01_.log
- grep Error b01.log >> _b01_.log
- grep "filler cells with master" b01.log >> _b01_.log
- grep "Leaf Cell Count" b01.log >> _b01_.log
- if [ -e b01.finish ]; then
- break
- fi
- done
このコードをさらに外部のsedコマンドで%%START%%,%%END%%,%%INC%%,%%ROW%%を置換する.
(1) 以下のようなプロシージャを定義して
- proc ::checkAreaAndExit { } {
- set cell_util [get_utilization]
- if {$cell_util < -0.99} then {
- echo "Error: Exit icc, floorplan failes"
- echo $cell_util
- quit
- }
- set exit_threshold 0.95
- if {$cell_util > $exit_threshold} then {
- echo "Error: Exit icc, cell area exceeds die area"
- echo $cell_util
- quit
- }
- }
メインのtclファイル中で要所要所で呼び出す.
- set row 119
- set corew [expr $row * 1.08]
- create_floorplan \
- -control_type width_and_height \
- -flip_first_row \
- -bottom_io2core 1.08 \
- -top_io2core 1.08 \
- -left_io2core 1.08 \
- -right_io2core 1.08 \
- -core_height 10.800000 \
- -core_width $corew
-
- ::checkAreaAndExit
(2) メインのtclファイルの末尾に完遂した場合のフラグファイルの出力と,冒頭にフラグファイルがある場合にquitするようにする.
- ## 冒頭
- if { [ file exists ${design}.finish ] == 1 } then {
- quit
- }
- ...(省略)...
- ## 末尾
- redirect ${design}.finish {echo finish}
フラグファイルがある場合は(0)のシェルスクリプトでもbreakするようにしているので,tcl 中の if 文は無駄ではあるが念のため.