2016年6月9日木曜日

Cadence AnalogArtistにおいてCUIからspiceInを行う

Virtuoso (AnalogArtist) において CDL や SPICE 形式のネットリストを読み込むときに spiceIn を利用する.GUI でも可能だが,大量にある場合は CUI で実行したい.
ここでは,spiceIn を実行する時のパラメータを記述した SKILL ファイルを用意する方法について述べる.

(a) conn2sch parameter file
spiceIn した schematic のオブジェクトの配置やラベルの大きさを制御している様だ.GUI で実行する時は用意する必要がなく,一方で実行後に勝手にできている.(しかし CUI では必要)

% cat schOpts_spiceIn.params                                                              
--  conn2sch parameter file prepared by Spice In:
sheet_symbol := none
page_row_limit := 1024
page_col_limit := 1024
label_height := 10
line_line_spacing := 0.200000
line_component_spacing := 0.500000
density_level := 0
pin_placement := left_and_right_sides

(2) DeviceMap file
ネットリスト中のトランジスタを schematic (正確にはトランジスタライブラリの)のトランジスタに対応させるファイル.これは GUI で実行する時であっても必要.PDK に依存する.
以下は,ネットリスト中のトランジスタ(*mos_net)を schematic のトランジスタ(*mos_sch)にマップしている.

% cat fet_map.spicein_map         
-- Device Mapping file generated from SpiceIn GUI
devSelect := pmos_net pmos_sch
        propMatch := pmos_sch
devSelect := nmos_net nmos_sch
        propMatch := nmos_sch

(3) spiceIn.param file
spiceIn に入力するファイル.

%cat spiceIn.param
piceInParams = list(nil
        'conn2schParamFile "schOpts_spiceIn.params"
        'language       "CDL"
        'netlistFile    "NAND4_4X.cdl"
        'outputLib      "CellLibrary"
        'refLibList     "cmos"
        'outputViewName "schematic"
        'simName        "auCdl"
        'outputSimName  "auCdl"
        'devMapFile     "fet_map.spicein_map"
)

(1)~(3)は,一度 GUI で spiceIn を実行すると生成されるので,保存してテンプレートとして利用するのも手である.

(4) spiceInの実行
Terminal において以下の様に実行すれば,spiceIn が起動する.
%spiceIn -param spiceIn.param

spiceIn は,上記に挙げたパラメータファイルをあらかじめ用意する方法と,引数にオプションとして記述する方法の2つの方法がある.
私の環境では後者は"conn2schParamFile"の場所を指定できず正しく動かない ($HOME/cadence/以下を探しに行く).

また,私の環境だと以下の2つのエラーがでてしまう,が schematic 生成には特に問題はない様だ.
*Error* eval: undefined function - ls
*Error* eval: undefined function - drLoadDrf

シェルスクリプト変数のsedへの展開

シェル(およびスクリプト)でsedコマンドを呼び出す時の作法をまとめる (ハマったので).

(a) 変数を展開せずにそのまま渡す場合→シングルクオート(')で囲む

sed -i 's/one/$two/g' target.txt

(b) 変数を展開して渡す→ダブルクオート(")で囲む

sed -i "s/out/$two/g" target.txt

上記ははよく知られているが,変数がディレクトリの場合,展開されてしまうと展開された文字列中のスラッシュ(/)にsedが反応してしまい,意図通りに置換できない.こういう場合は区切り文字を変えるとうまく動く.

sed -i "s;path;$HOME;g" target.txt