📄 jtagdev.cpp
字号:
// JTAGDev.cpp: implementation of the CJTAGDev class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "FluteD.h"
#include "Pin.h"
#include "Group.h"
#include "JTAGDev.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CJTAGDev::CJTAGDev()
{
pInChain = NULL;
pOutChain = NULL;
nPinNumber = 0;
nGroupNumber = 0;
error = ERR_FALSE;
nBSRLength = 0;
nInstLength = 0;
}
CJTAGDev::~CJTAGDev()
{
// destroy temp files !
}
void CJTAGDev::Init(int * in, int *out, int index )
{
pInChain = (in + index);
pOutChain = (out + index);
nPinNumber = 0;
nGroupNumber = 0;
error = ERR_FALSE;
nBSRLength = 0;
nInstLength = 0;
}
int CJTAGDev::SetBSDL(LPCTSTR szFileName, LPCTSTR pkg)
{
#ifdef _LOG
fprintf(lp, "JTAGDev::Setup BSDL ...\n");
#endif
pBSDL = TrimBSDL(szFileName);
if(pBSDL==NULL)
{
error = ERR_TRUE;
return ERR_TRUE;
}
strPackage = CString(pkg);
Parse();
fclose(pBSDL);
return (error);
}
int CJTAGDev::Seek(LPCTSTR key)
{
char buf[1024];
if(error) return ERR_TRUE;
do
{
if(fscanf(pBSDL, "%s", buf) == EOF)
{
error = ERR_TRUE;
return NO_FIND;
}
} while (_stricmp(buf, key) != 0);
return FIND;
}
CString CJTAGDev::GetWord()
{
char buf[1024];
if(fscanf(pBSDL, "%s", buf)==EOF)
{
error = ERR_TRUE;
return CString("");
}
return (CString(buf));
}
FILE * CJTAGDev::TrimBSDL(LPCTSTR szFileName)
{
FILE *fp_org, *fp_trim;
char buf_pre, buf, aux;
fp_org = fopen(szFileName, "rb");
fp_trim = fopen(BSDL_TMP1, "w+b");
if(fp_org == NULL || fp_trim == NULL) return NULL;
fread(&buf_pre, 1, 1, fp_org);
while(fread(&buf, 1, 1, fp_org))
{
if(buf == '-' && buf_pre == '-') // ignore comment
{
while(fread(&aux, 1 ,1 , fp_org)) if(aux == 10 ) break;
fread(&buf_pre, 1, 1, fp_org);
continue;
}
if(buf_pre < 32) buf_pre = 32; // cut off control characters
fwrite(&buf_pre, 1, 1, fp_trim);
switch(buf) // add space before special characters
{
case '"':
case '&':
case '(':
case ')':
case '*':
case ',':
case ':':
case ';':
case '<':
case '=':
case '>':
if(buf_pre != ' ')
{
buf_pre = 32;
fwrite(&buf_pre, 1, 1, fp_trim);
}
}
switch(buf_pre) // add space behind special characters
{
case '"':
case '&':
case '(':
case ')':
case '*':
case ',':
case ':':
case ';':
case '<':
case '=':
case '>':
if(buf != ' ')
{
buf_pre = 32;
fwrite(&buf_pre, 1, 1, fp_trim);
}
}
buf_pre = buf;
};
fwrite(&buf_pre, 1, 1, fp_trim);
fclose(fp_org);
fclose(fp_trim);
// second trim pass
fp_org = fopen(BSDL_TMP1, "rt");
fp_trim = fopen(BSDL_TMP2, "w+t");
if(fp_org == NULL || fp_trim == NULL) return NULL;
char word_pre[1024], word_now[1024], word_next[1024];
fscanf(fp_org, "%s", word_pre);
fscanf(fp_org, "%s", word_now);
while(fscanf(fp_org, "%s", word_next) != EOF)
{
if(stricmp(word_now, "&") == 0 &&
stricmp(word_pre, "\"") == 0 &&
stricmp(word_next, "\"") == 0)
{
word_now[0]=0;
word_pre[0]=0;
word_next[0]=0;
}
if(word_pre[0]) fprintf(fp_trim, "%s ", word_pre);
strcpy(word_pre, word_now);
strcpy(word_now, word_next);
}
fprintf(fp_trim, "%s ", word_pre);
fprintf(fp_trim, "%s ", word_now);
fclose(fp_org);
fclose(fp_trim);
return fopen(BSDL_TMP2, "rt");
}
int CJTAGDev::Pass(LPCTSTR key)
{
char buf[1024];
if(error) return ERR_TRUE;
if(fscanf(pBSDL, "%s", buf)==EOF)
{
error = ERR_TRUE;
AddLog("Syntax ERROR ! ");
AddLog(CString(" - ") + CString(key) + CString(" NOT found"));
return ERR_TRUE;
}
error = _stricmp(buf, key);
return (error);
}
int CJTAGDev::Parse()
{
Seek("entity");
strName = GetWord();
#ifdef _LOG
fprintf(lp, "Get Device: %s\n", strName);
#endif
ParsePort();
ParseStd();
ParsePackag();
ParseInst();
ParseBSR();
#ifdef _LOG
if(error == ERR_FALSE)
fprintf(lp, "BSDL Parse OK\n");
#endif
return error;
}
int CJTAGDev::ParsePort()
{
if(error) return error;
int nPinType, nPinStack;
CString strPinType, strPinName, strPinDim;
CString strOP;
#ifdef _LOG
fprintf(lp, "BSDL Parse of Port Part\n");
#endif
Seek("PHYSICAL_PIN_MAP");
if(strPackage.IsEmpty())
{
Pass(":");
Pass("string");
Pass(":");
Pass("=");
Pass("\"");
strPackage = GetWord();
}
Seek("port");
Pass("(");
while(1)
{
nPinStack = 0;
do
{
do strPinName = GetWord(); while (!strPinName.Compare(";")); // ignore ";"
if(!strPinName.Compare(")"))
{
Pass(";");
return error;
}
strPinName.TrimLeft();
strPinName.TrimRight();
PinTable[nPinNumber+(nPinStack++)] = CPin(strPinName);
strOP = GetWord();
if(strOP.Compare(",") && strOP.Compare(":"))
{
AddLog("Port Description ERROR !");
error = ERR_TRUE;
return error;
}
} while(strOP.Compare(":"));
strPinType = GetWord();
if(!strPinType.CompareNoCase("IN")) nPinType = PIN_IN;
else if(!strPinType.CompareNoCase("OUT")) nPinType = PIN_OUT;
else if(!strPinType.CompareNoCase("BUFFER")) nPinType = PIN_BUFFER;
else if(!strPinType.CompareNoCase("INOUT")) nPinType = PIN_INOUT;
else if(!strPinType.CompareNoCase("LINKAGE")) nPinType = PIN_LINKAGE;
else nPinType = PIN_NA;
strPinDim = GetWord();
if(!strPinDim.CompareNoCase("BIT"))
{
for(int i = 0 ; i < nPinStack; i++ )
PinTable[nPinNumber+i].nType = nPinType;
nPinNumber += nPinStack;
}
if(!strPinDim.CompareNoCase("BIT_VECTOR"))
{
int i,j;
Pass("(");
int num1 = atoi(LPCTSTR(GetWord()));
int step;
if(!GetWord().CompareNoCase("TO")) step = 1;
else step = -1;
int num2 = atoi(LPCTSTR(GetWord()));
Pass(")");
int width = (num2 - num1)*step + 1;
for(i=0; i<nPinStack; i++)
{
AddGroup(CGroup(PinTable[nPinNumber+i].strName, num1, step, num2));
}
for(i=1; i< width; i++)
{
for(j=0; j < nPinStack; j++)
{
PinTable[nPinNumber+i*nPinStack+j] = PinTable[nPinNumber+j];
}
}
for(i=0; i< width; i++)
{
char dim_buf[16];
_itoa((num1 + i*step),dim_buf,10);
CString dim = CString(dim_buf);
for(j=0; j < nPinStack; j++)
{
PinTable[nPinNumber+i*nPinStack+j].strName += dim;
PinTable[nPinNumber+i*nPinStack+j].nType = nPinType;
}
}
nPinNumber += nPinStack*width;
}
}
}
int CJTAGDev::ParseStd()
{
#ifdef _LOG
fprintf(lp, "BSDL Parse of STD Part\n");
#endif
Seek("use");
if(GetWord().CompareNoCase("STD_1149_1_1994.all"))
{
// unknown standard
error = ERR_TRUE;
AddLog("Unknown Standard !");
return error;
};
return ERR_FALSE;
}
int CJTAGDev::ParsePackag()
{
CString strPinName;
CGroup Grp;
char dim_buf[16];
if(error) return error;
#ifdef _LOG
fprintf(lp, "BSDL Parse of Package Part\n");
#endif
Seek("PHYSICAL_PIN_MAP");
Seek(strPackage);
if(error)
{
AddLog("Unknown Package !");
return error;
}
Seek("PIN_MAP_STRING");
Seek("\"");
while(1)
{
do strPinName = GetWord();
while(!strPinName.Compare(")") || !strPinName.Compare(","));
if(!strPinName.Compare("\"")) return error;
Pass(":");
if(IsGroup(strPinName))
{
Grp.strName = strPinName;
GetGroup(Grp);
Pass("(");
for(int i = Grp.nFrom; i != (Grp.nEnd + Grp.nStep); i+=Grp.nStep)
{
_itoa(i, dim_buf, 10);
AssignPin(strPinName+CString(dim_buf), GetWord());
GetWord();
}
if(!GetWord().Compare("\"")) return error;
}
else
{
AssignPin(strPinName, GetWord());
if(!GetWord().Compare("\"")) return error;
}
}
}
int CJTAGDev::AddGroup(CGroup Grp)
{
if(nGroupNumber >= MAX_GROUP)
{
error = ERR_TRUE;
AddLog("Too Many Groups !");
return ERR_TRUE;
}
GroupList[nGroupNumber++] = Grp;
return ERR_FALSE;
}
BOOL CJTAGDev::IsGroup(CString strGName)
{
for(int i=0; i<nGroupNumber; i++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -