let N: int = 4;

// a block machine which performs addition
namespace Add(N);
	let af = |i| (2 * i + 13) & 0xffffffff;
	let bf = |i| ((2 * i + 19) * 17) & 0xffffffff;
    col fixed a(i) { af(i) };
    col fixed b(i) { bf(i) };
    col fixed c(i) { af(i) + bf(i) };

// a machine which calls `Add` every other row on made up inputs
namespace Main(2 * N);
    col fixed a(i) { (i + 13) & 0xffffffff };
    col fixed b(i) { ((i + 19) * 17) & 0xffffffff };
    col witness c;

    // only make a call every other row, otherwise set `c` to 0
    // we do this to prevent running out of blocks in `Add`
    col fixed CALL = [1, 0]*;
    (1 - CALL) * c = 0;

    CALL $ [a, b, c] in [Add::a, Add::b, Add::c];


