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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 65327|回复: 205

[转贴] SKILL程序收集

[复制链接]
发表于 2019-12-31 16:09:29 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 sunxeu 于 2021-10-4 14:50 编辑

这是个总结帖, 我将目前看到的SKILL程序收集起来,方便以后大家使用,也方便自己使用。

十字标尺:(快捷键5)
十字标尺 crossruler 简洁写法  ^.^
http://bbs.eetop.cn/forum.php?mo ... 716&fromuid=1573268
(出处: ET创芯网论坛(EETOP) )





  1. hiSetBindKey("Layout" "<Key>5" "CreateCrossRuler()")

  2. procedure(CreateCrossRuler()
  3.         point=enterPoint()
  4.         leCreateRuler(geGetEditRep() list(point xCoord(point)+100:yCoord(point)))
  5.         leCreateRuler(geGetEditRep() list(point xCoord(point)-100:yCoord(point)))
  6.         leCreateRuler(geGetEditRep() list(point xCoord(point):yCoord(point)+100))
  7.         leCreateRuler(geGetEditRep() list(point xCoord(point):yCoord(point)-100))
  8. ); end procedure CreateCrossRuler


复制代码

两条交叉的metal线,去除多余的线头:(
快捷键6)

脚本,两条交叉的metal线,去除多余的线头
http://bbs.eetop.cn/forum.php?mo ... 086&fromuid=1573268
(出处: ET创芯网论坛(EETOP) )





  1. hiSetBindKey("Layout" "<Key>6" "xiubian()")

  2. procedure(xiubian()
  3. object_List=geGetSelSet()

  4. objectA=car(object_List)
  5. pointsA=objectA~>points
  6. widthA=objectA~>width
  7. objectB=cadr(object_List)
  8. pointsB=objectB~>points
  9. widthB=objectB~>width

  10. if(car(car(pointsA))==car(cadr(pointsA)) then
  11.   pointsShu=pointsA
  12.   widthShu=widthA
  13.   object_Shu=objectA
  14.   pointsHeng=pointsB
  15.   widthHeng=widthB
  16.   object_Heng=objectB
  17.   shoubian()
  18. else
  19.   pointsShu=pointsB
  20.   widthShu=widthB
  21.   object_Shu=objectB
  22.   pointsHeng=pointsA
  23.   widthHeng=widthA
  24.   object_Heng=objectA
  25.   shoubian()
  26. )
  27. )
  28. procedure(shoubian()
  29. y1Shu=cadr(car(pointsShu))
  30. y2Shu=cadr(cadr(pointsShu))
  31. yMaxShu=max(y1Shu y2Shu)
  32. yMinShu=min(y1Shu y2Shu)
  33. x1Heng=car(car(pointsHeng))
  34. x2Heng=car(cadr(pointsHeng))
  35. xMaxHeng=max(x1Heng x2Heng)
  36. xMinHeng=min(x1Heng x2Heng)
  37. xShu=car(car(pointsShu))
  38. yHeng=cadr(car(pointsHeng))

  39. when((xMaxHeng-xShu)<(xShu-xMinHeng)&&x1Heng<x2Heng
  40.   xHeng_new=xShu+widthShu/2
  41.   object_Heng~>points=list(car(pointsHeng) rplaca(cadr(pointsHeng) xHeng_new))
  42. )
  43. when((xMaxHeng-xShu)<(xShu-xMinHeng)&&x1Heng>x2Heng
  44.   xHeng_new=xShu+widthShu/2
  45.   object_Heng~>points=list(rplaca(car(pointsHeng) xHeng_new) cadr(pointsHeng))
  46. )
  47. when((xMaxHeng-xShu)>(xShu-xMinHeng)&&x1Heng<x2Heng
  48.   xHeng_new=xShu-widthShu/2
  49.   object_Heng~>points=list(rplaca(car(pointsHeng) xHeng_new) cadr(pointsHeng))
  50. )
  51. when((xMaxHeng-xShu)>(xShu-xMinHeng)&&x1Heng>x2Heng
  52.   xHeng_new=xShu-widthShu/2
  53.   object_Heng~>points=list(car(pointsHeng) rplaca(cadr(pointsHeng) xHeng_new))
  54. )

  55. when((yMaxShu-yHeng)>(yHeng-yMinShu)&&y1Shu<y2Shu
  56.   yShu_new=yHeng-widthHeng/2
  57.   remove_cell=cadr(car(pointsShu))
  58.   object_Shu~>points=list(remove(remove_cell append1(car(pointsShu) yShu_new)) cadr(pointsShu))
  59. )
  60. when((yMaxShu-yHeng)>(yHeng-yMinShu)&&y1Shu>y2Shu
  61.   yShu_new=yHeng-widthHeng/2
  62.   remove_cell=cadr(cadr(pointsShu))
  63.   object_Shu~>points=list(car(pointsShu) remove(remove_cell append1(cadr(pointsShu) yShu_new)))
  64. )

  65. when((yMaxShu-yHeng)<(yHeng-yMinShu)&&y1Shu<y2Shu
  66.   yShu_new=yHeng+widthHeng/2
  67.   remove_cell=cadr(cadr(pointsShu))
  68.   object_Shu~>points=list(car(pointsShu) remove(remove_cell append1(cadr(pointsShu) yShu_new)))
  69. )
  70. when((yMaxShu-yHeng)<(yHeng-yMinShu)&&y1Shu>y2Shu
  71.   yShu_new=yHeng+widthHeng/2
  72.   remove_cell=cadr(car(pointsShu))
  73.   object_Shu~>points=list(remove(remove_cell append1(car(pointsShu) yShu_new)) cadr(pointsShu))
  74. )   
  75. )



复制代码


转换只读模式和可编辑模式:(快捷键F12)

http://blog.eetop.cn/blog-1550883-6944230.html
(出处: yangqi666的个人空间 http://blog.eetop.cn/yeungchie)




  1. procedure(changemode()
  2. prog(()
  3. cond(
  4. (geGetEditCellView()~>mode=="a"
  5. geChangeEditMode("r")
  6. )
  7. (geGetEditCellView()~>mode=="r"
  8. geChangeEditMode("a")
  9. )
  10. (t
  11. return(nil)
  12. ]
  13. foreach(x list("Layout" "Schematics" "Symbol")
  14. hiSetBindKey(x "<Key>F12" "changemode()")
  15. ]


复制代码


快速换层:(快捷键@)
(按@键即可将选中layer换成LSW中选中的layer)






  1. procedure( ChangeLayer()
  2.            let( ( ToMetal )
  3.                 ToMetal = leGetEntryLayer()
  4.                 leReplace(geGetEditCellView(getCurrentWindow()) geGetSelSet() list(list("layer" nil list(car(ToMetal) cadr(ToMetal)))))
  5.               );end let
  6.          );end procedure
  7. hiSetBindKey("Layout" "<Key>@" "ChangeLayer()" )



复制代码

自动POLY和METAL1打孔:(快捷键7)(需要根据不同工艺尺寸修改数据)
(缺点:不能在Convert to Mosaic下使用)
根据“大虾们谁有这个脚本啊 太好用啦

(出处: ET创芯网论坛(EETOP) )”这个帖子中的“xxw9054 ”回复进行改写的







  1. procedure( create_gate()
  2.            let(( cv instList inst_fl inst_l inst_fw
  3.                  fingers tech viaDefId viaParams xy cutNum
  4.                  x1 y1 x2 y2 x3 y3 x4 y4 x5 y5
  5.                  PolyEncloseCO MetalEncloseCO COSpace
  6.                  PolyExtensionOD MetalWidth COCoreSpaceOD
  7.                  PolyEncloseMetal PolyWidth FingersPolySpace )

  8.                PolyEncloseCO = 0.07
  9.                MetalEncloseCO = 0.07
  10.                COSpace = PolyExtensionOD

  11.                PolyExtensionOD = 0.2
  12.                MetalWidth = 0.3
  13.                COCoreSpaceOD = 0.41
  14.                PolyEncloseMetal = 0.25
  15.                PolyWidth = 0.36
  16.                FingersPolySpace = 0.42

  17.                cv = geGetEditCellView(getCurrentWindow())
  18.                tech = techGetTechFile(cv)
  19.                instList = geGetSelSet()
  20.                foreach(inst instList
  21.                        inst_fl = atof(car(last(inst~>prop~>l)));get instance l\
  22.                                 prop=information in properties\
  23.                                 atof is change to float   from Character string\
  24.                                 atoi is change to integer from Character string
  25.                        if( (inst_fl >= 100) then inst_fl = inst_fl / 1000 )
  26.                        inst_fw = atof(car(last(inst~>prop~>fw)));get instance fw
  27.                        fingers = atof(car(last(inst~>prop~>fingers)));get instance fingers
  28.                        inst_l = inst_fl * fingers + (fingers - 1) * FingersPolySpace
  29.                        xy = inst~>xy
  30.                        cutNum = int(((inst_l - (MetalWidth * 2) ) / PolyWidth) +1)
  31.                        if( (cutNum <= 2)
  32.                           then cutNum = 2
  33.                           else cutNum = cutNum
  34.                          )
  35.                        viaDefId = techFindViaDefByName(tech "M1_PO")
  36.                        viaParams = list(list("cutSpacing" list(COSpace COSpace));cont via space
  37.                                         list("layer1Enc" list(PolyEncloseCO PolyEncloseCO));POLYG enclosures cont via
  38.                                         list("layer2Enc" list(MetalEncloseCO MetalEncloseCO));METAL1 enclosures cont via
  39.                                         list("cutRows" 1) list("cutColumns" cutNum));Row=1   Column=cutNum
  40.                        case(inst~>orient
  41.                            ("R0"
  42.                             x1 = car(xy)
  43.                             y1 = cadr(xy) + inst_fw + PolyExtensionOD
  44.                             x2 = x1 + inst_l
  45.                             y2 = y1 + PolyWidth
  46.                             x3 = x1 + inst_l/2
  47.                             y3 = cadr(xy) + inst_fw + COCoreSpaceOD
  48.                             x4 = x1 + PolyEncloseMetal
  49.                             y4 = y2 - MetalWidth
  50.                             x5 = x2 - PolyEncloseMetal
  51.                             y5 = y2
  52.                             dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
  53.                             dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
  54.                             dbCreateVia( cv viaDefId list(x3 y3) "R0" viaParams)
  55.                            );end "R0"
  56.                            ("R90"
  57.                             x1 = car(xy) - inst_fw - (PolyExtensionOD + PolyWidth)
  58.                             y1 = cadr(xy)
  59.                             x2 = car(xy) - inst_fw - PolyExtensionOD
  60.                             y2 = y1 + inst_l
  61.                             x3 = x1 + (MetalWidth / 2)
  62.                             y3 = y1 + inst_l/2
  63.                             x4 = x1
  64.                             y4 = y1 + PolyEncloseMetal
  65.                             x5 = x1 + MetalWidth
  66.                             y5 = y2 - PolyEncloseMetal
  67.                             dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
  68.                             dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
  69.                             dbCreateVia( cv viaDefId list(x3 y3) "R90" viaParams)
  70.                            );end "R90"
  71.                            ("R180"
  72.                             x1 = car(xy) - inst_l
  73.                             y1 = cadr(xy) + PolyExtensionOD
  74.                             x2 = car(xy)
  75.                             y2 = cadr(xy) + (PolyExtensionOD + PolyWidth)
  76.                             x3 = x1 + inst_l/2
  77.                             y3 = cadr(xy) + COCoreSpaceOD
  78.                             x4 = x1 + PolyEncloseMetal
  79.                             y4 = y2 - MetalWidth
  80.                             x5 = x2 - PolyEncloseMetal
  81.                             y5 = y2
  82.                             dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
  83.                             dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
  84.                             dbCreateVia( cv viaDefId list(x3 y3) "R180" viaParams)
  85.                            );end "R180"
  86.                            ("R270"
  87.                             x1 = car(xy) - (PolyExtensionOD + PolyWidth)
  88.                             y1 = cadr(xy) - inst_l
  89.                             x2 = car(xy) - PolyExtensionOD
  90.                             y2 = cadr(xy)
  91.                             x3 = x1 + (MetalWidth / 2)
  92.                             y3 = y1 + inst_l/2
  93.                             x4 = x1
  94.                             y4 = y1 + PolyEncloseMetal
  95.                             x5 = x1 + MetalWidth
  96.                             y5 = y2 - PolyEncloseMetal
  97.                             dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
  98.                             dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
  99.                             dbCreateVia( cv viaDefId list(x3 y3) "R270" viaParams)
  100.                            );end "R270"
  101.                            ("MY"
  102.                             x1 = car(xy) - inst_l
  103.                             y1 = cadr(xy) + inst_fw + PolyExtensionOD
  104.                             x2 = car(xy)
  105.                             y2 = y1 + PolyWidth
  106.                             x3 = x1 + inst_l/2
  107.                             y3 = y1 + PolyExtensionOD
  108.                             x4 = x1 + PolyEncloseMetal
  109.                             y4 = y2 - MetalWidth
  110.                             x5 = x2 - PolyEncloseMetal
  111.                             y5 = y2
  112.                             dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
  113.                             dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
  114.                             dbCreateVia( cv viaDefId list(x3 y3) "MY" viaParams)
  115.                            );end "MY"
  116.                            ("MYR90"
  117.                             x1 = car(xy) - inst_fw - (PolyExtensionOD + PolyWidth)
  118.                             y1 = cadr(xy) - inst_l
  119.                             x2 = car(xy) - inst_fw - PolyExtensionOD
  120.                             y2 = cadr(xy)
  121.                             x3 = x1 + (MetalWidth / 2)
  122.                             y3 = y1 + inst_l/2
  123.                             x4 = x1
  124.                             y4 = y1 + PolyEncloseMetal
  125.                             x5 = x1 + MetalWidth
  126.                             y5 = y2 - PolyEncloseMetal
  127.                             dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
  128.                             dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
  129.                             dbCreateVia( cv viaDefId list(x3 y3) "MYR90" viaParams)
  130.                            );end "MYR90"
  131.                            ("MX"
  132.                             x1 = car(xy)
  133.                             y1 = cadr(xy) + PolyExtensionOD
  134.                             x2 = x1 + inst_l
  135.                             y2 = y1 + PolyWidth
  136.                             x3 = x1 + inst_l/2
  137.                             y3 = y1 + PolyExtensionOD
  138.                             x4 = x1 + PolyEncloseMetal
  139.                             y4 = y2 - MetalWidth
  140.                             x5 = x2 - PolyEncloseMetal
  141.                             y5 = y2
  142.                             dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
  143.                             dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
  144.                             dbCreateVia( cv viaDefId list(x3 y3) "MX" viaParams)
  145.                            );end "MX"
  146.                            ("MXR90"
  147.                             x1 = car(xy) - (PolyExtensionOD + PolyWidth)
  148.                             y1 = cadr(xy)
  149.                             x2 = car(xy) - PolyExtensionOD
  150.                             y2 = cadr(xy)+ inst_l
  151.                             x3 = x1 + (MetalWidth / 2)
  152.                             y3 = y1 + inst_l/2
  153.                             x4 = x1
  154.                             y4 = y1 + PolyEncloseMetal
  155.                             x5 = x1 + MetalWidth
  156.                             y5 = y2 - PolyEncloseMetal
  157.                             dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
  158.                             dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
  159.                             dbCreateVia( cv viaDefId list(x3 y3) "MXR90" viaParams)
  160.                            );end "MXR90"
  161.                            );end case   
  162.                        );end foreach
  163.                );end let
  164. );end procedure
  165. <div>hiSetBindKey("Layout" "<Key>7" "create_gate()" )
  166. </div>


复制代码

 楼主| 发表于 2020-1-3 10:06:43 | 显示全部楼层
第四个自动打poly和metal1孔的skill程序是根据“大虾们谁有这个脚本啊 太好用啦
http://bbs.eetop.cn/forum.php?mo ... amp;fromuid=1573268
(出处: ET创芯网论坛(EETOP) )”这个帖子中的“xxw9054 ”回复进行改写的。
 楼主| 发表于 2020-8-14 12:01:37 | 显示全部楼层
鼠标滚轮直接修改 Via 的行数和列数skill脚本
http://bbs.eetop.cn/forum.php?mo ... amp;fromuid=1573268
(出处: EETOP 创芯网论坛 (原名:电子顶级开发网))
此处增加一个





  1. ;==========================================================================
  2. ;Function:         "Ctrl" or "Shift" + mouse wheel to modify the horizontal or vertical number of through holes (Via)
  3. ;Instructions:
  4. ;                1.In the CIW window, Load this il file
  5. ;                2.In the layout window, After selecting Via,
  6. ;                  Hold down "Ctrl" or "Shift" and slide the mouse wheel
  7. ;
  8. ;Note:                When selecting Via, you may accidentally select other devices.
  9. ;                This script only modifies Via parameters, not other device parameters.
  10. ;
  11. ;==========================================================================
  12. row = "row"
  13. col = "column"
  14. hiSetBindKey("Layout" "Shift<Btn4Down>" "NewVia(row  1)")
  15. hiSetBindKey("Layout" "Shift<Btn5Down>" "NewVia(row -1)")
  16. hiSetBindKey("Layout" "Ctrl<Btn4Down>"  "NewVia(col  1)")
  17. hiSetBindKey("Layout" "Ctrl<Btn5Down>"  "NewVia(col -1)")

  18. procedure(NewVia(dir num)       
  19.         instID = geGetSelSet()        ;get via ID list
  20.         viaID = setof(obj instID obj~>objType == "stdVia")
  21.         rotation = list("R90" "R270" "MYR90" "MXR90")
  22.         foreach(via viaID
  23.                 when(dir == "row"
  24.                         if(member(via~>orient rotation) == nil then        
  25.                                 org = via~>cutRows                       
  26.                                 via~>cutRows = apply('plus list(org num))
  27.                         else                                               
  28.                                 org = via~>cutColumns                       
  29.                                 via~>cutColumns = apply('plus list(org num))
  30.                         );end if
  31.                 );end when
  32.                 when(dir == "column"
  33.                         if(member(via~>orient rotation) == nil then
  34.                                 org = via~>cutColumns
  35.                                 via~>cutColumns = apply('plus list(org num))
  36.                         else
  37.                                 org = via~>cutRows
  38.                                 via~>cutRows = apply('plus list(org num))
  39.                         );end if
  40.                 );end when
  41.         );end foreach()
  42. );end procedure



复制代码

 楼主| 发表于 2020-8-17 17:21:43 | 显示全部楼层
本帖最后由 sunxeu 于 2021-10-4 14:51 编辑

这里再增加一个,可以使用Shift+上下左右键增加已有孔的数目,使用Ctrl+上下左右来减少已有孔的数目




  1. <div>UpAdd = "UpAdd"
  2. DownAdd = "DownAdd"
  3. LeftAdd = "LeftAdd"
  4. RightAdd = "RightAdd"
  5. UpMinus = "UpMinus"
  6. DownMinus = "DownMinus"
  7. LeftMinus = "LeftMinus"
  8. RightMinus = "RightMinus"
  9. hiSetBindKey("Layout" "Shift<Key>Up" "ChangeVia(UpAdd)")
  10. hiSetBindKey("Layout" "Shift<Key>Down" "ChangeVia(DownAdd)")
  11. hiSetBindKey("Layout" "Shift<Key>Left"  "ChangeVia(LeftAdd)")
  12. hiSetBindKey("Layout" "Shift<Key>Right"  "ChangeVia(RightAdd)")
  13. hiSetBindKey("Layout" "Ctrl<Key>Up" "ChangeVia(UpMinus)")
  14. hiSetBindKey("Layout" "Ctrl<Key>Down" "ChangeVia(DownMinus)")
  15. hiSetBindKey("Layout" "Ctrl<Key>Left"  "ChangeVia(LeftMinus)")
  16. hiSetBindKey("Layout" "Ctrl<Key>Right"  "ChangeVia(RightMinus)") </div><div> </div><div>procedure(ChangeVia(change)
  17.        instID = geGetSelSet()                                                     ;get via ID list
  18.        viaID = setof(obj instID obj~>objType == "stdVia")                         ;choose Via ID list
  19.        foreach(via viaID                                                          ;loop via IDlist
  20.                   ViaOrient = via~>orient                                            ;get via Rotation
  21.                   ViaRows = via~>cutRows                                             ;get via row number
  22.                   ViaColumns = via~>cutColumns                                       ;get via column number
  23.                   viaWidth = via ~> cutWidth
  24.                   viaRowSpace = cadr(via~>cutSpacing)
  25.                   viaColumnSpace = car(via~>cutSpacing)
  26.                   layer1 = dbGetViaLayer(via "layer1")                               ;get via layer1
  27. ;~~~~~~~~~~~~~~~~~TSMC 130nm BCD+ HV~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  28.                   Cont = 0.2       ;Array 4X4
  29.                   Via12 = 0.29     ;Array 3X3
  30.                   Via34 = 0.54     ;Array 3X3
  31. ;~~~~~~~~~~~~~~~~~use UpAdd/DownAdd , judge the Rows number is equal to 2~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  32.                   when(ViaOrient=="R0"||ViaOrient=="R180"||ViaOrient=="MY"||ViaOrient=="MX"
  33.                        when(ViaRows==2 && ViaColumns>=3 && change=="UpAdd" && layer1=="METAL3"
  34.                             if(viaRowSpace < Via34
  35.                                dbMoveFig(via nil list(0:Via34-viaRowSpace "R0")))
  36.                                via~>cutSpacing = (viaColumnSpace:Via34)
  37.                            );end when
  38.                        when(ViaRows==2 && ViaColumns>=3 && change=="UpAdd" && layer1=="METAL2"
  39.                             if(viaRowSpace < Via12
  40.                                dbMoveFig(via nil list(0:Via12-viaRowSpace "R0")))
  41.                                via~>cutSpacing = (viaColumnSpace:Via12)
  42.                            );end when
  43.                        when(ViaRows==2 && ViaColumns>=3 && change=="UpAdd" && layer1=="METAL1"
  44.                             if(viaRowSpace < Via12
  45.                                dbMoveFig(via nil list(0:Via12-viaRowSpace "R0")))
  46.                                via~>cutSpacing = (viaColumnSpace:Via12)
  47.                            );end when
  48.                        when(ViaRows==2 && ViaColumns>=3 && change=="UpAdd" && layer1=="POLYG"
  49.                             if(viaRowSpace < Cont
  50.                                dbMoveFig(via nil list(0:Cont-viaRowSpace "R0")))
  51.                                via~>cutSpacing = (viaColumnSpace:Cont)
  52.                            );end when
  53. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  54.                        when(ViaRows==2 && ViaColumns>=3 && change=="DownAdd" && layer1=="METAL3"
  55.                             if(viaRowSpace < Via34
  56.                                dbMoveFig(via nil list(0:-Via34+viaRowSpace "R0")))
  57.                                via~>cutSpacing = (viaColumnSpace:Via34)
  58.                            );end when
  59.                        when(ViaRows==2 && ViaColumns>=3 && change=="DownAdd" && layer1=="METAL2"
  60.                             if(viaRowSpace < Via12
  61.                                dbMoveFig(via nil list(0:-Via12+viaRowSpace "R0")))
  62.                                via~>cutSpacing = (viaColumnSpace:Via12)
  63.                            );end when
  64.                        when(ViaRows==2 && ViaColumns>=3 && change=="DownAdd" && layer1=="METAL1"
  65.                             if(viaRowSpace < Via12
  66.                                dbMoveFig(via nil list(0:-Via12+viaRowSpace "R0")))
  67.                                via~>cutSpacing = (viaColumnSpace:Via12)
  68.                            );end when
  69.                        when(ViaRows==2 && ViaColumns>=3 && change=="DownAdd" && layer1=="POLYG"
  70.                             if(viaRowSpace < Cont
  71.                                dbMoveFig(via nil list(0:-Cont+viaRowSpace "R0")))
  72.                                via~>cutSpacing = (viaColumnSpace:Cont)
  73.                            );end when
  74. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  75.                        when(ViaRows>=3 && ViaColumns==2 && change=="LeftAdd" && layer1=="METAL3"
  76.                             if(viaRowSpace < Via34
  77.                                dbMoveFig(via nil list(-Via34+viaRowSpace:0 "R0")))
  78.                                via~>cutSpacing = (Via34:viaColumnSpace)
  79.                            );end when
  80.                        when(ViaRows>=3 && ViaColumns==2 && change=="LeftAdd" && layer1=="METAL2"
  81.                             if(viaRowSpace < Via12
  82.                                dbMoveFig(via nil list(-Via12+viaRowSpace:0 "R0")))
  83.                                via~>cutSpacing = (Via12:viaColumnSpace)
  84.                            );end when
  85.                        when(ViaRows>=3 && ViaColumns==2 && change=="LeftAdd" && layer1=="METAL1"
  86.                             if(viaRowSpace < Via12
  87.                                dbMoveFig(via nil list(-Via12+viaRowSpace:0 "R0")))
  88.                                via~>cutSpacing = (Via12:viaColumnSpace)
  89.                            );end when
  90.                        when(ViaRows>=3 && ViaColumns==2 && change=="LeftAdd" && layer1=="POLYG"
  91.                             if(viaRowSpace < Cont
  92.                                dbMoveFig(via nil list(-Cont+viaRowSpace:0 "R0")))
  93.                                via~>cutSpacing = (Cont:viaColumnSpace)
  94.                            );end when
  95. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  96.                        when(ViaRows>=3 && ViaColumns==2 && change=="RightAdd" && layer1=="METAL3"
  97.                             if(viaRowSpace < Via34
  98.                                dbMoveFig(via nil list(Via34-viaRowSpace:0 "R0")))
  99.                                via~>cutSpacing = (Via34:viaColumnSpace)
  100.                            );end when
  101.                        when(ViaRows>=3 && ViaColumns==2 && change=="Rightdd" && layer1=="METAL2"
  102.                             if(viaRowSpace < Via12
  103.                                dbMoveFig(via nil list(Via12-viaRowSpace:0 "R0")))
  104.                                via~>cutSpacing = (Via12:viaColumnSpace)
  105.                            );end when
  106.                        when(ViaRows>=3 && ViaColumns==2 && change=="RightAdd" && layer1=="METAL1"
  107.                             if(viaRowSpace < Via12
  108.                                dbMoveFig(via nil list(Via12-viaRowSpace:0 "R0")))
  109.                                via~>cutSpacing = (Via12:viaColumnSpace)
  110.                            );end when
  111.                        when(ViaRows>=3 && ViaColumns==2 && change=="RightAdd" && layer1=="POLYG"
  112.                             if(viaRowSpace < Cont
  113.                                dbMoveFig(via nil list(Cont-viaRowSpace:0 "R0")))
  114.                                via~>cutSpacing = (Cont:viaColumnSpace)
  115.                            );end when
  116.                       );end when
  117. ;~~~~~~~~~~~~~~~~~use LeftAdd/RightAdd,judge the Columns number is equal to 2~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  118.                   when(ViaOrient=="R90"||ViaOrient=="R270"||ViaOrient=="MYR90"||ViaOrient=="MXR90"
  119.                        when(ViaRows>=3 && ViaColumns==2 && change=="UpAdd" && layer1=="METAL3"
  120.                             if(viaRowSpace < Via34
  121.                                dbMoveFig(via nil list(0:Via34-viaRowSpace "R0")))
  122.                                via~>cutSpacing = (Via34:viaColumnSpace)
  123.                            );end when
  124.                        when(ViaRows>=3 && ViaColumns==2 && change=="UpAdd" && layer1=="METAL2"
  125.                             if(viaRowSpace < Via12
  126.                                dbMoveFig(via nil list(0:Via12-viaRowSpace "R0")))
  127.                                via~>cutSpacing = (Via12:viaColumnSpace)
  128.                            );end when
  129.                        when(ViaRows>=3 && ViaColumns==2 && change=="UpAdd" && layer1=="METAL1"
  130.                             if(viaRowSpace < Via12
  131.                                dbMoveFig(via nil list(0:Via12-viaRowSpace "R0")))
  132.                                via~>cutSpacing = (Via12:viaColumnSpace)
  133.                            );end when
  134.                        when(ViaRows>=3 && ViaColumns==2 && change=="UpAdd" && layer1=="POLYG"
  135.                             if(viaRowSpace < Cont
  136.                                dbMoveFig(via nil list(0:Cont-viaRowSpace "R0")))
  137.                                via~>cutSpacing = (Cont:viaColumnSpace)
  138.                            );end when
  139. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  140.                        when(ViaRows>=3 && ViaColumns==2 && change=="DownAdd" && layer1=="METAL3"
  141.                             if(viaRowSpace < Via34
  142.                                dbMoveFig(via nil list(0:-Via34+viaRowSpace "R0")))
  143.                                via~>cutSpacing = (Via34:viaColumnSpace)
  144.                            );end when
  145.                        when(ViaRows>=3 && ViaColumns==2 && change=="DownAdd" && layer1=="METAL2"
  146.                             if(viaRowSpace < Via12
  147.                                dbMoveFig(via nil list(0:-Via12+viaRowSpace "R0")))
  148.                                via~>cutSpacing = (Via12:viaColumnSpace)
  149.                            );end when
  150.                        when(ViaRows>=3 && ViaColumns==2 && change=="DownAdd" && layer1=="METAL1"
  151.                             if(viaRowSpace < Via12
  152.                                dbMoveFig(via nil list(0:-Via12+viaRowSpace "R0")))
  153.                                via~>cutSpacing = (Via12:viaColumnSpace)
  154.                            );end when
  155.                        when(ViaRows>=3 && ViaColumns==2 && change=="DownAdd" && layer1=="POLYG"
  156.                             if(viaRowSpace < Cont
  157.                                dbMoveFig(via nil list(0:-Cont+viaRowSpace "R0")))
  158.                                via~>cutSpacing = (Cont:viaColumnSpace)
  159.                            );end when
  160. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  161.                        when(ViaRows==2 && ViaColumns>=3 && change=="LeftAdd" && layer1=="METAL3"
  162.                             if(viaRowSpace < Via34
  163.                                dbMoveFig(via nil list(-Via34+viaRowSpace:0 "R0")))
  164.                                via~>cutSpacing = (viaColumnSpace:Via34)
  165.                            );end when
  166.                        when(ViaRows==2 && ViaColumns>=3 && change=="LeftAdd" && layer1=="METAL2"
  167.                             if(viaRowSpace < Via12
  168.                                dbMoveFig(via nil list(-Via12+viaRowSpace:0 "R0")))
  169.                                via~>cutSpacing = (viaColumnSpace:Via12)
  170.                            );end when
  171.                        when(ViaRows==2 && ViaColumns>=3 && change=="LeftAdd" && layer1=="METAL1"
  172.                             if(viaRowSpace < Via12
  173.                                dbMoveFig(via nil list(-Via12+viaRowSpace:0 "R0")))
  174.                                via~>cutSpacing = (viaColumnSpace:Via12)
  175.                            );end when
  176.                        when(ViaRows==2 && ViaColumns>=3 && change=="LeftAdd" && layer1=="POLYG"
  177.                             if(viaRowSpace < Cont
  178.                                dbMoveFig(via nil list(-Cont+viaRowSpace:0 "R0")))
  179.                                via~>cutSpacing = (viaColumnSpace:Cont)
  180.                            );end when
  181. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  182.                        when(ViaRows==2 && ViaColumns>=3 && change=="RightAdd" && layer1=="METAL3"
  183.                             if(viaRowSpace < Via34
  184.                                dbMoveFig(via nil list(Via34-viaRowSpace:0 "R0")))
  185.                                via~>cutSpacing = (viaColumnSpace:Via34)
  186.                            );end when
  187.                        when(ViaRows==2 && ViaColumns>=3 && change=="Rightdd" && layer1=="METAL2"
  188.                             if(viaRowSpace < Via12
  189.                                dbMoveFig(via nil list(Via12-viaRowSpace:0 "R0")))
  190.                                via~>cutSpacing = (viaColumnSpace:Via12)
  191.                            );end when
  192.                        when(ViaRows==2 && ViaColumns>=3 && change=="RightAdd" && layer1=="METAL1"
  193.                             if(viaRowSpace < Via12
  194.                                dbMoveFig(via nil list(Via12-viaRowSpace:0 "R0")))
  195.                                via~>cutSpacing = (viaColumnSpace:Via12)
  196.                            );end when
  197.                        when(ViaRows==2 && ViaColumns>=3 && change=="RightAdd" && layer1=="POLYG"
  198.                             if(viaRowSpace < Cont
  199.                                dbMoveFig(via nil list(Cont-viaRowSpace:0 "R0")))
  200.                                via~>cutSpacing = (viaColumnSpace:Cont)
  201.                            );end when
  202.                       );end when
  203. ;~~~~~~~~~~~~~~~~~judge the distance of Via coordinate movement~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  204.                   if(ViaOrient=="R0"||ViaOrient=="R180"||ViaOrient=="MY"||ViaOrient=="MX"
  205.                      then if(change=="UpAdd"||change=="DownAdd"||change=="UpMinus"||change=="DownMinus"  
  206.                              then MoveDistance=(viaWidth/2) + (viaRowSpace/2)
  207.                              else MoveDistance=(viaWidth/2) + (viaColumnSpace/2)
  208.                             )
  209.                      else if(change=="UpAdd"||change=="DownAdd"||change=="UpMinus"||change=="DownMinus"  
  210.                              then MoveDistance=(viaWidth/2) + (viaColumnSpace/2)
  211.                              else MoveDistance=(viaWidth/2) + (viaRowSpace/2)
  212.                             )
  213.                     )
  214. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  215.             when(change=="UpAdd"
  216.               if(ViaOrient=="R0"||ViaOrient=="R180"||ViaOrient=="MY"||ViaOrient=="MX"
  217.                           then via~>cutRows = ViaRows+1
  218.                           else via~>cutColumns = ViaColumns+1);end if
  219.                           dbMoveFig(via nil list(0:MoveDistance "R0")))
  220.             when(change=="DownAdd"
  221.               if(ViaOrient=="R0"||ViaOrient=="R180"||ViaOrient=="MY"||ViaOrient=="MX"
  222.                           then via~>cutRows = ViaRows+1
  223.                           else via~>cutColumns = ViaColumns+1);end if
  224.                           dbMoveFig(via nil list(0:-MoveDistance "R0")))
  225.             when(change=="LeftAdd"
  226.               if(ViaOrient=="R0"||ViaOrient=="R180"||ViaOrient=="MY"||ViaOrient=="MX"
  227.                           then via~>cutColumns = ViaColumns+1
  228.                           else via~>cutRows = ViaRows+1);end if
  229.                           dbMoveFig(via nil list(-MoveDistance:0 "R0")))
  230.             when(change=="RightAdd"
  231.               if(ViaOrient=="R0"||ViaOrient=="R180"||ViaOrient=="MY"||ViaOrient=="MX"
  232.                           then via~>cutColumns = ViaColumns+1
  233.                           else via~>cutRows = ViaRows+1);end if
  234.                           dbMoveFig(via nil list(MoveDistance:0 "R0")))
  235.             when(change=="UpMinus"
  236.               if(ViaOrient=="R0"||ViaOrient=="R180"||ViaOrient=="MY"||ViaOrient=="MX"
  237.                           then via~>cutRows = ViaRows-1
  238.                           else via~>cutColumns = ViaColumns-1);end if
  239.                           dbMoveFig(via nil list(0:-MoveDistance "R0")))
  240.             when(change=="DownMinus"
  241.               if(ViaOrient=="R0"||ViaOrient=="R180"||ViaOrient=="MY"||ViaOrient=="MX"
  242.                           then via~>cutRows = ViaRows-1
  243.                           else via~>cutColumns = ViaColumns-1);end if
  244.                           dbMoveFig(via nil list(0:MoveDistance "R0")))
  245.             when(change=="LeftMinus"
  246.               if(ViaOrient=="R0"||ViaOrient=="R180"||ViaOrient=="MY"||ViaOrient=="MX"
  247.                           then via~>cutColumns = ViaColumns-1
  248.                           else via~>cutRows = ViaRows-1);end if
  249.                           dbMoveFig(via nil list(MoveDistance:0 "R0")))
  250.             when(change=="RightMinus"
  251.               if(ViaOrient=="R0"||ViaOrient=="R180"||ViaOrient=="MY"||ViaOrient=="MX"
  252.                           then via~>cutColumns = ViaColumns-1
  253.                           else via~>cutRows = ViaRows-1);end if
  254.                           dbMoveFig(via nil list(-MoveDistance:0 "R0")))
  255. );end foreach
  256. );end procedure
  257. </div>


复制代码
 楼主| 发表于 2020-8-18 11:55:17 | 显示全部楼层
更新一下给instance打gate via的skill





  1. procedure( create_gate()
  2.            let(( cv instList inst_fl inst_l inst_fw
  3.                  fingers tech viaDefId viaParams xy cutNum via
  4.                  x1 y1 x2 y2 x3 y3 x4 y4 x5 y5
  5.                  PolyEncloseCOUD PolyEncloseCOLR MetalEncloseCOUD MetalEncloseCOLR COSpace
  6.                  PolyExtensionOD MetalWidth COCoreSpaceOD
  7.                  PolyEncloseMetal PolyWidth FingersPolySpace )
  8. ;~~~~~~~~~~~~~~TSMC 130nm BCD+ HV~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  9.                PolyEncloseCOUD = 0.07         ;contact ~> poly enclosures contact top and down
  10.                PolyEncloseCOLR = 0.12         ;contact ~> poly enclosures contact left and right
  11.                MetalEncloseCOUD = 0.07        ;contact ~> metal1 enclosures contact top and down
  12.                MetalEncloseCOLR = 0.12        ;contact ~> metal1 enclosures contact left and right
  13.                COSpace = 0.2                  ;contact ~> space
  14.                PolyExtensionOD = 0.2          ;instance ~> poly extension diffusion
  15.                MetalWidth = 0.3               ;analog ~> metal1 width
  16.                COCoreSpaceOD = 0.41           
  17.                PolyEncloseMetal = 0.25        
  18.                PolyWidth = 0.36               
  19.                FingersPolySpace = 0.42        
  20.                Polybitch = 0.36               
  21. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  22.                cv = geGetEditCellView(getCurrentWindow())
  23.                tech = techGetTechFile(cv)
  24.                instList = geGetSelSet()
  25.                foreach(inst instList
  26.                        inst_fl = atof(car(last(inst~>prop~>l)));get instance l\
  27.                                 prop=information in properties\
  28.                                 atof is change to float   from Character string\
  29.                                 atoi is change to integer from Character string
  30.                        if( (inst_fl >= 100) then inst_fl = inst_fl / 1000 )
  31.                        inst_fw = atof(car(last(inst~>prop~>fw)));get instance fw
  32.                        fingers = atof(car(last(inst~>prop~>fingers)));get instance fingers
  33.                        inst_l = inst_fl * fingers + (fingers - 1) * FingersPolySpace
  34.                        xy = inst~>xy
  35.                        cutNum = int(((inst_l - (MetalWidth * 2)) / Polybitch))
  36.                        if( (cutNum <= 2)
  37.                           then cutNum = 2
  38.                           else cutNum = cutNum
  39.                          )
  40.                        viaDefId = techFindViaDefByName(tech "M1_PO")
  41.                        viaParams = list(list("cutSpacing" list(COSpace COSpace));cont via space
  42.                                         list("layer1Enc" list(PolyEncloseCOLR PolyEncloseCOUD));POLYG enclosures cont via
  43.                                         list("layer2Enc" list(MetalEncloseCOLR MetalEncloseCOUD));METAL1 enclosures cont via
  44.                                         list("cutRows" 1) list("cutColumns" cutNum));Row=1   Column=cutNum
  45. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  46.                        case(inst~>orient
  47.                            ("R0"
  48.                             x1 = car(xy)
  49.                             y1 = cadr(xy) + inst_fw + PolyExtensionOD
  50.                             x2 = x1 + inst_l
  51.                             y2 = y1 + PolyWidth
  52.                             x3 = x1 + inst_l/2
  53.                             y3 = cadr(xy) + inst_fw + COCoreSpaceOD
  54.                             x4 = x1 + PolyEncloseMetal
  55.                             y4 = y2 - MetalWidth
  56.                             x5 = x2 - PolyEncloseMetal
  57.                             y5 = y2
  58.                             dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
  59.                             dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
  60.                             dbCreateVia( cv viaDefId list(x3 y3) "R0" viaParams)
  61.                            );end "R0"
  62.                            ("R90"
  63.                             x1 = car(xy) - inst_fw - (PolyExtensionOD + PolyWidth)
  64.                             y1 = cadr(xy)
  65.                             x2 = car(xy) - inst_fw - PolyExtensionOD
  66.                             y2 = y1 + inst_l
  67.                             x3 = x1 + (MetalWidth / 2)
  68.                             y3 = y1 + inst_l/2
  69.                             x4 = x1
  70.                             y4 = y1 + PolyEncloseMetal
  71.                             x5 = x1 + MetalWidth
  72.                             y5 = y2 - PolyEncloseMetal
  73.                             dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
  74.                             dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
  75.                             dbCreateVia( cv viaDefId list(x3 y3) "R90" viaParams)
  76.                            );end "R90"
  77.                            ("R180"
  78.                             x1 = car(xy) - inst_l
  79.                             y1 = cadr(xy) + PolyExtensionOD
  80.                             x2 = car(xy)
  81.                             y2 = cadr(xy) + (PolyExtensionOD + PolyWidth)
  82.                             x3 = x1 + inst_l/2
  83.                             y3 = cadr(xy) + COCoreSpaceOD
  84.                             x4 = x1 + PolyEncloseMetal
  85.                             y4 = y2 - MetalWidth
  86.                             x5 = x2 - PolyEncloseMetal
  87.                             y5 = y2
  88.                             dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
  89.                             dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
  90.                             dbCreateVia( cv viaDefId list(x3 y3) "R180" viaParams)
  91.                            );end "R180"
  92.                            ("R270"
  93.                             x1 = car(xy) - (PolyExtensionOD + PolyWidth)
  94.                             y1 = cadr(xy) - inst_l
  95.                             x2 = car(xy) - PolyExtensionOD
  96.                             y2 = cadr(xy)
  97.                             x3 = x1 + (MetalWidth / 2)
  98.                             y3 = y1 + inst_l/2
  99.                             x4 = x1
  100.                             y4 = y1 + PolyEncloseMetal
  101.                             x5 = x1 + MetalWidth
  102.                             y5 = y2 - PolyEncloseMetal
  103.                             dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
  104.                             dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
  105.                             dbCreateVia( cv viaDefId list(x3 y3) "R270" viaParams)
  106.                            );end "R270"
  107.                            ("MY"
  108.                             x1 = car(xy) - inst_l
  109.                             y1 = cadr(xy) + inst_fw + PolyExtensionOD
  110.                             x2 = car(xy)
  111.                             y2 = y1 + PolyWidth
  112.                             x3 = x1 + inst_l/2
  113.                             y3 = y1 + PolyExtensionOD + 0.01
  114.                             x4 = x1 + PolyEncloseMetal
  115.                             y4 = y2 - MetalWidth
  116.                             x5 = x2 - PolyEncloseMetal
  117.                             y5 = y2
  118.                             dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
  119.                             dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
  120.                             dbCreateVia( cv viaDefId list(x3 y3) "MY" viaParams)
  121.                            );end "MY"
  122.                            ("MYR90"
  123.                             x1 = car(xy) - inst_fw - (PolyExtensionOD + PolyWidth)
  124.                             y1 = cadr(xy) - inst_l
  125.                             x2 = car(xy) - inst_fw - PolyExtensionOD
  126.                             y2 = cadr(xy)
  127.                             x3 = x1 + (MetalWidth / 2)
  128.                             y3 = y1 + inst_l/2
  129.                             x4 = x1
  130.                             y4 = y1 + PolyEncloseMetal
  131.                             x5 = x1 + MetalWidth
  132.                             y5 = y2 - PolyEncloseMetal
  133.                             dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
  134.                             dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
  135.                             dbCreateVia( cv viaDefId list(x3 y3) "MYR90" viaParams)
  136.                            );end "MYR90"
  137.                            ("MX"
  138.                             x1 = car(xy)
  139.                             y1 = cadr(xy) + PolyExtensionOD
  140.                             x2 = x1 + inst_l
  141.                             y2 = y1 + PolyWidth
  142.                             x3 = x1 + inst_l/2
  143.                             y3 = y1 + PolyExtensionOD + 0.01
  144.                             x4 = x1 + PolyEncloseMetal
  145.                             y4 = y2 - MetalWidth
  146.                             x5 = x2 - PolyEncloseMetal
  147.                             y5 = y2
  148.                             dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
  149.                             dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
  150.                             dbCreateVia( cv viaDefId list(x3 y3) "MX" viaParams)
  151.                            );end "MX"
  152.                            ("MXR90"
  153.                             x1 = car(xy) - (PolyExtensionOD + PolyWidth)
  154.                             y1 = cadr(xy)
  155.                             x2 = car(xy) - PolyExtensionOD
  156.                             y2 = cadr(xy)+ inst_l
  157.                             x3 = x1 + (MetalWidth / 2)
  158.                             y3 = y1 + inst_l/2
  159.                             x4 = x1
  160.                             y4 = y1 + PolyEncloseMetal
  161.                             x5 = x1 + MetalWidth
  162.                             y5 = y2 - PolyEncloseMetal
  163.                             dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
  164.                             dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
  165.                             dbCreateVia( cv viaDefId list(x3 y3) "MXR90" viaParams)
  166.                            );end "MXR90"
  167.                            );end case   
  168.                        );end foreach
  169.                );end let
  170. );end procedure
  171. hiSetBindKey("Layout" "<Key>7" "create_gate()" )



复制代码

点评

根据工艺不同,atof(car(last(inst~>prop~>fw))),其中inst~>prop~>fw可能是多个list嵌套,所以要自己细改一下,atof作用(atof("1u")=1)是提取参数(string)的float值   发表于 2023-7-25 10:02
同求 也是报atof的错误  发表于 2022-10-13 10:12
为啥atof 那个函数报错  发表于 2021-3-23 12:47
 楼主| 发表于 2020-9-10 16:20:17 | 显示全部楼层




  1. procedure(CreateCrossRuler()
  2.           let( ( windowID enterpoint point cvID x y )
  3. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  4.                cvID = geGetEditCellView(getCurrentWindow());geGetWindowCellView()
  5.                windowID = getCurrentWindow()
  6.                enterpoint = enterPoint()
  7.                x = car(enterpoint)
  8.                y = cadr(enterpoint)
  9.                point = geWindowToEditPoint(windowID x:y)
  10. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  11.                dbCreateRuler(cvID list(point xCoord(point)+100:yCoord(point)))
  12.                dbCreateRuler(cvID list(point xCoord(point)-100:yCoord(point)))
  13.                dbCreateRuler(cvID list(point xCoord(point):yCoord(point)+100))
  14.                dbCreateRuler(cvID list(point xCoord(point):yCoord(point)-100))
  15.              ); end of let
  16. ); end procedure CreateCrossRuler
  17. hiSetBindKey("Layout" "<Key>6" "CreateCrossRuler()")



复制代码
发表于 2020-1-3 00:45:32 | 显示全部楼层
thank you for sharing
发表于 2020-1-8 10:53:53 | 显示全部楼层
十字标尺的脚本,获取鼠标点坐标的函数enterPoint()只在当前层使用时有效,如果在上层x进去底层,enterPoint()就找不到正确的点了。可以用point=hiGetPoint(hiGetCurrentWindows())替代
 楼主| 发表于 2020-1-8 15:47:57 | 显示全部楼层


chinarml 发表于 2020-1-8 10:53
十字标尺的脚本,获取鼠标点坐标的函数enterPoint()只在当前层使用时有效,如果在上层x进去底层,enterPo ...


谢谢
发表于 2020-1-8 19:45:43 | 显示全部楼层
赞一个
 楼主| 发表于 2020-1-9 15:25:47 | 显示全部楼层
自动给MOS打poly孔脚本微调

procedure( create_gate()

           let(( cv instList inst_fl inst_l inst_fw
                 fingers tech viaDefId viaParams xy cutNum
                 x1 y1 x2 y2 x3 y3 x4 y4 x5 y5
                 PolyEncloseCO MetalEncloseCO COSpace
                 PolyExtensionOD MetalWidth COCoreSpaceOD
                 PolyEncloseMetal PolyWidth FingersPolySpace )

               PolyEncloseCO = 0.07
               MetalEncloseCO = 0.07
               COSpace = PolyExtensionOD

               PolyExtensionOD = 0.2
               MetalWidth = 0.3
               COCoreSpaceOD = 0.41
               PolyEncloseMetal = 0.25
               PolyWidth = 0.36
               FingersPolySpace = 0.42

               cv = geGetEditCellView(getCurrentWindow())
               tech = techGetTechFile(cv)
               instList = geGetSelSet()
               foreach(inst instList
                       inst_fl = atof(car(last(inst~>prop~>l)));get instance l\
                                prop=information in properties\
                                atof is change to float   from Character string\
                                atoi is change to integer from Character string
                       if( (inst_fl >= 100) then inst_fl = inst_fl / 1000 )
                       inst_fw = atof(car(last(inst~>prop~>fw)));get instance fw
                       fingers = atof(car(last(inst~>prop~>fingers)));get instance fingers
                       inst_l = inst_fl * fingers + (fingers - 1) * FingersPolySpace
                       xy = inst~>xy
                       cutNum = int(((inst_l - (MetalWidth * 2) ) / PolyWidth) +1)
                       if( (cutNum <= 2)
                          then cutNum = 2
                          else cutNum = cutNum
                         )
                       viaDefId = techFindViaDefByName(tech "M1_PO")
                       viaParams = list(list("cutSpacing" list(COSpace COSpace));cont via space
                                        list("layer1Enc" list(PolyEncloseCO PolyEncloseCO))OLYG enclosures cont via
                                        list("layer2Enc" list(MetalEncloseCO MetalEncloseCO));METAL1 enclosures cont via
                                        list("cutRows" 1) list("cutColumns" cutNum));Row=1   Column=cutNum
                       case(inst~>orient
                           ("R0"
                            x1 = car(xy)
                            y1 = cadr(xy) + inst_fw + PolyExtensionOD
                            x2 = x1 + inst_l
                            y2 = y1 + PolyWidth
                            x3 = x1 + inst_l/2
                            y3 = cadr(xy) + inst_fw + COCoreSpaceOD
                            x4 = x1 + PolyEncloseMetal
                            y4 = y2 - MetalWidth
                            x5 = x2 - PolyEncloseMetal
                            y5 = y2
                            dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
                            dbCreateRect( cv list( "OLYG" "drawing" ) list(x1:y1 x2:y2))
                            dbCreateVia( cv viaDefId list(x3 y3) "R0" viaParams)
                           );end "R0"
                           ("R90"
                            x1 = car(xy) - inst_fw - (PolyExtensionOD + PolyWidth)
                            y1 = cadr(xy)
                            x2 = car(xy) - inst_fw - PolyExtensionOD
                            y2 = y1 + inst_l
                            x3 = x1 + (MetalWidth / 2)
                            y3 = y1 + inst_l/2
                            x4 = x1
                            y4 = y1 + PolyEncloseMetal
                            x5 = x1 + MetalWidth
                            y5 = y2 - PolyEncloseMetal
                            dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
                            dbCreateRect( cv list( "OLYG" "drawing" ) list(x1:y1 x2:y2))
                            dbCreateVia( cv viaDefId list(x3 y3) "R90" viaParams)
                           );end "R90"
                           ("R180"
                            x1 = car(xy) - inst_l
                            y1 = cadr(xy) + PolyExtensionOD
                            x2 = car(xy)
                            y2 = cadr(xy) + (PolyExtensionOD + PolyWidth)
                            x3 = x1 + inst_l/2
                            y3 = cadr(xy) + COCoreSpaceOD
                            x4 = x1 + PolyEncloseMetal
                            y4 = y2 - MetalWidth
                            x5 = x2 - PolyEncloseMetal
                            y5 = y2
                            dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
                            dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
                            dbCreateVia( cv viaDefId list(x3 y3) "R180" viaParams)
                           );end "R180"
                           ("R270"
                            x1 = car(xy) - (PolyExtensionOD + PolyWidth)
                            y1 = cadr(xy) - inst_l
                            x2 = car(xy) - PolyExtensionOD
                            y2 = cadr(xy)
                            x3 = x1 + (MetalWidth / 2)
                            y3 = y1 + inst_l/2
                            x4 = x1
                            y4 = y1 + PolyEncloseMetal
                            x5 = x1 + MetalWidth
                            y5 = y2 - PolyEncloseMetal
                            dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
                            dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
                            dbCreateVia( cv viaDefId list(x3 y3) "R270" viaParams)
                           );end "R270"
                           ("MY"
                            x1 = car(xy) - inst_l
                            y1 = cadr(xy) + inst_fw + PolyExtensionOD
                            x2 = car(xy)
                            y2 = y1 + PolyWidth
                            x3 = x1 + inst_l/2
                            y3 = y1 + PolyExtensionOD
                            x4 = x1 + PolyEncloseMetal
                            y4 = y2 - MetalWidth
                            x5 = x2 - PolyEncloseMetal
                            y5 = y2
                            dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
                            dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
                            dbCreateVia( cv viaDefId list(x3 y3) "MY" viaParams)
                           );end "MY"
                           ("MYR90"
                            x1 = car(xy) - inst_fw - (PolyExtensionOD + PolyWidth)
                            y1 = cadr(xy) - inst_l
                            x2 = car(xy) - inst_fw - PolyExtensionOD
                            y2 = cadr(xy)
                            x3 = x1 + (MetalWidth / 2)
                            y3 = y1 + inst_l/2
                            x4 = x1
                            y4 = y1 + PolyEncloseMetal
                            x5 = x1 + MetalWidth
                            y5 = y2 - PolyEncloseMetal
                            dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
                            dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
                            dbCreateVia( cv viaDefId list(x3 y3) "MYR90" viaParams)
                           );end "MYR90"
                           ("MX"
                            x1 = car(xy)
                            y1 = cadr(xy) + PolyExtensionOD
                            x2 = x1 + inst_l
                            y2 = y1 + PolyWidth
                            x3 = x1 + inst_l/2
                            y3 = y1 + PolyExtensionOD
                            x4 = x1 + PolyEncloseMetal
                            y4 = y2 - MetalWidth
                            x5 = x2 - PolyEncloseMetal
                            y5 = y2
                            dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
                            dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
                            dbCreateVia( cv viaDefId list(x3 y3) "MX" viaParams)
                           );end "MX"
                           ("MXR90"
                            x1 = car(xy) - (PolyExtensionOD + PolyWidth)
                            y1 = cadr(xy)
                            x2 = car(xy) - PolyExtensionOD
                            y2 = cadr(xy)+ inst_l
                            x3 = x1 + (MetalWidth / 2)
                            y3 = y1 + inst_l/2
                            x4 = x1
                            y4 = y1 + PolyEncloseMetal
                            x5 = x1 + MetalWidth
                            y5 = y2 - PolyEncloseMetal
                            dbCreateRect( cv list( "METAL1" "drawing" ) list(x4:y4 x5:y5))
                            dbCreateRect( cv list( "POLYG" "drawing" ) list(x1:y1 x2:y2))
                            dbCreateVia( cv viaDefId list(x3 y3) "MXR90" viaParams)
                           );end "MXR90"
                           );end case   
                       );end foreach
               );end let
);end procedure
hiSetBindKey("Layout" "<Key>7" "create_gate()" )
 楼主| 发表于 2020-1-10 09:18:02 | 显示全部楼层
快速换层:(快捷键@)(按@键即可将选中layer换成LSW中选中的layer)



procedure( ChangeLayer()
           let( ( ToMetal )
                ToMetal = leGetEntryLayer()
                leReplace(geGetEditCellView(getCurrentWindow()) geGetSelSet() list(list("layer" nil list(car(ToMetal) cadr(ToMetal)))))
              );end let
         );end procedure
hiSetBindKey("Layout" "<Key>@" "ChangeLayer()" )


发表于 2020-1-10 10:00:19 | 显示全部楼层
希望楼主能用论坛的 代码 功能 发帖子呢。 这样看起来更舒服一点,也不会有变量名被替换成论坛的表情符号
 楼主| 发表于 2020-1-10 10:12:00 | 显示全部楼层


IvenC 发表于 2020-1-10 10:00
希望楼主能用论坛的 代码 功能 发帖子呢。 这样看起来更舒服一点,也不会有变量名被替换成论坛的表情符号 ...


可以请教一下怎么用代码功能发吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-5 13:00 , Processed in 0.032220 second(s), 8 queries , Gzip On, Redis On.

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