IC Compiler は一般に設定された preferred direction に沿った配線トラックに従って配線を行うが,配線接続性を向上させるために許容される範囲で配線トラックからずれた配線(オフトラック配線)を行う事がある.
一方で,プロセスによっては特にリソグラフィの都合もあり,オフトラック配線や,特定の配線幅以外全くを許容しない場合がある(SADPの場合など).
IC Compiler にて preferred direction 以外の配線を禁止するためには,Astro (IC Compiler)のテクノロジファイルに nonPreferredRouteMode を有効する.
また,オフトラック配線,つまり配線の一部を太らせる事を禁止するためには, hasRectangleOnly を有効にする.
Layer "M1" {
...
hasRectangleOnly=1
nonPreferredRouteMode=1
}
これはレイヤーごとに設定できる.
2019年11月29日金曜日
2019年11月28日木曜日
IC Compiler で Preferred Direction を設定する
IC Compiler で配線の preferred Direction を設定するためには,set_preferred_routing_direction コマンドを使う
icc_shell> set_preferred_routing_direction -layers {M3 M5 M7} -direction vertical
現在の preferred direction を調べるには report_preferred_direction を使う
icc_shell> report_preferred_direction
Milkyway で axgDefineWireTracks コマンドを使うことで preferred direction を設定するが,どうも Unit Cell 上の配線トラックの定義をしているらしく配置配線には反映されなかった.マクロレベルの配線トラックの定義は IC Compiler で行う必要があるらしい.
icc_shell> set_preferred_routing_direction -layers {M3 M5 M7} -direction vertical
現在の preferred direction を調べるには report_preferred_direction を使う
icc_shell> report_preferred_direction
Milkyway で axgDefineWireTracks コマンドを使うことで preferred direction を設定するが,どうも Unit Cell 上の配線トラックの定義をしているらしく配置配線には反映されなかった.マクロレベルの配線トラックの定義は IC Compiler で行う必要があるらしい.
2019年11月24日日曜日
SKILL関数 でレイアウトの中心座標を動かす (leMoveCellViewOrigin)
SKILL関数でレイアウトを動かしたい,leMoveCellViewOriginコマンドを使うと,
レイアウトの中心座標を変えることができる.
leMoveCellViewOrigin(
d_cellViewId
l_point
)
=> t | nil
d_cellViewId は Cell View ID,l_point は次に中心座標としたい今の座標である.
例えば右に10 um,上に5 um動かす場合は以下のようにする.
leMoveCellViewOrigin( cellViewId -10:-5)
レイアウトの中心座標を変えることができる.
leMoveCellViewOrigin(
d_cellViewId
l_point
)
=> t | nil
d_cellViewId は Cell View ID,l_point は次に中心座標としたい今の座標である.
例えば右に10 um,上に5 um動かす場合は以下のようにする.
leMoveCellViewOrigin( cellViewId -10:-5)
2019年11月20日水曜日
SKILL関数でセルを開け(dbOpenCellViewByType),所望の位置にインスタンスを貼る(dbCreateInstByMasterName)
特定のセルにインスタンスを貼る SKILL 関数を紹介する.そのためには(1)セルを開く,(2)インスタンスを貼る,の2つの関数が必要.
(1) セルを開く
dbOpenCellViewByType 関数を使う.
dbOpenCellViewByType(
{ gt_lib | nil }
t_cellName
lt_viewName
[ t_viewTypeName
[ t_mode
[ d_contextCellView ] ] ]
)
=> d_cellView / nil
gt_lib はライブラリ名,t_cellName はセル名,lt_viewName はView名, t_viewTypeName は ViewType,t_mode はセルを開くモードである.d_contextCellView はバージョンによっては必要らしいが不要っぽい.
モードはいくつかある.
r : 読み込み(read)
a : 追記(append)
w : 書き込み(write),すでにファイルがある場合は Virtual Memory に捨てられる.
他にもモードがあるが違いがよくわからない.
dbOpenCellViewByType 関数を実行すると,Cell View IDが帰ってくる.このCell View IDを使って後続の処理を行う.
(2)インスタンスを貼る
dbCreateInstByMasterName 関数を使う.
dbCreateInstByMasterName(
d_cellView
t_libName
t_cellName
t_viewName
t_instName
l_origin
t_orient
[ x_numInst ]
)
d_cellView は貼り付け先のCell View ID,t_libName は貼り付け元のライブラリ,t_cellName は貼り付け元のセル名,t_viewName は貼り付け元のView,t_instName はインスタンス名(不要ならnilに),l_origin は貼り付ける座標,t_orient は回転角度, x_numInst は貼り付け個数である.
例えば,設計後のレイアウトにスクライブラインを貼る SKILL は以下のようになる.
cellview = dbOpenCellViewByType("CHIP_TOP" "CHIP_TOP" "layout" "maskLayout" "a")
dbCreateInstByMasterName(cellview "SCRIBE2_5000x5000" "SCRIBE2_5000_5000" "layout" nil list(0 0) "R0" 1)
cellview = dbOpenCellViewByType("CHIP_TOP" "CHIP_TOP" "layout")
dbSave(cellview)
dbClose(cellview)
よくわからないけれど,貼り付け後もう一度 dbOpenCellViewByType しないとうまくいかなかった.最後は dbSave でセーブ, dbClose でクローズ.
(1) セルを開く
dbOpenCellViewByType 関数を使う.
dbOpenCellViewByType(
{ gt_lib | nil }
t_cellName
lt_viewName
[ t_viewTypeName
[ t_mode
[ d_contextCellView ] ] ]
)
=> d_cellView / nil
gt_lib はライブラリ名,t_cellName はセル名,lt_viewName はView名, t_viewTypeName は ViewType,t_mode はセルを開くモードである.d_contextCellView はバージョンによっては必要らしいが不要っぽい.
モードはいくつかある.
r : 読み込み(read)
a : 追記(append)
w : 書き込み(write),すでにファイルがある場合は Virtual Memory に捨てられる.
他にもモードがあるが違いがよくわからない.
dbOpenCellViewByType 関数を実行すると,Cell View IDが帰ってくる.このCell View IDを使って後続の処理を行う.
(2)インスタンスを貼る
dbCreateInstByMasterName 関数を使う.
dbCreateInstByMasterName(
d_cellView
t_libName
t_cellName
t_viewName
t_instName
l_origin
t_orient
[ x_numInst ]
)
d_cellView は貼り付け先のCell View ID,t_libName は貼り付け元のライブラリ,t_cellName は貼り付け元のセル名,t_viewName は貼り付け元のView,t_instName はインスタンス名(不要ならnilに),l_origin は貼り付ける座標,t_orient は回転角度, x_numInst は貼り付け個数である.
例えば,設計後のレイアウトにスクライブラインを貼る SKILL は以下のようになる.
cellview = dbOpenCellViewByType("CHIP_TOP" "CHIP_TOP" "layout" "maskLayout" "a")
dbCreateInstByMasterName(cellview "SCRIBE2_5000x5000" "SCRIBE2_5000_5000" "layout" nil list(0 0) "R0" 1)
cellview = dbOpenCellViewByType("CHIP_TOP" "CHIP_TOP" "layout")
dbSave(cellview)
dbClose(cellview)
よくわからないけれど,貼り付け後もう一度 dbOpenCellViewByType しないとうまくいかなかった.最後は dbSave でセーブ, dbClose でクローズ.
SKILL プログラムというよりは,API を叩いている感じである.マニュアルは Cadence Design Framework II SKILL Functions Reference です.
2019年11月19日火曜日
Milkywayでセルの配線可能性を評価する
Milkyway でライブラリ中のセルの配線可能性について評価するには,Check Wire Track を実行する.メインウィンドウのWire Tracks -> Check Pin on Track を選ぶ.
ライブラリ名を指定し,Unit Tileを指定すると,そのUnit Tileを利用するセルの配線可能性を評価し,配線がオフグリッドのものを列挙してくれる.(セル名とピン番号を列挙してくれる)
ライブラリ名を指定し,Unit Tileを指定すると,そのUnit Tileを利用するセルの配線可能性を評価し,配線がオフグリッドのものを列挙してくれる.(セル名とピン番号を列挙してくれる)
IC Compiler でマルチハイトセルを使う
IC Compiler でマルチハイトセルを使うメモ.ちゃんとしたセルを使わないと罠にはまるので注意.
(1) マルチハイトのセルを作成する.
このとき,最も下の行(横列)の電源の構造が,シングルハイトセルと同じにならなければいけない制約がある.つまり,普通のセルの電源レールが上から VDD/VSS の場合,マルチハイトセルは VSS/VDD/VSS となるべきで VDD/VSS/VDD ではいけない.
(2) マルチハイトの Unit Tile をテクノロジファイルに定義する.
一般に配置配線ツールはスタンダードセルの最小単位(Unit Tile)を定義し,そのグリッドにスタンダードセルを配置する.Astro (ICC)のテクノロジファイルにマルチハイトの Unit Tile の大きさを定義する.
/*シングルハイト*/
Tile "unit" {
width = 0.2
height = 1.8
}
/*マルチハイト*/
Tile "unit_2" {
width = 0.2
height = 3.6
}
(3) マルチハイトセルを認識させる
Set PR Boundaryを実行する.実行すると,セルの高さを認識し電源レールの順番を報告してくれる.
この後,Set Multiple Height PR Boundary (cmSetMultiHeightProperty)を実行する.
このとき以下のフィールドに以下のように記入する.
Library Name : ライブラリの名前
Cell Name : マルチハイトセルの名前,アスタリスクも使える.
LEF IN の時だけ必要で GDS IN の時は不要という説もあるらしい.また,マルチハイトセルでは複数の電源を持つこともできる.パワーゲーティング用だろうか.
(4) 配線トラックの定義
Unit Tile の配線トラックを定義する.Define Wire Tracks (axgDefineWireTracks) を使ってシングルハイトセル用のトラックを定義しているはずなので,それをマルチハイトセルにも実行する.この際,テクノロジファイルで定義した Unit Tile の名前をつけること.
;; シングルハイトセル
geOpenLib
setFormField "Open Library" "Library Name" "myLib"
formOK "Open Library"
axgDefineWireTracks
setFormField "Define Wire Track" "m1Dir" "horizontal"
setFormField "Define Wire Track" "m2Dir" "vertical"
...
formOK "Define Wire Track"
;; マルチハイトセル
geOpenLib
setFormField "Open Library" "Library Name" "myLib"
formOK "Open Library"
axgDefineWireTracks
setFormField "Define Wire Track" "Apply To" "specified"
setFormField "Define Wire Track" "User TileName" "unit_2"
setFormField "Define Wire Track" "m1Dir" "horizontal"
setFormField "Define Wire Track" "m2Dir" "vertical"
...
formOK "Define Wire Track"
(1) マルチハイトのセルを作成する.
このとき,最も下の行(横列)の電源の構造が,シングルハイトセルと同じにならなければいけない制約がある.つまり,普通のセルの電源レールが上から VDD/VSS の場合,マルチハイトセルは VSS/VDD/VSS となるべきで VDD/VSS/VDD ではいけない.
(2) マルチハイトの Unit Tile をテクノロジファイルに定義する.
一般に配置配線ツールはスタンダードセルの最小単位(Unit Tile)を定義し,そのグリッドにスタンダードセルを配置する.Astro (ICC)のテクノロジファイルにマルチハイトの Unit Tile の大きさを定義する.
/*シングルハイト*/
Tile "unit" {
width = 0.2
height = 1.8
}
/*マルチハイト*/
Tile "unit_2" {
width = 0.2
height = 3.6
}
(3) マルチハイトセルを認識させる
Set PR Boundaryを実行する.実行すると,セルの高さを認識し電源レールの順番を報告してくれる.
この後,Set Multiple Height PR Boundary (cmSetMultiHeightProperty)を実行する.
このとき以下のフィールドに以下のように記入する.
Library Name : ライブラリの名前
Cell Name : マルチハイトセルの名前,アスタリスクも使える.
LEF IN の時だけ必要で GDS IN の時は不要という説もあるらしい.また,マルチハイトセルでは複数の電源を持つこともできる.パワーゲーティング用だろうか.
(4) 配線トラックの定義
Unit Tile の配線トラックを定義する.Define Wire Tracks (axgDefineWireTracks) を使ってシングルハイトセル用のトラックを定義しているはずなので,それをマルチハイトセルにも実行する.この際,テクノロジファイルで定義した Unit Tile の名前をつけること.
;; シングルハイトセル
geOpenLib
setFormField "Open Library" "Library Name" "myLib"
formOK "Open Library"
axgDefineWireTracks
setFormField "Define Wire Track" "m1Dir" "horizontal"
setFormField "Define Wire Track" "m2Dir" "vertical"
...
formOK "Define Wire Track"
;; マルチハイトセル
geOpenLib
setFormField "Open Library" "Library Name" "myLib"
formOK "Open Library"
axgDefineWireTracks
setFormField "Define Wire Track" "Apply To" "specified"
setFormField "Define Wire Track" "User TileName" "unit_2"
setFormField "Define Wire Track" "m1Dir" "horizontal"
setFormField "Define Wire Track" "m2Dir" "vertical"
...
formOK "Define Wire Track"
(1) にはまった,というか,普通VDD/VSSで作ったらマルチハイトセルはVSS/VDD/VSSで作るのが直感的だと思うが,そうでない作り方をされてしまった.自由な発想だ.よい子のみんなは自然な設計をしようね.
2019年11月18日月曜日
Skill関数でレイアウトを回転する(dbTransformCellView)
SKILL 関数でレイアウトを回転するには dbTransformCellView を使う.レイアウトの拡大縮小もできる.
dbTransformCellView(
d_cellViewId
f_mag
f_angle
)
d_cellViewId は対象の CellViewID,f_mag は拡大縮小倍率,f_angle は回転角度(°)を指定する.
dbOpenCellViewByType と組み合わせると,レイアウトを開いて回転して閉じる事ができる.
dbTransformCellView(
d_cellViewId
f_mag
f_angle
)
d_cellViewId は対象の CellViewID,f_mag は拡大縮小倍率,f_angle は回転角度(°)を指定する.
dbOpenCellViewByType と組み合わせると,レイアウトを開いて回転して閉じる事ができる.
cellview= dbOpenCellViewByType("library" "cell" "layout" "maskLayout" "a")
dbTransformCellView(cellview 1.0 180.0)
dbSave(cellview)
f_mag に 1.0 を指定すると拡大しない事になる.
2019年11月12日火曜日
イオンカード100万円チャレンジ
イオン銀行の預金金利はイオン銀行およびクレジットカードの利用状況によって変化する.ゴールドカードを持つとスコアが増えるので預金金利が有利になる可能性が上がるが,住宅ローンの利用もしくはイオンカードの使用額が一定値(100万円/年というウワサ)を超えないといけないというウワサでなかなかハードルが高い.
今回,銀行の金利を上げるべくイオンカード100万円チャレンジしたところ,8ヶ月目計86万円の利用が確定した地点でインビテーションがきた.100万円より2割ぐらい低い.
今回,銀行の金利を上げるべくイオンカード100万円チャレンジしたところ,8ヶ月目計86万円の利用が確定した地点でインビテーションがきた.100万円より2割ぐらい低い.
2019年11月10日日曜日
Gnuplot で 3 次元プロットでフィッティングする(誤差項を追加する)
Gnuplot で3次元フィッティングを行おうとしたら,うまくフィッティングできず
Singular matrix in Invert_RtR
error during fit
と怒られてしまう.
3次元フィッティングでは x:y:z だけでなく誤差項 s も必要で,誤差項を与えないとフィッティングができない.誤差の評価をしていない場合は定数を与えればよい.
a=-0.5;b=-0.5;c=90;d=0.008
f(x,y)=a*x+b*y+c+x*y*d+1e-9
fit f(x,y) "hspice.mt0" using ($2*1000):($3*1000):($5*1000):(1) via a,b,c,d
splot "hspice.mt0" using ($2*1000):($3*1000):($5*1000) w p, f(x,y)
昔(3.6.x)は無くてもよかった気がするが,少なくとも3.7.x以降は必要らしい.
gnuplot のページ (Takeno Lab)
http://takeno.iee.niit.ac.jp/~foo/gp-jman/#Q11
Singular matrix in Invert_RtR
error during fit
と怒られてしまう.
3次元フィッティングでは x:y:z だけでなく誤差項 s も必要で,誤差項を与えないとフィッティングができない.誤差の評価をしていない場合は定数を与えればよい.
a=-0.5;b=-0.5;c=90;d=0.008
f(x,y)=a*x+b*y+c+x*y*d+1e-9
fit f(x,y) "hspice.mt0" using ($2*1000):($3*1000):($5*1000):(1) via a,b,c,d
splot "hspice.mt0" using ($2*1000):($3*1000):($5*1000) w p, f(x,y)
昔(3.6.x)は無くてもよかった気がするが,少なくとも3.7.x以降は必要らしい.
gnuplot のページ (Takeno Lab)
http://takeno.iee.niit.ac.jp/~foo/gp-jman/#Q11