logism自动化填充


P0的grf题需要32个寄存器,面对这种需要Ctrl-c/v的工作实在是浪费时间.对此,我们需要重拳出击,正好,logism的教程文件提到了怎么自动化复制,这不来尝试一下???

寻找目标元件

用vsc打开circ文件,看到一堆标签,如何从标签里面找到需要的文件?我提出我的一些小办法:

  1. 使用circuitname快速寻找:使用vsc自带的搜索功能,输入你要找的元件所属的circuit的名字,快速锁定大概范围.
  2. 根据元器件名字寻找:比如grf需要寄存器,那么,寻找名字为register 的器件,对于tunnel元件,可以根据朝向来判断需要
    找到之后,把这些标签放在一起,好统一复制
    logism所需的元件
    对应代码

    写代码

    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是世界上最好的编程语言!


Author: Dovahkiin
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Dovahkiin !
  TOC