Trying to sort out which cameras actually have what, I wrote a shell script (attached, expects to be run in the platform directory) which generates a csv (attached) with the following information:
GetUsableMinAv - on older cameras, this is only present on cameras with an actual Iris. However, it's also present on ixus160, which (IMHO) is almost certainly ND only. It's also present on some other questionable cases described below.
edit: ixus175 also has GetUsable*Av, does not have an iris. It returns the values with/without ND. This allows obtaining the ND value even if the canon firmware did not put the ND in.
task_IrisEvent, string IrisActuator.c - These generally appear to only be present on cameras with a real iris, though again there are some questions. Not present on ILC (EOS M) cameras.
task_Nd, string NdActuator.c - Generally only present on cameras with a real ND. (Some very old ND only ixus don't have the task: ixus40_sd300, ixus50_sd400, ixus700_sd500, ixus30_sd200)
CAM_HAS_ND_FILTER and CAM_HAS_IRIS_DIAPHRAGM - The current CHDK settings.
If anyone has any of the cameras mentioned below and is willing to test, let me know.
The simplest test is probably to check whether the "ND" (or Av on cameras that might be really be ND only) significantly changes depth of field. This is easiest to see at high zooms.
Questionable cases:
Some Ixus / SD cameras with task_IrisEvent and IrisActuator.
ixus1000_sd4500 (DryOS 45, 2010)
* Defined as ND only in CHDK
* Does not have task_Nd, NdActuator.c
* PutInNdFilter calls GetUsable*Av,
* Does not mention M, Tv, Av in Canon manual
* Canon manual includes aperture specs: Type blade (x2); f/number f/3.4-f/7.1(W), f/5.6-9.0 (T). Real ND only cameras around this time list different specs, e.g. SD1400 doesn't have a spec, A3300 says "circular together with ND filter"
* ReloadNdFilterAdjustment is noop
ixus200_sd980 (DryOS 39, 2009) - confirmed iris only
* Defined as ND + Iris in CHDK
* Does not have task_Nd, NdActuator.c
* PutInNdFilter calls GetUsable*Av,
* Does not mention M, Tv, Av in Canon manual
* No aperture type spec in Canon manual
* ReloadNdFilterAdjustment is noop
ixus310_elph500hs (DryOS 47, 2011),
ixus300_sd4000 (DryOS 43, 2010)
* Defined as ND + Iris in CHDK
* Has task_Nd, NdActuator.c, GetUsable*Av
* Canon manual describes Av and Tv modes (but not M), doesn't mention ND.
* PutInNdFilter calls a function that references NdActuator.c
*
ixus310 Canon manual aperture spec Type "Iris used together with ND filter", f/2.0(W)-f/8.0(T), f/5.8-f/8.0(W)
*
ixus300 No aperture type spec in Canon manual
* ReloadNdFilterAdjustment appears to have ND style code (both ixus300 and ixus310)
Other oddities
SX400IS (DryOS 55, 2014)
* Defined as ND only in CHDK
* Does not have task_Nd, NdActuator.c
* Has task_IrisEvent and IrisActuator.c
* Does not have M, Tv, Av modes
* PutInNdFilter doesn't obviously call GetUsable*
* NOTE: Related SX410IS was shown to have a real aperture, despite having no Av/Tv (
https://chdk.setepontos.com/index.php?topic=12948.msg129671#msg129671) but PutInNdFilter code is different.
* No aperture type spec in Canon manual
TX1 (VxWorks 2005) - confirmed iris only
* Defined as Iris + ND in CHDK
* Has GetUsable* (which on cameras this old appears to only be present in real iris cams)
* Canon manual doesn't mention M, Av, Tv or ND.
* No aperture type spec in Canon manual
* ReloadNdFilterAdjustment is noop
Some cameras defined in CHDK as iris-only, but have the task_Nd and NdActuator.c
A650, SX1, SX10, SX20I don't see references to an ND filter in the manuals of any of them. It isn't immediately obvious to me what the PutInNdFilter code on these cameras does, it's not the same as the later "hidden" ND cams that obviously manipulate the iris.
Edit:
Added Canon manual "aperture type" specs.
Edit:
An additional characteristic of cameras without an ND is "ReloadNdFilterAdjustment" eventproc is noop (either a return, return 0, or call to similar). The eventproc appears to exist on most iris-only cams, and is part of the jumptable interface. The ND value appears to obtainable through this function on ND cameras, more on this later.
The corresponding ReloadIrisAdjustment appears to have code even on ND only cameras.