0%

pscan2的官方教程,按照下面Linux 64 bit的指示,一共分为4步。找一个地方,新建一个文件夹用来存放安装包,这里我们以 pscan2_setup文件夹为例。pscan2安装的位置在 /opt/pscan2

image-20230325220538901

第一步:安装Anaconda

Anaconda官网链接,点进去后,翻到底。点击下面的链接,会下载一个 Anaconda3-xxx.sh文件,安装参考这个教程。我这里是安装在 /opt/Anaconda3下,当然需要root权限。

image-20230325213936087

安装好了Anaconda3后,然后创建一个python3.8的环境,这个需要和你下载的pscan2的包要求的一致。这里执行:

1
conda create -p /opt/pscan2/python38 python=3.8

第二步:安装SuiteSparse

安装这个比较复杂,因为它需要比较多的依赖。擦汗中。它是一个数值求解用的专业库,十分强大。我这里是安装的最新版的SuiteSparse,因为想着最新版的KLU的库,可以让pscan2仿真更快吧。官方的安装链接

这里下载的是SuiteSparse v7.0.1,下载链接。点击下面的链接,会下载一个 SuiteSparse-xxx.tar.gz的包。将这个包复制到 /opt/pscan2目录下,执行 tar -xf SuiteSparse-xxx.tar.gz来解压该包,会得到一个 SuiteSparse-7.0.1的文件夹,cd进去。我这里是采用 make local的方式,就是只把 .so文件释放到该目录下。

image-20230325221231573

下面都是在root下操作。

安装GMP

官网链接下载最新安装包。

1
2
3
4
5
6
7
8
9
10
11
解压,解压后的文件夹里,INSTALL文件是教程,记得认真看。
tar -xf gmp-xxx.tar

cd gmp-xxx

使用默认配置,即默认安装在/usr/local中
./configure

make
make check
make install

你的make要是提示版本太低啥的,需要升级一下cmake。我这里是把cmake升级到了3.26.1。

接下来需要安装GMP和MPFR,这两个是SuiteSparse需要的依赖。

安装MPFR

这里安装的mpfr v4.0.2版本,没有安装最新版,因为我没有在官网上找到最新版v4.2.0的patch文件,而找到了v4.0.2的patch文件。

v4.0.2的下载链接。下载好后,解压,先看下里面的INSTALL说明文件。然后按照下面的指示来操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cd mpfr-4.0.2

将patch文件下载到当前目录:
wget https://www.mpfr.org/mpfr-4.0.2/allpatches

patch一下:
patch -N -Z -p1 < allpatches

./configure
make
make check

默认安装到/usr/local目录:
make install

安装GMP和MPFR还不是太难。

安装SuiteSparse

make local,报了下面的错,但是我敲 gcc -v,发现我的gcc是12.2.0版本的,已经满足要求了,此时需要先指定一下gcc的环境变量。

image-20230325222136883

先敲下面的代码,来指定一下gcc。参考链接

1
2
3
4
5
export CC=`which gcc`
export CXX=`which g++`

这里参考github官网:
CC=gcc CX=g++

当你指定了上面的gcc后,执行JOBS=32 make local,会发现还是会报那个错,如下图所示,这时发现它是卡在了GraphBLAS里。这是因为make的cache文件还没有更新,所以我们需要删除掉这个cache文件,敲 rm GraphBLAS/build/CmakeCache.txt,来删除掉它。

image-20230325225523636

再执行JOBS=32 make local,会发现通过了上面这个报错。

但是过一会,又遇到了一个新的报错。说我的mpfr版本太低,但是我明明已经安装好了 v4.0.2的mpfr,所以应该时路径没有指定到位。

image-20230325224842490

可以看到这次是卡在了SPEX中,在终端中执行:

1
2
3
4
5
export GMP_ROOT=/usr/local/lib/
export MPFR_ROOT=/usr/local/mpfr/

这里一定要记得删除掉上次的cache文件,不然你指定好了路径后,它还是会报相同的错误。
rm SPEX/build/CMakeCache.txt

这里只需要指定GMP和MPFR的root路径即可,它会自动去找的。然后再次执行 JOBS=32 make local。这次就没有报错了,顺利的跑完了。

这时你的lib下还是空的,还需要执行下面的命令,来生成shared libraries(.so文件)。

1
make install

image-20230325231327700

下面我又安照pscan2官方的指示,又到各个module里make了一下。

1
2
3
4
5
6
7
8
9
10
cd SuiteSparse_config
make library
cd ../AMD
make library
cd ../BTF
make library
cd ../COLAMD
make library
cd ../KLU
make library

最后需要把SuiteSparse的lib路径添加到你的 ~/.bashrc文件中,即在~/.bashrc中添加下面的内容,这样pscan2就可以找到这些.so文件了。

1
2
3
# SuiteSparse, used for pscan2
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/pscan2/SuiteSparse-7.0.1/lib
export LD_LIBRARY_PATH

第三步:安装pscan2

将下载好的 pscan2-1.0.33-py38_0.tar.bz2包放在 /opt/pscan2/目录下(这里不需要解压该包),然后执行 conda activate /opt/pscan2/python38 来激活这个python环境。然后执行 conda install pscan2-xx.tar.bz2,来安装这个包。执行完后,你的/opt/pscan2/python38/lib/python3.8/site-packages/下就会有pscan2的包了。

第四步:测试安装好的pscan2

下面找一个jtl的电路,来跑一个pscan2。准备好下面几个文件,其中.hdl .cir的文件读者可以参考pscan2的手册编写,而psui.py是一个调用pscan2 GUI的脚本。

image-20230325232918047

psui.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys, os
from PyQt5.QtWidgets import QApplication

from pscan2 import *
from pscan2.psui import PSMainWindow


if __name__ == '__main__':
initialize([sys.argv[0],'main'])
app = QApplication(sys.argv)
mainWin = PSMainWindow.PSMainWindow()
mainWin.show()
sys.exit(app.exec_())

在上面这个目录下,开一个终端,先激活pscan2的python环境,conda activate /opt/pscan2/python38 。然后执行 python psui.py main来启动pscan2,此时应该会报找不到啥链接库之类的错误,我这里是报了找不到libamd.so,这是因为我虽然把 /opt/pscan2/SuiteSparse-7.0.1/lib加入到了 ~/.bashrc文件中,但是那个lib库里面没有 libamd.so,所以它说找不到。此时只需要在 /opt/pscan2/SuiteSparse-7.0.1/lib中为 libamd.so建立软连接即可,如下图所示。每加一个 .so文件的软链接后,就执行一下 python psui.py main,它会不断报新的库的错误,然后一个一个对应添加即可。当添加完所有的以后,应该还会报 PyQt5啥的找不到之类的错误,这是因为你现在的 /opt/pscan2/python38中还没有安装这些包,所以需要一个一个来安装,装好这些包以后,应该就可以启动pscan2的GUI了。

image-20230326152244124

下面是pscan2的界面,跑一下仿真,是可以运行的,也没有什么报错。

image-20230326152937027 image-20230326153103335

题外话

linux下,要格外注意 ~/.bashrc文件。假如用户要使用这个 /opt/pscan2下的pscan2软件,需要在自己的 ~/.bashrc中加入 condaSuiteSparse库的路径即可,conda的设置由 conda init自动管理的,用户不需要额外设置了,所以这里用户只需要添加下面的语句即可。

1
2
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/pscan2/SuiteSparse-7.0.1/lib
export LD_LIBRARY_PATH

~/.bashrc中其他的添加都可以去掉了,不然你可能会遇到下面的报错。我这里遇到了,重装了PyQt5还是不行,这篇博客给了我启发,应该Qt5的环境紊乱了。

1
Qt_5 not defined in file libQt5Core.so.5 with link time reference

在终端中执行 locate libQt5Core.so.5,可以看到有一堆路径中都有这个 .so5的包,于是我就把我的 ~/.bashrc中其他无关的路径注释掉了,上面的报错就没有了。

有用的话,记得点个赞哟~

如何打包并发布一款用Python写的软件?

开发环境: win10, Pycharm2021

用到的工具:pyinstaller, NSIS

pyinstaller打包项目

利用Pyinstaller打包整个python工程,它会将项目所用到的所有依赖包打包在一起。这里通过 release.spec文件进行配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# -*- mode: python ; coding: utf-8 -*-

# 这里将需要用到的resources文件添加一下,不要把自己的源码路径给添加进去了,否则你会在打包好的文件夹下看到自己的源码工程,当然如果你想要开源的话,那就没关系了。
added_files = [
("project_relative_path\\resources", "project_relative_path\\resources"),
]

# 这里是为了给软件加密,pyinstaller只能加密Python Bytecode,一定要搞清楚什么是Bytecode,也即pyinstaller并不会给python源码加密。这里有一个比较复杂的点,那就是安装加密用的pycrypto包,后面我会单独讲。
block_cipher = pyi_crypto.PyiBlockCipher(key='1234567812345678')

a = Analysis(
['main.py'], # 程序的入口
pathex=[],
binaries=[],
datas=added_files,
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
pyz,
a.scripts,
[],
exclude_binaries=True,
name='name_of_program',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon="absolute_path_of_logo.png" # 这里给.exe加一个logo
)

# onedir
coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='name_of_program',
)

写好上面的 release.spec文件后,然后在终端相应的目录执行 pyinstaller .\release.spec,便可以对项目进行打包了。上面不懂的地方去看官方文档吧。下面有一个例子,读者可以看一下。

链接1

安装pyinstaller加密用的pycrypto包

注意,我试过网上说的PyCryptodome,但是并没有成功。还是得安装pyisntaller指定的pycrypto包才行。我的win10+python3.8.5在用虚拟环境中的pip3安装pycrypto包时,遇到了报错。解决办法参考 链接2,看下面这个回答。

image-20221026093734333

NSIS制作软件安装、卸载界面

先看一下这个视频教程。要是使用最简单的安装,即只有一个路径选择,那么视频里已经讲了。若是想使用高级一点的安装、卸载,则要用脚本的形式,即写一个.nsi文件。这个.nsi文件在编译完可以生成一个.exe的文件,双击这个生成的.exe就可以进行程序的安装了。

下面讲一个demo。

Program_Name.nsi文件,代码如下。该文件的书写需要与实际的安装和卸载过程结合起来,多尝试几次就明白代码的语法了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
; Program_Name.nsi
;--------------------------------

; The name of the installer
Name "Program_Name"

; The file to write
OutFile "Install_Program_Name.exe"

; Request application privileges for Windows Vista and higher
RequestExecutionLevel user

; Build Unicode installer
Unicode True

; The default installation directory
InstallDir $PROGRAMFILES\Program_Name

; Registry key to check for directory (so if you install again, it will
; overwrite the old one automatically)
InstallDirRegKey HKLM "Software\Program_Name" "Install_Dir"

;--------------------------------

; Pages

Page components
Page directory
Page instfiles

UninstPage uninstConfirm
UninstPage instfiles

;--------------------------------

; The stuff to install
Section "Program_Name (required)"

SectionIn RO

; Set output path to the installation directory.
SetOutPath $INSTDIR

; Put file there. Program_Name is the folder name that you wanna release, this is rightly the folder that pyinstaller packaged.
File /r Program_Name\*.*

; Write the installation path into the registry
WriteRegStr HKLM SOFTWARE\Program_Name "Install_Dir" "$INSTDIR"

; Write the uninstall keys for Windows
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Program_Name" "DisplayName" "Program_Name"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Program_Name" "UninstallString" '"$INSTDIR\uninstall.exe"'
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Program_Name" "NoModify" 1
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Program_Name" "NoRepair" 1
WriteUninstaller "$INSTDIR\uninstall.exe"

SectionEnd

; Optional section (can be disabled by the user)
Section "Start Menu Shortcuts"

CreateDirectory "$SMPROGRAMS\Program_Name"
CreateShortcut "$SMPROGRAMS\Program_Name\Uninstall.lnk" "$INSTDIR\uninstall.exe"
CreateShortcut "$SMPROGRAMS\Program_Name\Program_Name.lnk" "$INSTDIR\Program_Name.exe"

SectionEnd

; Optional section (can be disabled by the user)
Section "Desktop Shortcut" SectionX
SetShellVarContext current
CreateShortCut "$DESKTOP\Program_Name.lnk" "$INSTDIR\Program_Name.exe"
SectionEnd

;--------------------------------

; Uninstaller

Section "Uninstall"

; Remove registry keys
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Program_Name"
DeleteRegKey HKLM SOFTWARE\Program_Name

; Remove all files in INSTDIR
Delete $INSTDIR\*.*

; Remove all shortcuts, if any
Delete "$SMPROGRAMS\Program_Name\*.lnk"
Delete "$DESKTOP\*.lnk"

; Remove directories
RMDir "$SMPROGRAMS\Program_Name"
RMDir "$INSTDIR"

SectionEnd

Program_Name.nsi放到与Program_name项目包的同一级,如下图所示。

image-20221026095511802

右击 Program_Name.nsi,点击Compile。

image-20221026100645595

然后点击Test Installer,可以测试一下,也可以选择Close。

image-20221026100839406

你会发现在当前文件夹下生成了一个 Install_Program_Name.exe,这个就是程序的安装文件。下面双击它进行安装。先勾选一些功能,然后选择安装路径,点击安装。

image-20221026101025597

安装好了以后会在 Install_Dir文件夹下释放下面的文件:

image-20221026101319360

并且在桌面和开始菜单会生成快捷方式。

image-20221026102328741image-20221026102341839

若要卸载的话,双击那个 uninstall.exe即可。

我把这个demo上传到github了,需要的同学自取吧,记得给个星哦。

前言:

当PCB已经走完其他的线后,就只剩下GND线了。如果什么都不管,直接给所有层都铺上GND的铜的话,当你进行未连接的走线检查时,会发现仍旧有一些GND的线没有连上,即仍然显示飞线。这是因为这些GND的焊盘在一些孤岛中,就算你打上GND的小过孔,这些孤岛也连不上。下面讲讲如何处理。

环境介绍: AD20

正文:

先给那些仍旧有飞线的的GND的焊盘都引出来一点线,然后打一个过孔,就像下面这样。

image-20220812174006978

然后选一个合适的层来把上面的小焊盘通过走线连接到孤岛外面的GND上去。

之后 T-G-A 重新铺所有层的GND铜,再 T-D-R运行DRC,检查还剩下哪些飞线没有处理。直到处理完所有的飞线。

最后 R-B,只勾选Routing Information,点击Report,来检查连线情况。若是100%了,就OK了。

image-20220812175807896

开发环境:

  • 本地环境win10, Pycharm2021
  • 使用远程的centos7 服务器上的python解释器

Matplotlib会抛出下面的警告,然后用matplotlib画的图也无法显示了。

1
2
UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.
plt.show()

在服务器端的配置

首先要检查服务器上的ssh协议是否正常运行,centos7的话是使用 sudo vim /etc/ssh/sshd_config来编辑ssh的配置文件,加入下面这样的两行。第一行是开启X11Forwarding,第二行是让默认的Display号为11。这个怎么理解呢?以我的使用场景为例,如果该服务器只有自己一个人用ssh的话,当你开启一个MobaXterm,通过ssh连接到服务器后,我本地电脑分配到的Display号默认就是11了。

1
2
X11Forwarding yes
X11DisplayOffset 11

在本地机的配置

下面就是只在自己本地机上操作了,用MobaXterm建立ssh的连接(可以设置自动开启X11 Forwarding,这就体现出了它相比于分别操作Putty和X11 ming的优势)。MobaXterm要设置成下面这样,防止ssh休眠,并开启默认开启X11-Forwarding。

image-20220610170025158 image-20220610170133246

这样设置好后,当用ssh连接后,会出现下面的信息:

image-20220610170254450

让MobaXterm在后台运行着,这样用Pycharm才可以正常在本地显示figure。记得在Mobaxterm中键入 echo $DISPLAY来看本地的号,该号要与下面Pycharm中运行程序的配置文件中的设置的一致,如下图所示。若是这两个号不一致,那么你就会得到本文最开始时的Matplotlib警告信息。

Snipaste_2022-06-10_17-06-31

搞定!

前言:

目的: 在win10上面的vmware中安装ubuntu20.04的过程全纪录

正文:

第一步

安装vmware和ubuntu,参考这个博客,记得看那篇博客下面的评论。

在进行第15步的时候,你会发现安装过程巨慢,这是因为使用的是国外的镜像,所以就慢。解决方法就是断网,先进入到系统再说,后面再更换镜像源,使用国内镜像,用命令行更新一下就好了。

第二步

装完系统后,第一件事情是更换为国内镜像源。

  1. 原文件备份
1
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
  1. 编辑源列表文件
1
sudo vim /etc/apt/sources.list
  1. 将原来文件中内容全删掉,添加下面的内容(清华镜像源)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse

deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse

deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse

deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse

deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse

deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse

  1. 运行 sudo apt-get update ,目的是从服务器获取全部可用的、最新的软件包列表,并缓存到本地电脑。
  2. 运行 sudo apt-get upgrade,该命令会提示你更新软件包,更新就好了。关于 apt-get updateapt-get upgrade的区别见这个链接

第三步

解决win10和ubuntu系统之间,无法使用跨平台copy/paste和drag/drop的问题。参考这个,看最高赞回答。

搞好了这一步,就可以实现win10的浏览器中google问题,然后把命令行粘贴到寄生系统ubuntu中。

第四步

挂载win10的文件夹到ubuntu中。

进行这一步的前提是进行了第三步中,安装vmware-tools的步骤。然后选择你想要把win10中哪个文件夹共享过去,依次点击左上角虚拟机 --》 设置 --》 选项 --》 共享文件夹 --》 总是启用 --》 添加要共享的文件夹。

设置好之后直接在ubuntu中执行 vmware-hgfsclient,来查看已经共享过来的文件夹有哪些,你应该可以看到刚设置好的文件夹。

对该共享文件夹进行测试,分别在win10和ubuntu中新建文件,看对方是否更新。

没问题的话,可以将 /mnt/hgfs/share的目录建立一个软连接,放到/home/用户 目录下。即执行 ln -s /mnt/hgfs/share/ /home/用户名/share 。注意:这几条命令中,读者明白意思就行,需要根据自己情况来修改某些词,当然这步建立快捷方式的过程也不是必须的。。。

这里记录一下在win10上安装Xic Wrspice的过程。


先说结论:我最终是在win10上的vmware中的ubuntu上安装了Xic和Wrspice软件。

刚开始看官网和github上有win10上的安装教程,然后操作了一通,没有成功,中间经历了很多坎坷,得出结论,还是上虚拟机中开发吧。。。下面介绍一下我自己的坎坷历程。

方案一:在win10上直接安装Xic和Wrspice软件

官网上下载这几个包,然后依次点击安装,装好后就是下面一堆文件,bin文件夹中有所有的启动文件。点击运行软件,你会看到一个终端一闪而过,然后就没有任何动静了。

image-20220507135239293

方案一失败。

方案二:在win10的MSYS2中搞Xic和Wrspice的exe文件

参考这个链接,上小系统MSYS2,在启动配置并启动Xic和wrspice软件。装好MSYS2后,安装一堆环境包,然后将方案一中的那些 sw/xictools/目录挂载到MSYS2系统中的 /usr/local/xictools/目录下。当进行到最后一步时,在终端中运行 winpty program时,给出了 Failed to load the program DLL的报错。参考github中的该issue,在2022.05.07这一天时,该issue还是open的,官方人员并没有给出有效的解决方案。

最终,方案二也失败。

方案三:在win10的MSYS2中编译xic和wrspice的源码

参考github中的说明,决定把该github的xic, wrspice源码文件下载下来,在MSYS2中编译这些源码,最终生成.exe文件,我再去启动这些.exe文件,会不会就可以work了呢?试试再说。

它官网给出的说明是使用MSYS2,而github中给出的说明是用Cygwin,这两个东西并不一样,但是我觉得对于编译该xic软件应该没啥区别吧,就还是继续使用了方案二中的MSYS2了。先是下载一堆准备环境,其中还参考了github文档中Linux的说明部分,把该装的都装上了。

最终到了 make config的环节,运行以后,给出了类似于下面这样的报错:

1
make[2]: *** No rule to make target 'depend'.  Stop.

它的源文件我并没有修改什么,但是看这报错好像是它源码的makefile没有处理好,光解决这个问题,搞了好久,反正就是一个又一个的报错吧。

最终放弃了,方案三失败。

方案四:在win10的虚拟机中的ubuntu中安装xic和wrspice的.deb文件

既然品出来了,它原本的源码就是在linux下开发的,那我直接上linux系统应该好一些吧。

image-20220507150335022

从上图中可知好几种linux系统都是可以的,但是由于见到刚上面那个issue中有人提到用ubuntu装好了软件,所以我也选择了ubuntu,并且选择了和它一模一样的版本。下面开搞!

参考这个教程,下载这一堆.deb文件。大家可以参考我的另一篇博客,来装vmware和ubuntu。装好ubuntu后,将win10下的xic的.deb的安装包所在文件夹挂载到虚拟机的ubuntu中,在终端中安装即可。当跟着官网的说明搞完后,就可以正常启动xic, wrspice软件了。

成功!

一、前言

这里记录一下在win10上安装JoSIM - Superconducting Circuit Simulator的过程。

开发环境:

  • win10
  • vscode (非必须)
  • python 3+
  • python 下的 cmake 3.14.4
  • Git
  • C++ compiler with C++17 support

二、开始

JoSIM官方文档

将下面两个包下载下来,上面这个是傻瓜版,下载完解压直接用,不用编译出josim-cli.exe和josim.lib了,因为里面已经有了。而下面这个压缩包则是包含源码的工程,例如文档、例子工程等,同样把它解压。

image-20220412183109984

先通过python 3.+在该工程下建立一个虚拟环境venv,并激活它。下面就在该虚拟环境中安装一些package。

运行pip install cmake==3.14.4

下面安装MSVC(下载链接),然后只需要安装带有cmake字样的功能即可,装好后重启电脑。

运行 cmake --help,来看是否是如下图所示的样子,新安装的MSVC上有个星号,有的话就往下继续。

image-20220412183851935

按照下面的步骤进行

image-20220412184022288

当执行完cmake …后,会提示一个Git tag标签的错误,这时候要去这个作者github上查看最新的工程的git的hash值,然后复制粘贴到下面的位置。

image-20220412184209683

再次cmake … 就没问题了。

然后把最后一个命令执行了,就会在Release文件夹下产生下面两个东西(这两个东西是和直接下载的另个包中的东西是一致的),然后看官方教程即可。

image-20220412184340677

一、前言

目的:在win10上安装PSCAN2 Superconductor Circuit Simulator软件。

开发环境:

  • win10
  • vscode + python插件 + vhdl插件

二、开始

查看官网要求:官网链接

image-20220409173851493

可以看到是安装32 bit的anaconda,所以打开Anaconda网站,往下翻,找到32 bit的windows安装包。可以看到写下这篇博客时,Anaconda已经更新到了Python 3.9,而PSCAN2要求的python环境是3.8的,这个版本差异我是通过后续在Anaconda软件内新建3.8版本的python环境来解决的,所以这里就直接下载这个Python3.9 32bit 的安装包即可。下载好了后,安装,参考这个Anaconda安装教程

image-20220409174028048

anaconda安装好了后,要是没有将它加入到环境变量,需要加入到环境变量,否则无法在terminal中执行conda命令,参考这个

接下来新建一个python 3.8的环境(按照pscan2 的官网要求),参考这个,在这篇教程中的py36可以自定义的,当然我们这里需要新建成3.8,而不是3.6的。

接下来将pscan2网站的所有东西下载下来,即下面这些东西,留着用来学习吧。假设我们下载到了一个名叫 pscan2文件夹,并将这所有的压缩包类的都解压到该目录下。

image-20220409175516063

pscan2文件夹中,开一个终端,在终端中切换到我们的python3.8环境,然后执行 conda install pscan2-xxx.bz2命令,目的是将pscan2软件部署到该Python环境中,接下来就可以启动pscan2软件了。

在上面的终端中,cd到testnot文件夹(这里面是一个demo工程,详情见pscan的两个pdf手册),然后键入下面图片中的命令 python -m pscan2.gui testnot,幸运的话,你就能正常启动软件了,并看到GUI软件出现。

image-20220409180000361

遇到了一个bug:

我在执行上述命令后,遇到了下面这样的错误:(参考的是这个

image-20220409180406876

解决办法,打开这个LodaCircuit.py文件,在报错的这一行(如下图所示)进行修改,加入这个 , encoding='UTF-8' ,然后保存。再执行一次该命令 python -m pscan2.gui testnot,这次应该就可以正常启动pscan的GUI了。GUI如下所示。

image-20220409180518536 image-20220409180743357

最后:

点赞

开发环境: win10, Pycharm2021

这里记录一下解决该问题的历程。该工程中使用到了PyQt5的GUI,多线程技术等。使用pycharm,在程序运行时,程序偶尔会莫名奇妙的退出,并只是报下面的错误:

1
Process finished with exit code -1073741819 (0xC0000005)

纳尼,只是给出了这一个报错,却没有任何traceback??!(想直接看结论的请下滑到底)并且这个报错只是偶尔才会给出。上网搜索上面这个报错,查到了这个,按照其给出的方法试了试:

image-20211129214434686

image-20211129214525252

于是查看win10的事件管理器,发现了下面的报错信息,而这些竟然在pycharm中完全不显示。由下面看出来应该是pyqt5引起的报错,于是重新安装了pyqt5,报错并没有解决。

image-20211129214749891

又上网搜索该 事件管理器中的报错,没有解决问题。


于是又上网搜索 pycharm come across error without traceback,终于努力对了方向。找到了这个,按照下面这种方法试了试,终于在debug时给出了具体的 traceback

image-20211129215454501

Debug的Console中给出的具体的报错如下,而且在程序靠前的某处还给出了一个警告,但是并没有影响程序的往下执行。

1
2
3
4
5
6
7
8
警告如下:
QObject::setParent: Cannot set parent, new parent is in a different thread

--snippets--

报错如下:
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QTextDocument(0x18992e5ad60), parent's thread is QThread(0x18990b3af30), current thread is QThread(0x18993804600)

于是上网搜索这两个报错,发现了link1, link2, link3

image-20211129220318194

image-20211129220554350

看完后有了灵感,总之是pyqt5的GUI和多线程导致的报错。于是上网搜索 pyqt5 qthread关键词,找到了一个令人欣喜若狂的文章:戳我。该文章中还讲了python的线程和QThread的比较。看完后完全明白了,上面的这些警告和报错是如何产生的。我的程序是先运行windows的部分,此时是在mainThread里,然后在mainThread里又开了一个python的thread去处理mainThread里的一些objects和widgets,而每当要访问这些widgets的地方都会抛出上述的警告和错误

然后按照该文章,比葫芦画瓢就好了。搞定~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/usr/bin/env python
# -*- coding:utf-8 -*-

class B(object):
def func_b(self):
print("In class B, func_b")
# print('B: ', B.__mro__)
print('B: ', self)
self.func_d() # 调用同为父类的D中的func_d函数


class C(object):
def func_c(self):
self.func_b()
print('C: ', self)
# print('C: ', C.__mro__)
print("In class C, func_c")


class D(object):
def func_d(self):
print('D: ', self)
# print('D: ', D.__mro__)
print("In class D, func_d")


class A(B, C, D): # A同时继承B,C,D
def __init__(self, parent=None):
super(A, self).__init__()
print('A: ', self)
# print('A: ', A.__mro__)

def func_d(self):
print("In class A, func_d")


if __name__ == '__main__':
A_inst = A()
print('A_inst: ', A_inst)
A_inst.func_b()
A_inst.func_c()
A_inst.func_d()

上面B,C,D都是A的父类,互为平行关系,而C类中的func_c竟然可以调用B类中的func_b???程序运行结果如下,可以看到类实例A_instA, B,C,类中的self是一个内存地址,这也就解释了为何C类中的func_c竟然可以调用B类中的func_b。

1
2
3
4
5
6
7
8
9
10
11
12

A: <__main__.A object at 0x000002D60CE2E070>
A_inst: <__main__.A object at 0x000002D60CE2E070>
In class B, func_b
B: <__main__.A object at 0x000002D60CE2E070>
In class A, func_d
In class B, func_b
B: <__main__.A object at 0x000002D60CE2E070>
In class A, func_d
C: <__main__.A object at 0x000002D60CE2E070>
In class C, func_c
In class A, func_d

**知识点:**有self时,该方法是绑定到对象的方法。

1
2
3
4
5
6
7
8
9
10
11
class Person(object):
def func01(self):
print('绑定到对象的方法')

@classmethod
def func02(cls):
print('绑定到类的方法')

@staticmethod
def func03():
print('非绑定方法')

参考: