def printLocalVarDecls(self, ir): tempSize = 0 for var in ir.varDecls.keys(): if forFloat() and var not in self.internalVars: typ_str = IR.DataType.getFloatStr() else: typ_str = IR.DataType.getIntStr() if config.vbwEnabled: if hasattr(self, 'varsForBitwidth'): typ_str = ("int%d_t" % (self.varsForBitwidth[var])) if var in self.varsForBitwidth else typ_str else: assert False, "VBW enabled but bitwidth info missing" idf_str = var type = ir.varDecls[var] if Type.isInt(type): shape_str = '' elif Type.isTensor(type): shape_str = ''.join(['[' + str(n) + ']' for n in type.shape]) self.out.printf('%s %s%s;\n', typ_str, idf_str, shape_str, indent=True) if forArduino(): if Type.isTensor(type): bw = self.varsForBitwidth[var] if var in self.varsForBitwidth else config.wordLength size = np.prod(type.shape) * bw // 8 tempSize += (size if var not in self.scratchSubs else 0) if forArduino(): self.currentRAMestimate += tempSize self.maxRAMestimate = max(self.maxRAMestimate, self.currentRAMestimate)
def printSuffix(self, expr: IR.Expr): self.out.printf('\n') type = self.decls[expr.idf] if Type.isInt(type): self.out.printf('return ', indent=True) self.print(expr) self.out.printf(';\n') elif Type.isTensor(type): idfr = expr.idf exponent = self.scales[expr.idf] num = 2**exponent if type.dim == 0: self.out.printf('cout << ', indent=True) self.out.printf('float(' + idfr + ')*' + str(num)) self.out.printf(' << endl;\n') else: iters = [] for i in range(type.dim): s = chr(ord('i') + i) tempVar = IR.Var(s) iters.append(tempVar) expr_1 = IRUtil.addIndex(expr, iters) cmds = IRUtil.loop(type.shape, iters, [IR.PrintAsFloat(expr_1, exponent)]) self.print(IR.Prog(cmds)) else: assert False self.out.decreaseIndent() self.out.printf('}\n', indent=True) self.out.close()
def printVarDecls(self): for decl in self.decls: if decl in self.globalVars: continue if forFloat() and decl not in self.internalVars: typ_str = IR.DataType.getFloatStr() else: typ_str = IR.DataType.getIntStr() if config.vbwEnabled: if hasattr(self, 'varsForBitwidth'): typ_str = ( "int%d_t" % (self.varsForBitwidth[decl]) ) if decl in self.varsForBitwidth else typ_str else: assert False, "VBW enabled but bitwidth info missing" idf_str = decl type = self.decls[decl] if Type.isInt(type): shape_str = '' elif Type.isTensor(type): shape_str = ''.join(['[' + str(n) + ']' for n in type.shape]) self.out.printf('%s %s%s;\n', typ_str, idf_str, shape_str, indent=True) self.out.printf('\n')
def updateRAMafterDealloc(self, ir): tempSize = 0 for var in ir.varDecls.keys(): if forArduino(): type = ir.varDecls[var] if Type.isTensor(type): bw = self.varsForBitwidth[var] if var in self.varsForBitwidth else config.wordLength size = np.prod(type.shape) * bw // 8 tempSize += (size if var not in self.scratchSubs else 0) if forArduino(): self.currentRAMestimate -= tempSize
def printVarDecls(self): varsFilePath = os.path.join(self.outputDir, "vars_" + getVersion() + ".h") varsFile = Writer(varsFilePath) varsFile.printf("#pragma once\n\n") varsFile.printf("#include \"datatypes.h\"\n\n") varsFile.printf("namespace vars_%s {\n" % (getVersion())) varsFile.increaseIndent() for decl in self.decls: if decl in self.globalVars: continue if forFloat() and decl not in self.internalVars: typ_str = IR.DataType.getFloatStr() else: typ_str = IR.DataType.getIntStr() idf_str = decl type = self.decls[decl] if Type.isInt(type): shape_str = '' elif Type.isTensor(type): shape_str = ''.join(['[' + str(n) + ']' for n in type.shape]) self.out.printf('%s vars_%s::%s%s;\n', typ_str, getVersion(), idf_str, shape_str, indent=True) varsFile.printf('extern %s %s%s;\n', typ_str, idf_str, shape_str, indent=True) self.out.printf('\n') varsFile.decreaseIndent() varsFile.printf("}\n") varsFile.close() self.generateDebugProgram()
def printVarDecls(self): for decl in self.decls: if decl in self.globalVars: continue typ_str = IR.DataType.getIntStr() idf_str = decl type = self.decls[decl] if Type.isInt(type): shape_str = '' elif Type.isTensor(type): shape_str = ''.join(['[' + str(n) + ']' for n in type.shape]) self.out.printf('%s %s%s;\n', typ_str, idf_str, shape_str, indent=True) self.out.printf('\n')
def printSuffix(self, expr: IR.Expr): self.out.printf('\n') type = self.decls[expr.idf] if Type.isInt(type): self.out.printf('return ', indent=True) self.print(expr) self.out.printf(';\n') elif Type.isTensor(type): idfr = expr.idf exponent = self.scales[expr.idf] num = 2**exponent if type.dim == 0: self.out.printf('Serial.println(', indent=True) self.out.printf('float(' + idfr + ')*' + str(num)) self.out.printf(', 6);\n') else: iters = [] for i in range(type.dim): s = chr(ord('i') + i) tempVar = IR.Var(s) iters.append(tempVar) expr_1 = IRUtil.addIndex(expr, iters) cmds = IRUtil.loop(type.shape, iters, [IR.PrintAsFloat(expr_1, exponent)]) self.print(IR.Prog(cmds)) else: assert False self.out.decreaseIndent() self.out.printf('}\n', indent=True) self.out.close() with open(os.path.join(self.outputDir, "ram.usage"), "w") as f: f.write("Estimate RAM usage :: %d bytes" % (self.maxRAMestimate))
def printLocalVarDecls(self, ir): for var in ir.varDecls.keys(): if forFloat() and var not in self.internalVars: typ_str = IR.DataType.getFloatStr() else: typ_str = IR.DataType.getIntStr() if config.vbwEnabled: if hasattr(self, 'varsForBitwidth'): typ_str = ( "int%d_t" % (self.varsForBitwidth[var]) ) if var in self.varsForBitwidth else typ_str else: assert False, "VBW enabled but bitwidth info missing" idf_str = var type = ir.varDecls[var] if Type.isInt(type): shape_str = '' elif Type.isTensor(type): shape_str = ''.join(['[' + str(n) + ']' for n in type.shape]) self.out.printf('%s %s%s;\n', typ_str, idf_str, shape_str, indent=True)
def printSuffix(self, expr: IR.Expr): self.out.printf('\n') if config.vbwEnabled and forFixed(): bw = self.varsForBitwidth['X'] typ_str = "int%d_t" % bw size = self.decls['X'].shape sizestr = ''.join([("[%d]" % i) for i in size]) Xindexstr = '' Xintstar = ''.join(["*" for i in size]) for i in range(len(size)): Xindexstr += (("[i%d]" % (i - 1)) if i > 0 else "") self.out.printf("for (int i%d = 0; i%d < %d; i%d ++ ){\n" % (i, i, size[i], i), indent=True) self.out.increaseIndent() for i in range(len(size) - 1, -1, -1): self.out.decreaseIndent() self.out.printf("}\n", indent=True) self.out.printf("delete[] X%s;\n" % (Xindexstr), indent=True) Xindexstr = Xindexstr[:-4] if len(Xindexstr) > 0 else Xindexstr assert len( size ) < 10, "Too simple logic for printing indices used, cannot handle 10+ Dim Tensors" type = self.decls[expr.idf] if Type.isInt(type): self.out.printf('return ', indent=True) self.print(expr) self.out.printf(';\n') elif Type.isTensor(type): idfr = expr.idf exponent = self.scales[expr.idf] num = 2**exponent if type.dim == 0: self.out.printf('cout << ', indent=True) self.out.printf('float(' + idfr + ')*' + str(num)) self.out.printf(' << endl;\n') else: iters = [] for i in range(type.dim): s = chr(ord('i') + i) tempVar = IR.Var(s) iters.append(tempVar) expr_1 = IRUtil.addIndex(expr, iters) cmds = IRUtil.loop(type.shape, iters, [IR.PrintAsFloat(expr_1, exponent)]) self.print(IR.Prog(cmds)) else: assert False self.out.decreaseIndent() self.out.printf('}\n', indent=True) def isInt(a): try: int(a) return True except: return False if forFixed(): if (int(self.printSwitch) if isInt(self.printSwitch) else -2) > -1: self.out.printf("const int switches = %d;\n" % (int(self.printSwitch)), indent=True) self.out.printf( 'void seedotFixedSwitch(int i, MYINT **X_temp, int& res) {\n', indent=True) self.out.increaseIndent() self.out.printf('switch(i) {\n', indent=True) self.out.increaseIndent() for i in range(int(self.printSwitch)): self.out.printf( 'case %d: res = seedotFixed%d(X_temp); return;\n' % (i, i + 1), indent=True) self.out.printf('default: res = -1; return;\n', indent=True) self.out.decreaseIndent() self.out.printf('}\n', indent=True) self.out.decreaseIndent() self.out.printf('}\n', indent=True) if debugCompiler(): print("Closing File after outputting cpp code: ID " + self.idStr) self.out.close()
def printVarDecls(self, globalVarDecl=True): if self.generateAllFiles: varsFilePath = os.path.join(self.outputDir, "vars_" + getVersion() + ".h") varsFile = Writer(varsFilePath) varsFile.printf("#pragma once\n\n") varsFile.printf("#include \"datatypes.h\"\n\n") varsFile.printf("namespace vars_%s {\n" % (getVersion())) varsFile.increaseIndent() for decl in self.decls: if decl in self.globalVars: continue if forFloat() and decl not in self.internalVars: typ_str = IR.DataType.getFloatStr() elif forFixed() and decl not in self.internalVars: if config.vbwEnabled and decl not in self.internalVars: bw = self.varsForBitwidth.get(decl, config.wordLength) typ_str = "int%d_t" % bw else: typ_str = IR.DataType.getIntStr() else: typ_str = IR.DataType.getIntStr() idf_str = decl type = self.decls[decl] if Type.isInt(type): shape_str = '' elif Type.isTensor(type): shape_str = ''.join(['[' + str(n) + ']' for n in type.shape]) if not config.vbwEnabled: self.out.printf('%s vars_%s::%s%s;\n', typ_str, getVersion(), idf_str, shape_str, indent=True) if self.generateAllFiles: varsFile.printf('extern %s %s%s;\n', typ_str, idf_str, shape_str, indent=True) else: if forFixed( ) and idf_str in self.varsForBitwidth and idf_str[:3] == "tmp": if globalVarDecl: for bw in config.availableBitwidths: self.out.printf("int%d_t vars_%s::%s_%d%s;\n", bw, getVersion(), idf_str, bw, shape_str, indent=True) else: self.out.printf("int%d_t %s_%d%s;\n", self.varsForBitwidth[idf_str], idf_str, bw, shape_str, indent=True) else: if globalVarDecl: self.out.printf("%s vars_%s::%s%s;\n", typ_str, getVersion(), idf_str, shape_str, indent=True) else: self.out.printf("%s %s%s;\n", typ_str, idf_str, shape_str, indent=True) if self.generateAllFiles: if forFixed( ) and idf_str in self.varsForBitwidth and idf_str[: 3] == "tmp": for bw in config.availableBitwidths: varsFile.printf("extern int%d_t %s_%d%s;\n", bw, idf_str, bw, shape_str, indent=True) else: varsFile.printf("extern %s %s%s;\n", typ_str, idf_str, shape_str, indent=True) self.out.printf('\n') if self.generateAllFiles: varsFile.decreaseIndent() varsFile.printf("}\n") varsFile.close() self.generateDebugProgram()