編寫PCB設計規則檢查器(DRC)的系統方法
本文引用地址:http://www.104case.com/article/190670.htm
DRC開發:drc_net()函數
drc_net()在PCB設計中遍歷所有網路并檢測任何違反設計規則的故障,然后創建附屬的輸出文件。實現上述功能的基本代碼如下:
[列表4]
這里,iggrpnet()和ignetnxt()函數是在PCB設計中檢查每個網路的ViewBase 例程。ignetnam()函數也是檢查網路名稱的ViewBase例程。ViewBase中的數據類型包括NETS、PINS、COMPONENTS、SYMBOLS和ATTRIBUTES。drc_net()函數可檢測下述違反設計規則的錯誤:
* 非法網路名。如果網路名由ViewDraw自動分配,那么將具有如下格式:$#...#N#...#,第一個#...#表示圖表編號,第二個#...#則表示網路號。PCB設計人員指定的網路名必須以字母開頭,其后的字符數不多于30。
drc_net()函數應調用legal_net_name()函數執行該任務。在UNIX系統中,利用包含在DRC程序中的regexp.h頭文件可以極大地簡化采用C語言編寫的常規表達式匹配/校驗程序。drc_net()應將網路名稱變量和違反設計規則的文件指針存儲在legal_net_name()函數中,該函數具有如下形式:
[列表5]
后端封裝工具pcbfwd也可檢測非法網路名,但其功能受限于簡單的常規表達式。上述代碼可處理任何常規表達式,同樣地,如何在運行pcbfwd工具之前或之后找到非法網路名稱也需要權衡。對于簡單的網路名稱,可以使用pcbfwd。
* 網路上的總線競爭也是嚴重問題。總線競爭有兩類:一類是圖騰柱輸出間的總線競爭,而另一類則是圖騰柱與三態輸出間的總線競爭。基本代碼實現如下所示:
[列表6]
這里,ignetpin()和igpinnnx()函數是在網路上檢查每個引腳的ViewBase例程。igpinown()例程返回引腳實例(系主)指針。函數get_inst_attr()、get_pin_attr() 和get_sheet_num()則返回請求實例屬性(參考標志符REFDES)、引腳屬性(PINTYPE)及引腳實例所在的圖表編號。get_pin_attr()函數的基本代碼如下:
[列表7]
get_inst_attr()函數的基本代碼如下:
[列表8]
get_sheet_num()函數的基本代碼如下:
[列表9]
* POWER和GROUND網路中的非法名稱。這些名稱將與存儲在內部數據結構中的信息(如鏈接列表)進行比較。
* 報告那些具有負載但不具有驅動程序或者具有驅動程序但不具有負載的網路。這可以通過標注網路上每個引腳的類型加以實現。網路應當帶有1個輸出引腳或多個三態輸出引腳及最少一個輸入引腳,此外還可提供與網路全部器件和引腳相關的參考標志符和符號。
* 報告那些不帶上拉電阻或所帶上拉電阻未連接到POWER的所有集電極開路輸出。
* 一旦網路的負載超過常規數目(良好的信號完整性條件下限額為8),那么將打印警告信息。
DRC開發:drc_inst()函數
drc_inst()函數與drc_net()函數類似,不同的是,前者遍歷了全部電路圖表及PCB設計中電路圖表上的所有實例,從而檢測違反規則的設計缺陷或創建附屬的輸出文件。其代碼實現如下:
[列表10]
上面關于drc_net()函數的討論提供了充分的C和ViewBase代碼示例,這里就不在贅述。下面給出了drc_inst()函數可檢測的部分違反規則的設計缺陷:
* 非法或遺漏的符號庫混淆。PCB設計中的所有符號必須來自共同符號庫,使用來自錯誤符號庫的符號是一個極為常見的錯誤,尤其是對于那些只依賴于符號進行設計的后端處理工具。
* 遺失符號和/或引腳屬性,例如那些描述器件幾何結構和引腳類型(in、out、bi和tri)的特性。
* 非法的符號和/或引腳屬性。例如,引腳類型可具有IN值,但不包括INPUT值。這將對后端封裝工具(如pcbfwd)如何為布線工具(如Allegro)提供信息產生影響。
* 符號上的參考標志符值,尤其是對于串行器件(如電阻、電容和電感)。大多數信號完整性工具需要這些器件以字母R、C和L開頭,因此可將這些器件作為串聯元件而非離散器件進行分析。類似地,drc_inst()函數可將其值同描述的屬性進行對比以保證兩者完全匹配。
電路圖符號相關文章:電路圖符號大全
c++相關文章:c++教程
評論