2022年7月16日 星期六

將Q3D匯出的cir檔案轉成TouchStone檔案

 

import re, os
from pyaedt import Circuit

circuit = Circuit(non_graphical=True, new_desktop_session='True', close_on_exit=True)


def cirtosnp(cir_path, fstart='0GHz', fstop='1GHz', fpoints=1001):
with open(cir_path) as f:
text = f.readlines()

ports = re.findall(r'\*\snode\s(\d+)\s+(.*)', '\n'.join(text))
snp_path = cir_path.replace('.cir', f'.s{len(ports)}p')
netlist = f'.inc "{cir_path}"\n\n'

for line in text:
if line.startswith('.subckt'):
_, cmp, *num = line.strip().split()
break

temp = ' '.join([i[1] for i in ports])
netlist += f'x1 {temp} {cmp}\n'
netlist_path = os.path.join(circuit.temp_directory, 'temp.cir')

with open(netlist_path, 'w') as f:
f.write(netlist)
circuit.add_netlist_datablock(netlist_path)

for port_id, port_name in ports:
circuit.modeler.components.create_interface_port(port_name)

setup1 = circuit.create_setup()
setup1.props["SweepDefinition"]["Data"] = f"LINC {fstart} {fstop} {fpoints}"
circuit.analyze_nominal()
circuit.export_touchstone(file_name=snp_path)
circuit.close_project()


cirtosnp("D:\demo\yqopvgihel_400000000.0.cir")

2022年5月26日 星期四

輸出一個專案當中所有設計的屬性值到CSV檔當中方便做比較

 


from pyaedt import Hfss

hfss = Hfss(specified_version='2022.1')

properties = {}
prop_list = []
for design in hfss.design_list:
properties[design] = {}
x = Hfss(projectname=hfss.project_name, designname=design)
props = x.odesign.GetProperties('LocalVariableTab', 'LocalVariables')
for i in props:
if i not in prop_list:
prop_list.append(i)
properties[design][i] = x.odesign.GetPropertyValue('LocalVariableTab', 'LocalVariables', i)

prop_list.sort()

with open('d:/demo/tabls.csv', 'w') as f:
f.writelines(','.join(hfss.design_list))
for p in prop_list:
row = [p]
for design in hfss.design_list:
try:
row.append(properties[design][p])
except:
row.append('NaN')
f.writelines(','.join(row) + '\n')



2022年5月22日 星期日

TDR 模擬

 執行Transient模擬,輸出tdr圖

#啟動非圖形模式
from pyaedt import Circuit
circuit = Circuit(non_graphical=True)

#網表內容
template = '''
.model diff_line S TSTONEFILE="D:/OneDrive - ANSYS, Inc/Models/S_Parameter/diff_line.s4p"
+ INTERPOLATION=LINEAR INTDATTYP=MA HIGHPASS=10 LOWPASS=10 convolution=0 enforce_passivity=0 Noisemodel=External

S2 net_1 net_2 net_3 net_4 FQMODEL="diff_line"
A3 net_2 net_1 COMPONENT=TDR_Differential_Ended enabled=1
R4 net_3 0 50
R7 net_4 0 50

.print TRAN V(*) O(*,z*)

.end
'''
#輸出template網表到檔案當中
with open('d:/demo/tdr.net', 'w') as f:
f.write(template)

#將網表加入到電路當中
oModule = circuit.add_netlist_datablock("D:/demo/tdr.net")

#加上Transient模擬設定並執行模擬
transient = circuit.create_setup('mytransient', circuit.SETUPS.NexximTransient)
transient.props['TransientData'] = ['0.1ns', '20ns']
circuit.analyse_nominal()

#取值並繪圖
data = circuit.post.get_solution_data('O(a3:zdiff)', domain='Time')
data.plot(math_formula='re')

#釋放license
circuit.release_desktop()


2022年5月21日 星期六

參數化結構範例

 

from math import sin, cos
from pyaedt import Q3d

q3d = Q3d(specified_version='2022.1', non_graphical=True)

q3d['r1'] = '150mm'
q3d['r2'] = '50mm'
q3d['dt'] = '1mm'
q3d['u_min'] = '-0.4*pi'
q3d['u_max'] = '0.4*pi'
q3d['du'] = 0.065
q3d['dr'] = '5mm'

q3d['v_min'] = '-0.3*pi'
q3d['v_max'] = '0.3*pi'
q3d['dv'] = 0.25

c1 = q3d.modeler.create_equationbased_curve('(r1+r2*cos(_t))*cos(u_min)', '(r1+r2*cos(_t))*sin(u_min)', 'r2*sin(_t)', 'v_min', 'v_max')
q3d.modeler.sweep_around_axis(c1, 2, 'u_max-u_min')
q3d.modeler.thicken_sheet(c1, 'dt')

spheres = []
for i in range(0, 100, 1):
for j in range(0, 10, 1):
x = f'if({i}*du+u_min<=u_max && {j}*dv+v_min<=v_max, (r1+r2*cos({j}*dv+v_min))*cos({i}*du+u_min), r1+r2*cos(v_min)*cos(u_min))'
y = f'if({i}*du+u_min<=u_max && {j}*dv+v_min<=v_max, (r1+r2*cos({j}*dv+v_min))*sin({i}*du+u_min), r1+r2*cos(v_min)*sin(u_min))'
z = f'if({i}*du+u_min<=u_max && {j}*dv+v_min<=v_max, r2*sin({j}*dv+v_min),r2*sin(v_min))'
s = q3d.modeler.create_sphere((x,y,z), 'dr')
s.color=(255,0,0)
spheres.append(s)

q3d.modeler.subtract(c1, spheres, False)
q3d.save_project('d:/demo/torus.aedt')
q3d.release_desktop()



不須啟動GUI執行PyAEDT電路模擬

 

#啟動非圖形模式
from pyaedt import Circuit
circuit = Circuit(non_graphical=True)

#輸出100級LC電路網表
with open('d:/demo/lc.net', 'w') as f:
for i in range(100):
f.writelines(f'L{i} net_{i} net_{i+1} 1e-9\n')
f.writelines(f'C{i} net_{i+1} 0 5e-12\n')

#將網表加入到電路當中
circuit.add_netlist_datablock('d:/demo/lc.net')

#加上ports
circuit.modeler.components.create_interface_port('net_0', (0,0))
circuit.modeler.components.create_interface_port('net_100', (0.01,0))

#加上模擬設定並執行模擬
lna = circuit.create_setup('mylna', circuit.SETUPS.NexximLNA)
lna.props['SweepDefinition']['Data']= 'LINC 0Hz 1GHz 101'
circuit.analyse_nominal()

#取值並繪圖
data = circuit.post.get_solution_data('db(Z11)')
data.plot(math_formula='re')

#釋放license
circuit.release_desktop()




2022年5月4日 星期三

生成帶有約束條件之線性規劃曲面

 

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d

fig = plt.figure(figsize=(8,6))
ax3d = plt.axes(projection="3d")

def func(x, y):
result = (3*x+4*y)
return result

constraint = lambda x, y: (x+y<5)*(x+y>1)

xdata = np.linspace(0,3,100)
ydata = np.linspace(0,3,100)
X,Y = np.meshgrid(xdata,ydata)
Z = func(X, Y)/constraint(X, Y)


ax3d = plt.axes(projection='3d')
ax3d.plot_surface(X, Y, Z,cmap='jet')
ax3d.set_title('Surface Plot in Matplotlib')
ax3d.set_xlabel('X')
ax3d.set_ylabel('Y')
ax3d.set_zlabel('Z')

plt.show()



2022年4月30日 星期六

建立參數化複雜結構

參數化之複雜結構過往都要透過UDP來編寫,困難度很高。PyAEDT可以用幾行程式碼達到要求。以下提供四個範例給各位參考。

from pyaedt import Hfss

hfss = Hfss(specified_version='2022.1', designname='case1')

hfss['Nx'] = '4'
hfss['wx'] = '1mm'
hfss['wy'] = '10mm'
u = 1

models = []
for i in range(100):
x = hfss.modeler.create_rectangle(2,
[f'if(Nx>{i}, {u}*wx, wx)', '0mm', '0mm'],
[f'if(Nx>{i}, {i+1}*wx, wx)', 'wy'],
name='rect')
x.color = (255, 0, 0)
u += i + 2
models.append(x)

hfss.modeler.unite(models)

# %%

from pyaedt import Hfss

hfss = Hfss(specified_version='2022.1', designname='case2')

hfss['Nr'] = 4
hfss['dr'] = '1mm'
hfss['dz'] = '1mm'
hfss['ratio'] = 0.7

rings = []
for i in range(0, 20):
c1 = hfss.modeler.create_circle(2, (0, 0, f'if({i}<Nr, {i}*dz, 0)'), f'if({i}<Nr, {2*i+1}*dr, 1*dr)',
is_covered=False, name=f'c_{2*i}')
c2 = hfss.modeler.create_circle(2, (0, 0, f'if({i}<Nr, ({i}+ratio)*dz, ratio*dz)'), f'if({i}<Nr, {2*i+2}*dr, 2*dr)',
is_covered=False, name=f'c_{2*i+1}')
ring = hfss.modeler.connect([c1, c2])

sheets = hfss.modeler.get_objects_in_group('Sheets')
hfss.modeler.unite(sheets)

# %%

hfss = Hfss(specified_version='2022.1', designname='case3')
N = 4

hfss['dx'] = '4mm'
hfss['dy'] = '3mm'
hfss['dz1'] = '0.2mm'
hfss['dz2'] = '0.1mm'
hfss['configuration'] = [1] * (N ** 2)

create_rectangle = hfss.modeler.create_rectangle
keys = [(i, j) for i in range(N) for j in range(N)]

x = create_rectangle(2, ('0mm', '0mm', '0mm'), (f'{N}*dx', f'{N}*dy'), name='m0')
hfss.modeler.thicken_sheet(x, 'dz2')
for n, (nx, ny) in enumerate(keys):
x = create_rectangle(2,
(f'if(configuration[{n}]==1, {nx}*dx, 0)', f'if(configuration[{n}]==1, {ny}*dy, 0)',
f'if(configuration[{n}]==1, 1mm, 0mm)'),
(f'if(configuration[{n}]==1, dx, {N}*dx)', f'if(configuration[{n}]==1, dy, {N}*dy)'),
name=f'mp{nx}_{ny}_0')
hfss.modeler.thicken_sheet(x, f'if(configuration[{n}]==1, dz1, dz2)')

# %%
from pyaedt import Hfss

hfss = Hfss(specified_version='2022.1', designname='case4')

hfss['Nr'] = 6
hfss['R0'] = '100um'
hfss['W0'] = '20um'
hfss['Pitch'] = '40um'
hfss['Nn'] = 4
hfss['T0'] = '5um'

locations = []
for i in range(200):
locations.append(
(f'if({i}<Nr*Nn, (R0+(Pitch/cos(pi/Nr))*{i}/Nr)*cos(2*pi*{i}/Nr), (R0+(Pitch/cos(pi/Nr))*Nn)*cos(2*pi*Nn))',
f'if({i}<Nr*Nn, (R0+(Pitch/cos(pi/Nr))*{i}/Nr)*sin(2*pi*{i}/Nr), (R0+(Pitch/cos(pi/Nr))*Nn)*sin(2*pi*Nn))',
'0mm'))

hfss.modeler.create_polyline(locations, xsection_type='Line', xsection_width='W0', name='spiral')
hfss.modeler.thicken_sheet('spiral', 'T0')




EDB建立PinGroup

為U2A5建立GND PinGroup,儲存之後匯入EDB from pyaedt import Edb edb = Edb(edbpath= r"D:\demo\Galileo_G87173_20454.aedb" , edbversion= '20...