P0的grf题需要32个寄存器,面对这种需要Ctrl-c/v的工作实在是浪费时间.对此,我们需要重拳出击,正好,logism的教程文件提到了怎么自动化复制,这不来尝试一下???
寻找目标元件
用vsc打开circ文件,看到一堆标签,如何从标签里面找到需要的文件?我提出我的一些小办法:
- 使用circuitname快速寻找:使用vsc自带的搜索功能,输入你要找的元件所属的circuit的名字,快速锁定大概范围.
- 根据元器件名字寻找:比如grf需要寄存器,那么,寻找名字为register 的器件,对于tunnel元件,可以根据朝向来判断需要
找到之后,把这些标签放在一起,好统一复制写代码
python是最好的语言
一通操作猛如虎,打出代码,然后尝试一下(在写代码之前建议备份一下之前的circ文件,别问我怎么知道的,在1000+行的circ里面debug太痛苦了,不如直接/remake)
好像emmmm,应该是双重循环.
修改一下,下面附上最终代码
import os
with open("F:\\LOGISIM_FILES\\P0_L0_GRF.circ","a") as f:
template = r"""
<comp lib="0" loc="(%d,%d)" name="Tunnel">
<a name="width" val="8"/>
<a name="label" val="r%d_out"/>
</comp>
<comp lib="4" loc="(%d,%d)" name="Register"/>
<comp lib="0" loc="(%d,%d)" name="Tunnel">
<a name="facing" val="north"/>
<a name="label" val="clk"/>
</comp>
<comp lib="0" loc="(%d,%d)" name="Tunnel">
<a name="facing" val="east"/>
<a name="width" val="8"/>
<a name="label" val="r%d_in"/>
</comp>
<comp lib="0" loc="(%d,%d)" name="Tunnel">
<a name="facing" val="north"/>
<a name="label" val="clr"/>
</comp>
<wire from="(%d,%d)" to="(%d,%d)"/>
<wire from="(%d,%d)" to="(%d,%d)"/>
<wire from="(%d,%d)" to="(%d,%d)"/>
<wire from="(%d,%d)" to="(%d,%d)"/>
<wire from="(%d,%d)" to="(%d,%d)"/>
<wire from="(%d,%d)" to="(%d,%d)"/>
<wire from="(%d,%d)" to="(%d,%d)"/>
<wire from="(%d,%d)" to="(%d,%d)"/>"""
# startx_clr+i*stepx starty_clr+j*stepy-10 startx_clr+i*stepx starty_clr+j*stepy
# startx_clr+i*stepx-10, starty_clr+j*stepy-10, startx_clr+i*stepx,starty_clr+j*stepy-10
# startx_clr+i*stepx-10,starty_clr+j*stepy-20,startx_clr+i*stepx-10,sstarty_clr+j*stepy-10
# startx_ri+i*stepx,starty_ri+j*stepy,startx_ri+i*stepx+20,starty_ri+j*stepy
# startx_ro+i*stepx,starty_ro+j*stepy,startx_ro+i*stepx,starty_ro+j*stepy
#startx_clk+i*stepx+10 starty_clk+j*stepy-20 startx_clk+i*stepx+10 starty_clk+j*stepy-10
#startx_clk+i*stepx starty_clk+j*stepy-10 startx_clk+i*stepx+10 starty_clk+j*stepy-10
#startx_clk+i*stepx starty_clk+j*stepy-10 startx_clk+i*stepx starty_clk+j*stepy
startx_ro = 450
starty_ro = 200
type_ro = 0
startx_re = 410
starty_re = 200
startx_clk = 380
starty_clk = 240
startx_ri = 360
starty_ri = 200
type_ri = 0
startx_clr = 410
starty_clr = 240
stepx = 300
stepy = 300
for i in range(0,8) :
for j in range(0,4):
f.write( template % (
startx_ro+i*stepx, starty_ro+j*stepy, type_ro+(4*i+j),
startx_re+i*stepx, starty_re+j*stepy,
startx_clk+i*stepx, starty_clk+j*stepy,
startx_ri+i*stepx, starty_ri+j*stepy, type_ri+(4*i+j),
startx_clr+i*stepx, starty_clr+j*stepy,
startx_clr+i*stepx, starty_clr+j*stepy-10, startx_clr+i*stepx,starty_clr+j*stepy,
startx_clr+i*stepx-10, starty_clr+j*stepy-10, startx_clr+i*stepx,starty_clr+j*stepy-10,
startx_clr+i*stepx-10,starty_clr+j*stepy-20,startx_clr+i*stepx-10,starty_clr+j*stepy-10,
startx_ri+i*stepx,starty_ri+j*stepy,startx_ri+i*stepx+20,starty_ri+j*stepy,
startx_ro+i*stepx,starty_ro+j*stepy,startx_ro+i*stepx-40,starty_ro+j*stepy,
startx_clk+i*stepx+10,starty_clk+j*stepy-20,startx_clk+i*stepx+10,starty_clk+j*stepy-10,
startx_clk+i*stepx,starty_clk+j*stepy-10,startx_clk+i*stepx+10,starty_clk+j*stepy-10,
startx_clk+i*stepx,starty_clk+j*stepy-10,startx_clk+i*stepx,starty_clk+j*stepy) )
f.write(""" </circuit>
</project>""") #logism通过这两个标签来判断circuit是否结束,所以在找到circ所需的元件之后,将这个标签删去,这样在f.write结束后自动填上/circuit,免得自己去翻
结果:
我宣布python是世界上最好的编程语言!