當前位置:才華齋>IT認證>EDA技術>

Protel到Allegro轉化的方法

EDA技術 閱讀(2.72W)

PROTEL較早就在國內開始使用,在國內的普及率也最高,有些高校的電子專業還專門開設了課程來學習它,下面小編為大家整理了關於Protel到Allegro轉化的方法,一起來看看吧:

Protel到Allegro轉化的方法

由於接觸和使用較早等原因,國內的Protel使用者為數眾多,他們在選擇Cadence高速PCB解決方案的同時,都面臨著如何將手頭的Protel設計移植到Cadence PCB設計軟體中的問題。

  在這個過程當中碰到的問題大致可分為兩種:

一是設計不很複雜,設計師只想藉助Cadence CCT的強大自動佈線功能完成佈線工作;二是設計複雜,設計師需要藉助信噪分析工具來對設計進行信噪模擬,設定線網的佈線拓撲結構等工作。

對於第一種情況,要做的轉化工作比較簡單,可以使用Protel或Cadence提供的Protel到CCT的轉換工具來完成這一工作。對於第二種情況,要做的工作相對複雜一些,下面將這種轉化的方法作一簡單的介紹。

Cadence信噪分析工具的分析物件是Cadence Allegro的brd檔案,而Allegro可以讀入合乎其要求的第三方網表,Protel輸出的Telexis格式的網表滿足Allegro對第三方網表的要求,這樣就可以將Protel檔案注入Allegro。

這裡有兩點請讀者注意。首先,Allegro第三方網表在$PACKAGE段不允許有“.”;其次,在Protel中,我們用BasName[0:N]的形式表示匯流排,用BasName[x]表示匯流排中的一根訊號,Allegro第三方網表中匯流排中的'一根訊號的表示形式為Bas NameX,讀者可以通過直接修改Protel輸出的Telexis網表的方法解決這些問題。

  Allegro在注入第三方網表時還需要每種型別器件的裝置描述檔案檔案,它的格式如下:

Package: package type

Class: classtype

Pincount: total pinnumber

Pinused: ...

其中常用的是PACKAGE,CLASS,PINCOUNT這幾項。PACKAGE描述了器件的封裝,但Allegro在注入網表時會用網表中的PACKAGE項而忽略裝置描述檔案中的這一項。CLASS確定器件的型別,以便信噪分折,Cadence將器件分為IC,IO,DISCRETE三類。PINCOUNT說明器件的管腳數目。對於大多數器件,檔案中包含有這三項就足夠了。

有了第三方網表和裝置描述檔案,我們就可以將Protel中原理圖設計以網表的形式代入到Cadence PCB設計軟體中,接下來,設計師就可以藉助Cadence PCB軟體在高速高密度PCB設計方面的強大功能完成自己的設計。

如果已經在Protel作了PCB佈局的工作,Allegro的script功能可以將Protcl中的佈局在Allegro中重現出來。在Protel中,設計師可以輸出一個Place & Pick檔案,這個檔案中包含了每個器件的位置、旋轉角度和放在PCB頂層還是底層等資訊,可以通過這個檔案很方便的生成一個Allegro的script檔案,在Allegro中執行這個script就能夠重現Protel中的佈局了,下面給出了完成Place & Pick檔案到Allegro Script檔案轉化的C++程式碼,筆者使用這段程式碼,僅用了數分鐘就將一個使用者有800多個器件的PCB板佈局在Allegro重現出來。

FILE *fp1, *fp2;

::AfxMessageBox("hello");

fp1=fopen("", "rt");

if (fp1==NULL) ::AfxMessageBox("Can not open the file!!!");

fp2=fopen("","wt");

if (fp2==NULL) ::AfxMessageBox("Can not create the file!!!");

char refdes[5], Pattern[5];

float midx,midy,refx,refy,padx,pady,rotation;

char tb[1];

char tmp='"';

fprintf(fp2,"%sn", "# Allegro script");

fprintf(fp2,"%sn", "version 13.6");

fprintf(fp2,"%sn", "place refdes");

while (!feof(fp1)) {

fscanf(fp1,"%s", refdes);

fscanf(fp1,"%s", Pattern);

fscanf(fp1,"%f", &midx);

fscanf(fp1,"%f", &midy);

fscanf(fp1,"%f", &refx);

fscanf(fp1,"%f", &refy);

fscanf(fp1,"%f", &padx);

fscanf(fp1,"%f", &pady);

fscanf(fp1,"%s", tb);

fscanf(fp1,"%f", &rotation);

fprintf(fp2, "fillin %c%s%c n",tmp,refdes,tmp);

if (rotation!=0) {

fprintf(fp2, "rotaten");

fprintf(fp2, "iangle %fn", rotation);

};

char yy=tb[0];

if (yy!='T') fprintf(fp2, "pop mirrorn");

fprintf(fp2, "pick %f %f n", padx,pady);

fprintf(fp2, "next n");

};

fprintf(fp2, "done");

fclose(fp1);

fclose(fp2);