2016-11-08 18:57:35 +01:00
|
|
|
import os
|
|
|
|
|
|
|
|
|
|
class GdsStreamer:
|
|
|
|
|
"""
|
|
|
|
|
This class is used to stream GDS files in and out of the Cadence toolsuite.
|
|
|
|
|
"""
|
|
|
|
|
def __init__(self, workingDirectory = "."):
|
|
|
|
|
self.workingDirectory = os.path.abspath(workingDirectory)
|
2020-11-03 15:29:17 +01:00
|
|
|
|
2016-11-08 18:57:35 +01:00
|
|
|
def createStreamOutTemplate(self, sourceLibraryName, sourceCellName, gdsDestinationPath):
|
|
|
|
|
templateFile = open(self.workingDirectory+"/partStreamOut.tmpl","w")
|
|
|
|
|
templateFile.write("streamOutKeys = list(nil\n")
|
|
|
|
|
templateFile.write("'runDir \".\"\n")
|
|
|
|
|
templateFile.write("'libName \""+sourceLibraryName+"\"\n")
|
|
|
|
|
templateFile.write("'primaryCell \""+sourceCellName+"\"\n")
|
|
|
|
|
templateFile.write("'viewName \"layout\"\n")
|
|
|
|
|
templateFile.write("'outFile \""+gdsDestinationPath+"/"+sourceCellName+".gds\"\n")
|
|
|
|
|
templateFile.write("'scale 0.001000\n")
|
|
|
|
|
templateFile.write("'units \"micron\"\n")
|
|
|
|
|
templateFile.write("'compression \"none\"\n")
|
|
|
|
|
templateFile.write("'hierDepth 32\n")
|
|
|
|
|
templateFile.write("'convertToGeo nil\n")
|
|
|
|
|
templateFile.write("'maxVertices 200\n")
|
|
|
|
|
templateFile.write("'refLib nil\n")
|
|
|
|
|
templateFile.write("'libVersion \"5.0\"\n")
|
|
|
|
|
templateFile.write("'checkPolygon nil\n")
|
|
|
|
|
templateFile.write("'snapToGrid nil\n")
|
|
|
|
|
templateFile.write("'simMosaicToArray t\n")
|
|
|
|
|
templateFile.write("'caseSensitivity \"preserve\"\n")
|
|
|
|
|
templateFile.write("'lineToZeroPath \"path\"\n")
|
|
|
|
|
templateFile.write("'convertDot \"ignore\"\n")
|
|
|
|
|
templateFile.write("'rectToBox nil\n")
|
|
|
|
|
templateFile.write("'convertPathToPoly nil\n")
|
|
|
|
|
templateFile.write("'keepPcell nil\n")
|
|
|
|
|
templateFile.write("'replaceBusBitChar nil\n")
|
|
|
|
|
templateFile.write("'useParentXYforText nil\n")
|
|
|
|
|
templateFile.write("'reportPrecision nil\n")
|
|
|
|
|
templateFile.write("'runQuiet nil\n")
|
|
|
|
|
templateFile.write("'comprehensiveLog nil\n")
|
|
|
|
|
templateFile.write("'ignorePcellEvalFail nil\n")
|
|
|
|
|
templateFile.write("'errFile \"PIPO.LOG\"\n")
|
|
|
|
|
templateFile.write("'NOUnmappingLayerWarning nil\n")
|
|
|
|
|
templateFile.write("'techFileChoice nil\n")
|
|
|
|
|
templateFile.write("'pcellSuffix \"DbId\"\n")
|
|
|
|
|
templateFile.write("'respectGDSIILimits nil\n")
|
|
|
|
|
templateFile.write("'dumpPcellInfo nil\n")
|
|
|
|
|
templateFile.write("'genListHier nil\n")
|
|
|
|
|
templateFile.write("'cellMapTable \"\"\n")
|
|
|
|
|
templateFile.write("'layerTable \"\"\n")
|
|
|
|
|
templateFile.write("'textFontTable \"\"\n")
|
|
|
|
|
templateFile.write("'convertPin \"geometry\"\n")
|
|
|
|
|
templateFile.write("'pinInfo 0\n")
|
|
|
|
|
templateFile.write("'pinTextMapTable \"\"\n")
|
|
|
|
|
templateFile.write("'propMapTable \"\"\n")
|
|
|
|
|
templateFile.write("'propSeparator \",\"\n")
|
|
|
|
|
templateFile.write("'userSkillFile \"\"\n")
|
|
|
|
|
templateFile.write("'rodDir \"\"\n")
|
|
|
|
|
templateFile.write("'refLibList \"\"\n")
|
|
|
|
|
templateFile.write(")\n")
|
|
|
|
|
templateFile.close()
|
|
|
|
|
|
|
|
|
|
def createStreamInTemplate(self, sourceLibraryName = None,inputGdsPath = None, retainReferenceLibraries = True):
|
|
|
|
|
# retainReferenceLibraries added to tell PIPO whether it should import all SREFS as new cellviews or to
|
|
|
|
|
#look inside of existing libraries for cellviews with the same name.
|
|
|
|
|
templateParameters = dict()
|
|
|
|
|
if retainReferenceLibraries:
|
|
|
|
|
templateParameters["ref"] = "t"
|
|
|
|
|
else:
|
|
|
|
|
templateParameters["ref"] = "nil"
|
|
|
|
|
templateFile = open(self.workingDirectory+"/partStreamIn.tmpl","w")
|
|
|
|
|
templateFile.write("streamInKeys = list(nil\n")
|
|
|
|
|
templateFile.write("'runDir \".\"\n")
|
2020-11-03 15:29:17 +01:00
|
|
|
templateFile.write("'inFile \""+inputGdsPath+"\"\n")
|
2016-11-08 18:57:35 +01:00
|
|
|
templateFile.write("'primaryCell \"\"\n")
|
|
|
|
|
templateFile.write("'libName \""+sourceLibraryName+"\"\n")
|
|
|
|
|
templateFile.write("'techFileName \"\"\n")
|
|
|
|
|
templateFile.write("'scale 0.001000\n")
|
|
|
|
|
templateFile.write("'units \"micron\"\n")
|
|
|
|
|
templateFile.write("'errFile \"PIPO.LOG\"\n")
|
|
|
|
|
templateFile.write("'refLib "+templateParameters["ref"]+"\n")
|
|
|
|
|
templateFile.write("'hierDepth 32\n")
|
|
|
|
|
templateFile.write("'maxVertices 1024\n")
|
|
|
|
|
templateFile.write("'checkPolygon nil\n")
|
|
|
|
|
templateFile.write("'snapToGrid nil\n")
|
|
|
|
|
templateFile.write("'arrayToSimMosaic t\n")
|
|
|
|
|
templateFile.write("'caseSensitivity \"preserve\"\n")
|
|
|
|
|
templateFile.write("'zeroPathToLine \"path\"\n")
|
|
|
|
|
templateFile.write("'convertNode \"ignore\"\n")
|
|
|
|
|
templateFile.write("'keepPcell nil\n")
|
|
|
|
|
templateFile.write("'replaceBusBitChar nil\n")
|
2020-11-03 15:29:17 +01:00
|
|
|
templateFile.write("'skipUndefinedLPP nil\n")
|
2016-11-08 18:57:35 +01:00
|
|
|
templateFile.write("'ignoreBox nil\n")
|
|
|
|
|
templateFile.write("'mergeUndefPurposToDrawing nil\n")
|
|
|
|
|
templateFile.write("'reportPrecision nil\n")
|
|
|
|
|
templateFile.write("'keepStreamCells nil\n")
|
|
|
|
|
templateFile.write("'attachTechfileOfLib \"\"\n")
|
|
|
|
|
templateFile.write("'runQuiet nil\n")
|
|
|
|
|
templateFile.write("'noWriteExistCell nil\n")
|
|
|
|
|
templateFile.write("'NOUnmappingLayerWarning nil\n")
|
|
|
|
|
templateFile.write("'comprehensiveLog nil\n")
|
|
|
|
|
templateFile.write("'ignorePcellEvalFail nil\n")
|
|
|
|
|
templateFile.write("'appendDB nil\n")
|
|
|
|
|
templateFile.write("'genListHier nil\n")
|
|
|
|
|
templateFile.write("'cellMapTable \"\"\n")
|
|
|
|
|
templateFile.write("'layerTable \"\"\n")
|
|
|
|
|
templateFile.write("'textFontTable \"\"\n")
|
|
|
|
|
templateFile.write("'restorePin 0\n")
|
|
|
|
|
templateFile.write("'propMapTable \"\"\n")
|
|
|
|
|
templateFile.write("'propSeparator \",\"\n")
|
|
|
|
|
templateFile.write("'userSkillFile \"\"\n")
|
|
|
|
|
templateFile.write("'rodDir \"\"\n")
|
2020-11-03 15:29:17 +01:00
|
|
|
templateFile.write("'refLibOrder \"\"\n")
|
2016-11-08 18:57:35 +01:00
|
|
|
templateFile.write(")\n")
|
|
|
|
|
templateFile.close()
|
2020-11-03 15:29:17 +01:00
|
|
|
|
2016-11-08 18:57:35 +01:00
|
|
|
def streamFromCadence(self, cadenceLibraryContainerPath, libraryName, cellName, outputPath):
|
|
|
|
|
#change into the cadence directory
|
|
|
|
|
outputPath = os.path.abspath(outputPath)
|
|
|
|
|
currentPath = os.path.abspath(".")
|
|
|
|
|
os.chdir(cadenceLibraryContainerPath)
|
|
|
|
|
self.createStreamOutTemplate(libraryName,cellName,outputPath)
|
|
|
|
|
#stream the gds out from cadence
|
|
|
|
|
worker = os.popen("pipo strmout "+self.workingDirectory+"/partStreamOut.tmpl")
|
|
|
|
|
#dump the outputs to the screen line by line
|
2018-05-12 01:32:00 +02:00
|
|
|
print("Streaming Out From Cadence......")
|
2016-11-08 18:57:35 +01:00
|
|
|
while 1:
|
|
|
|
|
line = worker.readline()
|
|
|
|
|
if not line: break #this means sim is finished so jump out
|
2018-05-12 01:32:00 +02:00
|
|
|
#else: print(line) #for debug only
|
2016-11-08 18:57:35 +01:00
|
|
|
worker.close()
|
|
|
|
|
#now remove the template file
|
|
|
|
|
os.remove(self.workingDirectory+"/partStreamOut.tmpl")
|
|
|
|
|
#and go back to whever it was we started from
|
|
|
|
|
os.chdir(currentPath)
|
2020-11-03 15:29:17 +01:00
|
|
|
|
2016-11-08 18:57:35 +01:00
|
|
|
def streamToCadence(self,cadenceLibraryContainerPath, libraryName, inputPath):
|
|
|
|
|
#change into the cadence directory
|
|
|
|
|
inputPath = os.path.abspath(inputPath)
|
|
|
|
|
currentPath = os.path.abspath(".")
|
|
|
|
|
os.chdir(cadenceLibraryContainerPath)
|
|
|
|
|
self.createStreamInTemplate(libraryName,inputPath)
|
|
|
|
|
#stream the gds out from cadence
|
|
|
|
|
worker = os.popen("pipo strmin "+self.workingDirectory+"/partStreamIn.tmpl")
|
|
|
|
|
#dump the outputs to the screen line by line
|
2018-05-12 01:32:00 +02:00
|
|
|
print("Streaming In To Cadence......")
|
2016-11-08 18:57:35 +01:00
|
|
|
while 1:
|
|
|
|
|
line = worker.readline()
|
|
|
|
|
if not line: break #this means sim is finished so jump out
|
2018-05-12 01:32:00 +02:00
|
|
|
#else: print(line) #for debug only
|
2016-11-08 18:57:35 +01:00
|
|
|
worker.close()
|
|
|
|
|
#now remove the template file
|
|
|
|
|
os.remove(self.workingDirectory+"/partStreamIn.tmpl")
|
|
|
|
|
#and go back to whever it was we started from
|
2018-05-12 01:32:00 +02:00
|
|
|
os.chdir(currentPath)
|