/* ngspice file
   Copyright Holger Vogt 2021
   License: BSD 3-clause 
 */

 /* Print the current node status to a file with format
    .ic V(node) = value 
 */

#include "ngspice/ngspice.h"
#include "ngspice/cpdefs.h"
#include "ngspice/ftedefs.h"
#include "ngspice/ftedev.h"
#include "ngspice/ftedebug.h"
#include "ngspice/cktdefs.h"

void com_wric(wordlist* wl);

 /* Print the current node status to a file with format
    .ic V(node) = value 
    during a transient simulation which has been stopped,
    by command 'stop' and which may continue by 'resume'.
 */
void
com_wric(wordlist* wl) {

    CKTnode* node;
    CKTcircuit* ckt = NULL;
    FILE* fp;
    char* file;

    if (wl)
        file = wl->wl_word;
    else
        file = "dot_ic_out.txt";

    if (!ft_curckt) {
        fprintf(cp_err, "Error: there aren't any circuits loaded.\n");
        return;
    }
    else if (ft_curckt->ci_ckt == NULL) { /* Set noparse? */
        fprintf(cp_err, "Error: circuit not parsed.\n");
        return;
    }

    ckt = ft_curckt->ci_ckt;

    if (!ckt->CKTrhsOld) {
        fprintf(stderr, "\nWarning: Command wrnodev is ignored!\n");
        fprintf(stderr, "    You need to execute stop ... tran ... resume\n\n");
        return;
    }

    if ((fp = fopen(file, "w")) == NULL) {
        perror(file);
        return;
    }

    fprintf(fp, "* Intermediate Transient Solution\n");
    fprintf(fp, "* Circuit: %s\n", ft_curckt->ci_name);
    fprintf(fp, "* Recorded at simulation time: %g\n", ckt->CKTtime);
    for (node = ckt->CKTnodes->next; node; node = node->next) {
        if (!strstr(node->name, "#branch") && !strchr(node->name, '#'))
            fprintf(fp, ".ic v(%s) = %g\n", node->name,
                ckt->CKTrhsOld[node->number]);
    }

    fprintf(stdout, "\nNode data saved to file %s\n", file);

    fclose(fp);
}
