EDA365电子论坛网

标题: RF线次层挖空 route keep out skill [打印本页]

作者: 杜兰    时间: 2020-4-18 15:53
标题: RF线次层挖空 route keep out skill
RF线次层挖空
skill操作步聚:
1) 快捷键ctrl+R,在option页选择挖空层及设定间距。其中间距有两种设置方式:按线宽倍数及直接设定间距,任选一种。
   
2) 在板中选择次层要挖空的pin、via或chines,可单选、框选也可使用右键菜单的Temp Group命令多选(多选后必须再次右键选取complete完成;
3)点击add keepout,在选定层产生route keepout(如2)中选择不包含clines,无法判定线宽,间距设定自动跟从第二种方式)
4)选择两个pin,点击add line keepout,在两pin之间产生route keepout ,其他设置与上同。
网上搜索的代码,skill会报错,有没有大佬指点一下,跪谢

以下是原代码:

axlCmdRegister("clear_RF" `clear_RF)
axlSetAlias( "~R" "clear_RF")

defun( clear_RF ()
    clear_RF_form()
    axlSetFindFilter(?enabled `("NOALL" "CLINES" "pins" "vias" )        ?onButtons `("CLINES"))
    axlClearSelSet()

    cline_list=nil
    while( axlSelect()
        ls=axlGetSelSet()
        a=car(ls)
        if( a->objType=="path" then
            a=nthelem(2 parseString(a->layer "/"))
        else
            a=nthelem(2 parseString(car(a->startEnd) "/"))
        )
        if( a=="TOP" then
            layer=nthelem(2 layer_list)
            axlFormListSelect(fs "layer_name" layer)        
        else
            if( a=="BOTTOM" then
                layer=nthelem(length(layer_list)-1 layer_list)
                axlFormListSelect(fs "layer_name" layer)        
            )
        )
    )
    axlFinishEnterFun()
)

defun( clear_RF_form ()
   clear_RF_file="./clesr_RF_file.form"
   p=outfile(clear_RF_file "w")
    if( car(axlDBGetDesignUnits())=="mils" then
        s="mil"
    else
        s="mm"
    )
    if(p != nil then
        fprintf(p "FILE_TYPE=FORM_DEFN VERSION=2\n")
        fprintf(p "FORM\n")
        fprintf(p "FIXED\n")
        fprintf(p "PORT 40 60\n")
        fprintf(p "HEADER "fanout BBvia"\n")
        fprintf(p "TILE\n")
        fprintf(p "\n")

        fprintf(p "TEXT "clear layer"\n")
        fprintf(p "TLOC 1 1\n")
        fprintf(p "ENDTEXT\n")
        fprintf(p "\n")

        fprintf(p "FIELD layer_name\n")
        fprintf(p "FLOC 9 1\n")
        fprintf(p "LIST "" 12 5\n")
        fprintf(p "ENDFIELD\n")
        fprintf(p "\n")


            fprintf(p "GROUP "clear space"\n")
        fprintf(p "GLOC 1 11\n")
        fprintf(p "GSIZE 20 7\n")
        fprintf(p "ENDGROUP\n")
        fprintf(p "\n")
        fprintf(p "FIELD xws\n")
        fprintf(p "FLOC 2 13\n")
        fprintf(p "CHECKLIST " " "1"\n")
        fprintf(p "ENDFIELD\n")
        fprintf(p "\n")
        fprintf(p "FIELD width\n")
        fprintf(p "FLOC 2 15\n")
        fprintf(p "CHECKLIST " " "1"\n")
        fprintf(p "ENDFIELD\n")
        fprintf(p "\n")

        fprintf(p "FIELD xw\n")
        fprintf(p "FLOC 5 13\n")
        fprintf(p "REALFILLIN 6 3\n")
        fprintf(p "ENDFIELD\n")
        fprintf(p "\n")

        fprintf(p "FIELD um\n")
        fprintf(p "FLOC 5 15\n")
        fprintf(p "REALFILLIN 6 6\n")
        fprintf(p "ENDFIELD\n")
        fprintf(p "\n")

        fprintf(p "TEXT "W"\n")
        fprintf(p "TLOC 13 13\n")
        fprintf(p "ENDTEXT\n")
        fprintf(p "\n")

        fprintf(p "TEXT "%s"\n" s)
        fprintf(p "TLOC 13 15\n")
        fprintf(p "ENDTEXT\n")
        fprintf(p "\n")

        fprintf(p "FIELD add_s\n")
        fprintf(p "FLOC 1 19\n")
        fprintf(p "MENUBUTTON "add keepout" 15 3\n")
        fprintf(p "ENDFIELD\n")
        fprintf(p "\n")

        fprintf(p "FIELD add_L\n")
        fprintf(p "FLOC 1 22\n")
        fprintf(p "MENUBUTTON "add line keepout" 15 3\n")
        fprintf(p "ENDFIELD\n")
        fprintf(p "\n")

        fprintf(p "ENDTILE\n")
        fprintf(p "ENDFORM\n")
    else
        printf("ERROR,can't create form file!")
)
    close(p)
    ;axlFormCreate('fs clear_RF_file '("msgLines" 0) 'do_clear_RF nil nil )
    axlMiniStatusLoad( 'fs clear_RF_file  'do_clear_RF t )

   a=axlLayerGet("ETCH/TOP")
    s=""
    layer_list=nil
    while( s!=nil
        s=a->name
        layer_list=append1(layer_list s)
        s=a->nextLayer
        if( s!=nil then
            nextlayer=strcat("ETCH" "/" s)
           a=axlLayerGet(nextlayer)
        )
    )


    layer=nthelem(2 layer_list)
    axlFormListDeleteAll(fs "layer_name")
    axlFormSetField(fs "layer_name" layer_list)
    axlFormListSelect(fs "layer_name" layer)        
    axlFormSetField(fs "xws" t)
    if( boundp('xs)==nil then
        xs="2.0"
        xum="0.6"
    )
    axlFormSetField(fs "xw" xs)
    axlFormSetField(fs "um" xum)
    axlFormDisplay(fs)
   if(isFile( clear_RF_file) then
        deleteFile(clear_RF_file)
    )
)
defun( do_clear_RF (fs)
    case( fs->curField
    ("layer_name"
        layer=fs->curValue
    )
    ("xw"
        xs=fs->curValue
    )
    ("um"
        xum=fs->curValue
    )
    ("add_s"
        if( ls!=nil then
            foreach(a ls
                polydbid = axlPolyFromDB(a, ?layer car(a->startEnd) ?padType 'REGULAR)
                if( axlFormGetField( fs "xws")=="1" then
                    i=1
                    while( nthelem(i ls)->objType!="path" && i<length(ls)
                        i=i+1
                    )
                    b=nthelem(i ls)
                    if( b->objType=="path" then
                        if( b->isSameWidth==t then
                            s=car(b->segments)->width*atof(xs)
                        else
                            s=0
                            foreach(c b->segments
                                if( c->width>s then s=c->width)
                            )
                            s=s*atof(xs)
                        )
                    else
                        s=atof(xum)
                        axlFormSetField(fs "width" t)
                    )

                else
                    s=atof(xum)
                )
                exp_poly = (axlPolyExpand polydbid s 'ACU_ARC)
                axlDBCreateShape(car(exp_poly) t strcat("ROUTE KEEPOUT/" layer))
                sprintf(xum "%f" s)
                axlFormSetField(fs "um" xum)
            )
        )
    )
    ("add_L"
        if( length(ls)==2 then
            if( car(ls)->objType="pin" && cadr(ls)->objType=="pin" then
                s=atof(xum)
                polydbid = axlPolyFromDB(car(ls), ?layer car(car(ls)->startEnd) ?padType 'REGULAR)
                exp_poly = (axlPolyExpand polydbid s 'NONE)
                a=car(exp_poly)->bBox
                w1=abs(caar(a)-caadr(a))/2
                h1=abs(cadar(a)-cadadr(a))/2

                polydbid = axlPolyFromDB(cadr(ls), ?layer car(cadr(ls)->startEnd) ?padType 'REGULAR)
                exp_poly = (axlPolyExpand polydbid s 'NONE)
                a=car(exp_poly)->bBox
                w2=abs(caar(a)-caadr(a))/2
                h2=abs(cadar(a)-cadadr(a))/2

                s=atof(xum)
                a=car(ls)->xy
                b=cadr(ls)->xy
                if( abs(car(a)-car(b))>abs(cadr(a)-cadr(b)) then
                    path = axlPathStart( list(car(a):cadr(a)-h1 car(a):cadr(a)+h1 car(b):cadr(b)+h2 car(b):cadr(b)-h2 car(a):cadr(a)-h1 ))
                else
                    path = axlPathStart( list(car(a)-w1:cadr(a) car(a)+w1:cadr(a) car(b)+w2:cadr(b) car(b)-w2:cadr(b) car(a)-w1:cadr(a)))
                )
                axlDBCreateShape(path t strcat("ROUTE KEEPOUT/" layer))
            else
                print("Select two pins.")
            )
        else
            print("Select two pins.")
        )
    )
    )

)




作者: bingshuihuo    时间: 2020-4-19 22:14
感谢分享!!!!!!!
作者: jason_hsu    时间: 2020-4-21 00:52
定义Form文件时,有些地方应该是\",不是单个"
作者: 王者和马    时间: 2020-4-21 09:32
我怎么看这个有点熟悉
作者: 杜兰    时间: 2020-4-29 15:51
王者和马 发表于 2020-4-21 09:32
我怎么看这个有点熟悉

这个程序有问题,报错

作者: 杜兰    时间: 2020-4-29 15:53
jason_hsu 发表于 2020-4-21 00:52
定义Form文件时,有些地方应该是\",不是单个"

多谢大佬指点

作者: 颖雨诺    时间: 2020-5-16 23:04
学习到了
作者: 3号仓库    时间: 2022-7-14 15:38
这个skill可以发个可以用的么,tks




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2