顯示具有 ADS 標籤的文章。 顯示所有文章
顯示具有 ADS 標籤的文章。 顯示所有文章

2014年8月7日 星期四

使用sed取代ADS檔案路徑

最近實驗室正在畢業潮(已羨慕),學長們約定俗成要把自己的設計燒成一片光碟傳給學弟……喔或是學妹。
一般習慣不好的話,在ADS 的設計檔裡,會包含很多絕對路徑的內容,這樣這個設計project就變得難以移植。
以我隔壁超強的同學「瓦哥」為例,過去的電磁模擬記錄會這樣寫
D:\Program Files (x86)\Sonnet\0.18um_m\transformer\PA\sonnet\Stack_PA\XXX.snp
移到別的電腦就找不到這些電磁模擬檔。

比較好的做法是把電磁模擬放到ADS的project資料夾內,例如新建一個EM的資料夾,然後用相對路徑去存取:
EM\Stack_PA\XXX.snp
就能確保模擬檔的可移動性。

那如果已經做完了,難道要一個一個改嗎?
ADS的設計是記錄在dsn文字檔裡面,這類文字檔的操作其實也很簡單,在ADS project的networks資料夾,改掉dsn裡面的檔案即可:
用sed 一行解決,加上for loop 輕鬆寫意,就跟喝水一樣輕鬆:

for i in *.dsn; do sed -i 's/XXX/yyy/g' $i; done

缺點:Unix 限定……,windows我還真想不出解法,可能要用python, mingw,不然powershell可能有類似的功能?
當然要一個檔案一個檔案打開來改也不是不行,只是很不smart就是。

2013年12月25日 星期三

ADS_origin_converter v2

今天下午發佈ADS origin converter v2

新增下列功能:
一、原本是進入一個prompt讓使用者輸入檔名,使用者試用的經驗表示這實在是太弱了,在windows下最好的使用方式:把要轉換的檔案拖到exe檔上面。
測試之後發現,在windows上把檔案拖到exe檔上面,等同將被拖的檔案路徑當成argv參數傳入,因此程式改為輸入參數為要修改的檔名即可。

二、支援多變數檔案:
之前的版本只支援單變數的狀況,這次則加入多變數的狀況,ADS記錄多變數的狀況如下:
sweepvar1 ... sweepvar_n-1 sweepvarn ... data
var1_1 ... varn-1_1 varn_1 ... data_1_1
var1_1 ... varn-1_1 varn_2 ... data_1_2
var1_1 ... varn-1_1 varn_3 ... data_1_3
...
var1_1 ... varn-1_1 varn_m ... data_1_m

sweepvar1 ... sweepvar_n-1 sweepvarn ... data
var1_1 ... varn-1_2 varn_1 ... data_2_1
var1_1 ... varn-1_2 varn_2 ... data_2_2
var1_1 ... varn-1_2 varn_3 ... data_2_3
...
var1_1 ... varn-1_2 varn_m ... data_2_m
新版的會以前幾個變數產生tital name,例如在上述狀況,最主要的index是sweepvarn,不斷重複的則是data,上述的狀況會產生為:
sweepvarn tital1 tital2 …
varn_1 data_1_1 data_2_1 …
varn_2 data_1_2 data_2_2 …
varn_3 data_1_3 data_2_3 …
...
varn_m data_1_m data_2_m ...

產生的第一個tital會是:
sweepvarn 之後則是
sweepvar1=var1_1,sweepvar2=var2_1, …sweepvar_n-1=varn-1_1
好像不好看懂,總之就是tital會是第二-n個變數的數值。

目前有一個已知難防的bug是,顯示的變數名稱不能有空白在裡面,因為斷詞是以空白為基準(好像也沒有更好的斷詞方試),有空白的變數名稱會造成tital產生錯誤,目前無解。只能要使用者不用掃有空白的變數名稱,例如:
I_Proble[0, ::]

安裝方式: 在下方github頁面,選”Download As zip”,解壓後直接將檔案拖到ADSToOrigin.exe上面即可。

--

本程式公開所有程式源碼,請見github,請眾位大神鞭小力一點>_<
https://github.com/lc85301/ADSToOrigin

2013年10月8日 星期二

ADS Export to Origin converter

最近在準備一些學校報告用的投影片,在學長主持的小咪報告之後:
學長:「你這幾頁的圖,如果之後要放論文的話,就乾脆用Origin重畫」
好吧學長都這樣說了,就來畫畫Origin的圖wwww
不過秉持著用開源軟體的精神,還是找了一下,結果就在[1]的作敏學長的blog裡面找到qtiplot這個開源繪圖軟體,跟Origin的功能幾乎差不多。

1. 問題簡述:

這裡遇到一個有點機車的問題:
平常我們在ADS這套軟體畫好圖之後,如果用ADS再export成txt file,就會變成類似下面的格式:
 freq S(1,1)
1e9 -1E1
2e9 -1E1
3e9 -1E1
4e9 -1E1

freq S(2,1)
1e9 1E1
2e9 1E1
3e9 1E1
4e9 1E1
註:隨便選個數字表示一下。 但如果要用Origin匯入文字檔的話,理當是這個格式比較好:
freq S(1,1) S(2,1)
1e9 -1E1 1E1
2e9 -1E1 1E1
3e9 -1E1 1E1
4e9 -1E1 1E1
俗話說得好:科技始終始於惰性,與其用Excel打開檔案然後一欄一欄複製貼上,不如寫個script來解決 =b,另一方面還是要再次強調我的哲學:「work hard, after you know you are working smart」。

2. 解決方案:

最後還是用我們的老朋友python,實際譔寫時間約30分,超快der;會慢主要是在查zip的寫法;實際內容大概也只有zip比較有趣。
首先先把資料一行一行讀進來,寫入list裡面。讀檔結束就會有一堆list,分別存著freq裡所有的資料,然後是S(1,1), S(2,1),我在讀檔時就先把這些list存到一個大list裡。
假設我的大list為data,data 的長相大概像這樣:
data = [[S(1,1)],[S(2,1),....]]
於是我們可以先展開data list為所有list,然後透過python 強大的zip函式,直接iterate所有的list。
For line in zip(*data):
outfile.write(“%s\n” %(“\t”.join(line)))
很快速的就完成檔案格式化寫出的工作。

3. windows版本:

在改windows版本的部分,則是把本來要吃參數的script改成吃使用者輸入的內容。
照著[3]的幫助,首先先安裝python和py2exe,利用py2exe把python script轉成exe檔。
先寫一個setup.py:
from distutils.core import setup
import py2exe

setup(console=['ADSToOrigin.py'])
然後在cmd用
python setup.py py2exe
就會自動產生dist這個資料夾,裡面會包括ADSToOrigin.exe,打開就會開console,像linux一樣正常使用。

 4. 原始碼公開: 這個script已經公開在我的github上:
https://github.com/lc85301/ADSToOrigin
歡迎大家給feedback或來pull request。

 5. 參考資料:
1. http://zuomin.blogspot.tw/2010/05/linux-origin.html
作敏學長:qtiplot介紹。
2. ptt python 版3115篇:python list iterate介紹。
3. http://logix4u.net/component/content/article/27-tutorials/44-how-to-create-windows-executable-exe-from-python-script
py2exe tutorial
4. python official site: http://www.python.org/
5. py2exe official site: http://www.py2exe.org/

2013年2月27日 星期三

ADS小電路模擬設定

個人用ADS喜歡把電路的小塊小塊變成一個個模組(component),比如說device建成一個模組,matching network建成一個模組,dc bias 的bypass電路建成一個模組。
這樣做的好處有:
1. 主電路不會太複雜,各個元件的關係十分清楚。
2. 要換掉元件十分容易,例如要把matching network從理想元件換成EM的S2P檔,只要改模組裡的接線即可。
3. 要對模組內的元件做微調時,可以清楚知道在微調哪個部分的元件,這在元件數多時很好用。
另一方面,這樣做也有幾個問題:
1. 大電路的模擬無法求得電流等資訊,即無法計算功耗,因此需要將dc線拉出來,造成電路稍加複雜。
2. 大電路的模擬設定會和小電路的相衝突,進行模擬時要將小電路的模擬關掉。

第2點煩人之處在於,大電路模擬和小電路模組行為的確認,幾乎都是要做的,例如DC bias 一定要加上bypass電路來隔離電源的雜訊,會先對bypass電路進行設計,進行S parameter模擬,確認頻帶內設計OK,再將bypass代入大電路中,這時候麻煩來了,ADS並不允許多重的模擬設定和模擬終端(term),此時要先將小電路的模擬設定和終端給取消掉,否則會產生重複的模擬設定;如果後來需要再次確認bypass的設計,就要再打開小電路的模擬設定和終端。
看device S2P也是,先在模組內模擬,確認device行為正常之後,要在大電路模擬,就需要進到read S2P的電路設計,把其中的模擬關掉;如果要換device,也要重開。
這樣每次來回的開關小電路的模擬設定,一是麻煩,二是徒然浪費時間,最後還容易做錯,實在不太聰明。

寒假個人自學了DesignPattern,前幾天突然從Design Pattern類似的概念,想到第二個問題的一個解法。 只要把bypass的implementation(電路架構)做成一個電路設計,bypass的模擬設定(interface)則做成另一個設計,這個模擬設定和大電路都各自包含bypass的implementation,要修改bypass,就到bypass模擬設定裡去tune,而大電路仍能正常模擬。
這樣一來,無論我要做大電路模擬或是調整小電路,都不需要再去開關小電路的模擬設定跟終端,可以簡省工作的時間,提升設計效率,看來沒事看看DP等其他領域的東西,也會有些收獲。

2012年11月16日 星期五

放大器的級間穩定

做多級的RF的放大器時,除了看一般的stability factor K值外,還需要去測試電路每級放大器的級間穩定。
實驗室一直遵照學長流傳下來的投影片:將電路從中切開,一邊看stability circle,另一邊看ADS裡面的「Map1 circle」跟「Map2 circle」這個東西,然後看看兩個圓有沒有相交在一起,可是這個Map 1/2 circle是啥鬼東西?極間穩定又是什麼?

1. 極間穩定的意義:


先考慮上圖的模型,在一個主動的電晶體兩旁接上matching的電路,stability circle的定義是,在什麼樣的$\Gamma_L$(or $\Gamma_S$)下,會讓$\Gamma_{in}$(out) >1,在$\Gamma_{in}$(out) > 1時,電路幾乎確定會不穩定,將$\Gamma_{in}$(out)=1的邊線畫出來的圓,就是穩定圓(stability circle)。
電路設計完後,一定會看看stability factor K是否全頻帶都大於1,就是要確認電路整體的$\Gamma_{in}$(out)都在穩定的範圍內。
可是若我們把電路切開,這個模型就不適用了,前後接的不是被動的matching電路,這時候我們就要確保,前端的load stability circle,和向後端可能看到任何一點阻抗,都不會相交;否則很不巧的該阻抗出現,電路就不穩定了;這就是極間穩定背後的原理。

所以說map1/2 circle是啥鬼?從上面的定義來看,我認為它所畫的是:當source(load)呈現任何被動阻抗時(也就是實部小於一,落在smith chart上的任何阻抗),會在另一邊load(source)上呈現的阻抗。
實際用複數變換來驗證看看:
$\Gamma_{in} = w = \frac{a \Gamma_L+b}{c\Gamma_L+d}$
改換上式為下式,兩行的abcd並不是相同的:
$\Gamma_L = \frac{a \Gamma_{in}+b}{c \Gamma_{in}+d}$
a=1, b= $-S_{11}$, c= $S_{22}$, d= $-\Delta$
其中 $\Delta = S_{11}S_{22}-S_{12}S_{21}$
這個 $|\Gamma_L|=1$經轉換後會畫出一個圓,其圓心和半徑為:
$C_L = \frac{c^*d-a^*b}{a^2-c^2} = \frac{-S_{11}|S_{22}^2|+S_{12}S_{21}S_{22}^*+S_{11}}{1-|S22|^2} = S_{11}+\frac{S_{12}S_{21}S_{22}^*}{1-|S22|^2}$
$r = \frac{ad-bc}{a^2-c^2} = |\frac{S_{12}S_{21}}{1-|S22|^2}|$
若兩圓相交,就表示有load會讓$\Gamma_L$呈現某阻抗,而該阻抗會落在不穩定圓中,也就使電路在這級不穩定(新細明體:你死了Q_Q)

2. 實際資料:

Linux有問題先查manpage,ADS遇到鬼先問F1 help,結果help裡面解釋是這麼寫的:
Used in Small-signal S-parameter simulations: The function maps the set of terminations with unity magnitude at port 1 to port 2. The circles are defined by the loci of terminations on one port as seen at the other port. A source-mapping circle is created for each value of the swept variable(s). This measurement is supported for 2-port networks only.
大概的意思是一樣的,依著help的註解找到了計算的ael原始碼,下面是map2的原始碼:
defun map2_center_and_radius(sParam, center, radius)
{
    decl S12xS21 = sParam(1,2)*sParam(2,1);
    decl s11MagSq = pow(abs(sParam(1,1)),2);
     *center = sParam(2,2)+S12xS21*conj(sParam(1,1))/(1-s11MagSq);
     *radius = abs(S12xS21)/(1-s11MagSq);
}
可見所做的是以$S_{11}+\frac{S_{12}S_{21}S_{22}^*}{1-|S22|^2}$為圓心,$|\frac{S_{12}S_{21}}{1-|S22|^2}|$為半徑的圓,和我們所計算的結果相符。

附件:

如何在blogger裡面插入方程式?目前找到兩種解決方案
第一種是用這篇文章中所建議的方式:
http://www.codecogs.com/latex/integration/blogger/install.php
照著裡面的步驟做即可,不過它是將LaTeX轉成圖片,再替換掉原本的文字,所以很醜...
而且測試發現Firefox會當掉(媽的連IE都可以了…),原因不明。
第二種是現在的作法:
方法同上,但code是在下面這個blog裡面找到的
http://aishuxue.blogspot.tw/2012/01/latex-blogspot.html

<script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js" type="text/javascript">
MathJax.Hub.Config({
 extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
 jax: ["input/TeX", "output/HTML-CSS"],
 tex2jax: {
     inlineMath: [ ['$','$'], ["\\(","\\)"] ],
     displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
 },
 "HTML-CSS": { availableFonts: ["TeX"] }
});
</script>
這個結果超漂亮的啊!!!,實在太強了!
在chrome跟firefox裡面都可以用,IE我倒不知道,反正懶得理他。

致謝:

本篇文章感謝503實驗室強者我同學曾奕恩,以及強者我學長陳柏翰學長在複數變換方面的指導。

2012年6月11日 星期一

bypass與測試線小技巧

無論是放大器、主動混頻器還是振盪器,都需要外加電線才能運作
這時候我們就面臨到一個問題
當你接一個DC的電線到電源,這段線的長度非常長
即便DC電源是個理想的ground,經過這麼長的線
各頻率的阻抗會散開到smith chart的整個圓周上

因此需要有方法在DC的位置創造一個理想的ground
方法很簡單,用並聯的電容即可
並聯的電容對RF信號來說,就像直接short到ground一樣
也可以說,電容會隨信號充放電,達到穩定的效果
對於愈高頻的電路,電容就要愈小

畫起來大概像這樣
當然這只是示意圖,電容值是預設值沒有改
也不能直接接ground,而是接back via的元件
通常會用一路只有電容的把主要in-band 的頻率cover住
另外一路會用大一點的電容跟串聯電阻,來cover較低的頻率
如此就能做到一個不錯的RF ground.

為了看看這個bypass好不好
通常會加上測試線來試試,其實測試線說穿了就是
用一段長線去模擬真實狀況的DC長線
模擬上長這個樣子
很簡單吧

但是,平時模擬時不會把測試線打開,它會讓模擬跑得久一些些
等到大概模擬完,要開測試線,要一個一個打開又很麻煩
最近發現ADS裡面也支援簡單的script這個小技巧
先拉出一個控制的var,例如叫:testline_valid好了
把上面測試線的Z改成
if (testline_valid == "open") then 20 Ohm else 1e10 Ohm endif
你不想叫"open",要用什麼東西隨你便

總之只要把testline_valid設成你要的值,就可以方便的加入測試線的模擬。