13 auto& world = arg->
world();
14 auto [r, s, T] = arg->
projs<3>();
20 for (
u64 i = 0; i < *r_l; ++i) {
21 auto d = s->proj(*r_l, i);
25 if (dims.size() == *r_l)
return {};
26 return world.app(callee, world.tuple({world.lit_nat(dims.size()), world.tuple(dims), T}));
31 auto& world = type->world();
32 auto [
mem, buf, index] = arg->
projs<3>();
33 if (
auto ex = buf->isa<
Extract>())
35 auto [cmem, v] = cst->arg()->projs<2>();
36 return world.tuple({
mem, v});
45 auto& world = type->world();
46 auto [buf, index] = arg->
projs<2>();
48 return world.extract(s, index);
#define MIM_buffer_NORMALIZER_IMPL
static auto isa(const Def *def)
World & world() const noexcept
auto projs(F f) const
Splits this Def via Def::projections into an Array (if A == std::dynamic_extent) or std::array (other...
static std::optional< T > isa(const Def *def)
const Def * normalize_write(const Def *, const Def *, const Def *)
const Def * normalize_shape(const Def *type, const Def *, const Def *arg)
shape buf i ↦ the i-th size, read off the buffer's type.
const Def * normalize_read(const Def *type, const Def *, const Def *arg)
read (constant v) idx ↦ v.
const Def * normalize_Buf(const Def *, const Def *callee, const Def *arg)
Buf (r, s, T) with literal size-1 axes in s ↦ Buf (r', s', T) with those axes dropped.
Vector< const Def * > DefVec