恒裕 发表于 2023-8-3 14:55:16

自动POLY和METAL1打孔:(快捷键7)

自动POLY和METAL1打孔:(快捷键7)(需要根据不同工艺尺寸修改数据)
(缺点:不能在Convert to Mosaic下使用)



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));POLYG 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( "POLYG" "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( "POLYG" "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
<div>hiSetBindKey("Layout" "<Key>7" "create_gate()" )
</div>

populaa 发表于 2023-12-30 13:51:56

谢谢分享
页: [1]
查看完整版本: 自动POLY和METAL1打孔:(快捷键7)