;_PinArray(
PadN (焊盘)
Col (列数)
Row (行数)
PitchX (x方向间距)
PitchY (y方向间距)
Pos1 (第一脚的位置)
bRight () bUp () bRowFirst () 这个三个是控制pin放置的方向的,
//这里有个隐含的基础 在skill里面,nil是表示假,t表示真.
bPin1
bPinNum (这个决定了 是不是机械焊盘)
Pin1Offset
PinAngle
PinTAngle
delta
Prefix)
_PinArray(PadN CKTS 2 -Pitch -Pitch 0:0 nil nil nil )
_PinArray(PadNs 2 1 W 0 -W/2:0 t t t t t 0 0 0 1 "S")
_PinArray(PadN 2 1 2.0 0 -2/2:2.71 t t t t t 1)
_PinArray(PadN 2 1 7 0 -3.5:2.71 t t t t t 0 0 0 3)
//pin array 函数
defun(_PinArray
(PadN Col Row PitchX PitchY
\@optional
(Pos1
(0:0)
)
(bRight t)
(bUp t)
(bRowFirst t)
(bPin1 t)
(bPinNum t)
(Pin1Offset 0)
(PinAngle 0)
(PinTAngle 0)
(delta 1)
(Prefix nil)
)
(pTotal = (Col * Row))
for(pRow 1 Row
for(pCol 1 Col
if(bRight
(x = (car(Pos1) + ((pCol - 1) * PitchX)))
(x = (car(Pos1) - ((pCol - 1) * PitchX)))
)
if(bUp
(y = (cadr(Pos1) + ((pRow - 1) * PitchY)))
(y = (cadr(Pos1) - ((pRow - 1) * PitchY)))
)
if(bRowFirst
(pnum = (((pRow - 1) * Col) + pCol))
(pnum = (((pCol - 1) * Row) + pRow))
)
sprintf(pn "%d"
(Pin1Offset + ((pnum - 1) * delta) + 1)
)
if(Prefix
(pn = strcat(Prefix pn))
)
if(bPinNum
if(!((pnum == 1) && !bPin1)
(_CreatePin PadN
(x:y) pn PinAngle
PinTAngle
)
)
(_CreatePinMechanical PadN
(x:y) PinAngle
)
)
)
)
)
;FPM skill by Richard L. version=0.08 fpmontreal@gmail.com
;Tree:Connector/Header
;Desc:XHB250-2*N louis author
;Vendor:
;Count:
;CVG64:bitmap field, not implemented yet.
;Datasheet:
Tabs='(
(2 2.5)
(3 5)
(4 7.5)
(5 10)
(6 12.5)
(7 15)
(8 17.5)
(9 20)
(10 22.5)
(11 25)
(12 27.5)
(13 30)
(14 32.5)
(15 35)
(16 37.5)
(1740)
(1842.5)
(1945)
(2047.5)
)
;courtyard 庭院,我测试了一下应该是器件周围的距离
Courtyard=1.0 pH=4 Pitch=2.5
Width=10;先定义为器件的宽度
foreach(aTb Tabs
CKTS =nth(0 aTb)
A =nth(1 aTb) ;这个参数是获取 Tabs表格中的第二列的数据
sprintf(pName,"XHB250-2X%02d",CKTS)
_PrepareNewSym(pName)
;这个插针是0.6x0.6的,斜角宽度就要到 0.86左右. 现在开孔给的1mm,常规焊盘1.5mm
PadN=_PadTH_Default(1.5 1.0)
;_PinArray(PadN Col Row PitchX/Y (P1=0:0) bRight bUp bRowFirst bPin1 bPinNum P1Offset=0 PAngle=0 TAngle=0)
;
;_PinArray(PadN CKTS 2 Pitch Pitch -(CKTS-1)*Pitch/2:0 0 0 0 )
_PinArray(PadN CKTS 2 Pitch Pitch -(CKTS-1)*Pitch/2:-Pitch/2 t t nil )
;bound
_Layer(lPkgGeoPlaceT)
;shape里面的第二个参数 上下宽度
_BoundHeight(_ShapeRectangle(A+2*Pitch+Courtyard Courtyard+Width) pH)
;silkscreen & assembly
for(i 1 2
case(i
(1 _Layer(lPkgGeoSilkT))
(2 _Layer(lPkgGeoAsmT)))
;这个应该是画第一脚的 三角形的.
_Triangle(-(CKTS-1)*Pitch/2:-Width/2 2 90)
;这里面的第二个参数是矩形的上下宽度
_Rectangle(A+2*Pitch Width);矩阵的中心位置怎么调整?
_Line(list(-(CKTS-2)*Pitch/2:Width/2-0.5 (CKTS-2)*Pitch/2:Width/2-0.5) 1.5);这个第三个参数可以设置 线的粗细.
)
;ref & val
_CreateRefValue(pName 0:-Width/2-tSilkHeight/2)
;_CrossCenter()
axlSetSymbolType("package");哈哈哈,这里一定要注意.之前的cadence 16.6 用fpm 创建的器件封装不能保存.是因为 setup ->design parameter的 design
;drawing type 的类型需要修改成为 package. 用了这个函数接口,就直接讲类型修改了. 后面就可以直接保存使用了.
_SaveDesign(pName)
_MakeDevice(pName 2) ;0-IC 1-IO 2-DISCRETE
);foreach