private void RunSetupPhase(int nBlocksInput, ulong nCols, ulong nRows)
        {
            for (i = 0; i < nBlocksInput; i++)
            {
                var arrayPassed = wholeMatrix.Skip((int)(i * (int)BLOCK_LEN_BLAKE2_SAFE_INT64 * (int)LyraConstants.UINT64_SIZE)).ToArray();
                sponge.AbsorbBlockBlake2Safe(arrayPassed);
            }

            sponge.ReducedSqueezeRow0(0, nCols);
            sponge.ReducedDuplexRow1(0, 1, nCols);

            do
            {
                sponge.ReducedDuplexRowSetup((ulong)prev, (ulong)rowa, (ulong)row, nCols);

                rowa = (rowa + step) & (window - 1);
                prev = row;
                row++;

                if (rowa == 0)
                {
                    step    = window + gap;
                    window *= 2;
                    gap     = -1 * gap;
                }
            } while (row < (int)nRows);
        }