2022年3月21日月曜日

HSPICEで容量を測る

 容量を測るには3つ方法がある.

・AC解析で測る
.print ac cap(Node)
.ac dec 15 .1k 100k
対象 Node の容量の周波数特性を評価することができる.ただし,Nodeとどこの間の結合容量を見ているのかはわからない.他のすべてのノードとの容量の和なのだろうか.

・captabを使う
.option captab
回路中の全ノードを対象に,GND(0)に対するDC容量を評価する.抵抗などでGNDとつながっているノードの容量値の算出はできない.

・過渡解析で充電してみる
実際に過渡解析で充電を行い,流れた電流の積分(Q)とノード間電圧(V)からC=Q/Vで求める.理想コンデンサとして近似できる事が前提.

2022年2月22日火曜日

Mendeley Desktop で Citation Key が生成されない

タイトル通り,Mendeley Desktop で Citation Key が生成されなくて困っていた.ググると,Tools → Options → Document Detail を開き,当該タイトルの Document type を選択し,Citation Key にチェックを入れるとよい.チェックを入れると Citation Key の項目が開くが,登録されているすべての文献をチェックしに行くのか Mendeley が劇重になるので注意.

2022年1月16日日曜日

IC Compiler で配置が正しく行われているか調べる(check_legality)

IC Compiler で配置が正しく行われているか,check_legality コマンドで調べる事が出来る.

check_legality

実行すると,行 (Row) に載っていないセルの数,重なっているセルの数などが報告される.また legalize できなかったのでエラーコード PSYN-215 が報告される.
これを利用して,IC Compiler で配置が正しくできなかった場合に終了するプロシージャを以下に示す.
  1. proc ::checkLegalityAndExit { design } {
  2. set fid [open ${design}.legal r]
  3. while {![eof $fid]} {
  4. set line [gets $fid]
  5. puts $line
  6. if {[string match "*PSYN-215*" $line]} {
  7. close $fid
  8. quit
  9. }
  10. }
  11. close $fid
  12. }


使い方

  1. # 前略
  2. place_opt
  3. redirect ${design}.legal { check_legality }
  4.  
  5. # place_opt/legalize_placementに失敗していれば終了
  6. ::checkLegalityAndExit { $design }

2022年1月15日土曜日

IC Compiler で DRC Error の一覧を出力する(get_drc_errors)

DRC Error をリスト形式で得るために get_drc_errors を利用する.

get_drc_errors
-error_view mw_error_view : 対象の Milkyway view (デフォルトで現在の view)
-error_id error_idserror_idと一致するオブジェクトのみ出力
-type error_typeerror_type に一致する違反を出力
-bbox {lx ly ux uy}:検索範囲
-quit:マッチしないときのメッセージを表示しない
-regexp | -exact-regexp では正規表現を有効に,-exact はワイルドカードを有効に
-nocaseerror_id および -filter オプションで大文字小文字を区別しない
-filter expressionfilter_collection コマンドで指定可能な形式でフィルタする

例えばショートが1000以上ある場合に ICC を止めるプロシージャを以下のように書ける.

2023/02/28 嘘を書いていたことが判明.get_drc_errors は collection を出力するので, get_object_name で list に変換しないといけません.
  1. proc ::checkDRCAndExit { } {
  2. set drcerror_coll [get_drc_errors -type "Short" -quiet]
  3. set drcerror_list [get_object_name $drcerror_coll]
  4. set drcerror_num [llength $drcerror_list]
  5. if {$drcerror_num > 1000} then {
  6. echo "Error: Exit icc, so many drc errors!"
  7. echo $drcerror_num
  8. quit
  9. }
  10. }

2022年1月14日金曜日

IC Compiler で配置配線可能な最小面積を調べる

Shell スクリプトで IC Compilerの create_floorplan のパラメータを変更していき設計が最後まで到達できたか調べれば良いのだが,面積制約を満たさない場合は DRC 違反が大量に出る中 ICC は(100%設計完了できないにもかかわらず)延々と頑張って設計改良をするので時間がかかる.一方で一度面積制約を満たしたら処理は終了したい.
そこで
(0) Shell スクリプトで tcl ファイルの create_floorplan のパラメータを変える
(1) 処理の要素要素で Utilization を調べて既定値以下なら終了する
(2) 一度最後まで到達したらフラグを出力し for ループをブレイクする

(0) はこんなコード

  1. echo "--------------" > _b01_.log
  2. for ((row=%%START%%; row<%%END%%;row=row+%%INC%%))do
  3. sed -e "s/%%row%%/${row}/g" tcl/b01.tcl > _b01_.tcl
  4. icc_shell -64 -shared_license -f _b01_.tcl
  5. echo "--------------" >> _b01_.log
  6. echo ${row} >> _b01_.log
  7. grep Error b01.log >> _b01_.log
  8. grep "filler cells with master" b01.log >> _b01_.log
  9. grep "Leaf Cell Count" b01.log >> _b01_.log
  10. if [ -e b01.finish ]; then
  11. break
  12. fi
  13. done
 
このコードをさらに外部のsedコマンドで%%START%%,%%END%%,%%INC%%,%%ROW%%を置換する.

(1) 以下のようなプロシージャを定義して

  1. proc ::checkAreaAndExit { } {
  2. set cell_util [get_utilization]
  3. if {$cell_util < -0.99} then {
  4. echo "Error: Exit icc, floorplan failes"
  5. echo $cell_util
  6. quit
  7. }
  8. set exit_threshold 0.95
  9. if {$cell_util > $exit_threshold} then {
  10. echo "Error: Exit icc, cell area exceeds die area"
  11. echo $cell_util
  12. quit
  13. }
  14. }

メインのtclファイル中で要所要所で呼び出す.

  1. set row 119
  2. set corew [expr $row * 1.08]
  3. create_floorplan \
  4. -control_type width_and_height \
  5. -flip_first_row \
  6. -bottom_io2core 1.08 \
  7. -top_io2core 1.08 \
  8. -left_io2core 1.08 \
  9. -right_io2core 1.08 \
  10. -core_height 10.800000 \
  11. -core_width $corew
  12.  
  13. ::checkAreaAndExit

(2) メインのtclファイルの末尾に完遂した場合のフラグファイルの出力と,冒頭にフラグファイルがある場合にquitするようにする.

  1. ## 冒頭
  2. if { [ file exists ${design}.finish ] == 1 } then {
  3. quit
  4. }
  5. ...(省略)...
  6. ## 末尾
  7. redirect ${design}.finish {echo finish}

フラグファイルがある場合は(0)のシェルスクリプトでもbreakするようにしているので,tcl 中の if 文は無駄ではあるが念のため.

2022年1月5日水曜日

Procedural-continuous assignments

Verilog では以下のように always の中に assign 文を入れることが出来るらしい(@ryos36さんのTwitterから).
  1. module dff (q, d, clear, preset, clock);
  2. output q;
  3. input d, clear, preset, clock;
  4. reg q;
  5.  
  6. always @(clear or preset)
  7. if(!clear)
  8. assign q = 0;
  9. else if(!preset)
  10. assign q = 1;
  11. else
  12. deassign q;
  13.  
  14. always@(posedge clock)
  15. q = d;
  16. endmodule
always 文の中に assign を入れる構文は Procedural-continuous assignments (手続き文の継続的代入?)と呼ぶらしく,DesignCompiler では「Procedural-continuous assignments は合成できないよ」とエラーが出た.純粋に動作モデルを立てるために使うのだろう.

2021年12月18日土曜日

電力とエネルギーと電力解析CADの中身

集積回路CADでは,回路において電気がする仕事量として,エネルギー(電力量,electrical energy)ではなくなぜか電力(power)が使われる. PowerCompiler などのレポートも電力(W)で表示される.
電力とエネルギーは混同されがちだが違うので,本来の仕事量はエネルギーとなるべきである.ではツールはどう取り扱っているのか各種マニュアルを調べてみた.ちなみに,マニュアル中でも電力とエネルギーは割とグチャグチャです(もしくは凄くセンシティブに使い分けているのか)

・キャラクタライズツール側(SilicoonSmart, LibraryCompiler)
キャラクタライズツールは,電力を3要素に分解し,そのうち内部電力(Internal power)とリーク電力の項を.libとして保持する.
(1)リーク電力:静止時の電力
(2)内部電力:セル内部で消費される電力.貫通電流など.
(3)スイッチング電力:外部容量の充放電による電力
電力は本来時間の関数だが,時間の関数として持つ事は難しい.電力はある波形が入ったときに流れた電荷量の積分値に電圧をかけたもの(エネルギー)から,出力容量の充放電エネルギー量,リークによるエネルギー量を引くことで内部電力(正確にはエネルギー)を計算する.

.libの Power Table は,第一軸入力スリュー,第二軸出力容量,そして肝心の第三軸はトグルあたりのエネルギーなっている(Eint/transition, in units of fJouls).
リーク電力は入力論理値それぞれ一意の値となる.

・電力解析側(PowerCompiler)
こちらは一部憶測で,回路の消費電力を以下のように計算すると思われる(トグル確率による平均電力評価の場合).
(1) リーク電力:入力がHighの確率,Lowの確率,それぞれの時のリーク電力からリーク電力の期待値を計算し,全てのセルの総和を取る.
(2) 内部電力:全ての入力から出力へのエネルギー量に,入出力の遷移確率とパスの重みをかけたものの総和を取る※
(3) スイッチング電力:全てのパスの出力容量と対応するトグル確率をかけた物の総和をとり,Vdd^2/2をかける.

動的電力の単位は.lib中の容量単位,電圧単位,時間単位から以下のように計算する.静的電力は単位が.libに書いてある.

power_unit = (capacitive_load_unit * voltage_unit^2)/time_unit

要約すると以下の通り.
・キャラクタライズ側は,きちんとエネルギーを測ってそれをエネルギーとして Power table に登録している.リーク電力はそのまま.
・解析側は,Power tableに書かれたエネルギーとトグル確率から動的エネルギーを計算し,電力に変換.リーク電力は全セルの和をとる.

あたりまえ?かもしれないが,動的電力は回路が動いたときに消費した正味の電力なので,意味合いはエネルギーと等価.電力を周期で割った物ではない.

最初から最後までエネルギーとして取り扱えばこんな問題は起きなかったのに,なんでなんや...

※P_int = Σ_{i=A,B} E_{i→Z} x PathWeight x TggleRateという式がでてくる(A,Bは入力,Zは出力).P_intはエネルギーの総和を評価している.

.lib (Liberty)については Synopsys がその仕様をオープンにしているので参考にした.といっても800ページ近くあるので一部だけしか読めてないですが.

2021年12月7日火曜日

Python で終了する時の呼び出し関数,行番号を報告する

 タイトル通り.inspect モジュールを利用する.
  1. import sys, inspect
  2.  
  3. def my_exit():
  4. frame = inspect.currentframe().f_back
  5. path = frame.f_code.co_filename.split('/')
  6. print("file:"+path[-1] +" in:"+frame.f_code.co_name+", line:"+str(frame.f_lineno))
  7. sys.exit()

Perl でもできる(さらにエラーメッセージを引数としてもらう).
  1. sub my_exit {
  2. my ($arg_str) = @_;
  3. my ($pkg, $file, $line) = caller;
  4. chomp($arg_str);
  5. print "Error $arg_str, in $file line $line\n";
  6. die;
  7. }

Perl の方が記述はシンプルなんだよなぁ.

2021年10月9日土曜日

Vivaldi のクリプトトークンを外す

Vivaldi は Version 4.0 から正式にメールサポートしたのだが,それに伴って(?) Vivaldi が Google サービスへのアクセスを要求するようになった.

むやみやたらに権限を許可したくないのだが,許可を求めるポップアップが頻繁に出てくるのが邪魔である.その場合,[設定]→[プライバシー]→[Google拡張機能]→[クリプトトークン]を外すとポップアップが出力されなくなった.

5ch には
https://egg.5ch.net/test/read.cgi/software/1609553989/26
クリプトトークンを外すとGoogleサービスにアクセスできないというコメントがあったが,ローカルユーザーにしているからかそのような不具合には直面していない.

なおクリプトトークンとは FIDOAlliance の仕様で定義されている公開鍵暗号化に依存するユーザー認証に利用するAPI らしい.
https://forum.vivaldi.net/topic/58228/guide-google-extensions-crypto-token-what-it-does

こんな乱暴なことをしなくても,ブラウザに Google アカウントでログインしないだけでいいのだけれどね….
この対応が正しいのかは全くよくわかりません.

2021年10月3日日曜日

AnalogArtist の レイヤー選択を Skill コマンドで実行する (leiMouseSetEntryLayer. leSetEntryLayer)

leiMouseSetEntryLayer コマンドを利用すると AnalogArtist のレイヤー選択を Skill コマンドで実行できる.
x


leiMouseSetEntryLayer ( i_layer )

i_layer は整数で,Layer Select Window (LSW) の最上位の項目から順に0,1,2...である.(テクノロジファイルの techLayerPurposePriorities の順番)

i_layer の選択の Visibility が低いので,番号ではなくレイヤー名を直接指定する場合は leSetEntryLayer コマンドを利用する.

leSetEntryLayer('("s_layer" "s_puopose"))
S_layer はレイヤー名(M1など),s_puopose は Purpose (Drawingなど) である.