Cadence Skill 论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 32895|回复: 33

[原创] 一种用于器件聚拢的功能

[复制链接]
发表于 2014-5-15 16:41:28 | 显示全部楼层 |阅读模式
在16.x版本的平台上,具体功能和用法见说明。由于不常布局,写完之后用的不多,里面有些地方不太完善,但不影响使用效果,我也没心思改了,谁有兴趣拿去改改,改好了贴上来分享。
  1. ;************************************************************************************
  2. ;Symbol Gather beta1.0
  3. ;
  4. ;功能概述:类似Protel交互布局时器件的聚拢。
  5. ;
  6. ;使用说明:        首先加载此il文件,在pcbenv文件目录下的allegro.ilinit最后一行添加
  7. ;                   load("symbol_gather.il")  ,axlCmdRegister("gs" 'gather_sym)中的"gs"       
  8. ;                为启动命令关键字,可以自定义此关键字。
  9. ;         
  10. ;功能明细        1. 通过在CIW窗口输入gs或者其他已经自定义的命令,启动功能窗体。
  11. ;                        2. 在打开Gather Symbols窗口后,应点击Start/End命令来激活交互功能(此按钮为避免内存浪费)
  12. ;                        3. 聚拢功能是以激活高亮器件的操作来执行的,如若需要聚拢必须(只允许)先高亮这些目标器件。
  13. ;                        6. 窗口中的Hilight按钮的意义是:通过点击按钮可以执行高亮操作。
  14. ;                        4. 可在Capture或Concept HDL原理图交互高亮器件,在功能窗口将显示这些目标器件位号。
  15. ;                        5. 若Active Symbols表中有位号显示,则表示可以执行Gather命令执行内聚。
  16. ;                        6. 点击Gather按钮,则将产生内聚示意图。
  17. ;                        7. 当布局结束必须点击Start/End来结束命令。
  18. ;
  19. ;
  20. ;作者:chen_ck
  21. ;
  22. ;升级历史


  23. axlCmdRegister("gs" , 'gather_sym)

  24. defun( gather_sym ()
  25.         let( (path p)
  26.                 Path = "./_gathersym.form"
  27.                 p = outfile( Path "w")
  28.                
  29.                 fprintf(p "FILE_TYPE=FORM_DEFN VERSION=2\n")
  30.                 fprintf(p "FORM\n")
  31.                 fprintf(p "FIXED\n")
  32.                 fprintf(p "PORT 30 11\n")
  33.                 fprintf(p "HEADER "Gather Symbol"\n")
  34.                 fprintf(p "TILE\n")

  35.                 fprintf(p "TEXT "Active Symbols:"\n")
  36.                 fprintf(p "FLOC 3 1\n")
  37.                 fprintf(p "ENDTEXT\n")

  38.                 fprintf(p "FIELD ref_sym\n")
  39.                 fprintf(p "FLOC 2 3\n")
  40.                 fprintf(p "LIST "" 10 10\n")
  41.                 fprintf(p "OPTIONS multiselect\n")               
  42.                 fprintf(p "ENDFIELD\n")
  43.                
  44.                 fprintf(p "FIELD gather\n")
  45.                 fprintf(p "FLOC 15 4\n")
  46.                 fprintf(p "MENUBUTTON "Gather" 12 5\n")
  47.                 fprintf(p "ENDFIELD\n")
  48.                
  49.                 fprintf(p "FIELD hilight\n")
  50.                 fprintf(p "FLOC 15 10\n")
  51.                 fprintf(p "MENUBUTTON "Hilight" 12 5\n")
  52.                 fprintf(p "ENDFIELD\n")
  53.                
  54.                 fprintf(p "FIELD startend\n")
  55.                 fprintf(p "FLOC 15 16\n")
  56.                 fprintf(p "MENUBUTTON "Start/End" 12 5\n")
  57.                 fprintf(p "ENDFIELD\n")

  58.                 fprintf(p "TEXT "Gather Mode:"\n")
  59.                 fprintf(p "FLOC 15 21\n")
  60.                 fprintf(p "ENDTEXT\n")
  61.                
  62.                 fprintf(p "TEXT\n")
  63.                 fprintf(p "FLOC 25 21\n")
  64.                 fprintf(p "INFO msg 20\n")
  65.                 fprintf(p "FSIZE 20 2\n")
  66.                 fprintf(p "ENDTEXT\n")
  67.        
  68.                 fprintf(p "ENDTILE\n")
  69.                 fprintf(p "ENDFORM\n")
  70.                 close(p)

  71.         axlFormCreate('gather  "_gathersym" '("msglines" 1) 'gatherCB t nil)
  72.         axlUIWPerm(gather t)
  73.         axlFormDisplay(gather)
  74.         deleteFile(Path)
  75.         );let
  76.        
  77.         kg = 0
  78.         axlFormSetField( gather "msg"         "  OFF")
  79. );
  80. defun( gatherCB (gather)
  81.         targ = nil
  82.        
  83.         case(gather->curField
  84.                 ("gather"        
  85.                         if(reflist == nil
  86.                                 then
  87.                                         axlUIWPrint(gather "Please Hilight symbols First!")
  88.                                 else
  89.                                         output())
  90.                 );#1
  91.                 ("hilight"
  92.                         if(kg == 0
  93.                                 then
  94.                                         axlUIWPrint(gather "Please Enable START/END Mode!")
  95.                                 else
  96.                                         hilight()
  97.                         );if
  98.                 );#2
  99.                 ("startend"
  100.                         tig_Ld_Uld()
  101.                 );#3
  102.         );case
  103.         case(gather->doneState
  104.                 (3 axlTriggerClear('xprobe 'myxprobe))
  105.         );case
  106.        
  107.         reflist = nil
  108. );defun
  109. defun( hilight ()
  110.         targ = nil
  111.         axlFormListDeleteAll(gather "ref_sym" )
  112.         axlShell("hilight")
  113. );

  114. defun(myxprobe (items)
  115.         if(car(items) == 'highlight
  116.                 then
  117.                         targ = cons(caadr(items)->refdes targ)
  118.         );if
  119.         axlFormListDeleteAll(gather "ref_sym" )
  120.         when(member(nil targ) targ = remove(nil targ))
  121.         targ = unique(targ)
  122.         axlFormSetField( gather "ref_sym"         targ)

  123.         reflist = targ
  124. );defun

  125. defun( tig_Ld_Uld ()
  126.         if(kg == 0
  127.                 then
  128.                         kg = 1
  129.                         axlTriggerSet('xprobe 'myxprobe)
  130.                         axlFormSetField( gather "msg"         "  ON")
  131.                        
  132.                 else
  133.                         kg = 0
  134.                         axlTriggerClear('xprobe 'myxprobe)
  135.                         axlFormSetField( gather "msg"         "  OFF")
  136.                        
  137.         )
  138. );defun

  139. defun(output ()       

  140.         axlShell("done")

  141.         axlClearSelSet()
  142.         axlSetFindFilter(?enabled list( "noall" "symbols") ?onButtons list( "noall" "symbols"))
  143.        
  144.         sym = makeTable("Symbol" nil)
  145.         k = 0
  146.         LenX = 0
  147.         LenY = 0
  148.         foreach(db reflist
  149.                 k++ ;
  150.                 sym[k] = gensym()
  151.                
  152.                 tmp = car(axlSelectByName("REFDES" db))
  153.                 sym[k]->db = tmp
  154.                 foreach(db0 tmp->children
  155.                         layer = cadr(parseString(db0->layer "/"))
  156.                         if(layer == "PLACE_BOUND_TOP" || layer == "PLACE_BOUND_BOTTOM"
  157.                                 then
  158.                                         box = db0->bBox
  159.                         );if
  160.                 );foreach
  161.                 sym[k]->lenH = xCoord(cadr(box)) - xCoord(car(box))
  162.                 sym[k]->lenV = yCoord(cadr(box)) - yCoord(car(box))
  163.                 sym[k]->Xo = xCoord(car(box))
  164.                 sym[k]->Yo = yCoord(car(box))

  165.                 path = list(        0 : 0
  166.                                                 sym[k]->lenH : 0
  167.                                                 sym[k]->lenH : sym[k]->lenV
  168.                                                 0 : sym[k]->lenV
  169.                                                 0 : 0
  170.                                         );path list
  171.                 outline = axlPathStart(path)
  172.                
  173.                 sym[k]->otl = outline
  174.                
  175.                 LenX = LenX + sym[k]->lenH
  176.                 LenY = LenY + sym[k]->lenV
  177.                
  178.         );foreach
  179.        
  180.         PlenX1 = 0
  181.         PlenX2 = 0
  182.         PlenX3 = 0
  183.         Rsec = 0
  184.         Rtht = 0
  185.         PlenY = 0
  186.         PlenY1 = 0
  187.         for(i 1 k
  188.                
  189.                 if(PlenX1 <= LenX / 3
  190.                         then
  191.                                 PlenX1 = PlenX1 + sym[i]->lenH
  192.                                 org = -(PlenX1 - sym[1]->lenH) : PlenY
  193.                         else if(PlenX2 <= LenX / 3
  194.                                         then
  195.                                                 when(PlenX2 == 0 Rsec = sym[i]->lenH)
  196.                                                 PlenX2 = PlenX2 + sym[i]->lenH
  197.                                                 PlenY = sym[i]->lenV +50
  198.                                                 org = -(PlenX2 - Rsec ) : PlenY
  199.                                                 when(PlenY1 == 0 PlenY1 = PlenY)
  200.                                           else
  201.                                                 when(PlenX3 == 0 Rtht = sym[i]->lenH)
  202.                                                 PlenX3 = PlenX3 + sym[i]->lenH
  203.                                                 PlenY = PlenY1 + sym[i]->lenV +50
  204.                                                 org = -(PlenX3 - Rtht ) : PlenY
  205.                                 );else if
  206.                 );if
  207.                 axlAddSimpleMoveDynamics(org outline "path" ?ref_point 0:0)
  208.                 sym[i]->Xt = - car(org)
  209.                 sym[i]->Yt = - cadr(org)
  210.         );for
  211.        
  212.         if(pic = axlEnterPoint()
  213.                 then
  214.                         move(pic)
  215.         );if
  216.        
  217. );defun


  218. defun( move (pick)

  219.         for(i 1 k
  220.                 relaxy = car(pick) - sym[i]->Xo + sym[i]->Xt : cadr(pick) - sym[i]->Yo + sym[i]->Yt
  221.                 axlTransformObject(sym[i]->db, ?move relaxy)
  222.         );
  223.         axlClearDynamics()
  224.         axlFormListDeleteAll(gather "ref_sym" )
  225.        
  226. );defun




  227.    
复制代码

评分

参与人数 1威望 +4 SKILL币 +8 贡献 +8 收起 理由
vivienluo + 4 + 8 + 8 很给力!

查看全部评分

发表于 2014-5-15 16:56:45 | 显示全部楼层
感谢分享……
发表于 2014-5-15 21:17:33 | 显示全部楼层
布局很有用。多谢
发表于 2014-5-15 23:52:21 | 显示全部楼层

感谢分享……
发表于 2014-5-16 08:48:43 | 显示全部楼层

布局很有用。多谢
发表于 2014-5-17 21:35:17 | 显示全部楼层
谢谢楼主分享
发表于 2015-8-28 09:21:28 | 显示全部楼层
很好用的样子,试试
发表于 2015-9-2 17:03:15 | 显示全部楼层
布局很有用。多谢
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|网站地图|Cadence Skill 论坛 ( 蜀ICP备13024417号 )

GMT+8, 2024-3-29 07:34 , Processed in 0.168476 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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