📄 jtagdev.cpp
字号:
if(GroupList[i].strName == strGName) return true;
}
return false;
}
int CJTAGDev::GetGroup(CGroup & Grp)
{
for(int i=0; i<nGroupNumber; i++)
{
if(GroupList[i].strName == Grp.strName)
{
Grp.nFrom = GroupList[i].nFrom;
Grp.nStep = GroupList[i].nStep;
Grp.nEnd = GroupList[i].nEnd;
return ERR_FALSE;
}
}
return ERR_TRUE;
}
int CJTAGDev::AssignPin(CString strPinName, CString strPinNumber)
{
strPinName.TrimLeft();
strPinName.TrimRight();
strPinNumber.TrimLeft();
strPinNumber.TrimRight();
for(int i=0; i<nPinNumber; i++)
{
if(PinTable[i].strName == strPinName)
{
PinTable[i].strNumber = strPinNumber;
return ERR_FALSE;
}
}
error = ERR_TRUE;
AddLog("Pin Assignment Failure !");
AddLog(CString(" - ") + strPinName);
return error;
}
int CJTAGDev::ParseInst()
{
#ifdef _LOG
fprintf(lp, "BSDL Parse of Instruction Part\n");
#endif
Seek("INSTRUCTION_LENGTH");
Pass("of");
if(error)
{
AddLog("Instruction Register ERROR !");
return error;
}
Pass(strName);
if(error)
{
AddLog("Device Name Mismatch in Instruction Register Section");
return error;
}
Pass(":");
Pass("entity");
Pass("is");
nInstLength = atoi(GetWord());
#ifdef _LOG
fprintf(lp, "Instruction Length: %d\n", nInstLength);
#endif
lBookMark = ftell(pBSDL);
if(Find("BYPASS"))
{
Pass("(");
nInstBypass = GetBin();
#ifdef _LOG
fprintf(lp, "Get BYPASS: 0x%x\n", nInstBypass);
#endif
}
else
{
AddLog("NO BYPASS Instruction !");
error = ERR_TRUE;
return error;
}
if(Find("SAMPLE"))
{
Pass("(");
nInstSample = GetBin();
#ifdef _LOG
fprintf(lp, "Get SAMPLE/PRELOAD: 0x%x\n", nInstSample);
#endif
}
else
{
AddLog("NO SAMPLE/PRELOAD Instruction !");
error = ERR_TRUE;
return error;
}
if(Find("EXTEST"))
{
Pass("(");
nInstExtest = GetBin();
#ifdef _LOG
fprintf(lp, "Get EXTEST: 0x%x\n", nInstExtest);
#endif
}
else
{
AddLog("NO EXTEST Instruction !");
error = ERR_TRUE;
return error;
}
if(error) return error;
if(Find("IDCODE")) // find optional IDCODE
{
Pass("(");
nInstIdcode = GetBin();
Seek("IDCODE_REGISTER");
Seek("entity");
Pass("is");
Pass("\"");
nIDCode = GetBin();
nIDMask = nBinMask;
#ifdef _LOG
fprintf(lp, "Get IDCode: 0x%lx\n", nIDCode);
#endif
}
else
{
nInstIdcode = -1;
error = 0;
}
return error;
}
int CJTAGDev::Find(LPCSTR key)
{
if(error) return NO_FIND;
fseek(pBSDL, lBookMark, SEEK_SET);
if(Seek(key) == FIND)
{
error = ERR_FALSE;
return FIND;
}
error = ERR_FALSE;
return NO_FIND;
}
unsigned long CJTAGDev::GetBin()
{
char aux;
unsigned long value = 0;
nBinMask = 0;
for(int end = 0; !end; )
{
aux = fgetc(pBSDL);
if(aux == EOF) return value;
switch(aux)
{
case '0':
value <<= 1;
nBinMask <<= 1;
nBinMask += 1;
break;
case '1':
value <<= 1;
nBinMask <<= 1;
nBinMask += 1;
value++;
break;
case 'x':
case 'X':
value <<= 1;
nBinMask <<= 1;
break;
case ' ':
break;
default:
end = 1;
}
}
return (value);
}
int CJTAGDev::CheckID(unsigned long id)
{
#ifdef _LOG
fprintf(lp, "JTAGDev::Check Device ID ...\n");
#endif
if(nIDMask == 0)
{
AddLog("NO ID code available\n");
return ERR_FALSE;
}
if((id&nIDMask) == nIDCode)
{
char aux[256];
sprintf(aux, "ID Code Correct 0x%08lX\n\r\a", nIDCode);
AddLog(aux);
return ERR_FALSE;
}
else
{
char aux[256];
sprintf(aux, "ID CODE ERROR (0x%08lX) Should Be 0x%08lX\n\r\a", id, nIDCode);
AddLog(aux);
return ERR_TRUE;
}
}
int CJTAGDev::ParseBSR()
{
CString strPin, strType, strSafe;
CString strCell;
int i, j, aux;
#ifdef _LOG
fprintf(lp, "BSDL Parse of BSR Part\n");
#endif
Seek("BOUNDARY_LENGTH");
Seek("is");
nBSRLength = atoi(GetWord());
#ifdef _LOG
fprintf(lp, "BSR Length: %d\n", nBSRLength);
#endif
Seek("BOUNDARY_REGISTER");
Seek("is");
Pass("\"");
lBookMark = ftell(pBSDL);
int p;
for(i=0; i<MAX_CELL; i++)
{
nSafeMask[i] = 0;
nSafePatten[i] = 0;
}
j = 0;
do
{
j++;
strCell = GetWord();
i = atoi(strCell);
Pass("(");
GetWord(); // pass VHDL Cell
Pass(",");
strPin = GetItem();
// Pass(","); included in GetItem
strType = GetWord();
Pass(",");
strSafe = GetWord();
if(strSafe.Compare("0") == 0)
{
nSafeMask[i] = 1;
nSafePatten[i] = 0;
}
else if(strSafe.Compare("1") == 0)
{
nSafeMask[i] = 1;
nSafePatten[i] = 1;
}
else
{
nSafeMask[i] = 0;
nSafePatten[i] = 1;
}
if(!strType.CompareNoCase("INPUT"))
{
p=SearchPin(strPin);
if(error)
{
return error;
}
else
{
PinTable[p].pInCell = pInChain + i;
PinTable[p].nInCell = i;
}
}
if(!strType.CompareNoCase("OUTPUT2"))
{
p=SearchPin(strPin);
if(error)
{
return error;
}
else
{
PinTable[p].pOutCell = pOutChain + i;
PinTable[p].nOutCell = i;
}
}
if(!strType.CompareNoCase("OUTPUT3"))
{
p=SearchPin(strPin);
if(error)
{
return error;
}
else
{
PinTable[p].pOutCell = pOutChain + i;
PinTable[p].nOutCell = i;
Pass(",");
aux = atoi(GetWord());
PinTable[p].pCtrlCell = pOutChain + aux;
PinTable[p].nCtrlCell = aux;
Pass(",");
PinTable[p].nAct = !atoi(GetWord());
Pass(",");
GetWord();
}
}
Pass(")");
} while(GetWord().Compare("\"") != 0);
if(j != nBSRLength)
{
AddLog("Miss Pin 1");
error = ERR_TRUE;
}
return error;
}
int CJTAGDev::SearchPin(CString name)
{
for(int i=0; i<nPinNumber; i++)
{
if(PinTable[i].strName == name) return i;
}
return -1;
}
CPin * CJTAGDev::GetPin(LPCTSTR szPNo)
{
for(int i=0; i<nPinNumber; i++)
{
if(!PinTable[i].strNumber.CompareNoCase(szPNo))
return &(PinTable[i]);
}
return NULL;
}
int CJTAGDev::SetSafe()
{
if(!pOutChain) return ERR_TRUE;
for(int i=0; i<nBSRLength; i++)
{
*(pOutChain + i) = nSafePatten[i];
}
return ERR_FALSE;
}
CString CJTAGDev::GetItem()
{
CString value, next;
value = GetWord();
next = CString("");
do
{
value += next;
next = GetWord();
if(next.Compare(")") == 0 || next.Compare("(") == 0)
next = CString("");
} while (next.Compare(",") != 0);
return value;
}
int CJTAGDev::Dump()
{
printf("Device name:%s Device package:%s\n", strName, strPackage);
printf("Devicd ID:0x%lX Device ID mask:0x%lX\n", nIDCode, nIDMask);
printf("Instruction length:%d\n", nInstLength);
printf("Instruction BYPASS:0x%lX\n", nInstBypass);
printf("Instruction EXTEST:0x%lX\n", nInstExtest);
printf("Instruction IDCODE:0x%lX\n", nInstIdcode);
printf("Instruction SAMPLE:0x%lX\n", nInstSample);
printf("Total %d pins\n", nPinNumber);
if(flag_verbose)
{
for(int i=0; i<nPinNumber; i++)
{
printf("#%3d %-12s %-12s In:%3d Out:%3d Ctrl:%3d\n",
i, PinTable[i].strName, PinTable[i].TypeName(), PinTable[i].nInCell, PinTable[i].nOutCell, PinTable[i].nCtrlCell);
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -