Beispiel #1
0
    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)
Beispiel #2
0
    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()
Beispiel #3
0
    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')
Beispiel #4
0
 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
Beispiel #5
0
    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()
Beispiel #6
0
 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')
Beispiel #7
0
    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))
Beispiel #8
0
 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)
Beispiel #9
0
    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()
Beispiel #10
0
    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()