解释如下函数代码:
def metalLink(tkcell,device,linkW=2,linkS=1,location=3,offset=['center',0],tkW=None,padW=None,padL=None,pitch=None,pad1offset=None,**pinset):
'''把device放到tkcell中,并根据设置连线'''
'''PADcell必须用pad画的, 否则需设置padW等参数'''
'''location指device放到哪个PAD的右边, offset有3个值,center, up,down, 指放到pad哪个位置,默认为center,放到pad中间,up指放pad上面,大小写不敏感'''
'''offset为列表, 当设置为center时, value一定是0, 当设置为非center时, eg offset=['up',10]指放到pad上面,离pad 10um'''
'''如果把pin定义成字典, 必须提前定义, 参数前面加**来引用, 或者直接写成,G=11,D=12,S=11...'''
'''写成字典形式: pinset={'G':12,'D':12,'S':11},引用 metalLink2(....,**pinset)'''
pass
metalCD=3 #转向PAD时的metal CD, device在pad上或下的时候会用到
metalCD2=4 #接触pad的metal CD
metalS=3 #当metal会穿过PAD时,自动隔离的距离
pad_cell=gdspy.current_library.cell_dict.get(tkcell,tkcell)
tkW=pad_cell.tkW if tkW==None else tkW
padW=pad_cell.padW if padW==None else padW
padL=pad_cell.padL if padL==None else padL
pitch=pad_cell.pitch if pitch==None else pitch
pad1offset=pad_cell.pad1offset if pad1offset==None else pad1offset
metal2edge=(tkW-padW)/2-linkS-linkW #metal到edge的距离
d_cell=gdspy.current_library.cell_dict.get(device,device)
''' put in device '''
offset0=offset[0]
if offset0.lower()=='center':
d_cell.align(None,cc,pad_cell,cl,(location-1)*pitch+pad1offset+padL+(pitch-padL)/2,0)
elif offset0.lower()=='up':
bbox1=pad_cell.get_bounding_box()
x1=bbox1[0][0]
y1=bbox1[0][1]
x_cc=(location-1)*pitch+pad1offset+padL+(pitch-padL)/2-d_cell.xCoord(None,cc)+x1
y_cc=tkW+offset[1]+d_cell.Width/2-d_cell.yCoord(None,cc)+y1
d_cell.insert(pad_cell,origin=(x_cc,y_cc))
# d_cell.align(None,cc,pad_cell,cl,(location-1)*pitch+pad1offset+padL+(pitch-padL)/2,tkW/2+d_cell.Width/2+offset[offset0])
elif offset0.lower()=='down':
bbox1=pad_cell.get_bounding_box()
x1=bbox1[0][0]
y1=bbox1[0][1]
x_cc=(location-1)*pitch+pad1offset+padL+(pitch-padL)/2-d_cell.xCoord(None,cc)+x1
y_cc=-(d_cell.Width/2+d_cell.yCoord(None,cc))-offset[1]+y1
d_cell.insert(pad_cell,origin=(x_cc,y_cc))
# d_cell.align(None,cc,pad_cell,cl,(location-1)*pitch+pad1offset+padL+(pitch-padL)/2,-(tkW/2+d_cell.Width/2+offset[offset0]))
'''center 连线,(CD,layer,dir,loaction)'''
pin_dict=d_cell.pin
x1=d_cell.originX(pad_cell,'ll')
y1=d_cell.originY(pad_cell,'ll')
if offset0.lower()=='center':
for pin1 in pin_dict:
p_start=(pin_dict[pin1][3][0]+x1,pin_dict[pin1][3][1]+y1)
Layer1=pin_dict[pin1][1]
if pin_dict[pin1][2]=='+x': #右引线
path1=gdspy.Path(pin_dict[pin1][0],p_start)
length1=location*pitch+pad1offset-p_start[0]+2
if length1>0:
Layer1=pin_dict[pin1][1]
path1.segment(length1,'+x',layer=gdsNo(Layer1),datatype=dtype(Layer1))
pad_cell.add(path1)
if pin_dict[pin1][2]=='-x': #左引线
path1=gdspy.Path(pin_dict[pin1][0],p_start)
length1=p_start[0]-((location-1)*pitch+pad1offset+padL)+2
if length1>0:
Layer1=pin_dict[pin1][1]
path1.segment(length1,'-x',layer=gdsNo(Layer1),datatype=dtype(Layer1))
pad_cell.add(path1)
if pin_dict[pin1][2]=='+y': #上引线
Length1=tkW+pad_cell.yCoord(None,lc)-metal2edge-linkW/2-p_start[1]
length3=(tkW-padW)/2-metal2edge-linkW/2+2
if pin1 in pinset:
if pinset[pin1]>location: #device在PAD左边
Length2=(pinset[pin1]-1)*pitch+pad1offset+padL/2-p_start[0]
turn1=-linkW/pin_dict[pin1][0]
turn2=-metalCD2/pin_dict[pin1][0]
else: #device在PAD右边
Length2=p_start[0]-((pinset[pin1]-1)*pitch+pad1offset+padL/2)
turn1=linkW/pin_dict[pin1][0]
turn2=metalCD2/pin_dict[pin1][0]
length=[Length1,Length2,length3]
turn=[turn1,turn2]
path1=gdspy.L1Path(p_start,'+y',pin_dict[pin1][0],length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
pad_cell.add(path1)
if pin_dict[pin1][2]=='-y': #下引线
Length1=p_start[1]-(metal2edge+linkW/2)-pad_cell.yCoord(None,lc)
length3=(tkW-padW)/2-metal2edge-linkW/2+2
if pin1 in pinset:
if pinset[pin1]>location: #device在PAD左边
Length2=(pinset[pin1]-1)*pitch+pad1offset+padL/2-p_start[0]
turn1=linkW/pin_dict[pin1][0]
turn2=metalCD2/pin_dict[pin1][0]
else: #device在PAD右边
Length2=p_start[0]-((pinset[pin1]-1)*pitch+pad1offset+padL/2)
turn1=-linkW/pin_dict[pin1][0]
turn2=-metalCD2/pin_dict[pin1][0]
length=[Length1,Length2,length3]
turn=[turn1,turn2]
path1=gdspy.L1Path(p_start,'-y',pin_dict[pin1][0],length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
pad_cell.add(path1)
return pad_cell
'''device放到pad上面'''
if offset0.lower()=='up':
for pin1 in pin_dict:
p_start=(pin_dict[pin1][3][0]+x1,pin_dict[pin1][3][1]+y1)
Layer1=pin_dict[pin1][1]
if pin_dict[pin1][2]=='+x': #右引线
if pin1 in pinset:
pad_num=pinset[pin1] #读取pin对应的PADnumber
length1=(pad_num-1)*pitch+pad1offset-p_start[0]+2 #右边pin脚到PAD edge的距离
length2=p_start[1]-tkW+(tkW-padW)/2+2 #上面到PAD edge的距离
if length1>0: #pin脚在pad左边
length=[length1+metalCD/2,length2]
turn=[-metalCD/pin_dict[pin1][0]]
path1=gdspy.L1Path(p_start,'+x',pin_dict[pin1][0],length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
elif abs(length1)<=padL-metalCD: #pin脚正好落在PAD上方
p_start=(p_start[0]+metalCD/2,p_start[1]+pin_dict[pin1][0]/2)
path1=gdspy.Path(metalCD,p_start)
path1.segment(length2+pin_dict[pin1][0]/2,'-y',layer=gdsNo(Layer1),datatype=dtype(Layer1))
elif abs(length1)>padL-metalCD and abs(length1)<=pitch-metalCD-metalS:
p_start=(p_start[0]+metalCD/2,p_start[1]+pin_dict[pin1][0]/2)
length3=p_start[0]-((pad_num-1)*pitch+pad1offset+padL)
length=[length2+pin_dict[pin1][0]/2+metalCD2/2,length3]
turn=[-metalCD2/metalCD]
path1=gdspy.L1Path(p_start,'-y',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
else:
p_start=(p_start[0]+metalCD/2,p_start[1]+pin_dict[pin1][0]/2)
length3=p_start[0]-((pad_num-1)*pitch+pad1offset+padL)+metalCD/2
length4=metalS+metalCD/2
length=[length2+pin_dict[pin1][0]/2-metalS-metalCD/2,length3,length4]
turn=[-1,1]
path1=gdspy.L1Path(p_start,'-y',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
pad_cell.add(path1)
if pin_dict[pin1][2]=='-x': #左引线
if pin1 in pinset:
pad_num=pinset[pin1]
length1=p_start[0]-((pad_num-1)*pitch+pad1offset+padL)+2 #左边pin脚到PAD edge的距离
length2=p_start[1]-tkW+(tkW-padW)/2+2 #上面到PAD edge的距离
if length1>0: #pin脚在pad左边
length=[length1+metalCD/2,length2]
turn=[metalCD/pin_dict[pin1][0]]
path1=gdspy.L1Path(p_start,'-x',pin_dict[pin1][0],length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
elif abs(length1)<=padL-metalCD: #pin脚正好落在PAD上方
p_start=(p_start[0]-metalCD/2,p_start[1]+pin_dict[pin1][0]/2)
path1=gdspy.Path(metalCD,p_start)
path1.segment(length2+pin_dict[pin1][0]/2,'-y',layer=gdsNo(Layer1),datatype=dtype(Layer1))
elif abs(length1)>padL-metalCD and abs(length1)<=pitch-metalCD-metalS:
p_start=(p_start[0]-metalCD/2,p_start[1]+pin_dict[pin1][0]/2)
length3=((pad_num-1)*pitch+pad1offset)-p_start[0]
length=[length2+pin_dict[pin1][0]/2+metalCD2/2,length3]
turn=[metalCD2/metalCD]
path1=gdspy.L1Path(p_start,'-y',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
else:
p_start=(p_start[0]-metalCD/2,p_start[1]+pin_dict[pin1][0]/2)
length3=((pad_num-1)*pitch+pad1offset)-p_start[0]+metalCD/2
length4=metalS+metalCD/2
length=[length2+pin_dict[pin1][0]/2-metalS-metalCD/2,length3,length4]
turn=[1,-1]
path1=gdspy.L1Path(p_start,'-y',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
pad_cell.add(path1)
if pin_dict[pin1][2]=='-y': #下引线
Length1=p_start[1]-(metal2edge+linkW/2)
length3=(tkW-padW)/2-metal2edge-linkW/2+2
if pin1 in pinset:
if pinset[pin1]>location: #device在PAD左边
Length2=(pinset[pin1]-1)*pitch+pad1offset+padL/2-p_start[0]
turn1=linkW/pin_dict[pin1][0]
turn2=metalCD2/pin_dict[pin1][0]
else: #device在PAD右边
Length2=p_start[0]-((pinset[pin1]-1)*pitch+pad1offset+padL/2)
turn1=-linkW/pin_dict[pin1][0]
turn2=-metalCD2/pin_dict[pin1][0]
length=[Length1,Length2,length3]
turn=[turn1,turn2]
path1=gdspy.L1Path(p_start,'-y',pin_dict[pin1][0],length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
pad_cell.add(path1)
if pin_dict[pin1][2]=='+y': #上引线
if pin1 in pinset:
pad_num=pinset[pin1]
if pad_num>location:
p_start=(p_start[0]-pin_dict[pin1][0]/2,p_start[1]+metalCD/2)
if (pad_num-1)*pitch+pad1offset>=d_cell.xCoord(pad_cell,cr): #如果PAD在device右边
length1=(pad_num-1)*pitch+pad1offset-p_start[0]+metalCD/2 #pin脚到PAD edge的距离
length2=p_start[1]-tkW+(tkW-padW)/2 #上面到PAD edge的距离
length=[length1,length2]
turn=[-1]
path1=gdspy.L1Path(p_start,'+x',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
elif (pad_num-1)*pitch+pad1offset<d_cell.xCoord(pad_cell,cr) and (pad_num-1)*pitch+pad1offset+padL>=d_cell.xCoord(pad_cell,cr): #PAD在device下面,但没跨过PAD
length1=d_cell.xCoord(pad_cell,cr)-p_start[0]+metalCD+metalS+metalCD/2 #metal延伸到device右边, 并keep metalS
length2=p_start[1]-tkW+(tkW-padW)/2 #上面到PAD的距离
length=[length1,length2]
turn=[-1]
path1=gdspy.L1Path(p_start,'+x',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
elif (pad_num-1)*pitch+pad1offset<d_cell.xCoord(pad_cell,cr) and (pad_num-1)*pitch+pad1offset+pitch-metalS>d_cell.xCoord(pad_cell,cr): #PAD在device下面,但没跨过PAD
length1=d_cell.xCoord(pad_cell,cr)-p_start[0]+metalCD+metalS+metalCD/2 #metal延伸到device右边, 并keep metalS
length2=p_start[1]-tkW+(tkW-padW)/2+metalCD/2 #上面到PAD的距离
length3=d_cell.xCoord(pad_cell,cr)+metalCD+metalS+metalCD/2-((pad_num-1)*pitch+pad1offset+padL) #转弯与pad相连
length=[length1,length2,length3]
turn=[-1,-1]
path1=gdspy.L1Path(p_start,'+x',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
else:
length1=d_cell.xCoord(pad_cell,cr)-p_start[0]+metalCD+metalS+metalCD/2 #metal延伸到device右边, 并keep metalS
length2=p_start[1]-tkW+(tkW-padW)/2-metalS-metalCD/2 #上面到PAD的距离
length3=d_cell.xCoord(pad_cell,cr)+metalCD+metalS+metalCD/2-((pad_num-1)*pitch+pad1offset+padL)+metalCD/2 #转弯与pad相连
length4=metalS+metalCD/2
length=[length1,length2,length3,length4]
turn=[-1,-1,1]
path1=gdspy.L1Path(p_start,'+x',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
if pad_num<location:
p_start=(p_start[0]+pin_dict[pin1][0]/2,p_start[1]+metalCD/2)
if (pad_num-1)*pitch+pad1offset+padL<=d_cell.xCoord(pad_cell,cl): #如果PAD在device左边
length1=p_start[0]-((pad_num-1)*pitch+pad1offset+padL)+metalCD/2 #左边pin脚到PAD edge的距离
length2=p_start[1]-tkW+(tkW-padW)/2 #上面到PAD edge的距离
length=[length1,length2]
turn=[1]
path1=gdspy.L1Path(p_start,'-x',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
elif (pad_num-1)*pitch+pad1offset+padL>d_cell.xCoord(pad_cell,cl) and (pad_num-1)*pitch+pad1offset<=d_cell.xCoord(pad_cell,cl): #PAD在device下面,但没跨过PAD
length1=p_start[0]-d_cell.xCoord(pad_cell,cl)+metalCD+metalS+metalCD/2 #左边pin脚到PAD edge的距离
length2=p_start[1]-tkW+(tkW-padW)/2 #上面到PAD的距离
length=[length1,length2]
turn=[1]
path1=gdspy.L1Path(p_start,'-x',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
elif (pad_num-1)*pitch+pad1offset>d_cell.xCoord(pad_cell,cl) and (pad_num-1)*pitch+pad1offset-(pitch-padL)+metalS<=d_cell.xCoord(pad_cell,cl): #PAD在device下面,但没跨过PAD
length1=p_start[0]-d_cell.xCoord(pad_cell,cl)+metalCD+metalS+metalCD/2 #左边pin脚到PAD edge的距离
length2=p_start[1]-tkW+(tkW-padW)/2+metalCD/2 #上面到PAD的距离
length3=(pad_num-1)*pitch+pad1offset-d_cell.xCoord(pad_cell,cl)+metalCD+metalS+metalCD/2 #转弯与pad相连
length=[length1,length2,length3]
turn=[1,1]
path1=gdspy.L1Path(p_start,'-x',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
else:
length1=p_start[0]-d_cell.xCoord(pad_cell,cl)+metalCD+metalS+metalCD/2 #左边pin脚到PAD edge的距离
length2=p_start[1]-tkW+(tkW-padW)/2-metalS-metalCD/2 #上面到PAD的距离
length3=(pad_num-1)*pitch+pad1offset-d_cell.xCoord(pad_cell,cl)+metalCD+metalS+metalCD/2+metalCD/2 #转弯与pad相连
length4=metalS+metalCD/2
length=[length1,length2,length3,length4]
turn=[1,1,-1]
path1=gdspy.L1Path(p_start,'-x',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
pad_cell.add(path1)
return pad_cell
'''device放到pad下面'''
if offset0.lower()=='down':
for pin1 in pin_dict:
p_start=(pin_dict[pin1][3][0]+x1,pin_dict[pin1][3][1]+y1)
Layer1=pin_dict[pin1][1]
if pin_dict[pin1][2]=='+x': #右引线
if pin1 in pinset:
pad_num=pinset[pin1]
length1=(pad_num-1)*pitch+pad1offset-p_start[0] #右边pin脚到PAD edge的距离
length2=abs(p_start[1])+(tkW-padW)/2 #上面到PAD edge的距离
if length1>0: #pin脚在pad左边
length=[length1+metalCD/2,length2]
turn=[metalCD/pin_dict[pin1][0]]
path1=gdspy.L1Path(p_start,'+x',pin_dict[pin1][0],length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
elif abs(length1)<=padL-metalCD:
p_start=(p_start[0]+metalCD/2,p_start[1]-pin_dict[pin1][0]/2)
path1=gdspy.Path(metalCD,p_start)
path1.segment(length2+pin_dict[pin1][0]/2,'+y',layer=gdsNo(Layer1),datatype=dtype(Layer1))
elif abs(length1)>padL-metalCD and abs(length1)<=pitch-metalCD-metalS:
p_start=(p_start[0]+metalCD/2,p_start[1]-pin_dict[pin1][0]/2)
length3=p_start[0]-((pad_num-1)*pitch+pad1offset+padL)
length=[length2+pin_dict[pin1][0]/2+metalCD2/2,length3]
turn=[metalCD2/metalCD]
path1=gdspy.L1Path(p_start,'+y',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
else:
p_start=(p_start[0]+metalCD/2,p_start[1]-pin_dict[pin1][0]/2)
length3=p_start[0]-((pad_num-1)*pitch+pad1offset+padL)+metalCD/2
length4=metalS+metalCD/2
length=[length2+pin_dict[pin1][0]/2-metalS-metalCD/2,length3,length4]
turn=[1,-1]
path1=gdspy.L1Path(p_start,'+y',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
pad_cell.add(path1)
if pin_dict[pin1][2]=='-x': #左引线
if pin1 in pinset:
pad_num=pinset[pin1]
length1=p_start[0]-((pad_num-1)*pitch+pad1offset+padL) #左边pin脚到PAD edge的距离
length2=abs(p_start[1])+(tkW-padW)/2 #上面到PAD edge的距离
if length1>0: #pin脚在pad左边
length=[length1+metalCD/2,length2]
turn=[-metalCD/pin_dict[pin1][0]]
path1=gdspy.L1Path(p_start,'-x',pin_dict[pin1][0],length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
elif abs(length1)<=padL-metalCD:
p_start=(p_start[0]-metalCD/2,p_start[1]-pin_dict[pin1][0]/2)
path1=gdspy.Path(metalCD,p_start)
path1.segment(length2+pin_dict[pin1][0]/2,'+y',layer=gdsNo(Layer1),datatype=dtype(Layer1))
elif abs(length1)>padL-metalCD and abs(length1)<=pitch-metalCD-metalS:
p_start=(p_start[0]-metalCD/2,p_start[1]-pin_dict[pin1][0]/2)
length3=((pad_num-1)*pitch+pad1offset)-p_start[0]
length=[length2+pin_dict[pin1][0]/2+metalCD2/2,length3]
turn=[-metalCD2/metalCD]
path1=gdspy.L1Path(p_start,'+y',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
else:
p_start=(p_start[0]-metalCD/2,p_start[1]-pin_dict[pin1][0]/2)
length3=((pad_num-1)*pitch+pad1offset)-p_start[0]+metalCD/2
length4=metalS+metalCD/2
length=[length2+pin_dict[pin1][0]/2-metalS-metalCD/2,length3,length4]
turn=[-1,1]
path1=gdspy.L1Path(p_start,'+y',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
pad_cell.add(path1)
if pin_dict[pin1][2]=='-y': #下引线
if pin1 in pinset:
pad_num=pinset[pin1]
if pad_num>location:
p_start=(p_start[0]-pin_dict[pin1][0]/2,p_start[1]-metalCD/2)
if (pad_num-1)*pitch+pad1offset>=d_cell.xCoord(pad_cell,cr): #如果PAD在device右边
length1=(pad_num-1)*pitch+pad1offset-p_start[0]+metalCD/2 #pin脚到PAD edge的距离
length2=d_cell.Width+metalCD/2+offset[1]+(tkW-padW)/2 #上面到PAD edge的距离
length=[length1,length2]
turn=[1]
path1=gdspy.L1Path(p_start,'+x',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
elif (pad_num-1)*pitch+pad1offset<d_cell.xCoord(pad_cell,cr) and (pad_num-1)*pitch+pad1offset+padL>=d_cell.xCoord(pad_cell,cr): #PAD在device下面,但没跨过PAD
length1=d_cell.xCoord(pad_cell,cr)-p_start[0]+metalCD+metalS+metalCD/2 #metal延伸到device右边, 并keep metalS
length2=d_cell.Width+metalCD/2+offset[1]+(tkW-padW)/2 #上面到PAD edge的距离
length=[length1,length2]
turn=[1]
path1=gdspy.L1Path(p_start,'+x',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
elif (pad_num-1)*pitch+pad1offset<d_cell.xCoord(pad_cell,cr) and (pad_num-1)*pitch+pad1offset+pitch-metalS>d_cell.xCoord(pad_cell,cr): #PAD在device下面,但没跨过PAD
length1=d_cell.xCoord(pad_cell,cr)-p_start[0]+metalCD+metalS+metalCD/2 #metal延伸到device右边, 并keep metalS
length2=d_cell.Width+metalCD/2+offset[1]+(tkW-padW)/2 +metalCD/2
length3=d_cell.xCoord(pad_cell,cr)+metalCD+metalS+metalCD/2-((pad_num-1)*pitch+pad1offset+padL) #转弯与pad相连
length=[length1,length2,length3]
turn=[1,1]
path1=gdspy.L1Path(p_start,'+x',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
else:
length1=d_cell.xCoord(pad_cell,cr)-p_start[0]+metalCD+metalS+metalCD/2 #metal延伸到device右边, 并keep metalS
length2=d_cell.Width+metalCD/2+offset[1]+(tkW-padW)/2-metalS-metalCD/2
length3=d_cell.xCoord(pad_cell,cr)+metalCD+metalS+metalCD/2-((pad_num-1)*pitch+pad1offset+padL)+metalCD/2 #转弯与pad相连
length4=metalS+metalCD/2
length=[length1,length2,length3,length4]
turn=[1,1,-1]
path1=gdspy.L1Path(p_start,'+x',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
if pad_num<location:
p_start=(p_start[0]+pin_dict[pin1][0]/2,p_start[1]-metalCD/2)
if (pad_num-1)*pitch+pad1offset+padL<=d_cell.xCoord(pad_cell,cl): #如果PAD在device左边
length1=p_start[0]-((pad_num-1)*pitch+pad1offset+padL)+metalCD/2 #左边pin脚到PAD edge的距离
length2=d_cell.Width+metalCD/2+offset[1]+(tkW-padW)/2
length=[length1,length2]
turn=[-1]
path1=gdspy.L1Path(p_start,'-x',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
elif (pad_num-1)*pitch+pad1offset+padL>d_cell.xCoord(pad_cell,cl) and (pad_num-1)*pitch+pad1offset<=d_cell.xCoord(pad_cell,cl): #PAD在device下面,但没跨过PAD
length1=p_start[0]-d_cell.xCoord(pad_cell,cl)+metalCD+metalS+metalCD/2 #左边pin脚到PAD edge的距离
length2=d_cell.Width+metalCD/2+offset[1]+(tkW-padW)/2 #上面到PAD edge的距离
length=[length1,length2]
turn=[-1]
path1=gdspy.L1Path(p_start,'-x',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
elif (pad_num-1)*pitch+pad1offset>d_cell.xCoord(pad_cell,cl) and (pad_num-1)*pitch+pad1offset-(pitch-padL)+metalS<=d_cell.xCoord(pad_cell,cl): #PAD在device下面,但没跨过PAD
length1=p_start[0]-d_cell.xCoord(pad_cell,cl)+metalCD+metalS+metalCD/2 #左边pin脚到PAD edge的距离
length2=d_cell.Width+metalCD/2+offset[1]+(tkW-padW)/2 +metalCD/2
length3=(pad_num-1)*pitch+pad1offset-d_cell.xCoord(pad_cell,cl)+metalCD+metalS+metalCD/2 #转弯与pad相连
length=[length1,length2,length3]
turn=[-1,-1]
path1=gdspy.L1Path(p_start,'-x',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
else:
length1=p_start[0]-d_cell.xCoord(pad_cell,cl)+metalCD+metalS+metalCD/2 #左边pin脚到PAD edge的距离
length2=d_cell.Width+metalCD/2+offset[1]+(tkW-padW)/2-metalS-metalCD/2
length3=(pad_num-1)*pitch+pad1offset-d_cell.xCoord(pad_cell,cl)+metalCD+metalS+metalCD/2+metalCD/2 #转弯与pad相连
length4=metalS+metalCD/2
length=[length1,length2,length3,length4]
turn=[-1,-1,1]
path1=gdspy.L1Path(p_start,'-x',metalCD,length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
pad_cell.add(path1)
if pin_dict[pin1][2]=='+y': #上引线
Length1=tkW-metal2edge-linkW/2-p_start[1]
length3=(tkW-padW)/2-metal2edge-linkW/2
if pin1 in pinset:
if pinset[pin1]>location: #device在PAD左边
Length2=(pinset[pin1]-1)*pitch+pad1offset+padL/2-p_start[0]
turn1=-linkW/pin_dict[pin1][0]
turn2=-metalCD2/pin_dict[pin1][0]
else: #device在PAD右边
Length2=p_start[0]-((pinset[pin1]-1)*pitch+pad1offset+padL/2)
turn1=linkW/pin_dict[pin1][0]
turn2=metalCD2/pin_dict[pin1][0]
length=[Length1,Length2,length3]
turn=[turn1,turn2]
path1=gdspy.L1Path(p_start,'+y',pin_dict[pin1][0],length,turn,layer=gdsNo(Layer1),datatype=dtype(Layer1))
pad_cell.add(path1)
return pad_cell
最新发布