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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 1201|回复: 31

[求助] 求助循环和调用自定义函数问题

[复制链接]
发表于 2024-6-5 11:08:48 | 显示全部楼层 |阅读模式

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

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

x
各位大佬,这是小弟第一次从0到1自己写一个简单的脚本,(之前都是是拿来别人的脚本,一行一行看懂之后自己改一改)现在自己感觉是遇到了循环和变量如何正确应用在自己的函数中的问题了,恳请大佬们指点一下,或者丢一个类似的脚本上来,小弟自己研究也可以,不胜感激!


自己写的这个脚本用于自动创建testkey layout,目标是load一个只有float number的定义w l的file,通过自定义函数完成每一个layout的创建。
我自己的思路是先用skill通过坐标运算完成一个cell的生成(用的leMakeCell,已成功),并自定义为Testkey()函数。然后写一个循环,根据load进来的w l不断调用函数生成一个一个的cell。

目前遇到的问题是在skill IDE中两个.il检查都没有error(但有warning,我没管),但是load这个skill的时候却不行,会报dbAddFigToFigGroup的错,实在不明白,自我感觉是传递w l的时候出现了问题,试了很多种写法都不行,求教


SA = 0.15;follow PDK
Y1 = 0.1
Y2 = 0.105;follow DRC
X = 0.105
spacex = 0.89
spacey = 0.71
six = 0.525;space of n/p imp to poly,x direction
siy = 0.495;space of n/p imp to poly,y direction
simx = 2.7;space of n/p imp to MOX,x direction
simy = 3.0;space of n/p imp to MOX,y direction
subw = 1.6;n/p sub polygon width
subaaw = 1.0;width of aa in sub
sis = 0.4;space of n/p imp to n/p sub
dx = (subw-subaaw)/2;space of aa to n/p sub


/********************************/

procedure(Testkey()
let((cv w l poly1 aa polyup polyup2 polydown fg fg2 fg3 fg7 fg8 SDN
                                         M1insub M1inpolyup M1inaaL M1inaaR)
        cv = geGetEditCellView()
        w = atof(car(lineContent))
    l = atof(cadr(lineContent))
        poly1 = dbCreateRect(cv list("PO" "drawing") list(-l/2:-w/2 l/2:w/2))
        point1 = poly1~>bBox
        aa = dbCreateRect(cv list("AA" "drawing") list(caar(point1)-SA:cadar(point1)-Y1 caadr(point1)+SA:cadadr(point1)+Y1))
        point2 = aa~>bBox
        fet = dbCreateRect(cv list("FET" "marking42") list(caar(point1)-SA:cadar(point1)-Y1 caadr(point1)+SA:cadadr(point1)+Y1))
        hgate = dbCreateRect(cv list("HGATE" "marking") list(-l/2:-w/2 l/2:w/2))
        polyup = dbCreateRect(cv list("PO" "drawing") list(caar(point2)-X:cadadr(point2)-Y1 caadr(point2)+X:cadadr(point2)+0.12))
        polyup2 = dbCreateRect(cv list("PO" "drawing") list(caar(point2)-X:cadadr(point2)-Y1 caadr(point2)+X:cadadr(point2)+Y2))
        polydown = dbCreateRect(cv list("PO" "drawing") list(caar(point2)-X:cadar(point2)-Y2 caadr(point2)+X:cadar(point2)+Y1))
        fg = dbCreateFigGroup(cv "fg5" t 1:1 "R0")
        dbAddFigToFigGroup(fg poly1)
        dbAddFigToFigGroup(fg aa)
        dbAddFigToFigGroup(fg polyup2)
        dbAddFigToFigGroup(fg polydown)
        point3 = fg~>bBox
        fg2 = dbCopyFig(fg cv list(0:cadadr(point3)+spacex+(cadadr(point3)-cadar(point3))/2 "R0" 1.0))
        fg8 = dbCopyFig(fg cv list(0:cadar(point3)-spacex-(cadadr(point3)-cadar(point3))/2 "R0" 1.0))
        fg4 = dbCopyFig(fg cv list(caar(point3)-spacey-(caadr(point3)-caar(point3))/2:0 "R0" 1.0))
        fg6 = dbCopyFig(fg cv list(caadr(point3)+spacey+(caadr(point3)-caar(point3))/2:0 "R0" 1.0))
        fg1 = dbCopyFig(fg2 cv list(caar(point3)-spacey-(caadr(point3)-caar(point3))/2:0 "R0" 1.0))
        fg3 = dbCopyFig(fg2 cv list(caadr(point3)+spacey+(caadr(point3)-caar(point3))/2:0 "R0" 1.0))
        fg7 = dbCopyFig(fg8 cv list(caar(point3)-spacey-(caadr(point3)-caar(point3))/2:0 "R0" 1.0))
        fg9 = dbCopyFig(fg8 cv list(caadr(point3)+spacey+(caadr(point3)-caar(point3))/2:0 "R0" 1.0))
        point4 = fg7~>bBox
        point5 = fg3~>bBox
        SDN = dbCreateRect(cv list("SDN" "drawing") list(caar(point4)-six:cadar(point4)-siy caadr(point5)+six:cadadr(point5)+siy))
        point6 = SDN~>bBox
        MOX = dbCreateRect(cv list("MOX" "drawing") list(caar(point6)-simx:cadar(point6)-simy caadr(point6)+simx:cadadr(point6)+simy))
        SDP = dbCreatePolygon(cv list("SDP" "drawing") list((caar(point6)-sis-subw:cadadr(point6))
                                                            (caar(point6)-sis:cadadr(point6))   
                                                            (caar(point6)-sis:cadar(point6)-sis)   
                                                            (caadr(point6)+sis:cadar(point6)-sis)
                                                            (caadr(point6)+sis:cadadr(point6))   
                                                            (caadr(point6)+sis+subw:cadadr(point6))  
                                                            (caadr(point6)+sis+subw:cadar(point6)-sis-subw)
                                                            (caar(point6)-sis-subw:cadar(point6)-sis-subw)
        ))
        aainSDP = dbCreatePolygon(cv list("AA" "drawing") list((caar(point6)-sis-dx-subaaw:cadadr(point6)-dx)
                                                            (caar(point6)-sis-dx:cadadr(point6)-dx)   
                                                            (caar(point6)-sis-dx:cadar(point6)-sis-dx)   
                                                            (caadr(point6)+sis+dx:cadar(point6)-sis-dx)
                                                            (caadr(point6)+sis+dx:cadadr(point6)-dx)   
                                                            (caadr(point6)+sis+dx+subaaw:cadadr(point6)-dx)  
                                                            (caadr(point6)+sis+dx+subaaw:cadar(point6)-sis-dx-subaaw)
                                                            (caar(point6)-sis-dx-subaaw:cadar(point6)-sis-dx-subaaw)
        ))
        M1insub = dbCreateRect(cv list("M1" "drawing") list(-0.5:cadar(point6)-1.7 0.5:cadar(point6)-0.7))
        point7 = M1insub~>bBox
        CTinsub = dbCreateViaShapeArray(cv "CT" M1insub caar(point7)+0.08 cadar(point7)+0.08 0.2 0.2 0.06 0.06 4 4)
        point8 = polyup~>bBox
        M1inpolyup = dbCreateRect(cv list("M1" "drawing") list(caar(point8):cadar(point8)+0.145 caadr(point8):cadadr(point8)-0.005))
        M1inaaL = dbCreateRect(cv list("M1" "drawing") list(caar(point2)+0.005:cadar(point2)+0.1 caar(point2)+0.075:cadadr(point2)-0.1))
        M1inaaR = dbCreateRect(cv list("M1" "drawing") list(caadr(point2)-0.075:cadar(point2)+0.1 caadr(point2)-0.005:cadadr(point2)-0.1))
        point9 = M1inaaL~>bBox
        point10 = M1inaaR~>bBox
        M1inSD = cadadr(point1)-cadar(point1)
        CTpitch = 0.14
        CTinSDm = int((M1inSD-0.2-0.06)/CTpitch)+1
        if(evenp(CTinSDm)
        then
                CT1 = dbCreateViaShapeArray(cv "CT" M1inaaL caar(point9)+0.005 0.04 0.0 0.14 0.06 0.06 CTinSDm/2 1)
                CT2 = dbCreateViaShapeArray(cv "CT" M1inaaL caar(point9)+0.005 -0.1 0.0 -0.14 0.06 0.06 CTinSDm/2 1)
                CT3 = dbCreateViaShapeArray(cv "CT" M1inaaR caar(point10)+0.005 0.04 0.0 0.14 0.06 0.06 CTinSDm/2 1)
                CT4 = dbCreateViaShapeArray(cv "CT" M1inaaR caar(point10)+0.005 -0.1 0.0 -0.14 0.06 0.06 CTinSDm/2 1)
        );if
        if(oddp(CTinSDm)
        then
                CT1 = dbCreateViaShapeArray(cv "CT" M1inaaL caar(point9)+0.005 -0.03 0.0 0.14 0.06 0.06 (CTinSDm+1)/2 1)
                CT2 = dbCreateViaShapeArray(cv "CT" M1inaaL caar(point9)+0.005 -0.03 0.0 -0.14 0.06 0.06 (CTinSDm+1)/2 1)
                CT3 = dbCreateViaShapeArray(cv "CT" M1inaaR caar(point10)+0.005 -0.03 0.0 0.14 0.06 0.06 (CTinSDm+1)/2 1)
                CT4 = dbCreateViaShapeArray(cv "CT" M1inaaR caar(point10)+0.005 -0.03 0.0 -0.14 0.06 0.06 (CTinSDm+1)/2 1)
        );if
        point11 = polyup~>bBox
        polylength = caadr(point11)-caar(point11)
        CTinpolym = int((polylength-0.06-0.06)/CTpitch)+1
        if(evenp(CTinpolym)
        then
                CT5 = dbCreateViaShapeArray(cv "CT" M1inpolyup 0.04 cadadr(point11)-0.07 0.14 0.0 0.06 0.06 1 CTinpolym/2)
                CT6 = dbCreateViaShapeArray(cv "CT" M1inpolyup -0.1 cadadr(point11)-0.07 -0.14 0.0 0.06 0.06 1 CTinpolym/2)
        );if
        if(oddp(CTinpolym)
        then
                CT5 = dbCreateViaShapeArray(cv "CT" M1inpolyup -0.03 cadadr(point11)-0.07 0.14 0.0 0.06 0.06 1 (CTinpolym/2)+1)
                CT6 = dbCreateViaShapeArray(cv "CT" M1inpolyup -0.03 cadadr(point11)-0.07 -0.14 0.0 0.06 0.06 1 (CTinpolym/2)+1)
        );if

        leMakeCell(cv~>shapes "lib" "test_testkey" "layout" nil)
);let
);procedure




补充内容 (2024-6-7 17:03):
20240607补充,各位大佬,现在又遇到一个问题,如何用skill调用一个pcell,并对其cdf参数进行赋值?
 楼主| 发表于 2024-6-5 11:10:13 | 显示全部楼层
中间都是些很傻的坐标运算,可以忽略......

load "./Testkey.il"
file = infile("./file")
while(
        gets(nextline file)
    lineContent = parseString(nextline)
   
    Testkey()
);while

这个是准备用来运行用的skill,和上面那个分开写了
 楼主| 发表于 2024-6-5 11:25:25 | 显示全部楼层
*Error* dbAddFigToFigGroup: argument #1 should be a database object (type template = "dd") at line 39 of file "./Testkey.il" - nil
*** Error in routine load:
Message: *Error* load: error while loading file - "./test.il" at line 8
Entering new debug toplevel due to error:

这个是CIW里的报错内容
发表于 2024-6-5 13:25:04 | 显示全部楼层


99259 发表于 2024-6-5 11:25
*Error* dbAddFigToFigGroup: argument #1 should be a database object (type template = "dd") at line 3 ...


dbAddFigToFigGroup 传入的第一个参数必须是database object,往上查dbCreateRect返回的值是否为nil

第二个用gets获取的line content 好像没去掉\n
 楼主| 发表于 2024-6-5 13:55:03 | 显示全部楼层


YuSHL 发表于 2024-6-5 13:25
dbAddFigToFigGroup 传入的第一个参数必须是database object,往上查dbCreateRect返回的值是否为nil

第 ...


我又看了下,fg返回是nil,但是fg = dbCreateFigGroup(cv "fg5" t 1:1 "R0")把fg5换成其他的比如fg50,fg就返回db了,再运行一遍就又是nil了,提示已存在对应的fg50,感觉这里也有问题,我似乎少了创建一个新cell的操作,要不然一直都在一个cv里运行......也不知道我这个想法对不对....

gets那里 ,lineContent = parseString(nextline),这句话输入之后,lineContent输出的是("1.2" "1.0"),已经是个list了,把\n过滤掉了,我感觉应该没问题呀

发表于 2024-6-5 14:25:50 | 显示全部楼层
试一下dbGetFigGroupByName
 楼主| 发表于 2024-6-5 14:37:44 | 显示全部楼层


qw357 发表于 2024-6-5 14:25
试一下dbGetFigGroupByName


这个似乎没有反复输入命令输出nil的问题,而且这个更简单一些,我改过来了,但是现在提示line 27 : w = atof(car(lineContent))有问题,


*** Error in routine atof:
Message: *Error* atof: argument #1 should be a string (type template = "tg") at line 27 of file "./Testkey.il"
Entering new debug toplevel due to error:


我看w已经得到我想要的结果了,是个floating number,为啥就是不对
发表于 2024-6-5 14:49:25 | 显示全部楼层
本帖最后由 忘仔牛奶 于 2024-6-5 14:59 编辑


99259 发表于 2024-6-5 14:37
这个似乎没有反复输入命令输出nil的问题,而且这个更简单一些,我改过来了,但是现在提示line 27 : w =  ...


你可以先将lineContent处理一下

发表于 2024-6-5 14:52:01 | 显示全部楼层
不对,这样好像也有问题
发表于 2024-6-5 14:57:23 | 显示全部楼层
用w=atof(nth(0 lineContent))
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-11-22 01:51 , Processed in 0.027170 second(s), 7 queries , Gzip On, Redis On.

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