Example #1
0
	def visitBopMulInt(self, node:AST.BOp, args=None):
		(prog_1, expr_1) = self.visit(node.expr1)
		(prog_2, expr_2) = self.visit(node.expr2)

		expr_3 = self.getTempVar()
		comment = IR.Comment(str(node.metadata))
		bitlen = node.expr.bitlen
		decl = IR.Decl(expr_3.idf, node.type, node.type.bitlen, node.type.isSecret)
		assign = IR.Assn(expr_3, IRUtil.mul(expr_1, expr_2))
		prog_3 = IRUtil.prog_merge(prog_1, prog_2, IR.Prog([comment, decl, assign]))

		progExtraBefore = IR.Prog([])
		progExtraAfter = IR.Prog([])
		if (Util.Config.disableTruncOpti):
			progExtraAfter = self.addTruncateFunctionCall(node, "MulInt", expr_3, Util.Config.consSF)
		else:
			expr1_sf = self.scaleFacMapping[expr_1.idf]
			expr2_sf = self.scaleFacMapping[expr_2.idf]
			if (expr1_sf > self.scaleFac):
				progExtraBefore = self.addTruncateFunctionCall(node.expr1, "MulInt", expr_1, expr1_sf-self.scaleFac)
				self.scaleFacMapping[expr_1.idf] = self.scaleFac
			if (expr2_sf > self.scaleFac):
				progExtraBefore = IRUtil.prog_merge(progExtraBefore, self.addTruncateFunctionCall(node.expr2, "MulInt", expr_2, expr2_sf-self.scaleFac))
				self.scaleFacMapping[expr_2.idf] = self.scaleFac
			self.scaleFacMapping[expr_3.idf] = 2*self.scaleFac

		prog_3 = IRUtil.prog_merge(progExtraBefore, prog_3, progExtraAfter)
		return (prog_3, expr_3)
Example #2
0
    def visitBopMulInt(self, node: AST.BOp, args=None):
        (prog_1, expr_1) = self.visit(node.expr1)
        (prog_2, expr_2) = self.visit(node.expr2)

        prog_3 = IRUtil.prog_merge(prog_1, prog_2)
        expr_3 = IRUtil.mul(expr_1, expr_2)

        return (prog_3, expr_3)