以下代码生成了左下方留有slot的pad,如何在外部调用,实现每排画25个pad,左下放slot中填对应序号数字:
'''28nm PAD for TQV2, 1P11M, 非slot型, 中间菱方填充, 覆盖metal dummy mark layer, 左下角挖空放Num'''
'''2025.11.5 update, by CHC'''
def PAD_28_Num_NM2(tech='28NM',cellname='PAD_28',intermetal=8,TM1=True,TM2=True,MTT1=False,MTT2=False,tkW=66.66,tkL=2777.75,padL=55.55,padW=55.55,padnum=25,pitch=111.11,slot=True):
padL=55.55
padW=55.55
pad1offset=(tkL-(padnum-1)*pitch-padL)/2
viasx = 0.15
viasy = 0.15
vialineencX = 0.05
vialineencY = 0.125
CutLength = 8.444
CutWidth = 5.767
T_viasx = 1.39
T_viasy = 1.39
T_vialineencX = 0.47
T_vialineencY = 0.07
slotL=1.25
slotW=1.25
CBW=2
CBS=4
slotll_x=8.25
slotll_y=6.5
slotll_space=0.9
PAD0=cCell(cellname+'_PAD0') #画1个PAD
lib = {}
AL = cRect(None,'AP',55.55,55.55).insert(PAD0,origin=(0,0))
'''画M1-M7,MX'''
for i in range(1,8):
lib[i] = cRect(cellname+'M'+str(i),'M'+str(i),padL,padW).insert(PAD0,origin=(0,0))
slotll=cRect(cellname+'slotM'+str(i),'M'+str(i),8.25,6.5).insert(lib[i],origin=(0.9,0.9))
lib[i].chop(None,slotll,'M'+str(i)).remove_cells(slotll)
'''挖slot,27*27,size:slotL=1.25*slotW=1.25'''
slot=cRect(cellname+'slotM'+str(i),'M'+str(i),slotL,slotW)
slotarray1=slot.array(cellname+'slotarray1',12,3,0.5,0.5).insert(lib[i],origin=(4.4,4.4))
lib[i].chop(None,slotarray1,'M'+str(i)).remove_cells(slotarray1)
slotarray2=slot.array(cellname+'slotarray2',9,3,0.5,0.5).insert(lib[i],origin=(4.4,9.65))
lib[i].chop(None,slotarray2,'M'+str(i)).remove_cells(slotarray2)
slotarray3=slot.array(cellname+'slotarray3',6,3,0.5,0.5).insert(lib[i],origin=(4.4,14.9))
lib[i].chop(None,slotarray3,'M'+str(i)).remove_cells(slotarray3)
slotarray4=slot.array(cellname+'slotarray4',3,9,0.5,0.5).insert(lib[i],origin=(4.4,20.15))
lib[i].chop(None,slotarray4,'M'+str(i)).remove_cells(slotarray4)
slotarray5=slot.array(cellname+'slotarray5',6,3,0.5,0.5).insert(lib[i],origin=(4.4,35.9))
lib[i].chop(None,slotarray5,'M'+str(i)).remove_cells(slotarray5)
slotarray6=slot.array(cellname+'slotarray6',9,3,0.5,0.5).insert(lib[i],origin=(4.4,41.15))
lib[i].chop(None,slotarray6,'M'+str(i)).remove_cells(slotarray6)
slotarray7=slot.array(cellname+'slotarray7',12,3,0.5,0.5).insert(lib[i],origin=(4.4,46.4))
lib[i].chop(None,slotarray7,'M'+str(i)).remove_cells(slotarray7)
slotarray8=slot.array(cellname+'slotarray8',12,3,0.5,0.5).insert(lib[i],origin=(30.65,4.4))
lib[i].chop(None,slotarray8,'M'+str(i)).remove_cells(slotarray8)
slotarray9=slot.array(cellname+'slotarray9',9,3,0.5,0.5).insert(lib[i],origin=(35.9,9.65))
lib[i].chop(None,slotarray9,'M'+str(i)).remove_cells(slotarray9)
slotarray10=slot.array(cellname+'slotarray10',6,3,0.5,0.5).insert(lib[i],origin=(41.15,14.9))
lib[i].chop(None,slotarray10,'M'+str(i)).remove_cells(slotarray10)
slotarray11=slot.array(cellname+'slotarray11',3,9,0.5,0.5).insert(lib[i],origin=(46.4,20.15))
lib[i].chop(None,slotarray11,'M'+str(i)).remove_cells(slotarray11)
slotarray12=slot.array(cellname+'slotarray12',6,3,0.5,0.5).insert(lib[i],origin=(41.15,35.9))
lib[i].chop(None,slotarray12,'M'+str(i)).remove_cells(slotarray12)
slotarray13=slot.array(cellname+'slotarray13',9,3,0.5,0.5).insert(lib[i],origin=(35.9,41.15))
lib[i].chop(None,slotarray13,'M'+str(i)).remove_cells(slotarray13)
slotarray14=slot.array(cellname+'slotarray14',12,3,0.5,0.5).insert(lib[i],origin=(30.65,46.4))
lib[i].chop(None,slotarray14,'M'+str(i)).remove_cells(slotarray14)
##up and down的小线条W=0.9横着铺
lib[i] = cRect(cellname+'M'+str(i),'M'+str(i),55.55,0.9).insert(PAD0,origin=(0,0))
lib[i] = cRect(cellname+'M'+str(i),'M'+str(i),55.55,0.9).insert(PAD0,origin=(0,54.65))
##内部的小线条W=0.5从下往上,底部三个扣左下角,
#Mental_UD=cRect(cellname+'Mental_UD'+str(i),'M'+str(i),55.55,0.5)
#Mental_UDarray=Mental_UD.array(cellname+'Mental_UDarray',1,30,1.25,1.25)#.insert(lib[i],origin=(0,2.15))
#Mental_UDarray.insert(PAD0,origin=(0,2.15))
lib[i] = cRect(cellname+'Mental_UD'+str(i),'M'+str(i),55.55-9.15,0.5).array(cellname+'Mental_UDarray',1,3,1.25,1.25).insert(PAD0,origin=(9.15,2.15))
lib[i] = cRect(cellname+'Mental_UD'+str(i),'M'+str(i),55.55,0.5).array(cellname+'Mental_UDarray',1,27,1.25,1.25).insert(PAD0,origin=(0,7.4))
##up and down的小线条W=0.9竖着铺
lib[i] = cRect(cellname+'M'+str(i),'M'+str(i),0.9,55.55).insert(PAD0,origin=(0,0))
lib[i] = cRect(cellname+'M'+str(i),'M'+str(i),0.9,55.55).insert(PAD0,origin=(54.65,0))
##内部的小线条W=0.5从左往右, 底部4个扣左下角,
#Mental_LR=cRect(cellname+'Mental_LR'+str(i),'M'+str(i),0.5,55.55)
#Mental_LRarray=Mental_LR.array(cellname+'Mental_LRarray',30,1,1.25,1.25)
#Mental_LRarray.insert(PAD0,origin=(2.15,0))
lib[i] = cRect(cellname+'Mental_LR'+str(i),'M'+str(i),0.5,55.55-7.4).array(cellname+'Mental_LRarray',4,1,1.25,1.25).insert(PAD0,origin=(2.15,7.4))
lib[i] = cRect(cellname+'Mental_LR'+str(i),'M'+str(i),0.5,55.55).array(cellname+'Mental_LRarray',26,1,1.25,1.25).insert(PAD0,origin=(9.15,0))
# '''画M8Z-M10Z'''
for i in range(8,11):
lib[i] = cRect(cellname+'M'+str(i)+'Z','M'+str(i)+'Z',padL,padW).insert(PAD0,origin=(0,0))
slotll=cRect(cellname+'slotM'+str(i)+'Z','M'+str(i)+'Z',8.25,6.5).insert(lib[i],origin=(0.9,0.9))
lib[i].chop(None,slotll,'M'+str(i)+'Z').remove_cells(slotll)
'''挖slot,27*27,size:slotL=1.25*slotW=1.25'''
slot=cRect(cellname+'slotM'+str(i),'M'+str(i)+'Z',slotL,slotW)
slotarray1=slot.array(cellname+'slotarray1',12,3,0.5,0.5).insert(lib[i],origin=(4.4,4.4))
lib[i].chop(None,slotarray1,'M'+str(i)+'Z').remove_cells(slotarray1)
slotarray2=slot.array(cellname+'slotarray2',9,3,0.5,0.5).insert(lib[i],origin=(4.4,9.65))
lib[i].chop(None,slotarray2,'M'+str(i)+'Z').remove_cells(slotarray2)
slotarray3=slot.array(cellname+'slotarray3',6,3,0.5,0.5).insert(lib[i],origin=(4.4,14.9))
lib[i].chop(None,slotarray3,'M'+str(i)+'Z').remove_cells(slotarray3)
slotarray4=slot.array(cellname+'slotarray4',3,9,0.5,0.5).insert(lib[i],origin=(4.4,20.15))
lib[i].chop(None,slotarray4,'M'+str(i)+'Z').remove_cells(slotarray4)
slotarray5=slot.array(cellname+'slotarray5',6,3,0.5,0.5).insert(lib[i],origin=(4.4,35.9))
lib[i].chop(None,slotarray5,'M'+str(i)+'Z').remove_cells(slotarray5)
slotarray6=slot.array(cellname+'slotarray6',9,3,0.5,0.5).insert(lib[i],origin=(4.4,41.15))
lib[i].chop(None,slotarray6,'M'+str(i)+'Z').remove_cells(slotarray6)
slotarray7=slot.array(cellname+'slotarray7',12,3,0.5,0.5).insert(lib[i],origin=(4.4,46.4))
lib[i].chop(None,slotarray7,'M'+str(i)+'Z').remove_cells(slotarray7)
slotarray8=slot.array(cellname+'slotarray8',12,3,0.5,0.5).insert(lib[i],origin=(30.65,4.4))
lib[i].chop(None,slotarray8,'M'+str(i)+'Z').remove_cells(slotarray8)
slotarray9=slot.array(cellname+'slotarray9',9,3,0.5,0.5).insert(lib[i],origin=(35.9,9.65))
lib[i].chop(None,slotarray9,'M'+str(i)+'Z').remove_cells(slotarray9)
slotarray10=slot.array(cellname+'slotarray10',6,3,0.5,0.5).insert(lib[i],origin=(41.15,14.9))
lib[i].chop(None,slotarray10,'M'+str(i)+'Z').remove_cells(slotarray10)
slotarray11=slot.array(cellname+'slotarray11',3,9,0.5,0.5).insert(lib[i],origin=(46.4,20.15))
lib[i].chop(None,slotarray11,'M'+str(i)+'Z').remove_cells(slotarray11)
slotarray12=slot.array(cellname+'slotarray12',6,3,0.5,0.5).insert(lib[i],origin=(41.15,35.9))
lib[i].chop(None,slotarray12,'M'+str(i)+'Z').remove_cells(slotarray12)
slotarray13=slot.array(cellname+'slotarray13',9,3,0.5,0.5).insert(lib[i],origin=(35.9,41.15))
lib[i].chop(None,slotarray13,'M'+str(i)+'Z').remove_cells(slotarray13)
slotarray14=slot.array(cellname+'slotarray14',12,3,0.5,0.5).insert(lib[i],origin=(30.65,46.4))
lib[i].chop(None,slotarray14,'M'+str(i)+'Z').remove_cells(slotarray14)
##up and down的小线条W=0.9横着铺
lib[i] = cRect(cellname+'M'+str(i)+'Z','M'+str(i)+'Z',55.55,0.9).insert(PAD0,origin=(0,0))
lib[i] = cRect(cellname+'M'+str(i)+'Z','M'+str(i)+'Z',55.55,0.9).insert(PAD0,origin=(0,54.65))
##内部的小线条W=0.5从下往上,底部三个扣左下角,
#Mental_UD=cRect(cellname+'Mental_UD'+str(i),'M'+str(i),55.55,0.5)
#Mental_UDarray=Mental_UD.array(cellname+'Mental_UDarray',1,30,1.25,1.25)#.insert(lib[i],origin=(0,2.15))
#Mental_UDarray.insert(PAD0,origin=(0,2.15))
lib[i] = cRect(cellname+'Mental_UD'+str(i),'M'+str(i)+'Z',55.55-9.15,0.5).array(cellname+'Mental_UDarray',1,3,1.25,1.25).insert(PAD0,origin=(9.15,2.15))
lib[i] = cRect(cellname+'Mental_UD'+str(i),'M'+str(i)+'Z',55.55,0.5).array(cellname+'Mental_UDarray',1,27,1.25,1.25).insert(PAD0,origin=(0,7.4))
##up and down的小线条W=0.9竖着铺
lib[i] = cRect(cellname+'M'+str(i)+'Z','M'+str(i)+'Z',0.9,55.55).insert(PAD0,origin=(0,0))
lib[i] = cRect(cellname+'M'+str(i)+'Z','M'+str(i)+'Z',0.9,55.55).insert(PAD0,origin=(54.65,0))
##内部的小线条W=0.5从左往右, 底部4个扣左下角,
#Mental_LR=cRect(cellname+'Mental_LR'+str(i),'M'+str(i),0.5,55.55)
#Mental_LRarray=Mental_LR.array(cellname+'Mental_LRarray',30,1,1.25,1.25)
#Mental_LRarray.insert(PAD0,origin=(2.15,0))
lib[i] = cRect(cellname+'Mental_LR'+str(i)+'Z','M'+str(i)+'Z',0.5,55.55-7.4).array(cellname+'Mental_LRarray',4,1,1.25,1.25).insert(PAD0,origin=(2.15,7.4))
lib[i] = cRect(cellname+'Mental_LR'+str(i)+'Z','M'+str(i)+'Z',0.5,55.55).array(cellname+'Mental_LRarray',26,1,1.25,1.25).insert(PAD0,origin=(9.15,0))
#
'''画M9U'''
for i in range(9,10):
lib[i] = cRect(cellname+'M'+str(i),'M'+str(i)+'U',padL,padW).insert(PAD0,origin=(0,0))
#中间的slot是3.15*3.15
slot=cRect(cellname+'slotM'+str(i),'M'+str(i)+'U',3.15,3.15)
slotarray=slot.array(cellname+'slotarray1',7,7,2.1,2.1).insert(lib[i],origin=(10.45,10.45))
lib[i].chop(None,slotarray,'M'+str(i)+'U')
lib[i].remove_cells(slotarray)
#四边的slot
slotDU=cRect(cellname+'slotM'+str(i),'M'+str(i)+'U',3.15,3.95)
slotDUarray=slotDU.array(cellname+'slotarray1',7,2,2.1,38.85).insert(lib[i],origin=(10.45,4.4))
lib[i].chop(None,slotDUarray,'M'+str(i)+'U')
lib[i].remove_cells(slotDUarray)
slotLR=cRect(cellname+'slotM'+str(i),'M'+str(i)+'U',3.95,3.15)
slotLRarray=slotLR.array(cellname+'slotarray1',2,7,38.85,2.1).insert(lib[i],origin=(4.4,10.45))
lib[i].chop(None,slotLRarray,'M'+str(i)+'U')
lib[i].remove_cells(slotLRarray)
#四个角的slot
slotJ=cRect(cellname+'slotM'+str(i),'M'+str(i)+'U',3.95,3.95)
slotJarray=slotJ.array(cellname+'slotarray1',2,2,38.85,38.85).insert(lib[i],origin=(4.4,4.4))
lib[i].chop(None,slotJarray,'M'+str(i)+'U')
lib[i].remove_cells(slotJarray)
#
# AAout=cRect(cellname+'_AAout','AA',CutLength,CutWidth).insert(lib[i],origin=(padL-CutLength-9.553,0.422))
# lib[i].chop(None,AAout,'M'+str(i)+'Z')
# lib[i].remove_cells(AAout)
# '''M7Z(TM2)接CB的地方填孔'''
# TM2Add=cRect(cellname+'M7Z_Add','M7Z',slotL,slotW)
# TM2Add_array=TM2Add.array(cellname+'M7Z_Add_array',4,4,12-slotL,12-slotW).insert(lib[intermetal],origin=(2.73+4,2.73+4))
#
# '''画V1-V6'''
for i in range(1,7):
via=cRect(cellname+'_V'+str(i),'V'+str(i),DR(tech).V1W,DR(tech).V1W) #V1W=0.05
#down 0.9 最低一排
FillVia9D=cRect(cellname+'FillVia9D','BORDER',55.55,0.9).insert(PAD0,origin=(0,0))
FillVia9D.fill(via,viasx,viasy,vialineencX,vialineencY,fixs=True,cross=False)
#middle 0.5 中间 array,分下3排slot和上27排
FillVia3=cRect(cellname+'FillVia3','BORDER',55.55-9.15,0.5).fill(via,viasx,viasy,vialineencX,vialineencY,fixs=True,cross=False)
FillVia27=cRect(cellname+'FillVia27','BORDER',55.55,0.5).fill(via,viasx,viasy,vialineencX,vialineencY,fixs=True,cross=False)
ViaArray3 = FillVia3.array(cellname+'ViaArray',1,3,1.25,1.25)
ViaArray3.insert(PAD0,origin=(9.15,2.15))
ViaArray27 = FillVia27.array(cellname+'ViaArray',1,27,1.25,1.25)
ViaArray27.insert(PAD0,origin=(0,7.4))
#up 0.9 最高一排
FillVia9U=cRect(cellname+'FillVia9U','BORDER',55.55,0.9).insert(PAD0,origin=(0,54.65))
FillVia9U.fill(via,viasx,viasy,vialineencX,vialineencY,fixs=True,cross=False)
#
#
## '''画V7Z-V9Z'''
for i in range(7,10):
T_via=cRect(cellname+'_V'+str(i),'V'+str(i)+'Z',DR(tech).TV1W,DR(tech).TV1W) #TV1W=0.36
FillVia9DZ=cRect(cellname+'FillVia9DZ','BORDER',55.55,0.9).insert(PAD0,origin=(0,0))
FillVia9DZ.fill(T_via,T_viasx,T_viasy,T_vialineencX,T_vialineencY,fixs=True,cross=False)
FillVia5Z3=cRect(cellname+'FillVia5Z3','BORDER',55.55-9.15+0.4,0.5).fill(T_via,T_viasx,T_viasy,T_vialineencX,T_vialineencY,fixs=True,cross=False)
FillVia5Z27=cRect(cellname+'FillVia5Z3','BORDER',55.55,0.5).fill(T_via,T_viasx,T_viasy,T_vialineencX,T_vialineencY,fixs=True,cross=False)
ViaZArray3 = FillVia5Z3.array(cellname+'ViaArrayZ',1,3,1.25,1.25)
ViaZArray3.insert(PAD0,origin=(9.15-0.4,2.15))
ViaZArray27 = FillVia5Z27.array(cellname+'ViaArrayZ',1,27,1.25,1.25)
ViaZArray27.insert(PAD0,origin=(0,7.4))
FillVia9UZ=cRect(cellname+'FillVia9UZ','BORDER',55.55,0.9).insert(PAD0,origin=(0,54.65))
FillVia9UZ.fill(T_via,T_viasx,T_viasy,T_vialineencX,T_vialineencY,fixs=True,cross=False)
# FillT_Via=cRect(cellname+'FillT_Via','BORDER',1.7,1.7).insert(lib[i],origin=(0.3,0.3))
# T_via=cRect(cellname+'_V'+str(i)+'Z','V'+str(i)+'Z',DR(tech).TV1W,DR(tech).TV1W)
# FillT_Via.fill(T_via,T_viasx,T_viasy,T_vialineencX,T_vialineencY,fixs=True,cross=False)
# T_ViaArray = FillT_Via.array(cellname+'T_ViaArray',2,2,padL-4-(0.3+1.7)*2,padW-4-(0.3+1.7)*2).align(PAD0,ll,FillT_Via,ll)
## '''画V8U'''
for i in range(8,9):
T_via=cRect(cellname+'_V'+str(i)+'U','V'+str(i)+'U',DR(tech).TV1W,DR(tech).TV1W)
# MID
T_viaArray = T_via.array(cellname+'T_via',32,8,1.39,4.89)
T_viaArray.insert(PAD0,origin=(0.47,9.22))
T_viaArray = T_via.array(cellname+'T_via',8,26,4.89,1.39)
T_viaArray.insert(PAD0,origin=(9.22,5.72))
# DOWN
T_viaArray = T_via.array(cellname+'T_via',27,1,1.39,0)
T_viaArray.insert(PAD0,origin=(9.22,2.22))
# LEFT
T_viaArray = T_via.array(cellname+'T_via',1,24,0,1.39)
T_viaArray.insert(PAD0,origin=(2.22,9.22))
# UP
T_viaArray = T_via.array(cellname+'T_via',32,1,1.39,0)
T_viaArray.insert(PAD0,origin=(0.47,52.97))
# RIGHT
T_viaArray = T_via.array(cellname+'T_via',1,26,0,1.39)
T_viaArray.insert(PAD0,origin=(52.97,5.72))
CB = cRect(None,'CB',CBW,CBW)
#上下CB孔
CB1array=CB.array(cellname+'CB1array',7,1,CBS,CBS)
CB1array.insert(PAD0,origin=(11.4,1.2))
CB2array=CB.array(cellname+'CB2array',8,1,CBS,CBS)
CB2array.insert(PAD0,origin=(5.775,52.35))
#左右CB孔
CB3array=CB.array(cellname+'CB1array',1,7,CBS,CBS)
CB3array.insert(PAD0,origin=(1.2,10.525))
CB4array=CB.array(cellname+'CB2array',1,8,CBS,CBS)
CB4array.insert(PAD0,origin=(52.35,5.775))
CB2 = cRect(None,'CB2',49.15,49.15).align(None,cc,PAD0,cc)
#画metal dummy mark layer 150_1-7/207/208/309
M1_MKR = cRect(None,'M1_tileNot',55.55,55.55).align(None,cc,PAD0,cc)
M2_MKR = cRect(None,'M2_tileNot',55.55,55.55).align(None,cc,PAD0,cc)
M3_MKR = cRect(None,'M3_tileNot',55.55,55.55).align(None,cc,PAD0,cc)
M4_MKR = cRect(None,'M4_tileNot',55.55,55.55).align(None,cc,PAD0,cc)
M5_MKR = cRect(None,'M5_tileNot',55.55,55.55).align(None,cc,PAD0,cc)
M6_MKR = cRect(None,'M6_tileNot',55.55,55.55).align(None,cc,PAD0,cc)
M7_MKR = cRect(None,'M7_tileNot',55.55,55.55).align(None,cc,PAD0,cc)
M7Z_MKR = cRect(None,'M7Z_tileNot',55.55,55.55).align(None,cc,PAD0,cc)
M8Z_MKR = cRect(None,'M8Z_tileNot',55.55,55.55).align(None,cc,PAD0,cc)
M9U_MKR = cRect(None,'M9U_tileNot',55.55,55.55).align(None,cc,PAD0,cc)
#左下角slot metal dummy mark layer 150_1-7/207/208
M1_MKR_slot = cRect(None,'M1_tileNot',8.25,6.5).align(None,ll,PAD0,ll,0.9,0.9)
M2_MKR_slot = cRect(None,'M2_tileNot',8.25,6.5).align(None,ll,PAD0,ll,0.9,0.9)
M3_MKR_slot = cRect(None,'M3_tileNot',8.25,6.5).align(None,ll,PAD0,ll,0.9,0.9)
M4_MKR_slot = cRect(None,'M4_tileNot',8.25,6.5).align(None,ll,PAD0,ll,0.9,0.9)
M5_MKR_slot = cRect(None,'M5_tileNot',8.25,6.5).align(None,ll,PAD0,ll,0.9,0.9)
M6_MKR_slot = cRect(None,'M6_tileNot',8.25,6.5).align(None,ll,PAD0,ll,0.9,0.9)
M7_MKR_slot = cRect(None,'M7_tileNot',8.25,6.5).align(None,ll,PAD0,ll,0.9,0.9)
M7Z_MKR_slot = cRect(None,'M7Z_tileNot',8.25,6.5).align(None,ll,PAD0,ll,0.9,0.9)
M8Z_MKR_slot = cRect(None,'M8Z_tileNot',8.25,6.5).align(None,ll,PAD0,ll,0.9,0.9)
# MKR_Num=cRect(cellname+'tileNot_MKR','tileNot_MKR',CutLength,CutWidth).insert(PAD0,origin=(padL-CutLength-7.553,2.422))
PAD0.remove_Layers('BORDER')
return PAD0
最新发布