2020年11月6日 星期五

如何取得3D Layout的database?

在開發3D Layout的自動化程式,某些時候我們需要取得Layout的一些訊息,偏偏函式庫不提供對應的函數,這時候就只能透過EDB的函式庫來抓取。但是如何才能從AEDT函式連結到專案對應到的EDB呢?這時候就可以透過下面指令來達成:

DB = edb.Database.Attach(int(oProject.GetEDBHandle()))

當中GetEDBHandle()可以取得現在開啟當中的Project對應到的資料庫編號,此時用edb.Database.Attach()輸入編號便可以返回資料庫物件做資料的抓取了。以下範例便是透過EDB抓到3D Layout所有的net及net連接的元件及pin,並將其輸出到AEDT的訊息視窗。
import clr

clr.AddReference('Ansys.Ansoft.Edb')
clr.AddReference('Ansys.Ansoft.SimSetupData')
import Ansys.Ansoft.Edb as edb

import ScriptEnv

ScriptEnv.Initialize("Ansoft.ElectronicsDesktop")
oDesktop.RestoreWindow()
oProject = oDesktop.GetActiveProject()
oDesign = oProject.GetActiveDesign()
oEditor = oDesign.GetActiveEditor()

def getNetInfo():
DB = edb.Database.Attach(int(oProject.GetEDBHandle()))
cells = list(DB.TopCircuitCells)

for i in cells:
if i.GetName() == (oDesign.GetName() if ';' not in oDesign.GetName() else oDesign.GetName().split(';')[1]):
layout = i.GetLayout()
break

net_info = {}
for n in layout.Nets:
netname = n.GetName()
net_info[netname] = {}
for i in n.PadstackInstances:
if len(i.GetName()) == 0:
continue
try:
net_info[netname][i.GetComponent().GetName()] += [i.GetName()]
except:
net_info[netname][i.GetComponent().GetName()] = [i.GetName()]

return net_info

AddWarningMessage(str(getNetInfo())) 


(圖一) 輸出net, net連接到的元件及pin


沒有留言:

張貼留言