def compile(self, options): modules = Constants() # dict nextModules = set(['main']) debugData = {} for path in options.moduleSearchPath: if not os.path.isdir(path): raise CompilerError(None, None, "Module search path '%s' does not exist" % path) while nextModules: nextModule = nextModules.pop() if nextModule in modules: continue if options.verboseprogress: print 'Parsing module %s...' % nextModule modules[nextModule], foundModuleReferences = self.parse(options, nextModule) nextModules.update(foundModuleReferences) if options.verboseprogress: print 'Resolving identifiers...' self.resolveIdentifiers(modules) datafields, functions = self.merge(modules) self.registerIdentifiers(datafields, functions) self.verifyIdentifiers(datafields, functions) self.checkIdentifierUsage(datafields, functions) if options.optimize and False: if options.verboseprogress: print 'Optimizing source...' self.optimizeSyntaxTree(datafields, functions) print 'Max stack usage: %d bytes' % (functions['main.main'].stackUsage(functions) + 2) ihStackUsage = 0 for function in functions: if function.startswith('interrupts.handler_'): ihStackUsage = max(ihStackUsage, functions[function].stackUsage(functions) + 2) if ihStackUsage: print 'Handling interrupts costs max %d bytes (%d with interrupted interrupts)' % (ihStackUsage, ihStackUsage * 2) if options.optimize: print 'Note: stack usage could be less, because optimization is enabled' if options.verboseprogress: print 'Generating assembly...' program, maxStackSize, internalMemoryEndAddress, externalMemoryEndAddress, newDebugData = asmgenerator.transform(datafields, functions) debugData.update(newDebugData) if options.optimize: if options.verboseprogress: print 'Optimizing assembly...' self.optimizeAsm(options, program) self.printAsmStatistics(program) self.checkCodeSize(program) print 'Stack space available: %d bytes' % maxStackSize if options.verboseinfo: if internalMemoryEndAddress >= 0x0E: print 'Internal memory used: 0x0E-0x%02X' % internalMemoryEndAddress if externalMemoryEndAddress >= 0x4000: print 'External memory used: 0x4000-0x%X' % externalMemoryEndAddress asm, newDebugData = asmgenerator.programToAsm(program, options) debugData.update(newDebugData) debugDataJson = json.dumps(debugData, allow_nan=False, indent=4) return asm, debugDataJson