示例#1
0
	def visitUOp(self, node:AST.UOp, args=None):
		(prog_1, expr_1) = self.visit(node.expr)
		op = node.op
		if op == AST.Operators.ADD:
			return (prog_1, expr_1)
		assert op == AST.Operators.SUB
		
		typ_2 = node.type
		expr_2 = self.getTempVar()
		
		if Type.isInt(typ_2):
			comment = IR.Comment(str(node.metadata))
			bitlen = node.expr.bitlen 
			decl = IR.Decl(expr_2.idf, node.type, typ_2.bitlen, typ_2.isSecret)
			assign = IR.Assn(expr_2, IRUtil.negate(expr_1))
			prog_2 = IRUtil.prog_merge(prog_1, IR.Prog([comment, decl, assign]))
		else:
			# decl fresh vars
			iters = self.getTempIterators(typ_2.dim)

			# cmdl_assn
			expr_1_elt = IRUtil.addIndex(expr_1, iters)
			expr_2_elt = IRUtil.addIndex(expr_2, iters)
			cmdl_assn = IRUtil.loop(typ_2.shape, iters, [IR.Assn(expr_2_elt, IRUtil.negate(expr_1_elt))])
			comment = IR.Comment(str(node.metadata))
			prog_2 = IRUtil.prog_merge(prog_1, IR.Prog([comment] + cmdl_assn))
			prog_2 = IRUtil.prog_merge(IR.Prog([IR.Decl(expr_2.idf, node.type)]), prog_2)

		if not(Util.Config.disableTruncOpti):
			self.scaleFacMapping[expr_2.idf] = self.scaleFacMapping[expr_1.idf]

		return (prog_2, expr_2)
示例#2
0
    def visitUOp(self, node: AST.UOp, args=None):
        (prog_1, expr_1) = self.visit(node.expr)
        op = node.op
        if op == AST.Operators.ADD:
            return (prog_1, expr_1)
        assert op == AST.Operators.SUB

        typ_2 = node.type

        # e : Int
        if Type.isInt(typ_2):
            prog_2 = prog_1
            expr_2 = IRUtil.negate(expr_1)

        # e: Tensor(), or Tensor(..)
        else:
            # decl fresh vars
            expr_2 = self.getTempVar()
            iters = self.getTempIterators(typ_2.dim)

            # cmdl_assn
            expr_1_elt = IRUtil.addIndex(expr_1, iters)
            expr_2_elt = IRUtil.addIndex(expr_2, iters)
            cmdl_assn = IRUtil.loop(
                typ_2.shape, iters,
                [IR.Assn(expr_2_elt, IRUtil.negate(expr_1_elt))])
            comment = IR.Comment(str(node.metadata))
            prog_2 = IRUtil.prog_merge(prog_1, IR.Prog([comment] + cmdl_assn))

            self.decls[expr_2.idf] = [typ_2]
            prog_2 = IRUtil.prog_merge(
                IR.Prog([IR.Decl(expr_2.idf, node.type)]), prog_2)

        return (prog_2, expr_2)