找回密码
 注册
查看: 21492|回复: 125
打印 上一主题 下一主题

[原创]根据ECS里面的CLASS/BUS来自动创建PINPAIR以及对应的MATCHGROUP

  [复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2014-12-31 10:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
前一阵子有点时间,就整了个,因为觉得大多时候,直接从NET来创建MATCHGROUP的形式并不合适,大多都需要pinpair,但是即使是用sigXplorer,还是觉得不够方便,尤其是很多组等长要约束的时候,所以就弄了个自动创建,不过个人能力有限,所以功能也比较2,大概思路如下:
1,要创建的对象必须是CLASS/BUS,可以包含dp对,不能包含其他兑现,因为最近忙,还没空想更复杂的;
2,对于地址控制的,比如U1是CPU,挂了U2-U5共4个器件,那么需要选择一个主器件U1,建立的pinpair就是U1-U2,U1-U3,U1-U4,U1-U5,;
3,对于数据,U1到U2的DQ,DM,DQS是一组,其他对应,不能包含其他
4,之所以是上面这个鬼样子,是因为我的思路有点2,对组内的对象排除杂七杂八电阻,端接什么的,剩下的组内每一个net/Xnet都包含的器件,才作为一个目标,就是筛选出U1-U5当前组NET中所有net都连接到的几个器件,那就是U1-U5,如果你多添加了一个U6,那将来筛选出来的就只有U1了,就会报错。
顺便说下,建立好的pinpair没有等长范围,因为不知道需要多长范围,而且手动添加也很简单,就没弄了,未来几个月会有一摩尔板子画,也没空整了,如果发现BUG和有什么建议,可以回复,等将来有空了再整理下,谢谢。
效果和附件如下:

2.png (142.46 KB, 下载次数: 2)

2.png

1.png (91.97 KB, 下载次数: 4)

1.png

Quick_pinpair.rar

2.48 KB, 下载次数: 158, 下载积分: 贡献 -30 , 威望 -10

评分

参与人数 1威望 +10 收起 理由
deargds + 10 很给力!

查看全部评分

该用户从未签到

来自 2#
 楼主| 发表于 2019-9-3 19:45 | 只看该作者
本帖最后由 kevin890505 于 2019-9-3 20:25 编辑

1,修改分列显示,30,60时候空白列的BUG问题 ;2,修改选择主控CPU时候显示模式,改为REF+DEVICE名称方式;
3,创建好的mg,新增约束,点对点的5mil,菊花链的20mil。



1.jpg (8.94 KB, 下载次数: 8)

1.jpg

Quick_pinpair.rar

3.11 KB, 下载次数: 71, 下载积分: 贡献 -30 , 威望 -10

点评

之前的有点小问题,如果数量是30/60整数的时候,列数应该是1/2,实际却是2/3,多了个空的列,修改下,就不发了按照上面自己加进去覆盖掉原来的即可。  详情 回复 发表于 2019-9-3 19:46

该用户从未签到

推荐
发表于 2022-10-19 17:33 | 只看该作者
本帖最后由 digitzing 于 2022-10-19 17:44 编辑
kevin890505 发表于 2021-6-19 22:00
要有BUS或者CLASS才可以   忘了做防呆   如果没有 就会出现这情况

我帮你修改了,改成英文,并支持allegro 17以上,没有BUS也不会一条细线无法退出



  1. /*
  2. ├─
  3. │ ├─        程序名称:Quick_pinpair.il
  4. │ ├─        程序功能:快速创建选择BUS/CLASS对应的pin pair
  5. │ ├─        创建时间:2014年10月31日
  6. │ ├─        作    者:kevin wong
  7. │ ├─        Q      Q:263350809
  8. ├─


  9. 1,2014.10.31开始构建主函数思路;
  10. 2,2014.11.07完成初步功能,测试通过;
  11. 3,2014.12.31修改添加部分按钮,提示;
  12. 4,2019.07.31修改增加分列显示功能,以避免超出屏幕范围
  13. 5,2019.07.31修改多30整除情况下的界面布局,以避免空白列
  14. 6,2019.09.01修改再3个以上器件时候,只显示位号不容易区分,以REF+VALUE的形式展示,
  15.                         并增加新建的MG添加约束,点对点为5mil,菊花链为20mil
  16. 7,2022.10.19 修改width为0时,from显示问题 by digitzing
  17. */


  18. axlCmdRegister( "quickpinpair" 'Quick_PinPair)

  19.   ; load("Quick_pinpair.il")



  20. defun(Quick_PinPair ()
  21.       let( (one allclass)
  22.           allclass = axlDBGetDesign()->netclass
  23.           alleleclass_name =  list()
  24.       foreach(one allclass
  25.                   if(one->electrical
  26.                              then
  27.                                  alleleclass_name = cons(list(one->name one) alleleclass_name)
  28.                                  )
  29.                           )
  30.           if(allbus = axlDBGetDesign()->bus
  31.              foreach(one allbus
  32.                          alleleclass_name = cons(list(one->name one) alleleclass_name)
  33.                          )
  34.                  )
  35.                 classnum = length(alleleclass_name)        ;class 数量         
  36.                 if(classnum <= 30
  37.                         then
  38.                         hig = classnum*2+6
  39.                         else

  40.                         hig = 30*2 + 6                ;>30个时高度固定,增加宽度
  41.                         )
  42.                 ;----------修改部分
  43.                 if(mod(classnum 30) == 0
  44.                 then
  45.                 width = ((classnum/30) + 0)*30 ;项目过多时加宽列数,整除 列宽=列数*30
  46.                  else
  47.                 width = ((classnum/30) + 1)*30 ;项目过多时加宽列数,有多余的,不整除 列宽=(列数+1)*30
  48.                  )
  49.                 if(width == 0
  50.                 then
  51.                         width = 31
  52.                         axlUIWPrint(displayform "No Class was found!")
  53.                 else
  54.                         nil
  55.                  )
  56.                  ;----------修改部分
  57.       Quick_pinpairform()          
  58.           ))
  59.           

  60. defun(Quick_pinpairform ()
  61.         let( (curclass)
  62.                 Formfile = axlTempFile()
  63.         ;Formfile = "./pinpairform.form"
  64.                 formport = outfile(Formfile "w")
  65.                 fprintf(formport "FILE_TYPE=FORM_DEFN VERSION=2\n")


  66.                 if(axlVersion('version)>17
  67.                 then       
  68.                         fprintf(formport "FORM \n")
  69.                 else
  70.                         fprintf(formport "FORM toolwindow\n")
  71.                 )                                

  72.         fprintf(formport "FIXED\n")
  73.                
  74.                 fprintf(formport "PORT %d 1\n" width)
  75.         fprintf(formport "HEADER \"Create PinPair - kevin\"\n")
  76.         fprintf(formport "TILE\n")
  77.                
  78.                 fprintf(formport "\n")
  79.                 fprintf(formport "TEXT \"1.Please creat BUS/CLASS first\"\n")
  80.                 fprintf(formport "TLOC 2 1\n")
  81.                 fprintf(formport "ENDTEXT\n")       
  82.                
  83.                 fprintf(formport "\n")
  84.                 fprintf(formport "TEXT \"2.Please select blew BUS/CLASS\"\n")
  85.                 fprintf(formport "TLOC 2 2\n")
  86.                 fprintf(formport "ENDTEXT\n")
  87.                
  88.         x =2
  89.                 y = 4
  90.                 foreach(curclass alleleclass_name
  91.                          fieldname = car(curclass)
  92.                 fprintf( formport "FIELD %s\n" fieldname)
  93.                 fprintf( formport "FLOC %d %d\n" x y)
  94.                 fprintf( formport "CHECKLIST \" %s\"\n" fieldname)               
  95.                 fprintf( formport "ENDFIELD\n\n")
  96.                 y = y+2
  97.                 if( y >= 64        ;大于30行就切换下一列
  98.                 then
  99.                 y = 4               
  100.                 x = x+30
  101.                 )       
  102.                
  103.                        )
  104.                           
  105.         fprintf(formport "FIELD sel\n")
  106.         fprintf(formport "FLOC 2 %d\n" hig)
  107.         fprintf(formport "MENUBUTTON \"Select All\" 10 3\n")
  108.         fprintf(formport "ENDFIELD \n\n")       
  109.                
  110.         fprintf(formport "FIELD desel\n")
  111.         fprintf(formport "FLOC 14 %d\n" hig)
  112.         fprintf(formport "MENUBUTTON \"Deselect\" 10 3\n")
  113.         fprintf(formport "ENDFIELD \n\n")

  114.         fprintf(formport "FIELD create\n")
  115.         fprintf(formport "FLOC 2 %d\n" hig+2)
  116.         fprintf(formport "MENUBUTTON \"Creat\" 10 3\n")
  117.         fprintf(formport "ENDFIELD \n\n")       
  118.                
  119.         fprintf(formport "FIELD cacel\n")
  120.         fprintf(formport "FLOC 14 %d\n" hig+2)
  121.         fprintf(formport "MENUBUTTON \"Exit\" 10 3\n")
  122.         fprintf(formport "ENDFIELD \n\n")
  123.                

  124.                 fprintf(formport "ENDTILE\n")
  125.         fprintf(formport "ENDFORM\n")
  126.         close(formport)
  127.                
  128.                 displayform = axlFormCreate((gensym) Formfile '(ne inner) 'createpinpairact t)
  129.                 axlFormDisplay(displayform)
  130.                
  131.                 foreach(curclass alleleclass_name
  132.                     axlFormSetField(displayform car(curclass) t)
  133.                                 )

  134.                 if(width == 31
  135.                 then
  136.                         axlUIWPrint(displayform "No Class or Bus was found!")
  137.                 else
  138.                         axlUIWPrint(displayform "Kevin Wong")
  139.                  )       
  140.                 deleteFile(Formfile)               
  141.      )
  142.         )
  143. defun(createpinpairact (displayform)
  144.           let( (membersel curclass onecl one alldp2net)
  145.           allclass = axlDBGetDesign()->netclass
  146.           alleleclass_name =  list()
  147.       foreach(one allclass
  148.                   if(one->electrical
  149.                              then
  150.                                  alleleclass_name = cons(list(one->name one) alleleclass_name)
  151.                                  )
  152.                           )
  153.           if(allbus = axlDBGetDesign()->bus
  154.              foreach(one allbus
  155.                          alleleclass_name = cons(list(one->name one) alleleclass_name)
  156.                          )
  157.                  )
  158.           
  159.           membersel = displayform->curField
  160.       case(membersel
  161.                ("sel"
  162.                         foreach(curclass alleleclass_name
  163.                     axlFormSetField(displayform car(curclass) t)
  164.                                 axlUIWPrint(displayform "Select All")
  165.                                 )                  
  166.                    )
  167.                    ("desel"
  168.                         foreach(curclass alleleclass_name
  169.                     axlFormSetField(displayform car(curclass) nil)
  170.                                 axlUIWPrint(displayform "Deselect All")
  171.                                 )                  
  172.                    )
  173.                    ("create"
  174.                     axlUIWPrint(displayform "Create the pinpair of selected BUS/Class")
  175.                     foreach(onecl alleleclass_name
  176.                             alldp2net = cadr(onecl)->groupMembers
  177.                                   foreach(one alldp2net
  178.                                           if(one->type == "DIFF_PAIR"
  179.                                                      alldp2net = append(remove(one alldp2net) one->groupMembers)
  180.                                                          )
  181.                                                   )
  182.                        
  183.                                if(axlFormGetField(displayform car(onecl))
  184.                                 then
  185.                                  curMGname = strcat("MG_" car(onecl))
  186.                                      allpinslist = list()
  187.                                      foreach(one alldp2net   
  188.                                          allpinslist = append1(allpinslist axlPinsOfNet(one 'pin))
  189.                                                  )

  190.                                  get_min_pinlist(allpinslist)  
  191.                                      if(length(result) == 1
  192.                                               then
  193.                                                   axlUIConfirm(strcat("there is some thing wrong with the BUS/Class " car(onecl)))
  194.                                             else
  195.                                                   if(length(result) == 2
  196.                                                     then
  197.                                                     get_main_pinlist()
  198.                                                         Creat_Match_Group()
  199.                                                         else
  200.                                                         if(length(result) >= 3
  201.                                                         then
  202.                                                         axlClearSelSet()
  203.                                                         axlSetFindFilter(?enabled list("noall" "COMPONENTS") ?onButtons list("all"))
  204.                                                         axlSingleSelectName("REFDES" result)
  205.                                                         resultdbid = axlGetSelSet()
  206.                                                         resultref = nil
  207.                                                         foreach(ref resultdbid
  208.                                                         resultref = append1(resultref strcat(strcat(ref->name "_") ref->deviceType))
  209.                                                        
  210.                                                         )
  211.                                                           choice = axlUIMultipleChoice("Please select a main CPU"
  212.                                                                                resultref strcat("Please select branch" car(onecl)))
  213.                                                           maindev = nth(choice result)
  214.                                                         get_main_pinlist()
  215.                                                             Creat_Match_Group()                                                          
  216.                                                           )
  217.                                                        
  218.                                                         )
  219.                                                 )
  220.                                  )
  221.                                  )
  222.              axlUIWPrint(displayform "Create the pinpair successfully!")                         
  223.                         )
  224.                    ("cacel"
  225.                         axlUIWPrint(displayform "Exit")
  226.                 axlFormClose(displayform)
  227.                 deleteFile(Formfile)                  
  228.                    )          
  229.                   
  230.                )

  231.                  ) )      
  232.           
  233.                   

  234. defun( get_min_pinlist (allpinslist)
  235.       let( (one mlist pin2netlist i j curlist okflag)
  236.            mlist = list()
  237.               foreach(one nth(0 allpinslist)
  238.                           mlist= cons(one->component->name mlist)   ;list(U1 U2)
  239.                                   )          
  240.        result = mlist   
  241.            foreach(pin2netlist allpinslist
  242.                      curlist = pin2netlist
  243.                                  
  244.                                  i = 0
  245.                     while( (i < length(mlist))
  246.                                     j = nth(i mlist)
  247.                      okflag = 0       
  248.                                           foreach(one curlist  
  249.                                                           if(j == one->component->name
  250.                                                              okflag++
  251.                                                              )
  252.                                                           )
  253.                                                           
  254.                                         if(okflag == 0
  255.                                                result = remove(j result)   
  256.                                                )
  257.                                           i++
  258.                                           )  
  259.                                           
  260.                            )  
  261.                          ))
  262.                   
  263. defun( get_main_pinlist ()       

  264.              let( (curcalcu pinid containflag)       
  265.          pinneedres = list()       
  266.      foreach(curcalcu allpinslist
  267.                         curcalcu = car(allpinslist)
  268.                         allpinslist = remove(curcalcu allpinslist)
  269.                           foreach(pinid curcalcu
  270.                                          containflag = 0
  271.                                           foreach(one result
  272.                                                   if(pinid->component->name == one
  273.                                                              containflag++
  274.                                                             )
  275.                                                           )
  276.                                              if(containflag == 0
  277.                                                 curcalcu = remove(pinid curcalcu)        )       
  278.                                          )
  279.               if(length(result)>=3
  280.                  then                         
  281.                                  foreach(one curcalcu
  282.                                          if(one->component->name == maindev
  283.                                                     
  284.                                                         curcalcu = cons(one remove(one curcalcu))
  285.                                                         )
  286.                                                  )
  287.                               pinneedres = append1(pinneedres curcalcu)
  288.                               else       
  289.                           
  290.                               pinneedres = append1(pinneedres curcalcu)
  291.                           )
  292.                           )
  293.           ))

  294.           
  295.           
  296. defun( Creat_Match_Group ()
  297.       let( (lastpinlist onepinlist lastpins onespin onelist curpinpair ref one onepin)
  298.           lastpinlist = list()
  299.           foreach(onepinlist pinneedres
  300.                       lastpins = list()
  301.                       foreach(one onepinlist
  302.                               onespin = strcat(strcat(one->component->name ".") one->number)
  303.                                                   lastpins = append1(lastpins onespin)
  304.                                      )
  305.                            lastpinlist = cons(lastpins lastpinlist)
  306.                           )
  307.           if(length(result) == 2
  308.              then
  309.                  axlMatchGroupDelete(curMGname)
  310.                  axlMatchGroupCreate(curMGname)
  311.                  
  312.                  foreach(onelist lastpinlist
  313.                          curpinpair = axlPinPair(car(onelist) cadr(onelist))
  314.                                  axlMatchGroupAdd(curMGname curpinpair)
  315.                                  axlMatchGroupProp(curMGname curpinpair strcat(curMGname ":G:::0 mil:5mil"))
  316.                                  )
  317.                  else   
  318.                  if(length(result)>=3
  319.                  then
  320.                  groupneedsuf = remove(maindev result)
  321.                  foreach(ref groupneedsuf
  322.                          axlMatchGroupDelete(strcat(strcat(curMGname "_") ref))
  323.                          axlMatchGroupCreate(strcat(strcat(curMGname "_") ref))
  324.                                  )  
  325.                                  
  326.                  foreach(one lastpinlist  
  327.                          pinpre = car(one)  
  328.                                  pinsuflist = cdr(one)
  329.                                  
  330.                                  foreach(onepin pinsuflist
  331.                                                  curpinpair = axlPinPair(pinpre onepin)
  332.                                                  ; car(parseString(onepin "."))
  333.                                                  lastname = strcat(strcat(curMGname "_") car(parseString(onepin ".")))
  334.                                                  axlMatchGroupAdd(lastname curpinpair)
  335.                                                  axlMatchGroupProp(lastname curpinpair strcat(lastname ":G:::0 mil:20mil"))
  336.                                                  
  337.                                                  )
  338.                                  )
  339.                  
  340.                  
  341.                    )
  342.                  )

  343.           ))
  344.        
  345.        




复制代码


点评

你好,加载后报错怎么回事啊 *Error* eval:unbound variable - displayform  详情 回复 发表于 2023-6-1 08:33

该用户从未签到

推荐
 楼主| 发表于 2015-10-14 16:25 | 只看该作者
penny190 发表于 2015-10-14 15:09
非常棒的Skill喔
不好意思想請問一下,要如何將對話框的中文字改變成英文的
謝謝

       分别位于54,58,63,80,85,90,95行的类似 fprintf(formport "HEADER \"\264\264\275\250PinPair - kevin\"\n")的


\"XXX\"双引号中间的\"\264\264\275\250PinPair - kevin\"     \+三个数字的就是一个汉字,你替换了即可   
比如"\264\264\275\250PinPair - kevin\"   改成 "ABCDEFG PinPair - HHH\"
很简单,试试就知道了

点评

成功了 ~~ 非常謝謝你喔  详情 回复 发表于 2015-10-14 18:05

该用户从未签到

6#
发表于 2015-1-26 08:24 | 只看该作者
先頂一個,再好好研究研究。謝謝了
  • TA的每日心情
    无聊
    2022-11-21 15:45
  • 签到天数: 1 天

    [LV.1]初来乍到

    7#
    发表于 2015-1-30 00:10 | 只看该作者
    谢谢lz很好的skill

    该用户从未签到

    8#
    发表于 2015-3-17 15:39 | 只看该作者
    楼主现在怎么搞起SKILL了
    不错!!!

    点评

    说的对 很多时候解决问题是困扰的  详情 回复 发表于 2015-3-18 11:21
    初学而已,而且做PCB学这个也是应该的,这样自己就可以不求人做出自己想要的功能。  发表于 2015-3-17 17:26

    该用户从未签到

    9#
    发表于 2015-3-18 11:21 | 只看该作者
    bingshuihuo 发表于 2015-3-17 15:39
    楼主现在怎么搞起SKILL了
    不错!!!

    说的对 很多时候解决问题是困扰的
  • TA的每日心情
    擦汗
    2024-5-15 15:49
  • 签到天数: 314 天

    [LV.8]以坛为家I

    10#
    发表于 2015-4-8 14:07 | 只看该作者
    已尝试不错的skill

    该用户从未签到

    11#
    发表于 2015-4-14 10:36 | 只看该作者
    绝对给力啊,支持个!!
  • TA的每日心情
    开心
    2023-12-4 15:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    12#
    发表于 2015-6-19 11:13 | 只看该作者
    感谢楼主,太好的skill了,简直是神器!!!
  • TA的每日心情
    奋斗
    2024-10-10 15:47
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    13#
    发表于 2015-7-6 16:31 | 只看该作者
    谢谢楼主分享,楼主说得对,求人不如求已,赞赏楼主的精神!

    该用户从未签到

    14#
    发表于 2015-7-15 11:13 | 只看该作者
    Hi,你skill是自学的吗?是不是要写代码的呀,我上学的时候学的是软件,还算有点基础,我也想自学,但实在不知道怎么下手,你有没有什么好的资料能推荐下呀

    点评

    木有资料,看ALLEGRO自带帮助,最全面的  详情 回复 发表于 2015-7-15 16:39

    该用户从未签到

    15#
     楼主| 发表于 2015-7-15 16:38 | 只看该作者
    木有资料,看ALLEGRO自带帮助,最全面的

    点评

    需要什么基础,c语言还是啥?  详情 回复 发表于 2015-12-2 15:10

    该用户从未签到

    16#
     楼主| 发表于 2015-7-15 16:39 | 只看该作者
    qq331217160 发表于 2015-7-15 11:13
    Hi,你skill是自学的吗?是不是要写代码的呀,我上学的时候学的是软件,还算有点基础,我也想自学,但实在不 ...

    木有资料,看ALLEGRO自带帮助,最全面的

    该用户从未签到

    19#
    发表于 2015-8-8 14:53 | 只看该作者
    楼主,请问上面第二幅图的画面是怎么出来的?
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-5-28 15:20 , Processed in 0.109375 second(s), 32 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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