Layout XL で編集する多くのレイアウトビューには回路図と紐づけられていますが、回路の改版のためにセルをコピーすると、新しいセルのレイアウトデータにはコピー前の回路図やフィジカル・コンフィグ設定が紐づいたままの状態になります。
レイアウトデータに紐づいている回路図を確認したり変更したりするには、[Connectivity] ⇒ [Update] ⇒ [Update Connectivity Reference] で出来ますが、セルが多数ある場合にこれを手作業で繰り返すの効率がよくありません。バッチ処理でこれをしたいものです。
ライブラリ中のすべてのセルのコネクティビティ・リファレンスをファイルに書き出す。
下のコードは "MemoryUnits" ライブラリと "Peripherals" ライブラリにあるすべてのセルのすべてのレイアウトビューについて紐づいている回路図の情報とフィジカルコンフィグの情報を "connRef+physConfig.csv" というファイルに書き出すものです。
(let ((fp (outfile "connRef+physConfig.csv"))) (fprintf fp "layLib,layCell,layView,connLib,connCell,connView,configLib,configCell,configView") (newline fp) ; (foreach libName (list "MemoryUnits" "Peripherals") (foreach cellName (sort (ddGetObj libName)~>cells~>name 'alphalessp) (foreach viewName (sort (ddGetObj libName cellName)~>views~>name 'alphalessp) (when (ddGetObj libName cellName viewName "layout.oa") (printf "connRef+physConfig: %s %s %s\n" libName cellName viewName) (fprintf fp "%s,%s,%s" libName cellName viewName) (let ((cv (dbOpenCellViewByType libName cellName viewName "maskLayout" "r"))) (if (not (dbIsId cv)) (fprintf fp ",%s" "*could-not-open-cellview*") ; else (begin ;; == Source View Definition == ; (let ((connRef (lxGetConnRef cv))) (fprintf fp ",%s,%s,%s" (let ((s (nth 1 connRef))) (if (blankstrp s) "#N/A" s)) (let ((s (nth 2 connRef))) (if (blankstrp s) "#N/A" s)) (let ((s (nth 3 connRef))) (if (blankstrp s) "#N/A" s)))) ; ;;; <別の方法> ; (let ((srcProp cv~>lxInternal~>source)) ; (fprintf fp ",%s,%s,%s" ; (let ((s srcProp~>lib )) (if (or (null s) (blankstrp s)) "#N/A" s)) ; (let ((s srcProp~>cell)) (if (or (null s) (blankstrp s)) "#N/A" s)) ; (let ((s srcProp~>view)) (if (or (null s) (blankstrp s)) "#N/A" s)))) ;;; </別の方法> ; ;; == Physical Configuration View Definition == ; (let ((cfgProp cv~>lxInternal~>config)) (fprintf fp "%s,%s,%s" (let ((s cfgProp~>lib )) (if (or (null s) (blankstrp s)) "#N/A" s)) (let ((s cfgProp~>cell)) (if (or (null s) (blankstrp s)) "#N/A" s)) (let ((s cfgProp~>view)) (if (or (null s) (blankstrp s)) "#N/A" s)))) ; (dbClose cv)))) (newline fp))))) (close fp))
ライブラリ中のすべてのセルのコネクティビティ・リファレンスを削除する
下のコードは "MemoryUnits" ライブラリと "Peripherals" ライブラリにあるすべてのセルのすべてのレイアウトビューについて紐づいている回路図の情報とフィジカルコンフィグの情報を削除するというものです。
(foreach cellName (ddGetObj libName)~>cells~>name (foreach viewName (ddGetObj libName cellName)~>views~>name (when (ddGetObj libName cellName viewName "layout.oa") (printf "remove ConnRef+PhysConfig: %s,%s,%s\n" libName cellName viewName) ; (if (not (isWritable (ddGetObjReadPath (ddGetObj libName cellName viewName "layout.oa")))) (warn "not writable: %s,%s,%s" libName cellName viewName) ; else (begin (lxSetConnRef libName cellName viewName "NONE") (lxSetConfigRef libName cellName viewName "NONE")))))))
ライブラリ中のすべてのセルのコネクティビティ・リファレンスをそのセル自身のものに変更する
下のコードは "MemoryUnits" ライブラリと "Peripherals" ライブラリにあるセルのうち "schematic" というビューを持つセルについて、そのすべてのレイアウトビューについて紐づいている回路図の情報とフィジカルコンフィグの情報を、そのセル自身の "schematic" ビューまた "phyConfig" ビューに設定するというものです。
(foreach libName (list "MemoryUnits" "Peripherals") (foreach cellName (ddGetObj libName)~>cells~>name (when (ddGetObj libName cellName "schematic" "sch.oa") ;; ← schematic というビューをもつセルに限定 (foreach viewName (ddGetObj libName cellName)~>views~>name (when (ddGetObj libName cellName viewName "layout.oa") (printf "normalize ConnRef+PhysConfig: %s,%s,%s\n" libName cellName viewName) ; (if (not (isWritable (ddGetObjReadPath (ddGetObj libName cellName viewName "layout.oa")))) (warn "not writable: %s,%s,%s" libName cellName viewName) ; else (begin ;; そのセルの "schematic" ビューを回路図として紐づける (lxSetConnRef libName cellName viewName "CELLVIEW" ?schLib libName ?schCell cellName ?schView "schematic") ; ;; そのセルに "physConfig" ビューが存在していればそれを設定する (when (ddGetObj libName cellName "physConfig" "physExpand.cfg") (lxSetConfigRef libName cellName viewName "physConfig" ?physLib libName ?physCell cellName ?physView "physConfig")))))))))