package pkg;
    `define STRUCT \
        struct packed { \
            integer unsigned a, b, c, d, e, f, g, h, i, j, k, l, m, \
                n, o, p, q, r, s, t, u, v, w, x, y, z; \
        }
    typedef `STRUCT T;

    `define step(b, o, f) f: o.f == "inv" ? b.f : o.f
    `define extend(_b, _o) '{ \
        `step(_b, _o, a), \
        `step(_b, _o, b), \
        `step(_b, _o, c), \
        `step(_b, _o, d), \
        `step(_b, _o, e), \
        `step(_b, _o, f), \
        `step(_b, _o, g), \
        `step(_b, _o, h), \
        `step(_b, _o, i), \
        `step(_b, _o, j), \
        `step(_b, _o, k), \
        `step(_b, _o, l), \
        `step(_b, _o, m), \
        `step(_b, _o, n), \
        `step(_b, _o, o), \
        `step(_b, _o, p), \
        `step(_b, _o, q), \
        `step(_b, _o, r), \
        `step(_b, _o, s), \
        `step(_b, _o, t), \
        `step(_b, _o, u), \
        `step(_b, _o, v), \
        `step(_b, _o, w), \
        `step(_b, _o, x), \
        `step(_b, _o, y), \
        `step(_b, _o, z) \
    }

    localparam X = 1'd0;
    localparam Y = 1'd1;

    localparam T a1_cfg = '{a: X, b: X, c: X, d: X, e: X, f: X, default: Y};
    localparam `STRUCT a2_cfg = a1_cfg;

    `define expand(let_a, let_b) \
        localparam T let_a``1_ext = '{let_a: Y, default: "inv"}; \
        localparam T let_b``1_cfg = `extend(let_a``1_cfg, let_a``1_ext); \
        localparam `STRUCT let_a``2_ext = '{let_a: Y, default: "inv"}; \
        localparam `STRUCT let_b``2_cfg = `extend(let_a``2_cfg, let_a``2_ext);

    `expand(a, b)
    `expand(b, c)
    `expand(c, d)
    `expand(d, e)
    `expand(e, f)
    `expand(f, g)
    `expand(g, h)
    `expand(h, i)
    `expand(i, j)
    `expand(j, k)
    `expand(k, l)
    `expand(l, m)
    `expand(m, n)
    `expand(n, o)
    `expand(o, p)
    `expand(p, q)
    `expand(q, r)
    `expand(r, s)
    `expand(s, t)
    `expand(t, u)
    `expand(u, v)
    `expand(v, w)
    `expand(w, x)
    `expand(x, y)
    `expand(y, z)

    localparam P = z1_cfg.z;
    localparam Q = 3 * z2_cfg.z;
    localparam `STRUCT R = '0;
endpackage

module top;
    initial $display(pkg::P, pkg::Q, pkg::R);
endmodule