如何快速生成Verilog代碼文件列表?(內附開源C代碼)

微信公眾號:西電通院專用集成電路課程學習

用工具建工程對Verilog進行仿真、綜合或者其它操作時,在寫腳本的時候常常需要工程中Veriog文件的列表,若工程中.v文件過多,則常常需要手動編寫文件列表。本文教給大家用C語言簡單寫的一個自動生成某個文件夾下所有.v文件列表的方法。

如果你覺得本文對你有幫助,歡迎轉發分享或讚賞

使用說明

環境:Windows 7操作系統或其它常用Windows操作系統

編譯器:DEV C++或其它

使用方法:隨便找個C語言的編譯器,靜態編譯生成exe文件後,可隨意拷貝至某文件夾下,雙擊運行,等待輸出rtl.f文件即可。

使用舉例:將生成的exe文件拷貝至C:\modeltech64_10.4目錄下,雙擊運行,如下動圖。

如何快速生成Verilog代碼文件列表?(內附開源C代碼)

生成的rtl.f打開後如下圖所示。

如何快速生成Verilog代碼文件列表?(內附開源C代碼)

另外,該代碼提供了一種操作Windows系統路徑的操作方法,可以簡單修改一下,用作它用。如找到某種類型的文件或某個文件進行拷貝、轉移、修改、刪除等操作。

源代碼

#include

#include

#include

#include

#include

#include

#define FILE_NUM 50000

#define N 50000

static int count_file=0;

typedef struct

{

int num;

char name[800];

int vtype;

}filetype;

filetype files[FILE_NUM];

BOOL IsRoot(LPCTSTR lpszPath)

{

TCHAR szRoot[4];

wsprintf(szRoot, "%c:\", lpszPath[0]);

return (lstrcmp(szRoot, lpszPath) == 0);

}

void FindInAll(LPCTSTR lpszPath)

{

WIN32_FIND_DATA wfd;

TCHAR szFind[MAX_PATH];

HANDLE hFind;

TCHAR szFile[MAX_PATH];

lstrcpy(szFind, lpszPath);

if (!IsRoot(szFind))

lstrcat(szFind, "\");

lstrcat(szFind, "*.*"); // 找所有.v文件

hFind = FindFirstFile(szFind, &wfd);

if (hFind == INVALID_HANDLE_VALUE) // 如果沒有找到或查找失敗

return;

do

{

if (wfd.cFileName[0] == '.')

continue; // 過濾這兩個目錄

if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)

{

if (IsRoot(lpszPath))

wsprintf(szFile, "%s%s", lpszPath, wfd.cFileName);

else

wsprintf(szFile, "%s\\%s", lpszPath, wfd.cFileName);

FindInAll(szFile); // 如果找到的是目錄,則進入此目錄進行遞歸

}

else

{

if (IsRoot(lpszPath))

wsprintf(szFile, "%s%s", lpszPath, wfd.cFileName);

else

wsprintf(szFile, "%s\\%s", lpszPath, wfd.cFileName);

printf("%s\n",szFile);

files[count_file].num=count_file;

strcpy(files[count_file].name,szFile);

count_file = count_file + 1;

//printf("count_file=%d,num=%s\n",count_file, files[count_file-1].name);

// 對文件進行操作

}

} while (FindNextFile(hFind, &wfd));

FindClose(hFind); // 關閉查找句柄

}

int main(int argc, char* argv[])

{

FILE *fp1;

int i,j,k;

char buf[800]=" ";

char buf1[800]=" ";

int type=0;

if ((fp1=fopen("rtl.f","w+"))==NULL)

return;

memset(buf,0,800);

memset(buf1,0,800);

memset(files,0,FILE_NUM*sizeof(filetype));

getcwd(buf, sizeof(buf));

printf("current working directory : %s\n", buf);

FindInAll(buf);

for(i=0;i

{

memset(buf1,0,800);

strcpy(buf1,files[i].name);

type=0;

k=strlen(buf1);

//printf("\n k=%d;",k);

for(j=0;j<=k;j++)

{

if((buf1[j]=='.') && ((buf1[j+1]=='v') || (buf1[j+1]=='V')) && (j==k-2))

//if((buf1[j]=='.') && (j==k-2))

{

//printf("\n j=%d\n",j);

type=1;

files[i].vtype=1;

fprintf(fp1,"%s\n",files[i].name);

}

}

}

getch();

fclose(fp1);

return 0;

}

版本更新記錄


版本號:V1.1.2

更新日期:2013-07-17

14:46:46 修改代碼,擴展name的長度為800,可以處理長路徑的情況

版本號:V1.1.1

更新日期:2013-05-18

10:55:38 修改代碼,添加判斷語句&& (j==k-2),避免.vhd等文件也被列出來

版本號:V1.1.0

更新日期:2013-02-10

14:49:55 已添加對文件名進行判斷,能夠自動的將當前路徑下的所有文件及子文件夾下的.v文件列舉出來。

全文完。


分享到:


相關文章: