| 101 | |
| 102 | @dataclass(frozen=True, eq=False) |
| 103 | class PtrDType(DType): |
| 104 | _base: DType |
| 105 | addrspace: AddrSpace |
| 106 | v: int |
| 107 | size: int = -1 # -1 is unlimited size |
| 108 | @property |
| 109 | def base(self): return self._base |
| 110 | @functools.cache # pylint: disable=method-cache-max-size-none |
| 111 | def vec(self, sz:int) -> DType: |
| 112 | assert self.v == 1, f"can't vectorize ptr {self} with size {sz}" |
| 113 | if sz == 1: return self # sz=1 is a scalar |
| 114 | if isinstance(self, ImageDType): |
| 115 | return ImageDType(self.priority, self.bitsize, self.name, self.fmt, self.count, self, self._base, self.addrspace, sz, self.size, self.shape) |
| 116 | return type(self)(self.priority, self.bitsize, self.name, self.fmt, self.count, self, self._base, self.addrspace, sz, self.size) |
| 117 | def ptr(self, size=-1, addrspace=AddrSpace.GLOBAL) -> PtrDType: raise RuntimeError("can't make a pointer from a pointer") |
| 118 | def nbytes(self) -> int: |
| 119 | if self.size == -1: raise RuntimeError("can't get nbytes of a pointer with unlimited size") |
| 120 | return self.size*self.itemsize |
| 121 | @property |
| 122 | def vcount(self): return self.v |
| 123 | def __repr__(self): |
| 124 | return f"{self.base.__repr__()}.ptr({self.size}{', '+str(self.addrspace) if self.addrspace != AddrSpace.GLOBAL else ''})" + \ |
| 125 | (f'.vec({self.v})' if self.v != 1 else '') |
| 126 | |
| 127 | @dataclass(frozen=True, eq=False) |
| 128 | class ImageDType(PtrDType): |
no outgoing calls
no test coverage detected
searching dependent graphs…