如何使用python调用ads接口(版图仿真)
使用python调用ads接口
- 背景
- 环境介绍
- 具体操作过程
- ads帮助文档
- 配置环境以及测试
- em生成仿真初始化文件
- 开始仿真
- 完整过程以及补充
- 最后一点建议
- 2022.3.9更新
- 一个小bug
- 改了改过程,把整体过程写的详细了些
背景
最近在做射频器件逆向设计,需要使用python调用ads生成数据,于是向师兄请教,在踩了很多坑之后终于成功了,记录一下整个过程
环境介绍
ads 2017(师兄用的是2021,俺估计2017及更新的版本都可以使用)
python3.6(主要是使用os)
具体操作过程
ads帮助文档
在ads的官方文档中,这篇文章是完整讲述如何使用ads接口(也就是用命令行的形式进行版图仿真),遇到啥问题找这里。
配置环境以及测试
在调用ads前,需要先修改系统环境变量;windows下的环境变量配置(我修改的是系统变量,不清楚修改用户变量是否有相同的效果)
set HPEESOF_DIR=<path_to_ADS_installation_directory> # for example: set HPEESOF_DIR=C:\Progam Files\Keysight\ADS2014_11
set ADS_LICENSE_FILE=<path_to_ADS_license_file_or_server> # for example: set ADS_LICENSE_FILE=C:\Program Files\Keysight\EEsof_License_Tools\licenses\license.lic
set PATH=%HPEESOF_DIR%\bin;%PATH%
注:不要直接在cmd控制台中直接使用这些命令,那样只是临时的变量,需要自己到环境变量中配置;
这里有个小坑是如果你在破解时没有lincense文件,那就不用配置证书的那条,只需配置第一三条就可以使用了(我就是这样,破解时没有lincense)
记得配置完后重启电脑(很重要!!!!)
配置后的测试:adsMomWrapper --version
em生成仿真初始化文件
在需要仿真的layout文件中打开仿真界面,生成仿真输入文件
生成之后的文件夹长这样
这个文件夹的路径在工作空间的simulation文件夹里
比如:D:/<your ads workspace>/simulation/*****/*****/layout
开始仿真
这部分就没啥说的,只要cd到指定的目标文件夹下,然后调用命令就可以了,详细见后文的代码部分
不过这个命令有两种
# 命令格式:adsMomWrapper -T proj proj
Substrate file pre-processing (e.g. expanding substrate for thick conductors)
-TSubstrate database generation (Green function calculation)
-DBLayout pre-processing and mesh generation
-MS-parameter model generation
-3DFar Field calculation
-FF# 还有一种是这种,也就是连续执行,从-T执行到-3D;-3D也就是我们常用的s参数仿真
adsMomWrapper -O -3D proj proj
因为俺最近升级了win11,用连续执行的命令会报错。。只能分开写。如下图(python里用os包使用ads的接口命令)
仿真后的文件变成这样(部分文件)
其中仿真后s参数的文件保存在 .cti 文件中。
注:不同type的仿真生成的s参数文件不同;
adaptive模式生成的是 .afs 文件,其他没有测过。
上述情况是单次仿真,如果需要改变器件的参数(比如微带线长度/宽度)进行连续仿真,则需要修改
proj_a和proj.pin文件
proj_a里面是器件的位置,以单条微带线为例,其中一行是微带线矩形四个点的坐标,这点需要按实际需求自己改
proj.pin保存了p针头的坐标,要和proj_a中器件的端口对应起来
其他需求照例子看看文件,俺是一个一个文件找过去的。
完整过程以及补充
梳理一下完整的过程,以及补充一个坑
1.配置环境变量,重启电脑。
2.打开python,open打开文件,修改内部器件参数
3.使用os.system,cd到目标的仿真文件夹,再使用ads命令仿真。
4.如果ads无法连续仿真,也就是仿真第一次后,后面几次执行命令后其实没有仿真而是和第一次的仿真数据一样,说明无法连续仿真,这时可以把文件中多余的文件删掉,这样下一次仿真时才是正常的。
(具体文件对比大家就自己对照写写吧,仿真文件不同生成的文件也不同)
至于怎么保存数据这就看各人的需求了
完整代码下图(作为例子)
import os
import math
import numpy as np
import pandas as pd# liner对应.cti adapt对应.afs 提取S参数,读取S参数
def read_cti(path: str):print(path)read_c = open(path + "/proj.cti")data = read_c.read()read_c.close()data = data.split("BEGIN\n")s_str = data[2].split("END")s11_str = s_str[0].replace("\t", "")s11_str = s11_str.split("\n")s_str = data[4].split("END")s21_str = s_str[0].replace("\t", "")s21_str = s21_str.split("\n")s11_r = []s11_i = []s21_r = []s21_i = []s21_phase = []for i in range(len(s11_str) - 1):s11_ri = s11_str[i].split(",")s21_ri = s21_str[i].split(",")s11_r.append(float(s11_ri[0]))s11_i.append(float(s11_ri[1]))s21_r.append(float(s21_ri[0]))s21_i.append(float(s21_ri[1]))s21_phase.append(math.atan2(s21_i[i], s21_r[i]) * 180 / math.pi)return s21_phase# 修改仿真前配置文件,即修改器件设计参数
def generate_s21(proj_path: str, w1):i_hang = 0with open(proj_path + r"\proj_a") as read_f, open(proj_path + r"\.proj_a", 'w') as write_f:for line in read_f:if i_hang == 2:print(line)line = "ADD P1 :W0.000000 -0.9500,-0.2750 %.4f,-0.2750 %.4f,0.4350 -0.9500,0.4350;\r" % (w1, w1)write_f.write(line)else:write_f.write(line)i_hang = i_hang + 1os.remove(proj_path + r"\proj_a")os.rename(proj_path + r"\.proj_a", proj_path + r"\proj_a")i_hang = 0w1_p = w1 * math.pow(10, -3)with open(proj_path + r"\proj.pin") as read_f_1, open(proj_path + r"\.proj.swap.pin", 'w') as write_f_1:for line in read_f_1:if i_hang == 25:print(line)line = " <x>%.5f</x>\r" % w1_pwrite_f_1.write(line)else:write_f_1.write(line)i_hang = i_hang + 1os.remove(proj_path + r"\proj.pin")os.rename(proj_path + r"\.proj.swap.pin", proj_path + r"\proj.pin")# os.system("cd %s && adsMomWrapper -O -3D proj proj" % proj_path)os.chdir(proj_path)print(os.getcwd())# 仿真命令os.system("adsMomWrapper -T proj proj")os.system("adsMomWrapper -DB proj proj")os.system("adsMomWrapper -M proj proj")os.system("adsMomWrapper -3D proj proj")# 删除上一次的仿真文件,才能进行下一次的(这里的功能是抄了一位博客园老哥的代码,链接放到最后)
def Delete_S21(proj_path: str, fileList):for parent, dirnames, filenames in os.walk(proj_path):goodfilelist = []fullfilelist = []for x in fileList:goodfile = proj_path + xgoodfilelist.append(goodfile)for filename in filenames:fullpath = parent + '/' + filenamefullfilelist.append(fullpath)for xlist in fullfilelist:if xlist not in goodfilelist:os.remove(xlist)passif __name__ == '__main__':# proj_path = "D:/project_all/ADS/Myfirstlayout_wrk/simulation/Myfirstlayout_lib/uniform_line/layout/emSetup_MoM"proj_path = "D:/em"w1 = 4.0500s21_csv = pd.DataFrame()S21_Phase = np.zeros([1, 402])w1_list = np.arange(0.65, 139.05, 0.01)# 仿真需保留的文件,不在此list中的文件将被删除fileList = [r'/emStateFile.xml', r'/momentum.cfg', r'/proj.cfg', r'/proj.lcf', r'/proj.ltd', r'/proj.opt',r'/proj.params', r'/proj.pin', r'/proj.plan', r'/proj.prt', r'/proj.sti', r'/proj_a']for i in range(len(w1_list)):generate_s21(proj_path, w1_list[i])S21_Phase_hang = read_cti(proj_path)S21_Freq = np.array(w1_list[i])S21_Freq = np.reshape(np.append(S21_Freq, np.reshape(np.array(S21_Phase_hang), [1, 401])), [1, 402])S21_Phase = np.append(S21_Phase, S21_Freq, axis=0)Delete_S21(proj_path, fileList)S21_data = pd.DataFrame(S21_Phase)S21_data.to_csv("D:/project_all/python/phase/0.65-139.05mm-phase.csv")print("save complete")
最后一点建议
整个的仿真文件可以复制出来,单独在某个文件夹里也是可以正常运行的;
比如生成仿真input文件后,把所有文件复制出来,放到 D:/em (自己随便创建的)文件路径下,cd到目标路径后使用ads命令仿真,最后的仿真数据也会保存在em文件夹中,减小文件夹深度,也算是一点小优化吧。
python保留指定文件/删除目录其他文件的功能:
https://www.cnblogs.com/chub/p/4509921.html
2022.3.9更新
一个小bug
如果第一次在pycham(python的编辑器,俺用的是这个)无法运行ads的接口命令(卡在层叠数据加载那)。需先对仿真文件夹进行一次引导,如下图
即先cd到对应文件夹下,然后运行一次即可,中途记得输入“y”确定。(连续运行记得删除文件)
改了改过程,把整体过程写的详细了些
如何使用python调用ads接口(版图仿真)相关推荐
- pythondockerapi_docker-py 用Python调用Docker接口的方法
众所周知,Docker向外界提供了一个API来管理其中的资源.这个API可以是socket文件形式的(一般也是默认的,在/var/run/docker.sock中),也可以是TCP形式的.以前想要通过 ...
- c调python_应该是史上最全的python调用C接口
在这段时间里,我需要使用python调用C接口.我在网上搜索了很多,再加上python的官方文件,并组织备份1.从ctypes加载dll导入* dll = () # func1dll = CDLL ( ...
- python调用webservice接口实例_python调用各种接口,webservice,c接口,com接口,socket协议方法...
python调用webservice接口(SOAP) (2)调用示例: 需要先安装suds库:pip install suds from suds.client import Client #如果需要 ...
- python调用第三方接口获取数据_python调用接口,python接收post请求接口(附完整代码)...
与Scala语言相比,Python有其独特的优势和广泛的应用,python调用接口,因此Spark也推出了PySpark,它在框架上提供了一个使用Python语言的接口,python接收post请求接 ...
- python rpc_对python调用RPC接口的实例详解
要调用RPC接口,python提供了一个框架grpc,这是google开源的 rpc相关文档: 需要安装的python包如下: 1.grpc安装 pip install grpcio 2.grpc的p ...
- Python 调用WebService接口出错-suds.transport.TransportError: HTTP Error 401: Unauthori
使用Python调用WebService接口出现"suds.transport.TransportError: HTTP Error 401: Unauthorized"错误. 问 ...
- 实现python 调用 C++ 接口的 easypr
实现python 调用 C++ 接口的 easypr 本文实现了用python 调用 C++ 的easypr ,实现车牌的识别. CMakelist.txt 以及调用方法将会附上 CMakelist. ...
- python调用百度接口实现ocr识别_Python调用百度OCR实现图片文字识别的示例代码
百度AI提供了一天50000次的免费文字识别额度,可以愉快的免费使用!下面直接上方法: 首先在百度AI创建一个应用,按照下图创建即可,创建后会获得如下: 创建后会获得如下信息: APP_ID = '* ...
- 如何利用python调用API接口获取数据进行测试
一.Python 可以使用 requests 库来调用 API 接口获取数据.以下是基本的步骤: 1.安装 requests 库 pip install requests 2.导入 requests ...
- python调用第三方接口获取数据_python 接口实现 供第三方调用的例子
python 接口实现 供第三方调用的例子 实验环境 1.环境问题 python 2.7 以上自带的pyunit bottle 作为一个python的简易服务器 在python安装目录 打开命令窗口( ...
最新文章
- python3 函数 不定长参数 不定参
- js判断是否在iframe和禁止网页在iframe中显示
- python系统-Python OS模块常用功能 中文图文详解
- 数学篇(一) 矩阵运算
- 《python机器学习经典实例》Expected 2D array, got 1D array instead和Reshape your data either using array.问题(已解决)
- free 命令查看linux的内存使用情况
- Webserver内存溢出分析
- [转] 使用Docker容器,这些错误千万别犯
- Thinking in Java 源代码 source code 在IDEA上运行
- 使用junit做其他事情
- signature=14a3e4f784cf9004647ea52bac22e550,维族老年慢性阻塞性肺疾病患者合并肺动脉高压的临床研究...
- LeetCode #1349. 参加考试的最大学生数 - 学到了:压缩状态动态规划、位运算、reduce()、str().count()
- 人工智能与机器学习大牛们的blog
- 准备将redis引入项目做消息队列使用
- win10最常用dos命令以及win+R即可运行的命令
- JS如何判断一个对象是否为JSON对象
- DOSBOX 0.74模拟器安装Windows 95
- flutter 实现文字竖排以及动画效果(文字逐一显示)
- HDU 4461 The Power of Xiangqi
- 为什么我朋友的移动手机打不开我的网站却能打开www.ip138.com?