The solution of the matrix that emerges from the spatial
discretization of the cable equation is done by looping over the
byte-code in an array called `funcs`. The number of entries in
this array is given by the field `nfuncs`:

genesis > showfield solve nfuncs [ /Purkinje/solve ] nfuncs = 25810

The `funcs` array contains the actual code to be executed and
also encodes the structure of the matrix (which corresponds to the
morphology of the neuron). Remember that this matrix is inverted in
two phases that are known as forward elimination and backward
substitution. If we *disassemble* a small part of the
`funcs` array, we get something like the following:

genesis > printfuncs solve 0 20 00000 :: 0 0 FOBA_ELIM 0 00002 :: 1 SET_DIAG 00003 :: 0 2 FOBA_ELIM 2 00005 :: 2 SKIP_DIAG 00006 :: 0 6 FOBA_ELIM 6 00008 :: 1 SET_DIAG 00009 :: 0 4 FOBA_ELIM 4 00011 :: 0 8 FOBA_ELIM 8 00013 :: 2 SKIP_DIAG 00014 :: 0 12 FOBA_ELIM 12 00016 :: 1 SET_DIAG 00017 :: 0 10 FOBA_ELIM 10 00019 :: 0 14 FOBA_ELIM 14

The first `FOBA_ELIM` opcode tells that the coefficient at
offset `0` should be eliminated from the matrix. Since we are
at the start of the `funcs` array, `hsolve` knows that
it is in the process of forward elimination (the opcode
`FOBA_ELIM` encodes forward elimination as well as backward
substitution).

Second the `SET_DIAG` opcode calculates a new value for the
coefficient on the diagonal of the matrix.

The `SKIP_DIAG` opcode calculates a new value for the
coefficient on the diagonal of the matrix, but then skips on to the
next row in the matrix. This means that we are dealing with a tip of
a dendrite. At positions 9 and 11 we encounter two consecutive
elimination steps. This a witness of a branch point in the morphology
of the neuron.

Note that the coefficients to be eliminated, are found in the
`ravals` and `results` arrays. When walking over the
`funcs` array, `hsolve` also automatically sweeps
through these two data arrays.

The separation between forward elimination and backward substitution
is done with a `FINISH` opcode:

genesis > printfuncs solve 12164 12171 12164 :: 1 SET_DIAG 12165 :: 0 9092 FOBA_ELIM 9092 12167 :: 7 FINISH 12168 :: 0 9094 FOBA_ELIM 9094 12170 :: 6 CALC_RESULTS 12171 :: 0 9092 FOBA_ELIM 9092

After the `FINISH` opcode, `hsolve` starts the backward
substitution cycle (so from then on the `FOBA_ELIM` opcode
encodes a backward substitution operation. Finally the
`CALC_RESULTS` operation tells that all coefficients from the
current row have been eliminated and that the final result for that
row can be calculated. There are yet some other opcodes that are used
for symmetric compartments. These are not discussed.

The emulation of this byte-code is done in the source file
`hines_solve.c`.