I have managed to get a simple CVode program running. Hurray! :-)
proc f(t: realtype, y: N_Vector, ydot: N_Vector, user_data: pointer): cint
{.cdecl.} =
NV_Ith_S(ydot, 0) = NV_Ith_S(y, 0)
NV_Ith_S(ydot, 1) = NV_Ith_S(y, 1)
NV_Ith_S(ydot, 2) = NV_Ith_S(y, 2)
var cvode_mem: pointer = nil
cvode_mem = CVodeCreate(CV_ADAMS)
var t0 = 0.0
var y0 = newNVector([1.0, 1.0, 1.0])
var A = SUNDenseMatrix(3, 3)
let reltol = 1e-8
let abstol = 1e-8
var flag = CVodeInit(cvode_mem, f, t0, y0.rawVector[])
flag = CVodeSStolerances(cvode_mem, reltol, abstol)
var LS = SUNLinSol_SPGMR(y0.rawVector[], 0, 0)
flag = CVodeSetLinearSolver(cvode_mem, LS, A)
var t: realtype = 0.0
var tout = 1.0
flag = CVode(cvode_mem, tout, y0.rawVector[], addr(t), CV_NORMAL)
import math
var correct = newNVector(@[exp(1.0), exp(1.0), exp(1.0)])
echo y0
echo "Error: ", correct - y0
CVodeFree(addr(cvode_mem))
flag = SUNLinSolFree(LS)
SUNMatDestroy(A)
Run