First lets consider potentiometerVC.sub, which contains the voltage controlled potentiometer model:
* This is the potentiometerVC
* _____
* 1--|_____|--2
* |
* 3
*
* 4 - control voltage
*
.SUBCKT potentiometerVC 1 2 3 4
.func w()=limit(V(4),1m,.999)
R0 1 3 R={Rtot}*(1-w())
R1 3 2 R={Rtot}*w()
R2 4 0 10G
.ENDS
Although its set up as voltage controlled, treat the control as a percentage wiper position: 0% -> 100% is represented by 0V -> 1V.
All lines starting with * are SPICE comments. The .subckt line defines a component with four pins as a netlist between it and the .ends line. The pins are numbered nodes as shown in the comment. 0 is the universal ground node which isn't explicitly connected to the potentiometerVC symbol.
The .func w() line sets limits for the wiper position. Even if you supply an out of range control to the pot (as voltage on pin 4: V(4)), the wiper stays within the track. As SPICE errors if a resistance is zero ohms, and a real pot has some track end resistance so it can never quite reach 0% or 100%, the function limits the wiper range to 0.1% to 99.9%. On a 10K pot that would leave 10 ohms between the wiper and the end pin at the wiper limits.
The lines starting R are resistors. R1 3 2 R={Rtot}*w() defines a resistor of value: parameter Rtot times the wiper position, connected between pins 3 and 2. Similarly R0 defines another resistor that decreases as R1 increases, between pins 1 and 3 so that the total resistance of the track between 2 and 3 remains constant at Rtot. Finally, R2 is a fixed 10 gigaohm resistor - virtually an insulator, which is needed to stop LTspice discarding pin 4 as an unconnected node.
Zeroing circuit:
R1 sets the maximum zeroing voltage, currently about +3mV. If in+ of U6 was grounded instead, the maximum zeroing voltage would be zero and the minimum would be set by the max input voltage from the preset RV2 times R3/100K, currently about 10mV, so the range is from +3mV to -7mV. R3 will need to be changed if the zeroing preset doesn't have enough range or is too sensitive. e.g increasing it to 820R would increase the zeroing range to about 20mV, which if R1 is unchanged would give you an adjustment range from approx +3mV to -17mV. Its actually a little more complicated than that, as the voltage on in+ doesn't actually directly add to the zeroing output, but as long as its small and R3 is much much less than 100K, the error due to over-simplifying the OPAMP maths is likely to be less than its offset voltage error.
TL431:
Sorry about the ****-up on the part number 'TL437' is bogus, it should be TL431.
The recommended operating conditions for a TL431 are to have between 1mA and 100mA passing through it. As you can see, the sim shows 9.5mA. The 2.5V reference rail is loaded by 100K||10K||12K, which is about 5K, or 0.5mA. Increasing the LED resistor to 500R wont be a problem.
The 'ideal' diode in the sim for the TL431 is to prevent the 2.5V voltage source providing any current to the 2.5V rail. (Not quite ideal as SPCE doesn't like zero or infinite resistances.) I can't really use a Zener there as the characteristic is very different to a TL431, which has a much sharper knee and nearly zero slope above the minimum current.
RV3:
RV3 + R11 form the lower arm of the divider (with R10) that scale the 0-2V from U5 down to what the current sinks need. You could easily rearrange this section to use a 10K preset. See attached image. If you need a fast step response however, you'll probably need to decrease C1 as well to keep the RC time constant low enough.
Function generator:
The input is protected against overvoltage by the 1K series resistor R4 and the 1N4148 diodes. Assuming a 1/4W resistor, it can withstand about +/-15V without immediate damage though, as the control voltage will only be clamped at 2.5+0.7=3.2V, the MOSFETs may overheat as it will try to pass 3.2A. Improving the protection to eliminate the possible over-current would make the circuit a *LOT* more complex.
I wouldn't recommend substituting 1N400x power diodes as their larger junction capacitance will limit the transient response and their possibly higher leakage current could be a problem. Any small low leakage silicon diodes rated for 50mA to 100mA could be substituted.
For the function generator or Arduino connection, you should use at least a four pin connector so you can bring out the source connection from ONE of the MOSFETS and also the drain - that would allow an Arduino to measure the actual voltage and current. The other two pins are current control voltage in and Gnd. It would be possible to use a 0.1" pitch rightangle header, preferably a seven pin one with pin 3 cropped (to avoid mistakes with the jumper or reversing the connector), and put a jumper on it on pins 1 and 2 to couple the pot knob to the buffer OPAMP rather than fitting a SPDT switch. The Arduino would also be able to read the control voltage from the front panel pot. The 7th pin is to provide the +2.5V reference to the Arduino.