在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3867|回复: 10

[求助] 大佬们过来瞅瞅,如何把蛇形绕线绕满整个空间

[复制链接]
发表于 2021-2-20 11:03:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
各位大佬们求助一个办法或者算法解决问题。如图1,如何能把这种蛇形绕线绕满整个TEXT空间呢。我想的办法是:先把线等间距画满整个矩形空间,如图2。然后把落在TEXT以外的删除掉,但是图3标识的地方就没法处理勒。

图4是希望最终呈现出来的效果。请各位帮忙看看,有没有好的解决办法。



图1

图1

图2

图2

图3

图3

图4

图4
发表于 2021-2-21 20:25:22 | 显示全部楼层
搬个板凳等结果
 楼主| 发表于 2021-2-22 16:55:48 | 显示全部楼层
后续:1,我根据space和with 计算pitch,先把竖线画满,用layerAndNot判断 画出来的竖线是否和有落在TEXT以外。运算坐标,把落在TXET以外的竖线收回来。
2,根据前一步得到的竖线坐标,再画头尾的横线,单数的横线落在上面,双数落在下面。最后merge。

想法是这么个思路,脚本还在写。有没有更简单点的算法呢
发表于 2021-2-23 16:05:52 | 显示全部楼层


wwqqyyx 发表于 2021-2-22 16:55
后续:1,我根据space和with 计算pitch,先把竖线画满,用layerAndNot判断 画出来的竖线是否和有落在TEXT以 ...


刚才写了一下,可以操作。不过还没写完,可能是我的思路也太复杂了一下。基本思路如下:
1.采用layersize把不可以走线的边缘区域去掉;
2.从左到右生成一排金属线,宽度和间距你定义好,坐标采用上述区域的bBox;
3.用LayerAnd生成在目标区域的金属线,删除原来的那排金属线;
4.从左到右扫描前后两条金属线的关系,根据这个生成横向走线和对下一个金属线进行修改,如缩短。目前卡在这里,估计定义好几种情况就可以实现了。
发表于 2021-2-23 17:04:04 | 显示全部楼层
image.png
估计已经实现你的需求了
发表于 2021-2-23 17:21:12 | 显示全部楼层
以下写法有很多可以简化和优化的地方,希望朋友你能把简化和优化后的版本也放出来给我学习一下。
简要思路:
1.把整个txt区域用Layersize函数缩小边缘尺寸形成一个目标区域;
2.使用Layerand函数在目标区域形成从左往右的一行金属线;
3.两次采用Layersize函数,把那些不是完整宽度的金属线部分去除;
4.从左往右生成横向连线:
(1)使用bigtd_flag表明应该在上方还是下方生成横向金属线,每次取反,等于1是在顶部生成,等于-1时在底部生成;
(2)flag等于1时,如果后一条金属的顶部比较高,那么把后一条金属过高的部分删除,通过修改bBox实现;如果后一条金属的顶部比较低,则拉低本条金属线;
(3)flag等于-1时,跟上述情况类似;

本脚本使用时,先选中txt区域,然后运行该脚本即可,不会自动保存和merge。
本脚本开始写时候和后面思路有所不同,因此有很多地方很繁琐,希望您能优化精简下。
本人工具用的比较少,很多新的功能不懂,如果有工具能自动实现该功能了也请各位大神赐教。谢谢。


bigtd_id=car(geGetSelSet())
bigtd_id_cv=bigtd_id~>cellView
bigtd_lay="M2";改成你用的金属
bigtd_mag=0.5;改成你的边缘距离
bigtd_wid=0.2;宽度
bigtd_grid=0.005;你的格点
bigtd_widoff=-bigtd_wid*0.5+bigtd_grid
bigtd_spa=0.2;你的间距
bigtd_min=0.6;好像没用
bigtd_lef=car(car(bigtd_id~>bBox))
bigtd_bot=car(cdr(car(bigtd_id~>bBox)))
bigtd_rig=car(car(cdr(bigtd_id~>bBox)))
bigtd_top=car(cdr(car(cdr(bigtd_id~>bBox))))
bigtd_x1=bigtd_lef+bigtd_mag
bigtd_x2=bigtd_x1+bigtd_wid
bigtd_y1=bigtd_bot
bigtd_y2=bigtd_top
bigtd_list_line=list()
bigtd_id_mag=dbLayerSize(bigtd_id_cv bigtd_lay list(bigtd_id) -bigtd_mag)
while((bigtd_x1+bigtd_mag+bigtd_wid)<=bigtd_rig
    bigtd_list_rec=list(bigtd_x1:bigtd_y1 bigtd_x2:bigtd_y2)
    bigtd_id_temp1=dbCreateRect(bigtd_id_cv bigtd_lay bigtd_list_rec)
    bigtd_id_temp2=dbLayerAnd(bigtd_id_cv bigtd_lay bigtd_id_mag list(bigtd_id_temp1))
    dbDeleteObject(bigtd_id_temp1)
    bigtd_id_temp3=dbLayerSize(bigtd_id_cv bigtd_lay bigtd_id_temp2 bigtd_widoff)
    bigtd_id_temp4=dbLayerSize(bigtd_id_cv bigtd_lay bigtd_id_temp3 (-1*bigtd_widoff))
    dbDeleteObject(car(bigtd_id_temp2))
    dbDeleteObject(car(bigtd_id_temp3))
    bigtd_list_line=append(bigtd_list_line bigtd_id_temp4)
    bigtd_x1=bigtd_x1+bigtd_wid+bigtd_spa
    bigtd_x2=bigtd_x1+bigtd_wid
)
dbDeleteObject(car(bigtd_id_mag))
bigtd_ar_line=listToVector(bigtd_list_line)
bigtd_step=0
bigtd_flag=1
while(bigtd_step < (length(bigtd_ar_line)-1)
    when(bigtd_flag==1
        bigtd_tmpy1=car(cdr(car(cdr(bigtd_ar_line[bigtd_step]~>bBox))))
        bigtd_tmpy2=car(cdr(car(cdr(bigtd_ar_line[bigtd_step+1]~>bBox))))
        when(bigtd_tmpy2>=bigtd_tmpy1
            bigtd_temp_x1=car(car(cdr(bigtd_ar_line[bigtd_step]~>bBox)))
            bigtd_temp_y1=car(cdr(car(cdr(bigtd_ar_line[bigtd_step]~>bBox))))-bigtd_wid
            bigtd_temp_x2=bigtd_temp_x1+bigtd_spa
            bigtd_temp_y2=bigtd_temp_y1+bigtd_wid
            bigtd_list_rec=list(bigtd_temp_x1:bigtd_temp_y1 bigtd_temp_x2:bigtd_temp_y2)
            bigtd_id_temp1=dbCreateRect(bigtd_id_cv bigtd_lay bigtd_list_rec)
            bigtd_temp_x1=car(car(bigtd_ar_line[bigtd_step+1]~>bBox))
            bigtd_temp_y1=car(cdr(car(bigtd_ar_line[bigtd_step+1]~>bBox)))
            bigtd_temp_x2=bigtd_temp_x1+bigtd_wid
            bigtd_ar_line[bigtd_step+1]~>bBox=list((bigtd_temp_x1:bigtd_temp_y1) (bigtd_temp_x2:bigtd_temp_y2))
        )
        when(bigtd_tmpy2<bigtd_tmpy1
            bigtd_temp_x1=car(car(cdr(bigtd_ar_line[bigtd_step+1]~>bBox)))-bigtd_wid-bigtd_spa
            bigtd_temp_y1=car(cdr(car(cdr(bigtd_ar_line[bigtd_step+1]~>bBox))))-bigtd_wid
            bigtd_temp_x2=bigtd_temp_x1+bigtd_spa
            bigtd_temp_y2=bigtd_temp_y1+bigtd_wid
            bigtd_list_rec=list(bigtd_temp_x1:bigtd_temp_y1 bigtd_temp_x2:bigtd_temp_y2)
            bigtd_id_temp1=dbCreateRect(bigtd_id_cv bigtd_lay bigtd_list_rec)
            bigtd_temp_x1=bigtd_temp_x1-bigtd_wid
            bigtd_temp_y1=car(cdr(car(bigtd_ar_line[bigtd_step]~>bBox)))
            bigtd_temp_x2=bigtd_temp_x1+bigtd_wid
            bigtd_ar_line[bigtd_step]~>bBox=list((bigtd_temp_x1:bigtd_temp_y1) (bigtd_temp_x2:bigtd_temp_y2))
        )
        bigtd_flag_temp=-bigtd_flag
    )
    when(bigtd_flag==-1
        bigtd_tmpy1=car(cdr(car(bigtd_ar_line[bigtd_step]~>bBox)))
        bigtd_tmpy2=car(cdr(car(bigtd_ar_line[bigtd_step+1]~>bBox)))
        when(bigtd_tmpy2<=bigtd_tmpy1
            bigtd_temp_x1=car(car(cdr(bigtd_ar_line[bigtd_step]~>bBox)))
            bigtd_temp_y1=car(cdr(car(bigtd_ar_line[bigtd_step]~>bBox)))
            bigtd_temp_x2=bigtd_temp_x1+bigtd_spa
            bigtd_temp_y2=bigtd_temp_y1+bigtd_wid
            bigtd_list_rec=list(bigtd_temp_x1:bigtd_temp_y1 bigtd_temp_x2:bigtd_temp_y2)
            bigtd_id_temp1=dbCreateRect(bigtd_id_cv bigtd_lay bigtd_list_rec)
            bigtd_temp_x1=car(car(bigtd_ar_line[bigtd_step+1]~>bBox))
            bigtd_temp_y1=car(cdr(car(bigtd_ar_line[bigtd_step]~>bBox)))
            bigtd_temp_x2=bigtd_temp_x1+bigtd_wid
            bigtd_temp_y2=car(cdr(car(cdr(bigtd_ar_line[bigtd_step+1]~>bBox))))
            bigtd_ar_line[bigtd_step+1]~>bBox=list((bigtd_temp_x1:bigtd_temp_y1) (bigtd_temp_x2:bigtd_temp_y2))
        )
        when(bigtd_tmpy2>bigtd_tmpy1
            bigtd_temp_x1=car(car(cdr(bigtd_ar_line[bigtd_step]~>bBox)))
            bigtd_temp_y1=car(cdr(car(bigtd_ar_line[bigtd_step+1]~>bBox)))
            bigtd_temp_x2=bigtd_temp_x1+bigtd_spa
            bigtd_temp_y2=bigtd_temp_y1+bigtd_wid
            bigtd_list_rec=list(bigtd_temp_x1:bigtd_temp_y1 bigtd_temp_x2:bigtd_temp_y2)
            bigtd_id_temp1=dbCreateRect(bigtd_id_cv bigtd_lay bigtd_list_rec)
            bigtd_temp_x1=bigtd_temp_x1-bigtd_wid
            bigtd_temp_x2=bigtd_temp_x1+bigtd_wid
            bigtd_temp_y2=car(cdr(car(cdr(bigtd_ar_line[bigtd_step]~>bBox))))
            bigtd_ar_line[bigtd_step]~>bBox=list((bigtd_temp_x1:bigtd_temp_y1) (bigtd_temp_x2:bigtd_temp_y2))
        )   
        bigtd_flag_temp=-bigtd_flag
    )
    bigtd_flag=bigtd_flag_temp
    bigtd_step=bigtd_step+1
)


发表于 2021-2-23 17:36:51 | 显示全部楼层


bigtd_csd 发表于 2021-2-23 17:21
以下写法有很多可以简化和优化的地方,希望朋友你能把简化和优化后的版本也放出来给我学习一下。
简要思路 ...


太牛了哥
 楼主| 发表于 2021-2-23 17:57:42 | 显示全部楼层


bigtd_csd 发表于 2021-2-23 16:05
刚才写了一下,可以操作。不过还没写完,可能是我的思路也太复杂了一下。基本思路如下:
1.采用layersize ...


这两天再忙一个临时改版tapeout的项目,写脚本的进度被耽误勒。之前写的脚本的思路,先画竖线再画横线,遇到新的问题就是这个TEXT有图示中有横向凹凸的时候就没法执行下去勒。
mmexport1614073994221.jpg
发表于 2021-2-23 18:22:08 | 显示全部楼层


wwqqyyx 发表于 2021-2-23 17:57
这两天再忙一个临时改版tapeout的项目,写脚本的进度被耽误勒。之前写的脚本的思路,先画竖线再画横线, ...


这属于二维情况,首先要明确你想实现的最终效果
 楼主| 发表于 2021-2-24 09:48:23 | 显示全部楼层
本帖最后由 wwqqyyx 于 2021-2-24 09:49 编辑


bigtd_csd 发表于 2021-2-23 18:22
这属于二维情况,首先要明确你想实现的最终效果


感谢朋友的持续关注,理想状态下是图1这样,但是实际运用上会有图2这种情况出现,刚好断在这儿。当然 不一定采用这种绕线方式,最终期望得到的结果是,在这个空间里面选定头尾以后,尽可能多的绕满线,节约空间。

图1

图1

图2

图2
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-19 05:36 , Processed in 0.023210 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表