找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 3224|回复: 54
打印 上一主题 下一主题

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

[复制链接]

57

主题

1857

帖子

7919

积分

六级会员(60)

Rank: 6Rank: 6

积分
7919
跳转到指定楼层
1#
发表于 2016-2-2 10:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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檔
;                或是其他功能,自己想像.





  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. )
复制代码



本帖子中包含更多资源

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

x

评分

参与人数 3威望 +9 收起 理由
wgs20120904 + 2 很给力!
ginooolu + 2 很给力!
betamelody + 5 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏6 支持!支持! 反对!反对!

0

主题

10

帖子

354

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
354
推荐
发表于 2017-3-22 17:12 | 只看该作者
你好,我根据你这份代码去编写bom比对skill,我首先需要判断每一份bom表中ref的个数是否正确,不正确也需要打印,但是我新加进的代码无法输出,总数格式不匹配,这是怎么回事呢C:\Users\Administrator\Desktop\1490172883541.jpg
C:\Users\Administrator\Desktop\IMG_20170322_164535.jpg

102

主题

377

帖子

1158

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1158
推荐
发表于 2016-2-3 17:08 | 只看该作者
XYX365 发表于 2016-2-3 16:49
我剛才有發現,所以已經刪除,附件沒有修改,必須自行刪除

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

点评

已修改,附件是正常的,  详情 回复 发表于 2016-2-4 08:43

57

主题

1857

帖子

7919

积分

六级会员(60)

Rank: 6Rank: 6

积分
7919
推荐
 楼主| 发表于 2016-2-4 08:43 | 只看该作者
361553894 发表于 2016-2-3 17:08
还有67行,应该是
                       rexCompile(".$")

已修改,附件是正常的,

10

主题

126

帖子

1636

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1636
2#
发表于 2016-2-2 10:51 | 只看该作者
谢谢楼主分享!!!

116

主题

960

帖子

5983

积分

五级会员(50)

Rank: 5

积分
5983
3#
发表于 2016-2-2 14:04 | 只看该作者
謝謝分享

4

主题

68

帖子

685

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
685
4#
发表于 2016-2-2 14:06 | 只看该作者

0

主题

17

帖子

139

积分

二级会员(20)

Rank: 2Rank: 2

积分
139
5#
发表于 2016-2-2 21:57 | 只看该作者
谢谢楼主分享!!!

4

主题

197

帖子

485

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
485
6#
发表于 2016-2-3 09:43 | 只看该作者
谢谢楼主分享!!!

4

主题

197

帖子

485

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
485
7#
发表于 2016-2-3 13:04 | 只看该作者
谢谢楼主分享!!!

102

主题

377

帖子

1158

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1158
8#
发表于 2016-2-3 16:24 | 只看该作者
感谢大神开放源码

点评

後續還有一些簡單的程式會在開放  详情 回复 发表于 2016-2-3 16:31

57

主题

1857

帖子

7919

积分

六级会员(60)

Rank: 6Rank: 6

积分
7919
9#
 楼主| 发表于 2016-2-3 16:31 | 只看该作者
361553894 发表于 2016-2-3 16:24
感谢大神开放源码

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

点评

对我们这些初学者来说,是相当高端的程式了  详情 回复 发表于 2016-2-3 16:34

102

主题

377

帖子

1158

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1158
10#
发表于 2016-2-3 16:34 | 只看该作者
XYX365 发表于 2016-2-3 16:31
後續還有一些簡單的程式會在開放

对我们这些初学者来说,是相当高端的程式了

点评

你可以比較我今年所分享的源代碼,就會發現很多地方寫的都一樣,幾乎可以做成一個模板,稍微修改就成為另一功能,  详情 回复 发表于 2016-2-3 16:41

57

主题

1857

帖子

7919

积分

六级会员(60)

Rank: 6Rank: 6

积分
7919
11#
 楼主| 发表于 2016-2-3 16:41 | 只看该作者
361553894 发表于 2016-2-3 16:34
对我们这些初学者来说,是相当高端的程式了

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

102

主题

377

帖子

1158

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1158
12#
发表于 2016-2-3 16:47 | 只看该作者
第58行的
AADAKDALKDKL
不理解。。

点评

我剛才有發現,所以已經刪除,附件沒有修改,必須自行刪除  详情 回复 发表于 2016-2-3 16:49

57

主题

1857

帖子

7919

积分

六级会员(60)

Rank: 6Rank: 6

积分
7919
13#
 楼主| 发表于 2016-2-3 16:49 | 只看该作者
361553894 发表于 2016-2-3 16:47
第58行的
AADAKDALKDKL
不理解。。

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

点评

还有67行,应该是 rexCompile(".$")  详情 回复 发表于 2016-2-3 17:08

22

主题

396

帖子

5195

积分

五级会员(50)

Rank: 5

积分
5195
15#
发表于 2016-2-4 08:35 | 只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-9-20 06:07 , Processed in 0.078055 second(s), 45 queries , Gzip On.

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

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

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