EDA365电子工程师网

标题: 【分享源代碼】比較兩個Board file網表差異工具/比较两份PCB文件的网表差异 [打印本页]

作者: XYX365    时间: 2016-2-2 10:21
标题: 【分享源代碼】比較兩個Board file網表差異工具/比较两份PCB文件的网表差异
本帖最后由 XYX365 于 2016-2-4 07:19 编辑

【分享源代碼】比較兩個Board file網表差異工具/比较两份PCB文件的网表差异


;
;FileName:        
;Load:                load("fCN.il")
;Command:        cn
;
;功能:比較兩個PCB的Netlist差異
;使用方法:
;        1.開起一個新的brd
;        2.執行cn
;        3.會提示讀取一個舊的brd
;        4.選擇檔案後,再選擇開啟之後就開始比較,直到輸出結果
;
;; 程式特色:
;        1.源代碼分享,讓所有人都可以依照自己的方式加入其他功能,
;                例如加入輸出檔案為excel檔
;                或是其他功能,自己想像.

[attach]108735[/attach]

[attach]108724[/attach]

[hide=d180]
  1. ;
  2. ;FileName:        
  3. ;Load:                load("fCN.il")
  4. ;Command:        cn
  5. ;
  6. ;功能:比較兩個PCB的Netlist差異
  7. ;使用方法:
  8. ;        1.開起一個新的brd
  9. ;        2.執行cn
  10. ;        3.會提示讀取一個舊的brd
  11. ;        4.選擇檔案後,再選擇開啟之後就開始比較,直到輸出結果
  12. ;
  13. ;; 程式特色:
  14. ;        1.源代碼分享,讓所有人都可以依照自己的方式加入其他功能,
  15. ;                例如加入輸出檔案為excel檔
  16. ;                或是其他功能,自己想像.
  17. axlCmdRegister("cn" 'fnCompareNetlist ?cmdType "general")

  18. procedure(fnCompareNetlist()
  19.         prog((tBrdPathNew tBrdOld tBrdPathOld pPort tCmd tNewFile tOldFile lNewList lOldList)
  20.                
  21.                 ;取新舊brd檔案名稱
  22.                 axlMsgPut("M-Please select a brd file:")
  23.                 tBrdPathOld = axlDMFileBrowse("ALLEGRO_BRD" nil ?title "Compare Netlist" ?optFilters "Board file(*.brd)|*.brd|") ;瀏覽舊的brd
  24.                 unless(tBrdPathOld
  25.                         return(nil)
  26.                 )
  27.                 tBrdNew = axlCurrentDesign() ;目前所開啟的brd
  28.                 tBrdPathNew = strcat(simplifyFilename(tBrdNew) ".brd")
  29.                 ;要導出比較的資料
  30.                 tFile = strcat(getWorkingDir() "/netlist.view")
  31.                 pPort = outfile(tFile)
  32.                 fprintf(pPort "LOGICAL_PIN\n")
  33.                 fprintf(pPort "  REFDES\n")
  34.                 fprintf(pPort "  PIN_NUMBER\n")
  35.                 fprintf(pPort "  NET_NAME\n")
  36.                 fprintf(pPort "END\n")
  37.                 close(pPort)
  38.                 ;
  39.                 ;導出新舊brd的資料,使用axlRunBatchDBProgram()就不會開啟cmd視窗
  40.                 foreach(tBrdPath list(tBrdPathNew tBrdPathOld)
  41.                         tBrdName = cadr(axlDMFileParts(tBrdPath))
  42.                         sprintf(tCmd "extracta %L %s %s_pin.txt" tBrdPath tFile tBrdName)
  43.                         axlRunBatchDBProgram("extracta" tCmd ?silent t ?noUnload t ?reloadDB nil)
  44.                         deleteFile(strcat(getWorkingDir() "/extract.log"))
  45.                 )
  46.                 deleteFile(tFile)
  47.                
  48.                 ;讀取新brd所導出的資料
  49.                 tNewFile = strcat(getWorkingDir() "/" cadr(axlDMFileParts(tBrdPathNew)) "_pin.txt")
  50.                 lNewList = fnCNReadFile(tNewFile)
  51.                 deleteFile(tNewFile)
  52.                                 
  53.                 ;讀取舊brd所導出的資料
  54.                 tOldFile = strcat(getWorkingDir() "/" cadr(axlDMFileParts(tBrdPathOld)) "_pin.txt")
  55.                 lOldList = fnCNReadFile(tOldFile)
  56.                 deleteFile(tOldFile)
  57.                
  58.                 ;比較新舊brd差異並輸出到檔案
  59.                 fnCNCompareData(tBrdPathNew tBrdPathOld lNewList lOldList)
  60.         )
  61. )
  62. procedure(fnCNReadFile(tFile)
  63.         let((pPort tLine lLines)
  64.                 if(tFile && isFile(tFile) then
  65.                         pPort = infile(tFile)
  66.                         rexCompile(".$")
  67.                         for(x 1 2 ;讀取前面兩行,這兩行不會處理
  68.                                 gets(tLine pPort)
  69.                         )
  70.                         while(gets(tLine pPort)
  71.                                 unless(blankstrp(tLine)
  72.                                         lLines = cons(rexReplace(tLine "" 0) lLines)
  73.                                 )
  74.                         )
  75.                         close(pPort)
  76.                         sort(lLines nil) ;排序所有資料
  77.                 else
  78.                         axlUIConfirm("E- Misssing file.")
  79.                 )
  80.         )
  81. )
  82. procedure(fnCNCompareData(tBrdPathNew tBrdPathOld lNewList lOldList)
  83.         let((oNewPin oOldPin lLines tRefDes tPin tNetName)
  84.                 for(x 0 1
  85.                         if(zerop(x) then
  86.                                 oNewPin = makeTable("NEWDATA" nil)
  87.                         else
  88.                                 oOldPin = makeTable("OLDDATA" nil)
  89.                         )
  90.                         rexCompile("!!")
  91.                         foreach(tLine nth(x list(lNewList lOldList))
  92.                                 tLine = rexReplace(tLine "! !" 0)
  93.                                 lLines = parseString(tLine "!")
  94.                                 
  95.                                 tRefDes = cadr(lLines)
  96.                                 tPin = strcat(tRefDes "." caddr(lLines))
  97.                                 tNetName = nth(3 lLines)
  98.                                 
  99.                                 if(zerop(x) then
  100.                                         oNewPin[tPin] = list(tNetName)
  101.                                 else
  102.                                         oOldPin[tPin] = list(tNetName)
  103.                                 )
  104.                         )
  105.                 )
  106.                 fnCNOutputData(tBrdPathNew tBrdPathOld oNewPin oOldPin)
  107.         )
  108. )
  109. procedure(fnCNOutputData(tBrdPathNew tBrdPathOld oNewPin oOldPin)
  110.         let((lAdded lDeleted lChanged tFile pPort xItem tOne)
  111.                 ;判斷是否有新增資料
  112.                 foreach(tPin oNewPin
  113.                         unless(oOldPin[tPin]
  114.                                 lAdded = cons(tPin lAdded)
  115.                         )
  116.                 )
  117.                 lAdded = sort(lAdded nil)
  118.                
  119.                 ;判斷是否有減少資料
  120.                 foreach(tPin oOldPin
  121.                         unless(oNewPin[tPin]
  122.                                 lDeleted = cons(tPin lDeleted)
  123.                         )
  124.                 )
  125.                 lDeleted = sort(lDeleted nil)
  126.                
  127.                 ;判斷是否有改變資料
  128.                 foreach(tPin oNewPin
  129.                         when(oOldPin[tPin]
  130.                                 unless(oNewPin[tPin] == oOldPin[tPin]
  131.                                         lChanged = cons(tPin lChanged)
  132.                                 )
  133.                         )
  134.                 )
  135.                 lChanged = sort(lChanged nil)
  136.                
  137.                 ;輸出資料到檔案
  138.                 drain()
  139.                 tFile = strcat(getWorkingDir() "/" cadr(axlDMFileParts(tBrdPathNew)) "_OldNew.rpt")
  140.                 pPort = outfile(tFile)
  141.                 ;檔案顯示的標題
  142.                 fprintf(pPort "Compare NetList report\n")
  143.                 fprintf(pPort "Date: %s\n" getCurrentTime())
  144.                 fprintf(pPort "%s.brd [Old]\n" cadr(axlDMFileParts(tBrdPathOld)))
  145.                 fprintf(pPort "%s.brd [New]\n\n" cadr(axlDMFileParts(tBrdPathNew)))
  146.                                                                
  147.                 fprintf(pPort "%s\n" "===================================================================================================================")
  148.                 fprintf(pPort "%-4s | %-20s | %-40s | %-40s |\n" "Item" "Pin Name" "Current(New) Design" "Old Design")
  149.                 fprintf(pPort "%s\n" "===================================================================================================================")
  150.                 xItem = 1
  151.                 ;輸出新增的資料到檔案
  152.                 foreach(tOne lAdded
  153.                         fprintf(pPort "%-4d | %-20s | %-40s | %-40s |\n" xItem tOne car(oNewPin[tOne]) "(***)")
  154.                         fprintf(pPort "%s\n" "-------------------------------------------------------------------------------------------------------------------")
  155.                         xItem++
  156.                 )
  157.                 ;輸出減少的資料到檔案
  158.                 foreach(tOne lDeleted
  159.                         fprintf(pPort "%-4d | %-20s | %-40s | %-40s |\n" xItem tOne "(***)" car(oOldPin[tOne]))
  160.                         fprintf(pPort "%s\n" "-------------------------------------------------------------------------------------------------------------------")
  161.                         xItem++
  162.                 )
  163.                 ;輸出變更的資料到檔案
  164.                 foreach(tOne lChanged
  165.                         fprintf(pPort "%-4d | %-20s | %-40s | %-40s |\n" xItem tOne car(oNewPin[tOne]) car(oOldPin[tOne]))
  166.                         fprintf(pPort "%s\n" "-------------------------------------------------------------------------------------------------------------------")
  167.                         xItem++
  168.                 )
  169.                 ;輸出總數量的訊息
  170.                 fprintf(pPort "Total: %5d\n\n" length(lAdded)+length(lDeleted)+length(lChanged))
  171.                 fprintf(pPort "Summary:\n")
  172.                 fprintf(pPort "  %d Added pins\n" length(lAdded))
  173.                 fprintf(pPort "  %d Deleted pins\n" length(lDeleted))
  174.                 fprintf(pPort "  %d Changed pins\n\n" length(lChanged))
  175.                 fprintf(pPort "%s\n" "Remark: (***) = Pin not exist in the design.")
  176.                 close(pPort)
  177.                
  178.                 axlUIViewFileCreate(tFile "Report Window" t (120:60)) ;觀看輸出結果
  179.         )
  180. )
复制代码

[/hide]


作者: nanosoc    时间: 2016-2-2 10:51
谢谢楼主分享!!!
作者: penny190    时间: 2016-2-2 14:04
謝謝分享
作者: dewyomo    时间: 2016-2-2 14:06

作者: bruceljc    时间: 2016-2-2 21:57
谢谢楼主分享!!!
作者: vivianwu0317    时间: 2016-2-3 09:43
谢谢楼主分享!!!


作者: vivianwu0317    时间: 2016-2-3 13:04
谢谢楼主分享!!!
作者: 361553894    时间: 2016-2-3 16:24
感谢大神开放源码

作者: XYX365    时间: 2016-2-3 16:31
361553894 发表于 2016-2-3 16:24
感谢大神开放源码

後續還有一些簡單的程式會在開放

作者: 361553894    时间: 2016-2-3 16:34
XYX365 发表于 2016-2-3 16:31
後續還有一些簡單的程式會在開放

对我们这些初学者来说,是相当高端的程式了
作者: XYX365    时间: 2016-2-3 16:41
361553894 发表于 2016-2-3 16:34
对我们这些初学者来说,是相当高端的程式了

你可以比較我今年所分享的源代碼,就會發現很多地方寫的都一樣,幾乎可以做成一個模板,稍微修改就成為另一功能,


作者: 361553894    时间: 2016-2-3 16:47
第58行的
AADAKDALKDKL
不理解。。

作者: XYX365    时间: 2016-2-3 16:49
361553894 发表于 2016-2-3 16:47
第58行的
AADAKDALKDKL
不理解。。

我剛才有發現,所以已經刪除,附件沒有修改,必須自行刪除

作者: 361553894    时间: 2016-2-3 17:08
XYX365 发表于 2016-2-3 16:49
我剛才有發現,所以已經刪除,附件沒有修改,必須自行刪除

还有67行,应该是
                       rexCompile(".$")

作者: jinshan010    时间: 2016-2-4 08:35
谢谢分享
作者: XYX365    时间: 2016-2-4 08:43
361553894 发表于 2016-2-3 17:08
还有67行,应该是
                       rexCompile(".$")

已修改,附件是正常的,

作者: 砰砰小心脏    时间: 2016-2-4 10:29
学习学习

作者: defir    时间: 2016-2-6 11:17
源码学习!
作者: 卫冬冬    时间: 2016-2-10 09:17
学习学习学习学习

作者: 86232648    时间: 2016-2-11 08:49
感谢楼主,感谢楼主,感谢楼主,

作者: vivianwu0317    时间: 2016-2-11 14:25
see see see see

作者: wenspig    时间: 2016-2-16 10:23
好厉害的样子,膜拜下~

作者: wolf343105    时间: 2016-2-17 09:03
xiexie,ding.
作者: JIMDENG    时间: 2016-2-17 14:16
本帖最后由 JIMDENG 于 2016-2-17 14:24 编辑

配套的好用SKILL(一个是CS,一个是CN),谢谢大师傅的分享!

作者: lindaling59420    时间: 2016-2-18 15:28
多谢楼主


作者: ben71431    时间: 2016-2-19 10:49
感謝分享~
作者: 武紫旭    时间: 2016-2-19 14:30
XYX365出品,必属精品!

作者: wgs20120904    时间: 2016-2-22 22:52
正找着这个工具,十分感谢
作者: guanhaiji301    时间: 2016-2-23 09:25
谢谢

作者: ouyang0320    时间: 2016-2-23 09:57
支持支持~

作者: KKVIN    时间: 2016-2-23 17:28
感謝樓主分享好資源
作者: zqy610710    时间: 2016-2-26 11:10
谢谢
作者: hayatokoc    时间: 2016-5-4 00:48
谢谢楼主分享!!!
作者: dengbaba    时间: 2016-5-4 08:37
谢谢楼主分享!!!
作者: cw883561    时间: 2016-5-7 16:47
這裡真的是高手如雲......!!!!!
作者: 许寒2012    时间: 2016-5-23 19:05
太感谢楼主了

作者: cw883561    时间: 2016-5-24 10:12
good

作者: cw883561    时间: 2016-5-24 10:26
good
作者: MaxEnding    时间: 2016-5-25 09:23
没有贡献值,伤心。。。怎么得贡献值啊?
作者: cw883561    时间: 2016-5-30 09:12
good
作者: liuanty    时间: 2016-5-30 11:35
谢谢楼主分享!
作者: hy20060614    时间: 2016-6-22 14:39
谢谢分享
作者: hy20060614    时间: 2016-6-23 14:41
谢谢
作者: wu55    时间: 2016-7-7 15:21
谢谢分享
作者: bb00lin    时间: 2016-7-7 16:00
等級不夠看不到.............殘念
作者: bb00lin    时间: 2016-7-7 16:01
等級不夠看不到.............殘念

作者: hy20060614    时间: 2016-7-12 13:45
谢谢分享
作者: mentorkk    时间: 2016-11-15 00:43
謝謝分享!!
作者: wyh12345    时间: 2017-3-22 17:12
你好,我根据你这份代码去编写bom比对skill,我首先需要判断每一份bom表中ref的个数是否正确,不正确也需要打印,但是我新加进的代码无法输出,总数格式不匹配,这是怎么回事呢C:\Users\Administrator\Desktop\1490172883541.jpg
C:\Users\Administrator\Desktop\IMG_20170322_164535.jpg
作者: wyh12345    时间: 2017-3-22 17:20
不好意思,图片太大,附不上去

作者: startlin    时间: 2017-6-17 15:50
謝謝分享
作者: 夕阳下_g7oc6    时间: 2017-6-19 10:22
:)
作者: 夕阳下_g7oc6    时间: 2017-6-19 10:22
:):)
作者: 夕阳下_g7oc6    时间: 2017-6-19 10:22
:):):)
作者: 65770096    时间: 2017-6-27 09:58
只比较网表的话,allegro不是自带有这个功能吗?而且很好用





欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/) Powered by Discuz! X3.2