解决放置BGA去耦电容的烦恼
本帖最后由 chuankay 于 2014-3-8 01:05 编辑上星期向管理员承诺周日发原创帖的,这几天有点忙,一直没来得及整理,今晚弄好了贴出来给大家吐吐槽。
功能简述:Allegro放置BGA背后大量的去耦电容时,会不时的移动画布点器件snap放置,严重重复劳动;用删除器件重新放置的方法并不是最方便的。因此借鉴AD的一个布局功能,折腾了这个脚本,特点是不移动画面的情况下可以依次放置框选的器件。
使用方法:load("keen_placing.il","allegro-skill")加载il脚本,kp命令调用脚本(命令不区分大小写)。点击Select Area或按快捷键F12选择需要摆放的器件组;
点击place each或按快捷键F11依次放置器件并吸附至任意焊盘上。
附上源脚本:axlCmdRegister("sp",'snap_main ?cmdType "interactive")
defun( snap_main ()
formPath = "./snap.form"
pform = outfile( formPath "w")
fprintf(pform "FILE_TYPE=FORM_DEFN VERSION=2\n")
fprintf(pform "FORM\n")
fprintf(pform "FIXED\n")
fprintf(pform "PORT 35 10\n")
fprintf(pform "HEADER \"Snap\"\n")
fprintf(pform "TILE\n")
fprintf(pform "FIELD sel\n")
fprintf(pform "FLOC 2 1\n")
fprintf(pform "MENUBUTTON \"Select Area\" 14 4\n")
fprintf(pform "ENDFIELD\n")
fprintf(pform "FIELD pic\n")
fprintf(pform "FLOC 18 1\n")
fprintf(pform "MENUBUTTON \"Place each\" 14 4\n")
fprintf(pform "ENDFIELD\n")
fprintf(pform "TEXT \"Snap to Pin \277\354\275\335\275\241:\"\n")
fprintf(pform "TLOC 2 5\n")
fprintf(pform "ENDTEXT\n")
fprintf(pform "TEXT \"Pick symbols\277\354\275\335\275\241:\"\n")
fprintf(pform "TLOC 2 7\n")
fprintf(pform "ENDTEXT\n")
fprintf(pform "TEXT \"F11\"\n")
fprintf(pform "TLOC 22 5\n")
fprintf(pform "OPTIONS BOLD\n")
fprintf(pform "ENDTEXT\n")
fprintf(pform "TEXT \"F12\"\n")
fprintf(pform "TLOC 22 7\n")
fprintf(pform "OPTIONS BOLD\n")
fprintf(pform "ENDTEXT\n")
fprintf(pform "ENDTILE\n")
fprintf(pform "ENDFORM\n")
close(pform)
snp = axlFormCreate( (gensym) "snap.form" '(e inner) 'snpCB t nil)
axlFormDisplay( snp )
deleteFile(formPath)
axlSetFunckey("F11" "skill snap" t);吸附命令
axlSetFunckey("F12" "skill place_each" t);放置命令
if(car(axlDBGetDesignUnits()) == "mils"
then
scale = 1
else
scale = 40
);if
formove = nil
);defun
defun(snpCB (snp)
func_list = axlGetFunckey(nil)
func_list = append( axlGetAlias(nil) func_list)
case(snp->curField
("sel" axlUIWPrint(snp "select box")SelectSym());case 1
("pic" if(!formove
then
axlUIWPrint(snp "Select symbols by box")
else
if(I != 0 /* box = axlLastPick(nil) */ lastbox = axlWindowBoxGet())
place_each()
);if
);case 2
);case
when(snp->doneState == 3
axlSetFunckey("F11""zoom in" t);吸附命令
axlSetFunckey("F12""zoom out" t);放置命令
);when
);defun
defun(SelectSym ()
I = 0;
axlClearSelSet()
axlSetFindFilter(?enabled list( "noall" "symbols" ) ?onButtons list( "noall" "symbols"))
;axlSelect(?groupMode nil ?prompt nil)
axlAddSelectBox()
syms = axlGetSelSet()
formove = nil
foreach(db syms
formove = append1(formove db->refdes)
);foreach
axlUIWPrint(snp sprintf(nil "%d symbols are ready for placing!" length(syms)))
);defun
defun(place_each ()
prog(()
unless(formove return("select box first"))
if(I != 0 then /* box = axlLastPick(nil) */ lastbox = axlWindowBoxGet())
active = car(formove)
formove = cdr(formove)
if(active
then
axlShell("move")
axlShell("setwindow form.mini")
axlShell("FORM mini rotate_point Sym Pin # ")
axlShell("setwindow form.find")
axlShell("FORM find name_type Symbol (or Pin)")
axlShell(sprintf(nil "FORM find find_name %s" active))
when(I != 0
axlWindowBoxSet(lastbox)
);when
I++;
axlUIWPrint(snp sprintf(nil "%d/%d symbols statue!" I ,length(syms)))
);if
);prog
); defun
defun(snap ()
cursor = axlCursorGet(nil)
axlShell(sprintf(nil "prepopup %L" cursor))
axlShell("pop dyn_option_select 'Snap pick to@:@Pin'")
;axlShell("pop dyn_option_select 'Snap pick to@:@Segment Vertex'")
);defun 這侽孓譙悴丶 发表于 2014-4-15 12:37 static/image/common/back.gif
我是用15.5.1加载的,这个是什么功能的,楼主说的什么移动画布点器件snap放置 没能懂什么意思···
不用移动画面,可以自动将去耦电容调过来。比方说在大的BGA背面摆放较多的去耦电容时,通常情况是在BGA背面摆放一颗电容后需要移开BGA画面再去找下一颗电容,然后再回到BGA画面来摆放,依次反复。这个skill可以让你一直在BGA的画面自动帮你把电容一颗颗调过来。 这么好原创!强烈支持,楼主强悍!
谢谢分享! 多谢分,功能不错。 下载了,支持 加载是正确的,输入命令却错了nil 正确了,双显,输入命令后弹到另一个显示器了,怪不得没找到:lol AD里面这个功能确实挺好用的。奈何不少公司不接受AD。 謝謝分享喔 AD里面这个功能确实挺好用的。奈何不少公司不接受AD
一直最卡 感谢分享。