def _doMap(self, ctx, idx, ref): rf = ctx.getRef(ref) if isinstance(idx, Node): idx = ctx.getRef(idx) v = rf.typ.irWithIndex(idx)(rf) ir = v["ir"] if "inNode" in v: # ground type name = ctx.getName(self) node = low_ir.DefNode(name, ir) ctx.appendFinalStatement(node, self.scopeId) ref = low_ir.Reference(name, ir.typ) ctx.updateRef(self, ref) return ref elif "inPort" in v: # memory type name = ctx.getName(self) memPort = ir(name, rf, ctx.getClock(), self._mem_rw if has_attr(self, "_mem_rw") else True) ctx.appendFinalStatement(memPort, self.scopeId) ref = low_ir.Reference(name, rf.typ.typ) ctx.updateRef(self, ref) return ref else: return ir
def mapToIR(self, ctx: EmitterContext): name = ctx.getName(self) cond = ctx.getRef(self.cond) conseq = ctx.getRef(self.conseq) alt = ctx.getRef(self.alt) m = low_ir.Mux(cond, conseq, alt, conseq.typ) n = low_ir.DefNode(name, m) ctx.appendFinalStatement(n, self.scopeId) ref = low_ir.Reference(name, conseq.typ) ctx.updateRef(self, ref) return ref
def _primMap(ctx: EmitterContext, obj, op, args, consts, tranFormFunc): if consts is None: consts = [] # get items' reference and do checking ars = [ctx.getRef(a) for a in args] newArgs, typ = tranFormFunc(*ars) e = low_ir.DoPrim(op, newArgs, consts, typ) name = ctx.getName(obj) node = low_ir.DefNode(name, e) ctx.appendFinalStatement(node, obj.scopeId) ref = low_ir.Reference(name, typ) ctx.updateRef(obj, ref) return ref