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
Example #5
0
 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