和ICCAD 一起做虛擬項目 - Tcl 腳本管理 Day2

Package 的使用是這樣的,我們把Package 的Path append 到全局變數auto_path 上,那麼Tcl 就可以識別Package 中的腳本。

So 我們以編寫一個有hierarchy的Package 為例,頂層的Package 名為iccad,包含兩個child package,分別叫做common 和 icc 。

mkdir -p icccad/common icccad/icc ;ntouch icccad/pkgIndex.tcl icccad/common/pkgIndex.tcl icccad/icc/pkgIndex.tclntouch iccad/common/icdVersionntouch iccad/icc/iccTidyShapen

至此,我們基本上創建了我們需要的文件夾和文件。

Tcl 有自己的命令生成pkgIndex.tcl ,但為了體現Tcl 的強大能力,一開始學習你可以使用命令來生成,看看生成的結構,我更傾向於自己寫,可以更多地加入控制和條件等語句。

# All packages need Tcl 8nif {![package vsatisfies [package provide Tcl] 8]} {return}nn# Extend the auto_path to make iccad packages availablenif {[lsearch -exact $::auto_path $dir] == -1} {n lappend ::auto_path $dirn}nn# For Tcl 8.3.1 and later, thats all we neednif {[package vsatisfies [package provide Tcl] 8.4]} {return}nif {(0 == [catch {n package vcompare [info patchlevel] [info patchlevel]n}]) && (n [package vcompare [info patchlevel] 8.3.1] >= 0n)} {return}nif {![package vsatisfies [package provide Tcl] 8.0]} {return}nn# Load local package in sub dirnset maindir $dir ;nset extradir "" ;nforeach subdir [concat [glob -type d -nocomplain $maindir/*] $extradir] {n set dir [file join $maindir [file tail $subdir]] ;n source [file join $dir pkgIndex.tcl]n}n

至此,我們完成了Tcl Version 的判斷,並獲取了iccad 下所有的目錄,當然你也可以在glob 中加入keyword,只導入某些包含關鍵字的目錄。

下面我們分別編寫iccad/common/pkgIndex.tcl 和iccad/icc/pkgIndex.tcl

# iccad/common/pkgIndex.tclnpackage ifneeded common 1.0 [list source [file join $dir icdVersion]]n

# iccad/icc/pkgIndex.tclnpackage ifneeded icc 1.0 [list source [file join $dir iccTidyShape]]n

幾個Package 的Index 文件編輯好以後,編輯具體的功能。

Namespace 和Package 一般都是連起來一起用的,一個Package 一般是放在和他同名的Namespace 里比較好,我們這裡為了簡單,也為了讓每一個工程師在腳本里直接使用,使用文件名等方式來區分各個Procedure。

在各個procedure 文件里,首先需要添加package provide 命令,讓pkg 可以識別文件,這個語句還可以做package 的版本控制。

package provide common 1.0n

包含這句話的文件是用於common 這個package 的 1.0 版本。

那麼把package 的框架搭好後,就可以編輯具體功能了。

使用測試

lappend auto_path <path to iccad package>n

或者在啟動tcl shell之前,將路徑加入如下環境變數。

setenv TCLLIBPATH <path to iccad package>n

在啟動Tcl 的shell 之後,

package require commonnpackage require iccn

下一天我們講如何更好地協同開發。

推薦閱讀:

新入職IC工程師必備技能——數模混合篇
善用CSV - 顯示於網頁Table
【E知】時鐘電路,約束設計與CTS基礎

TAG:CAD | IC设计师 | 芯片集成电路 |