Пример #1
0
    def ifun_get_index(self, cf, index):
        from mcdp_dp.dp_flatten import TakeFun
        from mocdp.comp.wrap import SimpleWrap

        if not cf in self.indexed_fun:
            F = self.get_ftype(cf)
            n = len(F.subs)

            # todo: use labels
            if isinstance(F, PosetProductWithLabels):
                fnames = list(F.labels)
            else:
                fnames = ['_f%d' % i for i in range(n)]
            coords = list(range(n))
            dp = TakeFun(F, coords)
            ndp_out = '_muxed'
            ndp = SimpleWrap(dp, fnames=fnames, rnames=ndp_out)
            ndp_name = self.new_name('_indexing')

            self.add_ndp(ndp_name, ndp)
            c = Connection(dp1=ndp_name, s1=ndp_out, dp2=cf.dp, s2=cf.s)
            self.add_connection(c)

            self.indexed_fun[cf] = ndp_name

        ndp_name = self.indexed_fun[cf]

        ndp = self.names[ndp_name]
        fnames = ndp.get_fnames()
        n = len(fnames)
        s = fnames[index]
        if not (0 <= index < n):
            msg = 'Out of bounds.'
            raise_desc(DPSemanticError, msg, index=index, F=F)

        res = self.make_function(ndp_name, s)
        return res
Пример #2
0
    def ifun_get_index(self, cf, index):
        from mcdp_dp.dp_flatten import TakeFun
        from mocdp.comp.wrap import SimpleWrap

        if not cf in self.indexed_fun:
            F = self.get_ftype(cf)
            n = len(F.subs)

            # todo: use labels
            if isinstance(F, PosetProductWithLabels):
                fnames = list(F.labels)
            else:
                fnames = ['_f%d' % i for i in range(n)]
            coords = list(range(n))
            dp = TakeFun(F, coords)
            ndp_out = '_muxed'
            ndp = SimpleWrap(dp, fnames=fnames, rnames=ndp_out)
            ndp_name = self.new_name('_indexing')

            self.add_ndp(ndp_name, ndp)
            c = Connection(dp1=ndp_name, s1=ndp_out, dp2=cf.dp, s2=cf.s)
            self.add_connection(c)

            self.indexed_fun[cf] = ndp_name

        ndp_name = self.indexed_fun[cf]

        ndp = self.names[ndp_name]
        fnames = ndp.get_fnames()
        n = len(fnames)
        s = fnames[index]
        if not (0 <= index < n):
            msg = 'Out of bounds.'
            raise_desc(DPSemanticError, msg, index=index, F=F)

        res = self.make_function(ndp_name, s)
        return res