找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 113801|回复: 91

[原创] 解决放置BGA去耦电容的烦恼

 火 [复制链接]
发表于 2014-2-25 23:08:04 | 显示全部楼层 |阅读模式
本帖最后由 chuankay 于 2014-3-8 01:05 编辑

上星期向管理员承诺周日发原创帖的,这几天有点忙,一直没来得及整理,今晚弄好了贴出来给大家吐吐槽。
keen_placing.rar (3.41 KB, 下载次数: 439)
功能简述:Allegro放置BGA背后大量的去耦电容时,会不时的移动画布点器件snap放置,严重重复劳动;用删除器件重新放置的方法并不是最方便的。因此借鉴AD的一个布局功能,折腾了这个脚本,特点是不移动画面的情况下可以依次放置框选的器件。

2014-2-25 22-46-34.jpg
使用方法:load("keen_placing.il","allegro-skill")加载il脚本,kp命令调用脚本(命令不区分大小写)。点击Select Area或按快捷键F12选择需要摆放的器件组;
点击place each或按快捷键F11依次放置器件并吸附至任意焊盘上。
附上源脚本:
  1. axlCmdRegister("sp",'snap_main   ?cmdType "interactive")

  2. defun( snap_main ()

  3.                 formPath = "./snap.form"
  4.                 pform = outfile( formPath "w")

  5.                 fprintf(pform "FILE_TYPE=FORM_DEFN VERSION=2\n")
  6.                 fprintf(pform "FORM\n")
  7.                 fprintf(pform "FIXED\n")               
  8.                 fprintf(pform "PORT 35 10\n")
  9.                 fprintf(pform "HEADER "Snap"\n")
  10.                 fprintf(pform "TILE\n")
  11.                
  12.                 fprintf(pform "FIELD sel\n")
  13.                 fprintf(pform "FLOC 2 1\n")
  14.                 fprintf(pform "MENUBUTTON "Select Area" 14 4\n")
  15.                 fprintf(pform "ENDFIELD\n")
  16.                
  17.                 fprintf(pform "FIELD pic\n")
  18.                 fprintf(pform "FLOC 18 1\n")
  19.                 fprintf(pform "MENUBUTTON "Place each" 14 4\n")
  20.                 fprintf(pform "ENDFIELD\n")
  21.                
  22.                 fprintf(pform "TEXT "Snap to Pin    \277\354\275\335\275\241:"\n")
  23.                 fprintf(pform "TLOC 2 5\n")
  24.                 fprintf(pform "ENDTEXT\n")
  25.                
  26.                 fprintf(pform "TEXT "Pick symbols  \277\354\275\335\275\241:"\n")
  27.                 fprintf(pform "TLOC 2 7\n")
  28.                 fprintf(pform "ENDTEXT\n")
  29.                
  30.                 fprintf(pform "TEXT "F11"\n")
  31.                 fprintf(pform "TLOC 22 5\n")
  32.                 fprintf(pform "OPTIONS BOLD\n")
  33.                 fprintf(pform "ENDTEXT\n")
  34.                
  35.                 fprintf(pform "TEXT "F12"\n")
  36.                 fprintf(pform "TLOC 22 7\n")
  37.                 fprintf(pform "OPTIONS BOLD\n")
  38.                 fprintf(pform "ENDTEXT\n")
  39.                
  40.                 fprintf(pform "ENDTILE\n")
  41.                 fprintf(pform "ENDFORM\n")       
  42.                 close(pform)
  43.                
  44.                 snp = axlFormCreate( (gensym) "snap.form" '(e inner) 'snpCB t nil)
  45.                 axlFormDisplay( snp )
  46.                 deleteFile(formPath)
  47.                
  48.                 axlSetFunckey("F11" "skill snap" t);吸附命令
  49.                        
  50.                 axlSetFunckey("F12" "skill place_each" t);放置命令
  51.                        
  52.                 if(car(axlDBGetDesignUnits()) == "mils"
  53.                         then
  54.                                 scale = 1
  55.                         else
  56.                                 scale = 40
  57.                 );if
  58.                
  59.                 formove = nil
  60. );defun
  61. defun(snpCB (snp)
  62.         func_list = axlGetFunckey(nil)
  63.         func_list = append( axlGetAlias(nil) func_list)
  64.         case(snp->curField
  65.                 ("sel" axlUIWPrint(snp "select box")  SelectSym());case 1
  66.                 ("pic" if(!formove
  67.                                         then
  68.                                                 axlUIWPrint(snp "Select symbols by box")
  69.                                         else
  70.                                                 if(I != 0   /* box = axlLastPick(nil) */ lastbox = axlWindowBoxGet())
  71.                                                 place_each()
  72.                                 );if
  73.                 );case 2
  74.         );case
  75.         when(snp->doneState == 3
  76.                 axlSetFunckey("F11"  "zoom in" t);吸附命令
  77.                 axlSetFunckey("F12"  "zoom out" t);放置命令
  78.         );when
  79.                
  80. );defun
  81. defun(SelectSym ()
  82.         I = 0;
  83.         axlClearSelSet()
  84.         axlSetFindFilter(?enabled list( "noall" "symbols" ) ?onButtons list( "noall" "symbols"))

  85.         ;axlSelect(?groupMode nil ?prompt nil)
  86.         axlAddSelectBox()
  87.         syms = axlGetSelSet()
  88.         formove = nil
  89.         foreach(db syms
  90.                 formove = append1(formove db->refdes)
  91.         );foreach
  92.         axlUIWPrint(snp sprintf(nil "%d symbols are ready for placing!" length(syms)))
  93. );defun


  94. defun(place_each ()
  95. prog(()
  96.         unless(formove return("select box first"))
  97.         if(I != 0 then /* box = axlLastPick(nil) */ lastbox = axlWindowBoxGet())
  98.         active = car(formove)
  99.         formove = cdr(formove)
  100.         if(active
  101.                 then
  102.                         axlShell("move")
  103.                         axlShell("setwindow form.mini")
  104.                         axlShell("FORM mini rotate_point Sym Pin # ")
  105.                         axlShell("setwindow form.find")
  106.                         axlShell("FORM find name_type Symbol (or Pin)")
  107.                         axlShell(sprintf(nil "FORM find find_name %s" active))
  108.                        
  109.                         when(I != 0       
  110.                                 axlWindowBoxSet(lastbox)       
  111.                         );when       
  112.        
  113.                         I++;
  114.                         axlUIWPrint(snp sprintf(nil "%d/%d symbols statue!" I ,length(syms)))
  115.         );if
  116. );prog
  117. );        defun

  118. defun(snap ()
  119.         cursor = axlCursorGet(nil)
  120.         axlShell(sprintf(nil "prepopup %L" cursor))
  121.         axlShell("pop dyn_option_select 'Snap pick to@:@Pin'")
  122.         ;axlShell("pop dyn_option_select 'Snap pick to@:@Segment Vertex'")
  123. );defun
复制代码

评分

参与人数 1威望 +2 SKILL币 +4 贡献 +5 收起 理由
vivienluo + 2 + 4 + 5 赞一个!

查看全部评分

发表于 2014-4-15 14:11:04 | 显示全部楼层
這侽孓譙悴丶 发表于 2014-4-15 12:37
我是用15.5.1加载的,这个是什么功能的,楼主说的什么移动画布点器件snap放置 没能懂什么意思···

不用移动画面,可以自动将去耦电容调过来。比方说在大的BGA背面摆放较多的去耦电容时,通常情况是在BGA背面摆放一颗电容后需要移开BGA画面再去找下一颗电容,然后再回到BGA画面来摆放,依次反复。这个skill可以让你一直在BGA的画面自动帮你把电容一颗颗调过来。
发表于 2014-2-26 11:49:09 | 显示全部楼层
这么好原创!强烈支持,楼主强悍!
谢谢分享!
发表于 2014-2-26 12:47:35 | 显示全部楼层
多谢分,功能不错。
发表于 2014-2-26 17:24:55 | 显示全部楼层
下载了,支持
发表于 2014-2-26 17:43:10 | 显示全部楼层
加载是正确的,输入命令却错了nil
发表于 2014-2-26 17:45:14 | 显示全部楼层
正确了,双显,输入命令后弹到另一个显示器了,怪不得没找到
发表于 2014-2-26 17:51:52 | 显示全部楼层
AD里面这个功能确实挺好用的。奈何不少公司不接受AD。
发表于 2014-2-26 23:11:56 | 显示全部楼层
謝謝分享喔
发表于 2014-3-1 23:34:07 | 显示全部楼层
AD里面这个功能确实挺好用的。奈何不少公司不接受AD
一直最卡
发表于 2014-3-4 15:58:33 | 显示全部楼层
感谢分享。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|手机版|网站地图|Cadence Skill 论坛 ( 蜀ICP备2026063727号 )

GMT+8, 2026-10-24 08:24 , Processed in 0.054608 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表