Ejemplo n.º 1
0
    def map_subscript(self, expr):
        from pymbolic.primitives import Variable
        assert isinstance(expr.aggregate, Variable)

        name = expr.aggregate.name
        dims = self.scope.dim_map.get(name)
        if dims is None:
            return IdentityMapper.map_subscript(self, expr)

        subscript = expr.index

        if not isinstance(subscript, tuple):
            subscript = (subscript,)

        subscript = list(subscript)

        if len(dims) != len(subscript):
            raise TranslationError("inconsistent number of indices "
                    "to '%s'" % name)

        for i in range(len(dims)):
            if len(dims[i]) == 2:
                # has a base index
                subscript[i] -= dims[i][0]
            elif len(dims[i]) == 1:
                # base index is 1 implicitly
                subscript[i] -= 1

        return expr.aggregate[self.rec(tuple(subscript))]
Ejemplo n.º 2
0
    def map_subscript(self, expr):
        from pymbolic.primitives import Variable
        assert isinstance(expr.aggregate, Variable)

        name = expr.aggregate.name
        dims = self.scope.dim_map.get(name)
        if dims is None:
            return IdentityMapper.map_subscript(self, expr)

        subscript = expr.index

        if not isinstance(subscript, tuple):
            subscript = (subscript,)

        subscript = list(subscript)

        if len(dims) != len(subscript):
            raise TranslationError("inconsistent number of indices "
                    "to '%s'" % name)

        for i in range(len(dims)):
            if len(dims[i]) == 2:
                # has a base index
                subscript[i] -= dims[i][0]
            elif len(dims[i]) == 1:
                # base index is 1 implicitly
                subscript[i] -= 1

        return expr.aggregate[self.rec(tuple(subscript))]
Ejemplo n.º 3
0
    def map_subscript(self, expr):
        try:
            new_idx = self.var_to_new_inames[expr.aggregate.name]
        except KeyError:
            return IdentityMapper.map_subscript(self, expr)
        else:
            index = expr.index
            if not isinstance(index, tuple):
                index = (index,)
            index = tuple(self.rec(i) for i in index)

            return expr.aggregate.index(index + new_idx)
Ejemplo n.º 4
0
Archivo: ilp.py Proyecto: spillai/loopy
    def map_subscript(self, expr):
        try:
            new_idx = self.var_to_new_inames[expr.aggregate.name]
        except KeyError:
            return IdentityMapper.map_subscript(self, expr)
        else:
            index = expr.index
            if not isinstance(index, tuple):
                index = (index, )
            index = tuple(self.rec(i) for i in index)

            return expr.aggregate.index(index + new_idx)
Ejemplo n.º 5
0
    def map_subscript(self, expr):
        try:
            new_idx = self.var_to_new_inames[expr.aggregate.name]
        except KeyError:
            return IdentityMapper.map_subscript(self, expr)
        else:
            index = expr.index
            if not isinstance(index, tuple):
                index = (index, )
            index = tuple(self.rec(i) for i in index)

            self.seen_priv_axis_inames.update(v.name for v in new_idx)

            new_idx = tuple(v - self.iname_to_lbound[v.name] for v in new_idx)

            return expr.aggregate.index(index + new_idx)
Ejemplo n.º 6
0
    def map_subscript(self, expr):
        from pymbolic.primitives import Variable
        assert isinstance(expr.aggregate, Variable)

        name = expr.aggregate.name
        dims = self.scope.dim_map.get(name)
        if dims is None:
            return IdentityMapper.map_subscript(self, expr)

        subscript = expr.index

        if not isinstance(subscript, tuple):
            subscript = (subscript, )

        if len(dims) != len(subscript):
            raise TranslationError("inconsistent number of indices "
                                   "to '%s'" % name)

        new_subscript = []
        for i in range(len(dims)):
            if len(dims[i]) == 2:
                # has an explicit base index
                base_index, end_index = dims[i]
            elif len(dims[i]) == 1:
                base_index = 1
                end_index, = dims[i]

            sub_i = subscript[i]
            if isinstance(sub_i, Slice):
                start = sub_i.start
                if start is None:
                    start = base_index

                step = sub_i.step
                if step is None:
                    step = 1

                stop = sub_i.stop
                if stop is None:
                    stop = end_index

                if step == 1:
                    sub_i = Slice((
                        start - base_index,

                        # FIXME This is only correct for unit strides
                        stop - base_index + 1,
                        step))
                elif step == -1:
                    sub_i = Slice((
                        start - base_index,

                        # FIXME This is only correct for unit strides
                        stop - base_index - 1,
                        step))

                else:
                    # FIXME
                    raise NotImplementedError("Fortran slice processing for "
                                              "non-unit strides")

            else:
                sub_i = sub_i - base_index

            new_subscript.append(sub_i)

        return expr.aggregate[self.rec(tuple(new_subscript))]