import tensorflow as tf

        for bi in range(b):
            with tf.variable_scope('block_{}'.format(bi)):
                idx1 = cell_arch[bi][0]
                op1 = cell_arch[bi][1]
                idx2 = cell_arch[bi][2]
                op2 = cell_arch[bi][3]

                with tf.variable_scope('X1'):
                    X1 = self._add_op_dynamic(cell_inputs, blocks, idx1, op1, w, h, block_ch, is_train=is_train)
                    X1 = self._add_drop_path(X1, drop_path_keep_prob)

                with tf.variable_scope('X2'):
                    X2 = self._add_op_dynamic(cell_inputs, blocks, idx2, op2, w, h, block_ch, is_train=is_train)
                    X2 = self._add_drop_path(X2, drop_path_keep_prob)

                X = tf.add_n([X1, X2])

            blocks.append(X)

        (X, comb_ch) = self._combine_cell_blocks_dynamic(cell_inputs, blocks, cell_arch, w, h, block_ch, is_train)

        X = tf.reshape(X, (-1, w, h, comb_ch)) # Sanity shape check

        layers.append((X, w, h, comb_ch))

    def _add_static_cell(self, cell_arch, layers, w, h, block_ch, drop_path_keep_prob, is_train=False, is_reduction=False):
        b = CELL_NUM_BLOCKS

        # Calibrate inputs as necessary to last input layer's dimensions and add them to hidden states
        cell_inputs = [layers[-2] if len(layers) > 1 else layers[-1], layers[-1]]
