add(new BlockSplit(x1, y1, blockDiv));
add(new BlockSplit(y1, x1, blockDiv));
    public void init(        final int x0,        final int y0,        final int x1,        final int y1,        final int blockDiv)    {        ASSERT(x0 == y1);        ASSERT(x0 % blockDiv == 0);        ASSERT(y0 % blockDiv == 0);        ASSERT(x1 % blockDiv == 0);        ASSERT(y1 % blockDiv == 0);        // rearrange and duplicate the matrices as necessary:        add(new SplitJoin()        {            public void init()            {                setSplitter(WEIGHTED_ROUND_ROBIN(x0 * y0, x1 * y1));                add(new Pipeline()                {                    public void init()                    {                        add(new BlockSplit(x0, y0, blockDiv));                        add(                            new Duplicate(                                x0 * y0 / (blockDiv),                                blockDiv));                    }                });                add(new Pipeline()                {                    public void init()                    {                        add(new Transpose(x1, y1));                        add(new BlockSplit(x1, y1, blockDiv));                        add(new Duplicate(x1 * y1, blockDiv));                    }                });                setJoiner(                    WEIGHTED_ROUND_ROBIN(                        x0 * y0 / (blockDiv * blockDiv),                        x1 * y1 / (blockDiv * blockDiv)));            }        });        add(            new BlockMultiply(                x0 / blockDiv,                y0 / blockDiv,                y1 / blockDiv,                x0 / blockDiv));        add(new BlockAdd(x1 / blockDiv, y0 / blockDiv, blockDiv));        add(new BlockCombine(x1, y0, blockDiv));    }