跳轉到

2.3 Tcl 與 Python:兩種驅動晶片的方式#

晶片設計流程從誕生以來就有一個奇特的特徵:使用者幾乎從不直接操作工具,而是透過腳本。而腳本語言的選擇,早在 1990 年代就被決定了——Tcl。Synopsys 的 Design Compiler、Cadence 的 Innovus、Mentor 的 Calibre,無一例外地採用 Tcl 作為命令介面。這不是巧合,而是歷史:1988 年 John Ousterhout 在 Berkeley 發明 Tcl 時,正是 EDA 工具圖形介面尚未成熟的年代,一個小而美、可嵌入 C 程式的直譯語言,恰好滿足了 EDA 廠商「讓工具可被編排」的需求。此後三十年,Tcl 成為整個產業的事實標準,一代代設計工程師在 .tcl 檔案裡度過職業生涯。

OpenROAD 繼承了這個傳統。啟動 openroad 之後,你面對的就是一個 Tcl shell,所有引擎的命令都註冊在這個 shell 裡:

# 典型的 OpenROAD Tcl 腳本片段
read_lef sky130_fd_sc_hd.tlef
read_liberty sky130_fd_sc_hd__tt_025C_1v80.lib
read_def design.def
read_sdc constraint.sdc

initialize_floorplan -die_area {0 0 1000 1000} \
    -core_area {50 50 950 950} -site unithd
global_placement -density 0.65
detailed_placement
clock_tree_synthesis
global_route
write_def final.def

這種寫法對任何用過商業工具的工程師來說都似曾相識,這是刻意的設計:降低遷移成本,讓業界使用者零縫隙地轉向開源工具。

Python 的新聲音#

但 OpenROAD 做了一件商業 EDA 直到近年才跟進的事:提供完整的 Python 綁定。OpenDB 的整個資料模型——每個 block、instance、net、pin、layer——都透過 SWIG 綁定暴露給 Python:

import openroad

design = openroad.makeBlock("top")
inst = design.findInst("u_core")
print(inst.getLocation())          # instance 座標
print(inst.getMaster().getName())  # cell master 名稱

# 遍歷所有 net,統計 fanout
for net in design.getNets():
    print(net.getName(), net.getITerms().__len__())

Python 綁定的意義不只是「多一種語言」。Tcl 在 1990 年代是合理選擇,但它沒有現代科學生態:沒有 NumPy、沒有 pandas、沒有機器學習框架。而今日 EDA 最活躍的前沿——學習引導的最佳化(learning-guided optimization)、以強化學習做 placement——全都長在 Python 生態上。Google 用強化學習做 chip floorplanning 的論文(2021 年發表於 Nature)引爆了這個方向,而這類研究的前提,就是設計資料能被 Python 直接讀取與操作。OpenROAD 的 Python 綁定正是為此而生:研究者可以在 Jupyter notebook 裡載入一個 OpenDB 資料庫,把 placement 資料轉成張量,訓練模型,再寫回資料庫。這在封閉工具的世界裡幾乎不可能。

兩種語言在 OpenROAD 中各有定位:Tcl 承擔「流程驅動」的角色——寫流程腳本、跑設計、與 ORFS 整合;Python 承擔「資料科學與研究」的角色——分析設計、做實驗、開發新演算法。同一份 OpenDB 資料,兩種視角。

實務:從腳本到互動#

實際工作中,這兩種介面常混合使用。常見的模式是把 Tcl 腳本存檔後以批次模式執行:

openroad -no_init -exit run_floorplan.tcl 2>&1 | tee floorplan.log

-no_init 跳過個人設定檔,-exit 在腳本結束後離開,這是可重現流程的標準寫法。互動除錯時則直接進入 shell,用 Tcl 命令逐步檢查:

openroad> foreach inst [[ord::get_db_block] getInsts] {
    puts "[$inst getName] [$inst getLocation]"
}

對從 veryl2chip 這類工具鏈轉過來的讀者,可以把關係想成這樣:veryl2chip 把整條流程封裝成少數幾個子命令(sim、synth、asic),使用者不需要碰中間狀態;OpenROAD 則把每個階段的每個動作都開放成命令,讓你自由編排。前者是「駕駛自動車」,後者是「給你整個引擎室」。理解了這一點,就理解了為什麼 ORFS(下一節)要存在——它用 Makefile 重新提供了一層「自動車」的抽象,讓不想自己編排的人也能一鍵跑完流程。

語言即制度#

最後值得從制度面想一想「腳本介面」的深層意義。商業 EDA 的 Tcl 命令是廠商的私有資產,語意細節是多年經驗的口耳相傳;OpenROAD 的命令則有完整的文件與原始碼對照,命令背後的演算法可以直接閱讀。這讓「怎麼寫腳本」從師徒制的手藝,變成可以公開傳授的科學。台灣的大學若要開一門實體設計課,過去受制於 license 數量,只能讓少數學生輪流上機;現在,每個學生都能擁有一份可以改到核心的完整工具。Tcl 與 Python,一個連接三十年的產業傳統,一個通往正在成形的智慧設計未來——OpenROAD 同時握住兩者,這正是它作為教育與研究平台的底氣。