def ires_get_index(self, cr, index): from mcdp_dp.dp_flatten import TakeRes from mocdp.comp.wrap import SimpleWrap if not cr in self.indexed_res: R = self.get_rtype(cr) n = len(R.subs) # todo: use labels if isinstance(R, PosetProductWithLabels): rnames = list(R.labels) else: rnames = ['_r%d' % i for i in range(n)] coords = list(range(n)) dp = TakeRes(R, coords) ndp_out = '_muxed' ndp = SimpleWrap(dp, fnames=ndp_out, rnames=rnames) ndp_name = self.new_name('_indexing') self.add_ndp(ndp_name, ndp) c = Connection(dp2=ndp_name, s2=ndp_out, dp1=cr.dp, s1=cr.s) self.add_connection(c) self.indexed_res[cr] = ndp_name ndp_name = self.indexed_res[cr] ndp = self.names[ndp_name] rnames = ndp.get_rnames() n = len(rnames) s = rnames[index] if not (0 <= index < n): msg = 'Out of bounds.' raise_desc(DPSemanticError, msg, index=index, R=R) res = self.make_resource(ndp_name, s) return res