【简介】HFSS在射频集成电路设计起到了至关重要的作用,堪称射频集成电路工程师的左膀右臂。上篇文章中介绍了如何用Python对简单片上电感进行建模和仿真。
本篇文章,将在上篇文章的基础上,介绍如何进行参数扫描和SP文件的批量化自动导出。
在进行射频集成电路HFSS设计时,我们需要反复调节电磁结构的几何参数,并输出所对应的SP文件,再导入cadence或者ADS 中进行仿真。这种重复性的工作非常低效,于是研究了如何用代码去完成这类工作。读者可以直接拷贝、复用下列代码。
| 变量名 | Min | Max | Step |
|---|---|---|---|
| L | 80 um | 120 um | 10 um |
| Lg | 15 um | 25 um | 5 um |
| W | 4 um | 8 um | 2 um |
在文章(1)所示代码的基础上,我们可以进行SP文件导出
频率起始值为1GHz,截止值为5GHz,频率点数为401
freq_start = 1e9
freq_stop = 5e9
freq_num = 401
freq_step = (freq_stop - freq_start)/(freq_num - 1)
freq_arr = [None] * 0
for i in range(freq_num):
freq_arr.append(i * freq_step + freq_start)
oModule = oDesign.GetModule("Solutions")
oModule.ExportNetworkData("D=\'10um\' L=\'100um\' Lg=\'20um\' W=\'6um\'", ["Setup1:Sweep"], 3, "tutorial_Design1.s1p", freq_arr, True, 50, "S", -1, 0, 15, True, True, False)
以Lg为例,展示如何进行参数扫描
for i in range(3):
Lg = str(i * 5 + 15) + "um"
oDesign.ChangeProperty(
[
"NAME:AllTabs",
[
"NAME:LocalVariableTab",
[
"NAME:PropServers",
"LocalVariables"
],
[
"NAME:ChangedProps",
[
"NAME:Lg",
"Value:=" , Lg
]
]
]
])
oDesign.Analyze("Setup1 : Sweep")
将上述二者合并后,我们可以得出下列代码
import ScriptEnv
ScriptEnv.Initialize("Ansoft.ElectronicsDesktop")
oDesktop.RestoreWindow()
oProject = oDesktop.SetActiveProject("tutorial")
oDesign = oProject.SetActiveDesign("Design1")
freq_start = 1e9
freq_stop = 5e9
freq_num = 401
freq_step = (freq_stop - freq_start)/(freq_num - 1)
freq_arr = [None] * 0
for i in range(freq_num):
freq_arr.append(i * freq_step + freq_start)
for i in range(5):
L = str(i * 10 + 80) + "um"
oDesign.ChangeProperty(
[
"NAME:AllTabs",
[
"NAME:LocalVariableTab",
[
"NAME:PropServers",
"LocalVariables"
],
[
"NAME:ChangedProps",
[
"NAME:L",
"Value:=" , L
]
]
]
])
for j in range(3):
Lg = str(j * 5 + 15) + "um"
oDesign.ChangeProperty(
[
"NAME:AllTabs",
[
"NAME:LocalVariableTab",
[
"NAME:PropServers",
"LocalVariables"
],
[
"NAME:ChangedProps",
[
"NAME:Lg",
"Value:=" , Lg
]
]
]
])
for k in range(3):
W = str(k * 2 + 4) + "um"
oDesign.ChangeProperty(
[
"NAME:AllTabs",
[
"NAME:LocalVariableTab",
[
"NAME:PropServers",
"LocalVariables"
],
[
"NAME:ChangedProps",
[
"NAME:W",
"Value:=" , W
]
]
]
])
oDesign.Analyze("Setup1 : Sweep")
solution_name = "D=\'10um\'L=\'" + L + "\' Lg=\'" + Lg + "\' W=\'" + W + "\'"
file_name = "IND_"+L+"_"+Lg+"_"+W+".s1p"
oModule = oDesign.GetModule("Solutions")
oModule.ExportNetworkData(solution_name, ["Setup1:Sweep"], 3, file_name, freq_arr, True, 50, "S", -1, 0, 15, True, True, False)
其中要注意两点:
W =str(k *2+4)+"um"
"D=\'10um\' L=\'100um\' Lg=\'20um\' W=\'6um\'"
因此我们对仿真结果命名时,需要做如下操作
solution_name ="D=\'10um\'L=\'"+ L +"\' Lg=\'"+ Lg +"\' W=\'"+ W +"\'"
睡个午觉起来,发现仿真和SP文件导出已经全部完成(^_^)