(self)
| 781 | |
| 782 | @property |
| 783 | def buffer(self) -> Buffer|MultiBuffer: |
| 784 | if self.op in {Ops.CONTIGUOUS, Ops.RESHAPE, Ops.DETACH, Ops.AFTER}: return self.src[0].buffer |
| 785 | # this buffer can process disk tensors and simple movement ops |
| 786 | if self is not self.base: |
| 787 | buf = self.base.buffer |
| 788 | assert isinstance(buf, Buffer), "must be a Buffer for movement ops" |
| 789 | offset = self.contiguous_view_offset() |
| 790 | if offset is None: raise RuntimeError(f"non-contiguous view is not supported for {buf.device} buffer") |
| 791 | return buf.view(prod(self.max_shape), self.dtype, offset*self.dtype.itemsize) |
| 792 | if self.op is Ops.BITCAST: |
| 793 | buf = self.src[0].buffer |
| 794 | assert isinstance(buf, Buffer), "must be a Buffer for BITCAST" |
| 795 | return buf.view(prod(self.max_shape), self.dtype, 0) |
| 796 | if self.op is Ops.BUFFER_VIEW: |
| 797 | if (cret:=buffers.get(self)) is not None: return cret |
| 798 | buf = self.src[0].buffer |
| 799 | if isinstance(buf, MultiBuffer): |
| 800 | mbuf = MultiBuffer.__new__(MultiBuffer) |
| 801 | mbuf.bufs = [b.view(self.arg[0], self.dtype, self.arg[1] * self.dtype.itemsize) for b in buf.bufs] |
| 802 | buffers[self] = mbuf |
| 803 | return mbuf |
| 804 | assert isinstance(buf, Buffer), "must be a Buffer for BUFFER_VIEW" |
| 805 | buffers[self] = bv = buf.view(self.arg[0], self.dtype, self.arg[1] * self.dtype.itemsize) |
| 806 | return bv |
| 807 | if self.op is Ops.MSELECT: |
| 808 | ret = self.src[0].buffer |
| 809 | assert isinstance(ret, MultiBuffer) |
| 810 | return ret.bufs[self.arg] |
| 811 | if self.op is Ops.MSTACK: |
| 812 | ret = MultiBuffer.__new__(MultiBuffer) |
| 813 | ret.bufs = [cast(Buffer, x.buffer) for x in self.src] |
| 814 | assert all_same([(x.size, x.dtype) for x in ret.bufs]), "multibuffers mismatch buffers" |
| 815 | return ret |
| 816 | assert self.op is Ops.BUFFER, f"must be BUFFER {self.op}" |
| 817 | assert self.src[0].op is Ops.UNIQUE, f"buffer src[0] must be UNIQUE, not {self.src[0].op}" |
| 818 | if (cret:=buffers.get(self)) is not None: return cret |
| 819 | rdtype = self.dtype if isinstance(self.dtype, ImageDType) else self.dtype.base |
| 820 | if isinstance(self.device, tuple): ret = MultiBuffer(self.device, self.arg, rdtype).ref(1) |
| 821 | else: ret = Buffer(self.device, self.arg, rdtype).ref(1) |
| 822 | buffers[self] = ret |
| 823 | return ret |
| 824 | @property |
| 825 | def realized(self) -> Buffer|MultiBuffer|None: |
| 826 | # only these can be realized |
nothing calls this directly
no test coverage detected