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)
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)