2020年8月21日 星期五

簡化Cython編譯的Script

在CPython當中,我們可以透過Cython的技術,將Python程式碼加以編譯來保護程式碼,並加速程式的執行。一般作法需要另外準備setup.py,並透過命令列來加以編譯。為了簡化步驟,我寫了以下的script。在Anaconda Spyder執行該script,隨即跳出檔案選擇視窗。選擇要編譯的.pyx檔即可生成.pyc檔。

import os import tkinter as tk from tkinter import filedialog root = tk.Tk() root.withdraw() pyx_path = filedialog.askopenfilename(initialdir = "d:/demo", title = "Select file", filetypes = (("pyx files","*.pyx"), ("all files","*.*"))) pyx_dir = os.path.dirname(pyx_path) os.chdir(pyx_dir) pyx_name = os.path.basename(pyx_path) setup = '''from distutils.core import setup from Cython.Build import cythonize setup(name='', ext_modules=cythonize("{}"))'''.format(pyx_name) with open('setup.py', 'w') as f: f.write(setup) os.environ['path']+=';C:\ProgramData\Anaconda3' os.system('python setup.py build_ext --inplace') os.startfile(pyx_dir)

如何在命令列將.brd轉成.siw

在置放.brd(此處以Galileo_G87173_204.brd為例)的目錄底下,建立批次檔convert.bat,內容如下:

path=%path%;C:\Program Files\AnsysEM\AnsysEM20.2\Win64 anstranslator.exe Galileo_G87173_204.brd siwave_ng Galileo_G87173_204.aedb SaveSiw.exec pause




此外,在目錄底下建立SaveSiw.exec檔案,當中只有一行:

SaveSiw



滑鼠雙擊convert.bat,幾秒鐘之後生成Galileo_G87173_204.siw。開啟Galileo_G87173_204.siw如下圖:


2020年8月14日 星期五

SIwave輸出所有元件及各個元件連接的net連同對應的pad

obj= oApp.GetActiveProject()

parts = []
refDesList = []

result = {}
for net in obj.ScrGetNetNameList():
    obj.ScrGetPinsOnNet(net, "", "" , [], parts, refDesList)

    for i, j in set(zip(parts, refDesList)):
        pins = []

        obj.ScrGetPinsOnNet(net, i, j , pins, [], [])
        try:
            result[j].append((net, pins))
        except:
            result[j]=[(net, pins)]
        
obj.ScrLogMessage('\n\n')
for i in result:
    obj.ScrLogMessage(i+': '+str(result[i]))


2020年8月10日 星期一

如何取得專案/設計/設定/物件的屬性

在AEDT當中,不管是專案,設計,模擬設定甚或是物件都可以透過屬性視窗加以觀察或修改。不同類別的屬性歸類在不同的標籤頁,每一種標籤頁有各自的名稱,像是Attribute、Command等等,如圖一所示:

(圖一) 物件的標籤頁及名稱


要取得物件的名稱使用的函式是:

oEditor.GetPropertyValue(string tabArg, string serverArg, string propArg) -> string

當中要設定的參數分別為tabArg(標籤名),serverArg(物件名)以及 propArg(屬姓名),返回字串型別的屬性值。該如何正確設定這三項參數呢?這裡簡單介紹一個方式。啟動腳本錄製,修改該屬性,停止錄製。接下來便可以從錄製腳本當中找到這三項參數的設定方式了。這裡舉個例子,我們修改Box1的材料,錄製到的程式碼如下:

(圖二) 錄製修改屬性的程式碼

從錄製的程式碼可以看出標籤頁全名為"Geometry3DAttributeTab",物件名為"Box1",屬性名為"Material"。於是我們用下面程式碼便可以抓到物件的材料名稱了:

material_name = oEditor.GetPropertyValue('Geometry3DAttributeTab', 'Box1', 'Material')

其他像是專案的變量,模擬設定的參數等等都可以用這裡介紹的方式快速找到正確抓取設定的方法。

2020年8月2日 星期日

如何用Jupyter Notebook保存程式碼片段

學習Python程式的過程當中,我們會習慣將學到好用的片段代碼紀錄下來,已備之後不時之需。但是該如何紀錄這些代碼卻是一個難題。是要將不同功能的程式碼放在同一個檔案當中呢?還是分開不同檔案存放。放在同一個檔案的話,修改測試其中一組程式碼,執行時會執行檔案當中所有的程式碼片段,輸出結果混雜在一起。如果是將程式碼片段存放在不同檔案又不方便查詢,執行程式又稍嫌麻煩。以上的問題有沒有好的解決方案呢?有的,那就是Jupyter Notebook(可以在Anaconda開始選單當中找到Jupyter Notebook)。

(圖一) 啟動Jupyter Notebook

Jupyter Notebook是執行在本端電腦瀏覽器的程式編輯工具(如圖一),副檔名為.ipynb。Jupyter Notebook主要是用在資料分析上,支援numpy, scupy及資料視覺化,廣為數據科學家所喜愛。下面簡單說明如何用Jupyter Notebook來保存程式碼片段。

.ipynb檔案是用cell的方式分割不同的片段。cell可以是code或是markdown。保存code的cell可以單獨執行(滑鼠點擊上方Run鍵或按下Ctrl+Enter),則運算結果則會即時顯示在cell下方。markdown的cell可以用來編寫格式化說明文字。加入新的cell或修改已有的cell也很簡單。此外,cell也可以上下移動,調整排列位置。最後可以將寫好的.ipynb檔存檔並將網址加到瀏覽器的書籤當中,方便隨時調用及查詢。

(圖二) Jupyter Notebook介面