def setSourceProcessingFlags(config): # set outputFormat explicitly if format or output file are supplied by user. # otherwise, outputFormat is set to inputFormat during parsing if config.outputFormat == None: if config.outputFile: ext = os.path.splitext(config.outputFile)[1] config.outputFormat = Ffile.get_format(ext) setOutputFormat(config.outputFormat) elif (config.outputFormat <> 'fixed') and (config.outputFormat <> 'free'): opt.error( "outputFormat option must be specified with either 'fixed' or 'free' as an argument" ) else: setOutputFormat(config.outputFormat) if config.outputLineLength: setOutputLineLength(config.outputLineLength) if config.inputLineLength: setInputLineLength(config.inputLineLength) # set symtab type defaults Symtab.setTypeDefaults((fs.RealStmt, []), (fs.IntegerStmt, [])) # parse info units if config.infoUnitFile: from PyFort.fortUnit import fortUnitIterator for aUnit in fortUnitIterator(config.infoUnitFile, config.inputFormat): # need to parse this so the type information is available, but do not modify or print units pass # set verbosity DebugManager.setVerbose(config.isVerbose) DebugManager.setQuiet(config.noWarnings) DebugManager.setCheck(config.check)
def compareFiles(assertFunc, originalFileName, RefFileName, format, hoistStrings=False): try: (fd, testFileName) = tempfile.mkstemp() testFile = open(testFileName, 'w') setOutputFormat(format) UnitCanonicalizer.setHoistStringsFlag(hoistStrings) for aUnit in fortUnitIterator(fname_t(originalFileName), format): setOutputFormat(format) UnitCanonicalizer(aUnit).canonicalizeUnit().printit(testFile) testFile.close() testFile = open(testFileName, 'r') testFileLines = testFile.readlines() refFile = open(fname_t(RefFileName), 'r') refFileLines = refFile.readlines() assertFunc( len(testFileLines), len(refFileLines), 'transformation result (' + testFileName + ') and reference file (' + RefFileName + ') have disparate line counts') for testLine, refLine in zip(testFileLines, refFileLines): try: assertFunc(testLine, refLine) except AssertionError, e: print >> sys.stderr, '\ncomparing produced output(' + testFileName + ') and reference file (' + RefFileName + ') fails with:\n' + str( e) raise e refFile.close() testFile.close() os.remove(testFileName)
def main(): usage = '%prog <input_file>' opt = OptionParser(usage=usage) addTransformFileOptions(opt) config,args = opt.parse_args() TransformFileOptErrors(config,args) setTransformFileFlags(config) ActiveTypeHelper.setPlaceholderActiveType(TransformActiveVariables._replacement_type) inputFileList = args if config.outputDir : if not os.path.exists(config.outputDir): os.makedirs(config.outputDir) currentFile = config.vardefs ourOutFileHandle=None try: TransformActiveVariables.getActiveVars(config.vardefs, config.inputFormat) # only one input file if len(inputFileList) == 1 : currentFile = inputFileList[0] ourOutFileHandle = config.outputFile and open(config.outputFile,'w') \ or sys.stdout for aUnit in fortUnitIterator(currentFile,config.inputFormat): TransformActiveVariables(aUnit).transformUnit().printit(ourOutFileHandle) if config.outputFile : ourOutFileHandle.close() # multiple input files else : for anInputFile in inputFileList: currentFile = anInputFile ourOutFileHandle = open(os.path.join(config.outputDir,currentFile),'w') for aUnit in fortUnitIterator(currentFile,config.inputFormat): TransformActiveVariables(aUnit).transformUnit().printit(ourOutFileHandle) ourOutFileHandle.close() except (TransformError,SymtabError,UserError,ScanError,ParseError),e: sys.stderr.write(str(e)+'\n') cleanup(config,ourOutFileHandle) return 1
def main(): global ourOutFileNameList global ourOutFileHandle usage = '%prog [options] <input_file> [additional input files]' opt = OptionParser(usage=usage) addPostProcessorOptions(opt) try: config, args = opt.parse_args() startTime = None if (config.timing): startTime = datetime.datetime.utcnow() PostProcessorOptErrors(opt, config, args) setPostProcessFlags(config, args) ActiveTypeHelper.setPlaceholderActiveType( UnitPostProcessor._replacement_type) ActiveTypeHelper.setPlaceholderActiveType( UnitPostProcessor._abstract_type) # set options for splitting compile units if config.width: splitUnits = True unitNameWidth = config.width else: splitUnits = False DebugManager.debug("running for <input_file>:" + args[0] + " and the following options: " + str(config)) inputFile = args[0] initTriples = caselessDict() initModuleNames = set() if splitUnits: (base, ext) = os.path.splitext(inputFile) unitNumExt = "%0" + str(unitNameWidth) + "d" unit_num = 0 unitStartTime = None if (config.timing): unitStartTime = datetime.datetime.utcnow() for aUnit in fortUnitIterator(inputFile, config.inputFormat): if (config.explicitInit or config.activeVariablesFile): UnitPostProcessor(aUnit).getInitDecls( initTriples, initModuleNames) outputFile = base + unitNumExt % unit_num + ext unit_num += 1 ourOutFileHandle = open(outputFile, 'w') ourOutFileNameList.append(outputFile) UnitPostProcessor(aUnit).processUnit().printit( ourOutFileHandle) ourOutFileHandle.close() globalTypeTable.cleanUpUnitTypeEntries() globalTypeTable.verifyTypeEntries() if (config.progress): msg = 'SourceProcessing: PROGRESS: done with unit ' + aUnit.uinfo.name if (config.timing): nTime = datetime.datetime.utcnow() msg += ' took: ' + str(nTime - unitStartTime) unitStartTime = nTime print msg # add new init procedures & global init procedure at end if (config.explicitInit): addInitProcedures(initTriples,initModuleNames,base=base,unitNumExt=unitNumExt,\ unit_num=unit_num,ext=ext,splitUnits=splitUnits) makeOut = open('postProcess.make', 'w') makeOut.write("POSTPROCESSEDFILES=") for outFileName in ourOutFileNameList: makeOut.write(" \\\n" + outFileName) makeOut.write("\n") makeOut.close() # SEPARATE OUTPUT INTO FILES AS SPECIFIED BY PRAGMAS elif config.separateOutput: ourOutFileHandle = None setFormat = False if config.outputFormat == None: setFormat = True unitStartTime = None if (config.timing): unitStartTime = datetime.datetime.utcnow() for aUnit in fortUnitIterator(inputFile, config.inputFormat): if (config.progress): print 'SourceProcessing: PROGRESS: start with unit ' + aUnit.uinfo.name if (config.explicitInit or config.activeVariablesFile): UnitPostProcessor(aUnit).getInitDecls( initTriples, initModuleNames) # We expect to find file pragmas in the cmnt section of units exclusively if aUnit.cmnt: if (re.search('openad xxx file_start', aUnit.cmnt.rawline, re.IGNORECASE)): # close the previous output file (if any) if ourOutFileHandle: ourOutFileHandle.close() # extract the new output file location (and add path and filename suffixes) (head, tail) = os.path.split( aUnit.cmnt.rawline.split('start [')[1].split(']') [0]) (fileName, fileExtension) = os.path.splitext(tail) outputDirectory = config.pathPrefix + head + config.pathSuffix if outputDirectory == '': outputDirectory = './' if not os.path.exists(outputDirectory): os.makedirs(outputDirectory) if (not setFormat): fileExtension = Ffile.get_extension( config.outputFormat) else: config.outputFormat = Ffile.get_format( fileExtension) setOutputFormat(config.outputFormat) newOutputFile = os.path.join( outputDirectory, fileName + config.filenameSuffix + fileExtension) ourOutFileNameList.append(newOutputFile) ourOutFileHandle = open(newOutputFile, 'w') elif not ourOutFileHandle: raise PostProcessError( 'option separateOutput specified, no output file can be determined for the first unit', 0) # postprocess the unit and print it UnitPostProcessor(aUnit).processUnit().printit( ourOutFileHandle) globalTypeTable.cleanUpUnitTypeEntries() globalTypeTable.verifyTypeEntries() if (config.progress): msg = 'SourceProcessing: PROGRESS: done with unit ' + aUnit.uinfo.name if (config.timing): nTime = datetime.datetime.utcnow() msg += ' took: ' + str(nTime - unitStartTime) unitStartTime = nTime print msg # add new init procedures & global init procedure after module declarations if (config.explicitInit): addInitProcedures(initTriples, initModuleNames, ourOutFileHandle) ourOutFileHandle.close() else: ourOutFileHandle = None if config.outputFile: ourOutFileHandle = open(config.outputFile, 'w') ourOutFileNameList.append(config.outputFile) else: ourOutFileHandle = sys.stdout for aUnit in fortUnitIterator(inputFile, config.inputFormat): if (config.explicitInit or config.activeVariablesFile): UnitPostProcessor(aUnit).getInitDecls( initTriples, initModuleNames) UnitPostProcessor(aUnit).processUnit().printit( ourOutFileHandle) globalTypeTable.cleanUpUnitTypeEntries() globalTypeTable.verifyTypeEntries() # add new init procedures & global init procedure after module declarations if (config.explicitInit): addInitProcedures(initTriples, initModuleNames, ourOutFileHandle) if config.outputFile: ourOutFileHandle.close() UnitPostProcessor.activeDecls(initTriples, initModuleNames) if (config.timing): print 'SourceProcessing: timing: ' + str( datetime.datetime.utcnow() - startTime) except (PostProcessError, UserError, AssemblerException, ListAssemblerException, ParseError, LogicError, ScanError), e: sys.stderr.write(str(e) + '\n') cleanup(config) return 1
def getActiveVars(fileName, inputFormat=None): for aUnit in fortUnitIterator(fileName, inputFormat): ActiveTypeHelper.getCommonDecls( aUnit, TransformActiveVariables(aUnit).__isActiveNamedType, TransformActiveVariables._cTriples)
def main(): global ourOutFileNameList global ourOutFileHandle usage = '%prog [options] <input_file> [additional input files]' opt = OptionParser(usage=usage) addCanonOptions(opt) config, args = opt.parse_args() startTime = None if (config.timing): startTime = datetime.datetime.utcnow() CanonOptErrors(opt, config, args) inputFileList = args setCanonFlags(config) try: if (not (config.outputFile or config.separateOutput)): ourOutFileHandle = sys.stdout if ( len(inputFileList) > 1 ): # output the file start pragma for the subroutinized intrinsics ourOutFileHandle.write('!$openad xxx file_start [' + getModuleName() + '.f90]\n') ourOutFileHandle.flush() for aUnit in makeSubroutinizedIntrinsics(False): aUnit.printit(ourOutFileHandle) currentInputFile = '<none>' for anInputFile in inputFileList: fileStartTime = None if (config.timing): fileStartTime = datetime.datetime.utcnow() if (config.outputFile and not ourOutFileHandle): ourOutFileNameList.append(config.outputFile) ourOutFileHandle = open(config.outputFile, 'w') if (config.separateOutput): if ourOutFileHandle: ourOutFileHandle.close() (head, tail) = os.path.split(anInputFile) (base, extension) = os.path.splitext(tail) outputDirectory = mkOutputDir(config, head) newOutputFile = os.path.join( outputDirectory, base + config.filenameSuffix + ".f90") ourOutFileNameList.append(newOutputFile) ourOutFileHandle = open(newOutputFile, 'w') currentInputFile = anInputFile if (len(inputFileList) > 1): # output the file start pragma ourOutFileHandle.write('!$openad xxx file_start [' + anInputFile + ']\n') ourOutFileHandle.flush() for aUnit in fortUnitIterator(anInputFile, config.inputFormat): UnitCanonicalizer(aUnit).canonicalizeUnit().printit( ourOutFileHandle) #print aUnit.symtab.debug() #print globalTypeTable.debug() globalTypeTable.cleanUpUnitTypeEntries() #print globalTypeTable.debug() globalTypeTable.verifyTypeEntries() if (config.progress): msg = 'SourceProcessing: PROGRESS: done with file ' + anInputFile if (config.timing): nTime = datetime.datetime.utcnow() msg += ' took: ' + str(nTime - fileStartTime) fileStartTime = nTime print msg if config.outputFile or config.separateOutput: ourOutFileHandle.close() if config.separateOutput: outputDirectory = mkOutputDir(config, '') newOutputFile = os.path.join(outputDirectory, getModuleName() + '.f90') if config.outputFile: newOutputFile = tempfile.mktemp() ourOutFileNameList.append(newOutputFile) ourOutFileHandle = open(newOutputFile, 'w') if ( len(inputFileList) > 1 ): # output the file start pragma for the subroutinized intrinsics ourOutFileHandle.write('!$openad xxx file_start [' + getModuleName() + '.f90]\n') ourOutFileHandle.flush() for aUnit in makeSubroutinizedIntrinsics(True): aUnit.printit(ourOutFileHandle) if (config.outputFile): oFile = open(config.outputFile) ourOutFileHandle.write(oFile.read()) oFile.close ourOutFileHandle.close() if (config.outputFile): shutil.move(newOutputFile, config.outputFile) if (config.timing): print 'SourceProcessing: timing: ' + str( datetime.datetime.utcnow() - startTime) except (CanonError, SymtabError, UserError, ScanError, ParseError, LogicError, InferenceError, AssemblerException, ListAssemblerException, FunToSubError), e: sys.stderr.write(str(e) + '\n') cleanup(config) return 1