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

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜全文
查看: 13123|回复: 25

[求助] SKILL

[复制链接]
发表于 2021-3-12 09:36:59 | 显示全部楼层
把开头的CtrlChangeLayer改成ChangeLayer,后面的括号内加个bb
procedure(ChangeLayer( bb)
回复 支持 反对

使用道具 举报

发表于 2021-3-12 12:02:55 | 显示全部楼层


   
zhuxiaowu 发表于 2021-3-12 10:49
谢谢,果然可以了。但是后面又有个error techFindViaDefByName: argument #2 should be a string (type t ...


请问是否方便提供出错时的CIW报错截图?
回复 支持 反对

使用道具 举报

发表于 2021-3-12 12:09:12 | 显示全部楼层
我明白了。脚本中定义的、layerList、pinList、viaList要根据你所适用的工艺做相应的修改。你所提供的这个脚本对via的定义只支持M1~M7,若使用的工艺金属层数大于7,就会产生你描述的错误信息。
回复 支持 反对

使用道具 举报

发表于 2021-3-12 12:34:55 | 显示全部楼层


   
zhuxiaowu 发表于 2021-3-12 10:49
谢谢,果然可以了。但是后面又有个error techFindViaDefByName: argument #2 should be a string (type t ...


做了一些简单的修改,修改以后的脚本可以在大部分工艺下直接使用,极少数工艺不支持pin层修改。(极少数工艺tech文件中没有定义LabelLayers变量,无法得到有效的pinList)


   

        

                
  1. procedure( ChangeLayer( bb)
  2.         let((cv objs layerList pinList viaList layerName pinName viaName)
  3.                 cv = geGetEditCellView()
  4.                 objs = geGetSelSet()
  5.                 layerList = GetMetalLayersFromTech( cv)
  6.                 pinList = techGetStampLabelLayers( techGetTechFile(cv))

  7.                 viaList = techGetTechFile( cv)~>viaDefs~>name
  8.                 foreach(obj objs
  9.                                 case(obj ~> objType
  10.                                         ("path" || "rect" || "polygon" || "pathSeg"
  11.                                                 layerName = obj ~> layerName
  12.                                                 if(bb == 1 then
  13.                                                         obj ~> layerName = cadr(member(layerName layerList))
  14.                                                         println("+1")
  15.                                                 else
  16.                                                         obj ~> layerName = cadr(member(layerName reverse(layerList)))
  17.                                                         println("-1")
  18.                                                 );if
  19.                                         )
  20.                                 ("label"
  21.                                         when(pinList
  22.                                                 pinName = obj ~> lpp
  23.                                                 if(bb == 1 then
  24.                                                         obj ~> lpp = cadr(member(pinName pinList))
  25.                                                         println(obj~>lpp)
  26.                                                 else
  27.                                                         obj ~> lpp = cadr(member(pinName reverse(pinList)))
  28.                                                         println(obj~>lpp)
  29.                                                 );if
  30.                                         )
  31.                                 );"label"
  32.                                 ("stdVia"
  33.                                         viaName = obj ~> viaHeader ~> viaDefName
  34.                                         if(bb == 1 then
  35.                                                 viaName = cadr(member(viaName viaList))
  36.                                                 println("+1")
  37.                                         else
  38.                                                 viaName = cadr(member(viaName reverse(viaList)))
  39.                                                 println("-1")
  40.                                         );if
  41.                                         CreateVia(obj viaName)
  42.                                 );"stdVia"
  43.                         );case
  44.                 );foreach
  45.         );let
  46. );proc

  47. procedure( GetMetalLayersFromTech( cellview)
  48.         let( ( MetalLayerName)
  49.                 foreach( ViaLayer techGetViaLayers( techGetTechFile( ddGetObj( cellview~>libName)))
  50.                         MetalLayerName = append1( MetalLayerName car( ViaLayer))
  51.                         MetalLayerName = append1( MetalLayerName car( last( ViaLayer)))
  52.                 )
  53.                 ;MetalLayerName = artUnique( MetalLayerName)
  54.                 MetalLayerName = setof( x artUnique( MetalLayerName) rexMatchp( "^M" x))
  55.                 MetalLayerName = sort( MetalLayerName nil)
  56.                 MetalLayerName
  57.         )
  58. )


  59. procedure(CreateVia(obj viaName)
  60.         let((cv tech viaDefId origin viaParams newVia)
  61.                 cv = geGetEditCellView()
  62.                 tech = techGetTechFile(cv)
  63.                 viaDefId = techFindViaDefByName(tech viaName)
  64.                 origin = obj ~> origin
  65.                 orient = obj ~> orient
  66.                 viaParams = list(
  67.                         list("cutRows"        obj ~>cutRows)
  68.                         list("cutColumns"        obj ~>cutColumns)
  69.                         list("layer1Enc"        obj ~>layer1Enc)
  70.                         list("layer2Enc"        obj ~>layer2Enc)
  71.                         list("layer1Offset"        obj ~>layer1Offset)
  72.                         list("layer2Offset"        obj ~>layer2Offset)
  73.                         list("imp1Enc"        obj ~>imp1Enc)
  74.                         list("imp2Enc"        obj ~>imp2Enc)
  75.                         list("cutSpacing"        obj ~>cutSpacing)
  76.                         list("originOffset"        obj ~>originOffset)
  77.                         list("cutWidth"        obj ~>cutWidth)
  78.                         list("cutHeight"        obj ~>cutHeight)
  79.                 );list
  80.                 newVia = dbCreateVia(cv viaDefId origin orient viaParams)
  81.                 geSelectObject(newVia)
  82.                 dbDeleteObject(obj)
  83.         );let
  84. );proc

  85. hiSetBindKey("layout" "Ctrl<Btn4Down>" "ChangeLayer(1)")
  86. hiSetBindKey("Layout" "Ctrl<Btn5Down>" "ChangeLayer(-1)")
            

   

    复制代码


回复 支持 反对

使用道具 举报

发表于 2021-3-12 12:39:15 | 显示全部楼层


   
annyzer 发表于 2021-3-12 12:34
做了一些简单的修改,修改以后的脚本可以在大部分工艺下直接使用,极少数工艺不支持pin层修改。(极少数 ...


此处@chinarml 原作者
回复 支持 反对

使用道具 举报

发表于 2021-3-12 15:03:15 | 显示全部楼层


   
zhuxiaowu 发表于 2021-3-12 14:48
你这段是不是layerList,pinlist,vialist这些是不是就没定义了


layer1Offset
检查下是不是把O打成了0。。。是大写字母O。。。

回复 支持 反对

使用道具 举报

发表于 2021-3-12 15:06:59 | 显示全部楼层


   
annyzer 发表于 2021-3-12 12:34
做了一些简单的修改,修改以后的脚本可以在大部分工艺下直接使用,极少数工艺不支持pin层修改。(极少数 ...


索性把第6行、第21~32行注释掉,脚本只用来修改shape和via
回复 支持 反对

使用道具 举报

发表于 2021-3-12 15:27:56 | 显示全部楼层
我试了下没问题呀
检查下是不是打错字了_(:з」∠)_
回复 支持 反对

使用道具 举报

发表于 2021-3-12 15:29:09 | 显示全部楼层


   
zhuxiaowu 发表于 2021-3-12 14:48
你这段是不是layerList,pinlist,vialist这些是不是就没定义了


不是没定义了,是直接从当前打开的版图获取tech文件,再从tech文件中获取当前tech的金属、via定义。不需要再自己手动打了
回复 支持 反对

使用道具 举报

发表于 2021-3-12 15:54:04 | 显示全部楼层
procedure( GetMetalLayersFromTech( cellview)
        let( ( MetalLayerName)
                foreach( ViaLayer techGetViaLayers( techGetTechFile( ddGetObj( cellview~>libName)))
                        MetalLayerName = append1( MetalLayerName car( ViaLayer))
                        MetalLayerName = append1( MetalLayerName car( last( ViaLayer)))
                )
                ;MetalLayerName = artUnique( MetalLayerName)
                MetalLayerName = setof( x artUnique( MetalLayerName) rexMatchp( "^M" x))
                MetalLayerName = sort( MetalLayerName nil)
                MetalLayerName
        )
)
                cv = geGetEditCellView()
                layerList = GetMetalLayersFromTech( cv)

检查了一下代码,判断问题应该出在metal已经是最低/高层时继续降/升层导致的
    此时        obj ~> layerName = cadr(member(layerName reverse(layerList))) 等号后面的赋值可能是nil而不是希望得到的metal名。所以,
1、你在CIW中直接输入上面这段代码 看看CIW输出信息是什么
2、增加判断语句,case语句的第一段改成下面的代码:
                                        ("path" || "rect" || "polygon" || "pathSeg"
                                                layerName = obj ~> layerName
                                                if(bb == 1 then
                                                        if( length( member(layerName layerList))<2 then
                                                                obj ~> layerName = car(member(layerName layerList))
                                                                println("+1")
                                                        else
                                                                obj ~> layerName = cadr(member(layerName layerList))
                                                                println("+1")
                                                else
                                                        if( length( member(layerName reverse(layerList)))<2 then
                                                                obj ~> layerName = car(member(layerName reverse(layerList)))
                                                                println("-1")
                                                        else
                                                                obj ~> layerName = cadr(member(layerName reverse(layerList)))
                                                                println("-1")
                                                );if
                                        )

回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

X

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

GMT+8, 2025-9-21 08:35 , Processed in 0.047302 second(s), 4 queries , Gzip On, Redis On.

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