class getEnvVariableWork():
def __init__(self):
self.msgCtrlObj = setEnvMsg("Start to check work directory valid or not")
def getWorkDir(self):
self.curWorkPath = os.getcwd()
reInfo = "(.*)\/" + options.vrfDirName + "\/(\w+)\/(.*)$"
curWorkObj = re.match(reInfo,self.curWorkPath)
if curWorkObj:
self.curProjPath = curWorkObj.group(1)
self.curBlockPath= curWorkObj.group(2)
self.curWrokPath = curWorkObj.group(3)
if self.curWrokPath != "work" and options.localSimCtrl==False:
self.msgCtrlObj.warnMsgPrint("the normal project, simulation start excute from work directory")
os.environ[options.projTopName] = self.curProjPath
elif options.selfDefineWork:
self.msgCtrlObj.infoMsgPrint("Simulation scripts will current directory excute")
elif options.pathCheckCtrl:
self.curProjPath = os.getenv(options.projTopName)
else:
self.msgCtrlObj.errorMsgPrint("no surport excute the scripts in current directory, if you want, please enable --self=Ture")
def getEnvInfo(self):
return self.curProjPath+"/"+options.vrfDirName+"/"+self.curBlockPath, self.curBlockPath, self.curWorkPath
def setSynEnv(self):
self.envPath = os.getenv("PATH")
self.vcsHome = "/edatools/synopsys/VCS"
self.verdiHome = "/edatools/synopsys/Verdi"
self.setPathStr = self.vcsHome + "/bin:" + self.envPath
self.setVerdiPathStr = self.verdiHome + "/bin:" + self.envPath
os.environ["VCS_HOME"] = self.vcsHome
os.environ["NOVAS_HOME"] = self.verdiHome
os.environ["VERDI_HOME"] = self.verdiHome
os.environ["PATH"] = self.setPathStr
os.environ["PATH"] = self.setVerdiPathStr
def setCdnEnv(self):
self.envPath = os.getenv("PATH")
self.ldPath = os.getenv("LD_LIBRARY_PATH")
self.cdsLicFile = "/edatools/tools_setup/lic/cadence_20240819.dat"
self.xlmHome = "/edatools/cadence/XCELIUM"
self.verdiHome = "/edatools/synopsys/Verdi"
self.setXlmStr = self.xlmHome + "/bin:" + self.xlmHome + "/tools/bin:" + self.xlmHome + "/tools/dfII/bin:"
self.setPathStr = self.setXlmStr + self.envPath
self.setLdPathStr= self.xlmHome + "%0s/tools/lib:%0s/share/PLI/IUS/linux64:%0s"%(self.xlmHome,self.verdiHome,self.ldPath)
os.environ["CDS_LIC_FILE"] = self.cdsLicFile
os.environ["PATH"] = self.setPathStr
os.environ["LD_LIBRARY_PATH"] = self.setLdPathStr
def setResourceLimit(self):
resource.setrlimit(resource.RLIMIT_STACK,(resource.RLIM_INFINITY,resource.RLIM_INFINITY))
resource.setrlimit(resource.RLIMIT_AS,(resource.RLIM_INFINITY,resource.RLIM_INFINITY))
resource.setrlimit(resource.RLIMIT_DATA,(resource.RLIM_INFINITY,resource.RLIM_INFINITY))
# TODO generate random seed
class genRandSeed():
def __init__(self):
self.randDataVal = random.randint(1,1000000000)
self.randSymbol = random.randint(0,1)
def genRandData(self):
if self.randSymbol:
self.randDataVal = -self.randDataVal;
return self.randDataVal
# TODO Testcase or Testlist anaysis
class genTestcaselist():
def __init__(self,pjPath):
self.testCaselist = []
self.testCfglist = []
self.msgCtrlObj = setEnvMsg("Analysis testcase and testlist infomation")
self.projPath = pjPath
self.cfgObj = getTestConfig()
self.testCount = 0
self.waveCtrl = False
self.seedWorkCtrl = False
self.compVarList = []
self.compvarCount = 0
def genTestcase(self):
if options.testCfgName!=None:
for cfgName in options.testCfgName:
if cfgName not in self.testCfglist:
self.testCfglist.append(cfgName)
if options.countCtrl:
self.waveCtrl = False
self.seedWorkCtrl = True
if len(self.testCfglist)==0:
self.testCfglist.append(options.caseCfgName)
for testName in options.testNameCtrl:
if os.path.exists(self.projPath+"/"+testName)==False and options.testCheckCtrl==1:
self.msgCtrlObj.fatalMsgPrint("No exist " + testName + " in " + self.projPath)
else:
for cfgName in self.testCfglist:
if options.testCheckCtrl==0:
self.cfgObj.getCfgInfo(self.projPath+"/",cfgName)
else:
self.cfgObj.getCfgInfo(self.projPath+"/"+testName,cfgName)
curCompVar = self.cfgObj.getCompOpts()
if self.compVarList.count(curCompVar)==0:
self.compVarList.append(curCompVar)
self.compvarCount = self.compVarList.index(curCompVar)
curTestCfgName = self.cfgObj.getCfgFileName()
simVarList = self.cfgObj.getSimOpts()
preVarList = self.cfgObj.getPreSimProc()
postVarList = self.cfgObj.getPostSimProc()
falseErrVarList = self.cfgObj.getFalseErr()
expectErrVarList = self.cfgObj.getExpectErr()
falseWarnVarList = self.cfgObj.getFalseWarn()
expectWarnVarList = self.cfgObj.getExpectWarn()
for curCountVal in range(0,options.countCtrl):
if options.seedCtrl:
curSeedData = options.seedCtrl.pop(0)
else:
randSeedObj = genRandSeed()
curSeedData = randSeedObj.genRandData()
curTestcaseInfo = [testName,curSeedData,curTestCfgName,self.compvarCount,self.compVarList[self.compvarCount],simVarList,preVarList,postVarList,falseErrVarList,expectErrVarList,falseWarnVarList,expectWarnVarList]
self.testCaselist.append(curTestcaseInfo)
self.testCount += 1
else:
testNameList = options.testNameCtrl[:]
testcaseCount = len(testNameList)
if options.seedCtrl!=None:
seedCount = len(options.seedCtrl)
else:
seedCount = 1
if len(self.testCfglist)==0:
self.testCfglist.append(options.caseCfgName)
testCfgCount = len(self.testCfglist)
if testcaseCount == 1:
self.waveCtrl = options.waveCtrl
curTestcase = testNameList.pop(0)
if os.path.exists(self.projPath+"/"+curTestcase)==False and options.testCheckCtrl==1:
self.msgCtrlObj.fatalMsgPrint("No exist " + curTestcase + " in " + self.projPath)
else:
seedCountCtrl = int(math.ceil(float(seedCount)/float(testCfgCount)))
for cfgName in self.testCfglist:
if options.testCheckCtrl==0:
self.cfgObj.getCfgInfo(self.projPath+"/",cfgName)
else:
self.cfgObj.getCfgInfo(self.projPath+"/"+curTestcase,cfgName)
curCompVar = self.cfgObj.getCompOpts()
if self.compVarList.count(curCompVar)==0:
self.compVarList.append(curCompVar)
self.compvarCount = self.compVarList.index(curCompVar)
curTestCfgName = self.cfgObj.getCfgFileName()
simVarList = self.cfgObj.getSimOpts()
preVarList = self.cfgObj.getPreSimProc()
postVarList = self.cfgObj.getPostSimProc()
falseErrVarList = self.cfgObj.getFalseErr()
expectErrVarList = self.cfgObj.getExpectErr()
falseWarnVarList = self.cfgObj.getFalseWarn()
expectWarnVarList = self.cfgObj.getExpectWarn()
for seedIdx in range(0,seedCountCtrl):
if options.seedCtrl:
curSeedData = options.seedCtrl.pop(0)
else:
randSeedObj = genRandSeed()
curSeedData = randSeedObj.genRandData()
curTestcaseInfo = [curTestcase,curSeedData,curTestCfgName,self.compvarCount,self.compVarList[self.compvarCount],simVarList,preVarList,postVarList,falseErrVarList,expectErrVarList,falseWarnVarList,expectWarnVarList]
self.testCaselist.append(curTestcaseInfo)
self.testCount += 1
if self.testCount>1:
self.seedWorkCtrl = True
else:
self.seedWorkCtrl = options.seedWorkCtrl
else:
self.waveCtrl = options.waveCtrl
for testName in options.testNameCtrl:
if os.path.exists(self.projPath+"/"+testName)==False and options.testCheckCtrl==1:
self.msgCtrlObj.fatalMsgPrint("No exist " + testName + " in " + self.projPath)
else:
if len(self.testCfglist):
cfgName = self.testCfglist.pop(0)
else:
cfgName = options.caseCfgName
if options.testCheckCtrl==0:
self.cfgObj.getCfgInfo(self.projPath+"/",cfgName)
else:
self.cfgObj.getCfgInfo(self.projPath+"/"+testName,cfgName)
curCompVar = self.cfgObj.getCompOpts()
if self.compVarList.count(curCompVar)==0:
self.compVarList.append(curCompVar)
self.compvarCount = self.compVarList.index(curCompVar)
curTestCfgName = self.cfgObj.getCfgFileName()
simVarList = self.cfgObj.getSimOpts()
preVarList = self.cfgObj.getPreSimProc()
postVarList = self.cfgObj.getPostSimProc()
falseErrVarList = self.cfgObj.getFalseErr()
expectErrVarList = self.cfgObj.getExpectErr()
falseWarnVarList = self.cfgObj.getFalseWarn()
expectWarnVarList = self.cfgObj.getExpectWarn()
if options.seedCtrl:
curSeedData = options.seedCtrl.pop(0)
else:
randSeedObj = genRandSeed()
curSeedData = randSeedObj.genRandData()
curTestcaseInfo = [testName,curSeedData,curTestCfgName,self.compvarCount,self.compVarList[self.compvarCount],simVarList,preVarList,postVarList,falseErrVarList,expectErrVarList,falseWarnVarList,expectWarnVarList]
self.testCaselist.append(curTestcaseInfo)
self.testCount += 1
if self.testCount>1:
self.seedWorkCtrl = True
else:
self.seedWorkCtrl = options.seedWorkCtrl
def genTestlist(self):
curTestname = ""
curCount = ""
curTestCfg = ""
curCompVar = ""
simVar = ""
seedVar = ""
lineInfo = ""
fileHandle = open(options.testListFile,'r')
self.waveCtrl = False
self.seedWorkCtrl = True
while True:
lineContext = fileHandle.readline()
if not lineContext:
break
lineInfo = lineContext.strip()
if len(lineInfo)==0:
continue
reInfo = "^\s*#.*"
lineObj= re.match(reInfo,lineContext)
if lineObj:
continue
else:
testInfoQueue = lineContext.split(";")
if len(testInfoQueue)<=2:
self.msgCtrlObj.fatalMsgPrint("Regression list include testcase and count, current line: %0s"%(lineContext))
curTestname = testInfoQueue[0].strip()
curCount = testInfoQueue[1].strip()
if len(testInfoQueue)>2:
curTestCfg = testInfoQueue[2].strip()
if len(testInfoQueue)>3:
curCompVar = testInfoQueue[3].strip()
if len(testInfoQueue)>4:
simVar = testInfoQueue[4].strip()
#support multi seed
if len(testInfoQueue)>5:
seedVar = testInfoQueue[5].strip()
seedTempVar = re.sub(' +',' ',seedVar)
seedVarList = seedTempVar.split(' ')
if os.path.exists(self.projPath+"/"+curTestname)==False and options.testCheckCtrl==1:
self.msgCtrlObj.fatalMsgPrint("No exist " + curTestname + " in " + self.projPath)
else:
testMacroVarList = []
noMacroVarList = []
compMacroVar = ""
compNoMacroVar = ""
if curTestCfg:
testCfgFile = curTestCfg
elif options.testCfgName!=None:
testCfgFile = options.testCfgName.pop(0)
else:
testCfgFile = options.caseCfgName
if options.testCheckCtrl==0:
self.cfgObj.getCfgInfo(self.projPath+"/",testCfgFile)
else:
self.cfgObj.getCfgInfo(self.projPath+"/"+curTestname,testCfgFile)
#test.cfg compile parameter
testCompVar = self.cfgObj.getCompOpts()
compOptsVar = re.sub(' +',' ',testCompVar)
CompVarList = compOptsVar.split(' ')
CompVarList.sort()
for macroVar in CompVarList:
if macroVar:
macroObj = re.match('\+define\+',macroVar)
if macroObj:
macroTmpVar = re.sub('\+define\+','',macroVar)
macroVarList = macroTmpVar.split('+')
macroVarList.sort()
for compVar in macroVarList:
if compVar not in testMacroVarList:
testMacroVarList.append(compVar)
else:
compVar = re.sub(':',' ',macroVar)
noMacroVarList.append(compVar)
#List compile parameter
testCompVar = curCompVar
compOptsVar = re.sub(' +',' ',testCompVar)
CompVarList = compOptsVar.split(' ')
CompVarList.sort()
for macroVar in CompVarList:
if macroVar:
macroObj = re.match('\+define\+',macroVar)
if macroObj:
macroTmpVar = re.sub('\+define\+','',macroVar)
macroVarList = macroTmpVar.split('+')
macroVarList.sort()
for compVar in macroVarList:
if compVar not in testMacroVarList:
testMacroVarList.append(compVar)
else:
compVar = re.sub(':',' ',macroVar)
noMacroVarList.append(compVar)
#Merge all compile parameter
if len(testMacroVarList):
compMacroVar = "+define+" + "+".join(testMacroVarList)
if len(noMacroVarList):
compNoMacroVar = " ".join(noMacroVarList)
if compMacroVar or compNoMacroVar:
compMacroVar = compMacroVar + " " + compNoMacroVar
if self.compVarList.count(compMacroVar)==0:
self.compVarList.append(compMacroVar)
self.compvarCount = self.compVarList.index(compMacroVar)
#Sim paramter
simVarList = self.cfgObj.getSimOpts()
if simVar:
simVarList = simVarList.strip() + " " + simVar
curTestCfgName = self.cfgObj.getCfgFileName()
preVarList = self.cfgObj.getPreSimProc()
postVarList = self.cfgObj.getPostSimProc()
falseErrVarList = self.cfgObj.getFalseErr()
expectErrVarList = self.cfgObj.getExpectErr()
falseWarnVarList = self.cfgObj.getFalseWarn()
expectWarnVarList = self.cfgObj.getExpectWarn()
for curCountVal in range(0,int(curCount)):
if curCountVal>=len(seedVarList):
randSeedObj = genRandSeed()
curSeedData = randSeedObj.genRandData()
elif seedVarList[curCountVal]:
curSeedData = int(seedVarList[curCountVal])
else:
randSeedObj = genRandSeed()
curSeedData = randSeedObj.genRandData()
curTestcaseInfo = [curTestname,curSeedData,curTestCfgName,self.compvarCount,self.compVarList[self.compvarCount],simVarList,preVarList,postVarList,falseErrVarList,expectErrVarList,falseWarnVarList,expectWarnVarList]
self.testCaselist.append(curTestcaseInfo)
self.testCount += 1
fileHandle.close()
def getTestList(self):
return self.testCaselist
def getWaveCtrl(self):
return self.waveCtrl
def getSeedPathCtrl(self):
return self.seedWorkCtrl
def getTestcaseCount(self):
return self.testCount
def getCompVar(self):
return self.compVarList