| 451 | def maketuple(*srcs:UOp): # pylint: disable=no-self-argument |
| 452 | return UOp(Ops.TUPLE, dtypes.void, srcs) |
| 453 | def gettuple(self, idx:int) -> UOp: |
| 454 | in_tuple = self.src[0] if self.op is Ops.FUNCTION else self |
| 455 | assert in_tuple.op is Ops.TUPLE, f"gettuple requires FUNCTION or TUPLE source, got {self.op}" |
| 456 | return UOp(Ops.GETTUPLE, in_tuple.src[idx].dtype, (self,), idx) |
| 457 | def group(*srcs:UOp|None): # pylint: disable=no-self-argument |
| 458 | if len(srcs) == 1 and isinstance(srcs[0], UOp): return srcs[0] |
| 459 | return UOp(Ops.GROUP, dtypes.void, tuple([x for x in srcs if x is not None])) |